* Re: [PATCH] Add support for GeoVision GV-800(S)
@ 2009-03-03 1:38 Bruno Christo
0 siblings, 0 replies; 6+ messages in thread
From: Bruno Christo @ 2009-03-03 1:38 UTC (permalink / raw)
To: klimov.linux; +Cc: Nicola Soranzo, linux-media
Hello Alexey,
> Well, i used gmail instructions to adjust evolution and it worked well
> (patches inlined okay).
> And i tried mutt - it also works as expected. I read email-clients.txt
> and used "preformatted" inline format in evolution as described. I
> think you can try again if have free time/wish.
>
> --
> Best regards, Klimov Alexey
I tried e-mailing myself the patch a few times using the method you
described, but I was getting whitespace instead of tabs on the message I
received (both in gmail and evolution). And that was preventing me from
applying the patch.
After many tries, I tried using the MIME attachment method, and it worked,
so I sent it to the list using this format because it appeared to be less
error-prone.
Based on this, my guess is you use a script to replace whitespace with
tabs, so all you need is an inlined patch? Or am I doing something wrong
and it should arrive with the tabs instead of the whitespace?
Anyway, I'm sending it now using the method you described:
Signed-off-by: Bruno Christo <bchristo@inf.ufsm.br>
diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
--- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/Documentation/video4linux/CARDLIST.bttv Sun Mar 01 16:01:31 2009 +0000
@@ -155,3 +155,5 @@
154 -> PHYTEC VD-012-X1 (bt878)
155 -> PHYTEC VD-012-X2 (bt878)
156 -> IVCE-8784 [0000:f050,0001:f050,0002:f050,0003:f050]
+157 -> Geovision GV-800(S) (master) [800a:763d]
+158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d]
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
--- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Sun Mar 01 16:01:31 2009 +0000
@@ -75,6 +75,9 @@
static void geovision_muxsel(struct bttv *btv, unsigned int input);
static void phytec_muxsel(struct bttv *btv, unsigned int input);
+
+static void gv800s_muxsel(struct bttv *btv, unsigned int input);
+static void gv800s_init(struct bttv *btv);
static int terratec_active_radio_upgrade(struct bttv *btv);
static int tea5757_read(struct bttv *btv);
@@ -312,6 +315,10 @@
{ 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
{ 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
{ 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
+ { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },
+ { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
{ 0, -1, NULL }
};
@@ -2847,7 +2854,60 @@
.pll = PLL_28,
.tuner_type = TUNER_ABSENT,
.tuner_addr = ADDR_UNSET,
- }
+ },
+ [BTTV_BOARD_GEOVISION_GV800S] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * This is the first BT878A chip of the GV-800(S). It's the
+ * "master" chip and it controls the video inputs through an
+ * analog multiplexer (a CD22M3494) via some GPIO pins. The
+ * slaves should use card type 0x9e (following this one).
+ * There is a EEPROM on the card which is currently not handled.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (master)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0xf107f,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
+ [BTTV_BOARD_GEOVISION_GV800S_SL] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * The 3 other BT878A chips are "slave" chips of the GV-800(S)
+ * and should use this card type.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (slave)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0x00,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
};
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -3376,6 +3436,9 @@
case BTTV_BOARD_KODICOM_4400R:
kodicom4400r_init(btv);
break;
+ case BTTV_BOARD_GEOVISION_GV800S:
+ gv800s_init(btv);
+ break;
}
/* pll configuration */
@@ -4595,6 +4658,122 @@
gpio_bits(0x3, mux);
}
+/*
+ * GeoVision GV-800(S) functions
+ * Bruno Christo <bchristo@inf.ufsm.br>
+*/
+
+/* This is a function to control the analog switch, which determines which
+ * camera is routed to which controller. The switch comprises an X-address
+ * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
+ * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
+ * A data value (gpio bit 18) of '1' enables the switch, and '0' disables
+ * the switch. A STROBE bit (gpio bit 17) latches the data value into the
+ * specified address. There is also a chip select (gpio bit 16).
+ * The idea is to set the address and chip select together, bring
+ * STROBE high, write the data, and finally bring STROBE back to low.
+ */
+static void gv800s_write(struct bttv *btv,
+ unsigned char xaddr,
+ unsigned char yaddr,
+ unsigned char data) {
+ /* On the "master" 878A:
+ * GPIO bits 0-9 are used for the analog switch:
+ * 00 - 03: camera selector
+ * 04 - 06: 878A (controller) selector
+ * 16: cselect
+ * 17: strobe
+ * 18: data (1->on, 0->off)
+ * 19: reset
+ */
+ const u32 ADDRESS = ((xaddr&0xf) | (yaddr&3)<<4);
+ const u32 CSELECT = 1<<16;
+ const u32 STROBE = 1<<17;
+ const u32 DATA = data<<18;
+
+ gpio_bits(0x1007f, ADDRESS | CSELECT); /* write ADDRESS and CSELECT */
+ gpio_bits(0x20000, STROBE); /* STROBE high */
+ gpio_bits(0x40000, DATA); /* write DATA */
+ gpio_bits(0x20000, ~STROBE); /* STROBE low */
+}
+
+/*
+ * GeoVision GV-800(S) muxsel
+ *
+ * Each of the 4 cards (controllers) use this function.
+ * The controller using this function selects the input through the GPIO pins
+ * of the "master" card. A pointer to this card is stored in master[btv->c.nr].
+ *
+ * The parameter 'input' is the requested camera number (0-4) on the controller.
+ * The map array has the address of each input. Note that the addresses in the
+ * array are in the sequence the original GeoVision driver uses, that is, set
+ * every controller to input 0, then to input 1, 2, 3, repeat. This means that
+ * the physical "camera 1" connector corresponds to controller 0 input 0,
+ * "camera 2" corresponds to controller 1 input 0, and so on.
+ *
+ * After getting the input address, the function then writes the appropriate
+ * data to the analog switch, and housekeeps the local copy of the switch
+ * information.
+ */
+static void gv800s_muxsel(struct bttv *btv, unsigned int input)
+{
+ struct bttv *mctlr;
+ char *sw_status;
+ int xaddr, yaddr;
+ static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },
+ { 0x1, 0x5, 0xb, 0x7 },
+ { 0x2, 0x8, 0xc, 0xe },
+ { 0x3, 0x9, 0xd, 0xf } };
+ input = input%4;
+ mctlr = master[btv->c.nr];
+ if (mctlr == NULL) {
+ /* do nothing until the "master" is detected */
+ return;
+ }
+ yaddr = (btv->c.nr - mctlr->c.nr) & 3;
+ sw_status = (char *)(&mctlr->mbox_we);
+ xaddr = map[yaddr][input] & 0xf;
+
+ /* Check if the controller/camera pair has changed, ignore otherwise */
+ if (sw_status[yaddr] != xaddr) {
+ /* disable the old switch, enable the new one and save status */
+ gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
+ sw_status[yaddr] = xaddr;
+ gv800s_write(mctlr, xaddr, yaddr, 1);
+ }
+}
+
+/* GeoVision GV-800(S) "master" chip init */
+static void gv800s_init(struct bttv *btv)
+{
+ char *sw_status = (char *)(&btv->mbox_we);
+ int ix;
+
+ gpio_inout(0xf107f, 0xf107f);
+ gpio_write(1<<19); /* reset the analog MUX */
+ gpio_write(0);
+
+ /* Preset camera 0 to the 4 controllers */
+ for (ix = 0; ix < 4; ix++) {
+ sw_status[ix] = ix;
+ gv800s_write(btv, ix, ix, 1);
+ }
+
+ /* Inputs on the "master" controller need this brightness fix */
+ bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
+
+ if (btv->c.nr > BTTV_MAX-4)
+ return;
+ /*
+ * Store the "master" controller pointer in the master
+ * array for later use in the muxsel function.
+ */
+ master[btv->c.nr] = btv;
+ master[btv->c.nr+1] = btv;
+ master[btv->c.nr+2] = btv;
+ master[btv->c.nr+3] = btv;
+}
+
/* ----------------------------------------------------------------------- */
/* motherboard chipset specific stuff */
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
--- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv.h Sun Mar 01 16:01:31 2009 +0000
@@ -182,6 +182,8 @@
#define BTTV_BOARD_VD012_X1 0x9a
#define BTTV_BOARD_VD012_X2 0x9b
#define BTTV_BOARD_IVCE8784 0x9c
+#define BTTV_BOARD_GEOVISION_GV800S 0x9d
+#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
/* more card-specific defines */
--
Bruno Christo
Bacharel em Ciência da Computação - UFSM
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH] Add support for GeoVision GV-800(S)
@ 2009-02-28 18:24 Bruno Christo
2009-02-28 20:13 ` Bruno Christo
0 siblings, 1 reply; 6+ messages in thread
From: Bruno Christo @ 2009-02-28 18:24 UTC (permalink / raw)
To: mchehab; +Cc: linux-media
Hello all,
I have a GeoVision GV-800(S) card, it has 4 CONEXANT BT878A chips.
It has 16 video inputs and 4 audio inputs, and it is almost identical
to the GV-800, as seen on http://bttv-gallery.de .
The only difference appears to be the analog mux, it has a CD22M3494
in place of the MT8816AP. The card has a blue PCB, as seen in this
picture: http://www.gsbr.com.br/imagem/kits/GeoVision%20GV%20800.jpg .
This card wasn't originally supported, and it was detected as
UNKNOWN/GENERIC. The video inputs weren't working, so I tried
"forcing" a few cards like the GeoVision GV-600, but there was still
no video. So I made a patch to support this card, based on the Kodicom
4400r.
The GV-800(S) is identified as follows:
# lspci
...
02:00.0 Multimedia video controller: Brooktree Corporation Bt878 Video
Capture (rev 11)
02:00.1 Multimedia controller: Brooktree Corporation Bt878 Audio
Capture (rev 11)
02:04.0 Multimedia video controller: Brooktree Corporation Bt878 Video
Capture (rev 11)
02:04.1 Multimedia controller: Brooktree Corporation Bt878 Audio
Capture (rev 11)
02:08.0 Multimedia video controller: Brooktree Corporation Bt878 Video
Capture (rev 11)
02:08.1 Multimedia controller: Brooktree Corporation Bt878 Audio
Capture (rev 11)
02:0c.0 Multimedia video controller: Brooktree Corporation Bt878 Video
Capture (rev 11)
02:0c.1 Multimedia controller: Brooktree Corporation Bt878 Audio
Capture (rev 11)
# lspci -nv
...
02:00.0 0400: 109e:036e (rev 11)
Subsystem: 800a:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdfff000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
Kernel modules: bttv
02:00.1 0480: 109e:0878 (rev 11)
Subsystem: 800a:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdffe000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
02:04.0 0400: 109e:036e (rev 11)
Subsystem: 800b:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdffd000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
Kernel modules: bttv
02:04.1 0480: 109e:0878 (rev 11)
Subsystem: 800b:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdffc000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
02:08.0 0400: 109e:036e (rev 11)
Subsystem: 800c:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdffb000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
Kernel modules: bttv
02:08.1 0480: 109e:0878 (rev 11)
Subsystem: 800c:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdffa000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
02:0c.0 0400: 109e:036e (rev 11)
Subsystem: 800d:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdff9000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
Kernel modules: bttv
02:0c.1 0480: 109e:0878 (rev 11)
Subsystem: 800d:763d
Flags: bus master, medium devsel, latency 32, IRQ 10
Memory at cdff8000 (32-bit, prefetchable) [size=4K]
Capabilities: [44] Vital Product Data <?>
Capabilities: [4c] Power Management version 2
As you can see, the GV-800(S) card is almost identical to the GV-800
on bttv-gallery, so this patch might also work for that card. If not,
only a few changes should be required on the gv800s_write() function.
After this patch, the video inputs work correctly. The input order may
seem a little odd, but it's the order the original software/driver
uses, and I decided to keep that order to get the most out of the
card.
I tried to get the audio working with the snd-bt87x module, but I only
get noise from every audio input, even after selecting a different mux
with alsamixer. Also, after trying to play sound from those sources, I
randomly get a RISC error about an invalid RISC opcode, and then that
output stops working. I also can't change the sampling rate when
recording. Any pointers to adding audio support are welcome.
Signed-off-by: Bruno Christo <bchristo@inf.ufsm.br>
diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
--- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
21:29:59 2009 -0300
+++ b/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
22:12:29 2009 -0300
@@ -155,3 +155,5 @@
154 -> PHYTEC VD-012-X1 (bt878)
155 -> PHYTEC VD-012-X2 (bt878)
156 -> IVCE-8784
[0000:f050,0001:f050,0002:f050,0003:f050]
+157 -> Geovision GV-800(S) (master) [800a:763d]
+158 -> Geovision GV-800(S) (slave)
[800b:763d,800c:763d,800d:763d]
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
--- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 21:29:59
2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 22:12:29
2009 -0300
@@ -75,6 +75,9 @@
static void geovision_muxsel(struct bttv *btv, unsigned int input);
static void phytec_muxsel(struct bttv *btv, unsigned int input);
+
+static void gv800s_muxsel(struct bttv *btv, unsigned int input);
+static void gv800s_init(struct bttv *btv);
static int terratec_active_radio_upgrade(struct bttv *btv);
static int tea5757_read(struct bttv *btv);
@@ -312,6 +315,10 @@
{ 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
{ 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
{ 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
+ { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },
+ { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
{ 0, -1, NULL }
};
@@ -2847,7 +2854,60 @@
.pll = PLL_28,
.tuner_type = TUNER_ABSENT,
.tuner_addr = ADDR_UNSET,
- }
+ },
+ [BTTV_BOARD_GEOVISION_GV800S] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * This is the first BT878A chip of the GV-800(S). It's the
+ * "master" chip and it controls the video inputs through an
+ * analog multiplexer (a CD22M3494) via some GPIO pins. The
+ * slaves should use card type 0x9e (following this one).
+ * There is a EEPROM on the card which is currently not handled.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (master)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0xf107f,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
+ [BTTV_BOARD_GEOVISION_GV800S_SL] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * The 3 other BT878A chips are "slave" chips of the GV-800(S)
+ * and should use this card type.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (slave)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0x00,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
};
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -3376,6 +3436,9 @@
case BTTV_BOARD_KODICOM_4400R:
kodicom4400r_init(btv);
break;
+ case BTTV_BOARD_GEOVISION_GV800S:
+ gv800s_init(btv);
+ break;
}
/* pll configuration */
@@ -4595,6 +4658,123 @@
gpio_bits(0x3, mux);
}
+/*
+ * GeoVision GV-800(S) functions
+ * Bruno Christo <bchristo@inf.ufsm.br>
+*/
+
+/* This is a function to control the analog switch, which determines which
+ * camera is routed to which controller. The switch comprises an X-address
+ * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
+ * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
+ * A data value (gpio bit 18) of '1' enables the switch, and '0' disables
+ * the switch. A STROBE bit (gpio bit 17) latches the data value into the
+ * specified address. There is also a chip select (gpio bit 16).
+ * The idea is to set the address and chip select together, bring
+ * STROBE high, write the data, and finally bring STROBE back to low.
+ */
+static void gv800s_write(struct bttv *btv,
+ unsigned char xaddr,
+ unsigned char yaddr,
+ unsigned char data) {
+ /* On the "master" 878A:
+ * GPIO bits 0-9 are used for the analog switch:
+ * 00 - 03: camera selector
+ * 04 - 06: 878A (controller) selector
+ * 16: cselect
+ * 17: strobe
+ * 18: data (1->on, 0->off)
+ * 19: reset
+ */
+ const u32 ADDR = ((xaddr&0xf) | (yaddr&3)<<4);
+ const u32 CSELECT = 1<<16;
+ const u32 STROBE = 1<<17;
+ const u32 DATA = data<<18;
+
+ gpio_bits(0x1007f, ADDR | CSELECT); /* write ADDR and CSELECT */
+ gpio_bits(0x20000, STROBE); /* STROBE high */
+ gpio_bits(0x40000, DATA); /* write DATA */
+ gpio_bits(0x20000, ~STROBE); /* STROBE low */
+}
+
+/*
+ * GeoVision GV-800(S) muxsel
+ *
+ * Each of the 4 cards (controllers) use this function.
+ * The controller using this function selects the input through the GPIO pins
+ * of the "master" card. A pointer to this card is stored in master[btv->c.nr].
+ *
+ * The parameter 'input' is the requested camera number (0-4) on the
controller.
+ * The map array has the address of each input. Note that the addresses in the
+ * array are in the sequence the original GeoVision driver uses, that is, set
+ * every controller to input 0, then to input 1, 2, 3, repeat. This means that
+ * the physical "camera 1" connector corresponds to controller 0 input 0,
+ * "camera 2" corresponds to controller 1 input 0, and so on.
+ *
+ * After getting the input address, the function then writes the appropriate
+ * data to the analog switch, and housekeeps the local copy of the switch
+ * information.
+ */
+static void gv800s_muxsel(struct bttv *btv, unsigned int input)
+{
+ struct bttv *mctlr;
+ char *sw_status;
+ int xaddr, yaddr;
+ static unsigned int map[4][4] = {{ 0x0, 0x4, 0xa, 0x6 },
+ { 0x1, 0x5, 0xb, 0x7 },
+ { 0x2, 0x8, 0xc, 0xe },
+ { 0x3, 0x9, 0xd, 0xf }};
+ input = input%4;
+ mctlr = master[btv->c.nr];
+ if (mctlr == NULL) {
+ // do nothing until the "master" is detected
+ return;
+ }
+ yaddr = (btv->c.nr - mctlr->c.nr) & 3;
+ sw_status = (char *)(&mctlr->mbox_we);
+ xaddr = map[yaddr][input] & 0xf;
+
+ // Check if the controller/camera pair has changed, ignore otherwise
+ if (sw_status[yaddr] != xaddr)
+ {
+ // disable the old switch, enable the new one and save status
+ gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
+ sw_status[yaddr] = xaddr;
+ gv800s_write(mctlr, xaddr, yaddr, 1);
+ }
+}
+
+/* GeoVision GV-800(S) "master" chip init */
+static void gv800s_init(struct bttv *btv)
+{
+ char *sw_status = (char *)(&btv->mbox_we);
+ int ix;
+
+ gpio_inout(0xf107f, 0xf107f);
+ gpio_write(1<<19); /* reset the analog MUX */
+ gpio_write(0);
+
+ /* Preset camera 0 to the 4 controllers */
+ for (ix = 0; ix < 4; ix++) {
+ sw_status[ix] = ix;
+ gv800s_write(btv, ix, ix, 1);
+ }
+
+ /* Inputs on the "master" controller need this brightness fix */
+ bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
+
+ if (btv->c.nr>BTTV_MAX-4)
+ return;
+ /*
+ * Store the "master" controller pointer in the master
+ * array for later use in the muxsel function.
+ */
+ master[btv->c.nr] = btv;
+ master[btv->c.nr+1] = btv;
+ master[btv->c.nr+2] = btv;
+ master[btv->c.nr+3] = btv;
+}
+
/* ----------------------------------------------------------------------- */
/* motherboard chipset specific stuff */
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
--- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 22:12:29 2009 -0300
@@ -182,6 +182,8 @@
#define BTTV_BOARD_VD012_X1 0x9a
#define BTTV_BOARD_VD012_X2 0x9b
#define BTTV_BOARD_IVCE8784 0x9c
+#define BTTV_BOARD_GEOVISION_GV800S 0x9d
+#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
/* more card-specific defines */
--
Bruno Christo
Bacharel em Ciência da Computação - UFSM
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] Add support for GeoVision GV-800(S)
2009-02-28 18:24 Bruno Christo
@ 2009-02-28 20:13 ` Bruno Christo
2009-03-02 13:59 ` Nicola Soranzo
0 siblings, 1 reply; 6+ messages in thread
From: Bruno Christo @ 2009-02-28 20:13 UTC (permalink / raw)
To: mchehab; +Cc: linux-media
I forgot to run make checkpatch before submitting the previous patch,
here is the fixed patch:
diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
--- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
21:29:59 2009 -0300
+++ b/linux/Documentation/video4linux/CARDLIST.bttv Sat Feb 28
17:09:23 2009 -0300
@@ -155,3 +155,5 @@
154 -> PHYTEC VD-012-X1 (bt878)
155 -> PHYTEC VD-012-X2 (bt878)
156 -> IVCE-8784
[0000:f050,0001:f050,0002:f050,0003:f050]
+157 -> Geovision GV-800(S) (master) [800a:763d]
+158 -> Geovision GV-800(S) (slave)
[800b:763d,800c:763d,800d:763d]
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
--- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 21:29:59
2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Sat Feb 28 17:09:23
2009 -0300
@@ -75,6 +75,9 @@
static void geovision_muxsel(struct bttv *btv, unsigned int input);
static void phytec_muxsel(struct bttv *btv, unsigned int input);
+
+static void gv800s_muxsel(struct bttv *btv, unsigned int input);
+static void gv800s_init(struct bttv *btv);
static int terratec_active_radio_upgrade(struct bttv *btv);
static int tea5757_read(struct bttv *btv);
@@ -312,6 +315,10 @@
{ 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
{ 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
{ 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
+ { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },
+ { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
{ 0, -1, NULL }
};
@@ -2847,7 +2854,60 @@
.pll = PLL_28,
.tuner_type = TUNER_ABSENT,
.tuner_addr = ADDR_UNSET,
- }
+ },
+ [BTTV_BOARD_GEOVISION_GV800S] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * This is the first BT878A chip of the GV-800(S). It's the
+ * "master" chip and it controls the video inputs through an
+ * analog multiplexer (a CD22M3494) via some GPIO pins. The
+ * slaves should use card type 0x9e (following this one).
+ * There is a EEPROM on the card which is currently not handled.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (master)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0xf107f,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
+ [BTTV_BOARD_GEOVISION_GV800S_SL] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * The 3 other BT878A chips are "slave" chips of the GV-800(S)
+ * and should use this card type.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (slave)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0x00,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
};
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -3376,6 +3436,9 @@
case BTTV_BOARD_KODICOM_4400R:
kodicom4400r_init(btv);
break;
+ case BTTV_BOARD_GEOVISION_GV800S:
+ gv800s_init(btv);
+ break;
}
/* pll configuration */
@@ -4595,6 +4658,122 @@
gpio_bits(0x3, mux);
}
+/*
+ * GeoVision GV-800(S) functions
+ * Bruno Christo <bchristo@inf.ufsm.br>
+*/
+
+/* This is a function to control the analog switch, which determines which
+ * camera is routed to which controller. The switch comprises an X-address
+ * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
+ * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
+ * A data value (gpio bit 18) of '1' enables the switch, and '0' disables
+ * the switch. A STROBE bit (gpio bit 17) latches the data value into the
+ * specified address. There is also a chip select (gpio bit 16).
+ * The idea is to set the address and chip select together, bring
+ * STROBE high, write the data, and finally bring STROBE back to low.
+ */
+static void gv800s_write(struct bttv *btv,
+ unsigned char xaddr,
+ unsigned char yaddr,
+ unsigned char data) {
+ /* On the "master" 878A:
+ * GPIO bits 0-9 are used for the analog switch:
+ * 00 - 03: camera selector
+ * 04 - 06: 878A (controller) selector
+ * 16: cselect
+ * 17: strobe
+ * 18: data (1->on, 0->off)
+ * 19: reset
+ */
+ const u32 ADDR = ((xaddr&0xf) | (yaddr&3)<<4);
+ const u32 CSELECT = 1<<16;
+ const u32 STROBE = 1<<17;
+ const u32 DATA = data<<18;
+
+ gpio_bits(0x1007f, ADDR | CSELECT); /* write ADDR and CSELECT */
+ gpio_bits(0x20000, STROBE); /* STROBE high */
+ gpio_bits(0x40000, DATA); /* write DATA */
+ gpio_bits(0x20000, ~STROBE); /* STROBE low */
+}
+
+/*
+ * GeoVision GV-800(S) muxsel
+ *
+ * Each of the 4 cards (controllers) use this function.
+ * The controller using this function selects the input through the GPIO pins
+ * of the "master" card. A pointer to this card is stored in master[btv->c.nr].
+ *
+ * The parameter 'input' is the requested camera number (0-4) on the
controller.
+ * The map array has the address of each input. Note that the addresses in the
+ * array are in the sequence the original GeoVision driver uses, that is, set
+ * every controller to input 0, then to input 1, 2, 3, repeat. This means that
+ * the physical "camera 1" connector corresponds to controller 0 input 0,
+ * "camera 2" corresponds to controller 1 input 0, and so on.
+ *
+ * After getting the input address, the function then writes the appropriate
+ * data to the analog switch, and housekeeps the local copy of the switch
+ * information.
+ */
+static void gv800s_muxsel(struct bttv *btv, unsigned int input)
+{
+ struct bttv *mctlr;
+ char *sw_status;
+ int xaddr, yaddr;
+ static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },
+ { 0x1, 0x5, 0xb, 0x7 },
+ { 0x2, 0x8, 0xc, 0xe },
+ { 0x3, 0x9, 0xd, 0xf } };
+ input = input%4;
+ mctlr = master[btv->c.nr];
+ if (mctlr == NULL) {
+ /* do nothing until the "master" is detected */
+ return;
+ }
+ yaddr = (btv->c.nr - mctlr->c.nr) & 3;
+ sw_status = (char *)(&mctlr->mbox_we);
+ xaddr = map[yaddr][input] & 0xf;
+
+ /* Check if the controller/camera pair has changed, ignore otherwise */
+ if (sw_status[yaddr] != xaddr) {
+ /* disable the old switch, enable the new one and save status */
+ gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
+ sw_status[yaddr] = xaddr;
+ gv800s_write(mctlr, xaddr, yaddr, 1);
+ }
+}
+
+/* GeoVision GV-800(S) "master" chip init */
+static void gv800s_init(struct bttv *btv)
+{
+ char *sw_status = (char *)(&btv->mbox_we);
+ int ix;
+
+ gpio_inout(0xf107f, 0xf107f);
+ gpio_write(1<<19); /* reset the analog MUX */
+ gpio_write(0);
+
+ /* Preset camera 0 to the 4 controllers */
+ for (ix = 0; ix < 4; ix++) {
+ sw_status[ix] = ix;
+ gv800s_write(btv, ix, ix, 1);
+ }
+
+ /* Inputs on the "master" controller need this brightness fix */
+ bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
+
+ if (btv->c.nr > BTTV_MAX-4)
+ return;
+ /*
+ * Store the "master" controller pointer in the master
+ * array for later use in the muxsel function.
+ */
+ master[btv->c.nr] = btv;
+ master[btv->c.nr+1] = btv;
+ master[btv->c.nr+2] = btv;
+ master[btv->c.nr+3] = btv;
+}
+
/* ----------------------------------------------------------------------- */
/* motherboard chipset specific stuff */
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
--- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv.h Sat Feb 28 17:09:23 2009 -0300
@@ -182,6 +182,8 @@
#define BTTV_BOARD_VD012_X1 0x9a
#define BTTV_BOARD_VD012_X2 0x9b
#define BTTV_BOARD_IVCE8784 0x9c
+#define BTTV_BOARD_GEOVISION_GV800S 0x9d
+#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
/* more card-specific defines */
2009/2/28 Bruno Christo <brunochristo@gmail.com>:
> Hello all,
>
> I have a GeoVision GV-800(S) card, it has 4 CONEXANT BT878A chips.
> It has 16 video inputs and 4 audio inputs, and it is almost identical
> to the GV-800, as seen on http://bttv-gallery.de .
> The only difference appears to be the analog mux, it has a CD22M3494
> in place of the MT8816AP. The card has a blue PCB, as seen in this
> picture: http://www.gsbr.com.br/imagem/kits/GeoVision%20GV%20800.jpg .
>
> This card wasn't originally supported, and it was detected as
> UNKNOWN/GENERIC. The video inputs weren't working, so I tried
> "forcing" a few cards like the GeoVision GV-600, but there was still
> no video. So I made a patch to support this card, based on the Kodicom
> 4400r.
>
> The GV-800(S) is identified as follows:
>
> # lspci
> ...
> 02:00.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> Capture (rev 11)
> 02:00.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> Capture (rev 11)
> 02:04.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> Capture (rev 11)
> 02:04.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> Capture (rev 11)
> 02:08.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> Capture (rev 11)
> 02:08.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> Capture (rev 11)
> 02:0c.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> Capture (rev 11)
> 02:0c.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> Capture (rev 11)
>
> # lspci -nv
> ...
> 02:00.0 0400: 109e:036e (rev 11)
> Subsystem: 800a:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdfff000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
> Kernel modules: bttv
>
> 02:00.1 0480: 109e:0878 (rev 11)
> Subsystem: 800a:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdffe000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
>
> 02:04.0 0400: 109e:036e (rev 11)
> Subsystem: 800b:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdffd000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
> Kernel modules: bttv
>
> 02:04.1 0480: 109e:0878 (rev 11)
> Subsystem: 800b:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdffc000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
>
> 02:08.0 0400: 109e:036e (rev 11)
> Subsystem: 800c:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdffb000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
> Kernel modules: bttv
>
> 02:08.1 0480: 109e:0878 (rev 11)
> Subsystem: 800c:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdffa000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
>
> 02:0c.0 0400: 109e:036e (rev 11)
> Subsystem: 800d:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdff9000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
> Kernel modules: bttv
>
> 02:0c.1 0480: 109e:0878 (rev 11)
> Subsystem: 800d:763d
> Flags: bus master, medium devsel, latency 32, IRQ 10
> Memory at cdff8000 (32-bit, prefetchable) [size=4K]
> Capabilities: [44] Vital Product Data <?>
> Capabilities: [4c] Power Management version 2
>
> As you can see, the GV-800(S) card is almost identical to the GV-800
> on bttv-gallery, so this patch might also work for that card. If not,
> only a few changes should be required on the gv800s_write() function.
>
> After this patch, the video inputs work correctly. The input order may
> seem a little odd, but it's the order the original software/driver
> uses, and I decided to keep that order to get the most out of the
> card.
>
> I tried to get the audio working with the snd-bt87x module, but I only
> get noise from every audio input, even after selecting a different mux
> with alsamixer. Also, after trying to play sound from those sources, I
> randomly get a RISC error about an invalid RISC opcode, and then that
> output stops working. I also can't change the sampling rate when
> recording. Any pointers to adding audio support are welcome.
>
> Signed-off-by: Bruno Christo <bchristo@inf.ufsm.br>
>
> diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
> --- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
> 21:29:59 2009 -0300
> +++ b/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
> 22:12:29 2009 -0300
> @@ -155,3 +155,5 @@
> 154 -> PHYTEC VD-012-X1 (bt878)
> 155 -> PHYTEC VD-012-X2 (bt878)
> 156 -> IVCE-8784
> [0000:f050,0001:f050,0002:f050,0003:f050]
> +157 -> Geovision GV-800(S) (master) [800a:763d]
> +158 -> Geovision GV-800(S) (slave)
> [800b:763d,800c:763d,800d:763d]
> diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
> --- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 21:29:59
> 2009 -0300
> +++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 22:12:29
> 2009 -0300
> @@ -75,6 +75,9 @@
> static void geovision_muxsel(struct bttv *btv, unsigned int input);
>
> static void phytec_muxsel(struct bttv *btv, unsigned int input);
> +
> +static void gv800s_muxsel(struct bttv *btv, unsigned int input);
> +static void gv800s_init(struct bttv *btv);
>
> static int terratec_active_radio_upgrade(struct bttv *btv);
> static int tea5757_read(struct bttv *btv);
> @@ -312,6 +315,10 @@
> { 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
> { 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
> { 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
> + { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },
> + { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
> + { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
> + { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
> { 0, -1, NULL }
> };
>
> @@ -2847,7 +2854,60 @@
> .pll = PLL_28,
> .tuner_type = TUNER_ABSENT,
> .tuner_addr = ADDR_UNSET,
> - }
> + },
> + [BTTV_BOARD_GEOVISION_GV800S] = {
> + /* Bruno Christo <bchristo@inf.ufsm.br>
> + *
> + * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
> + * 1 audio input per BT878A = 4 audio inputs
> + * 4 video inputs per BT878A = 16 video inputs
> + * This is the first BT878A chip of the GV-800(S). It's the
> + * "master" chip and it controls the video inputs through an
> + * analog multiplexer (a CD22M3494) via some GPIO pins. The
> + * slaves should use card type 0x9e (following this one).
> + * There is a EEPROM on the card which is currently not handled.
> + * The audio input is not working yet.
> + */
> + .name = "Geovision GV-800(S) (master)",
> + .video_inputs = 4,
> + /* .audio_inputs= 1, */
> + .tuner_type = TUNER_ABSENT,
> + .tuner_addr = ADDR_UNSET,
> + .svhs = NO_SVHS,
> + .gpiomask = 0xf107f,
> + .no_gpioirq = 1,
> + .muxsel = MUXSEL(2, 2, 2, 2),
> + .pll = PLL_28,
> + .no_msp34xx = 1,
> + .no_tda7432 = 1,
> + .no_tda9875 = 1,
> + .muxsel_hook = gv800s_muxsel,
> + },
> + [BTTV_BOARD_GEOVISION_GV800S_SL] = {
> + /* Bruno Christo <bchristo@inf.ufsm.br>
> + *
> + * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
> + * 1 audio input per BT878A = 4 audio inputs
> + * 4 video inputs per BT878A = 16 video inputs
> + * The 3 other BT878A chips are "slave" chips of the GV-800(S)
> + * and should use this card type.
> + * The audio input is not working yet.
> + */
> + .name = "Geovision GV-800(S) (slave)",
> + .video_inputs = 4,
> + /* .audio_inputs= 1, */
> + .tuner_type = TUNER_ABSENT,
> + .tuner_addr = ADDR_UNSET,
> + .svhs = NO_SVHS,
> + .gpiomask = 0x00,
> + .no_gpioirq = 1,
> + .muxsel = MUXSEL(2, 2, 2, 2),
> + .pll = PLL_28,
> + .no_msp34xx = 1,
> + .no_tda7432 = 1,
> + .no_tda9875 = 1,
> + .muxsel_hook = gv800s_muxsel,
> + },
> };
>
> static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
> @@ -3376,6 +3436,9 @@
> case BTTV_BOARD_KODICOM_4400R:
> kodicom4400r_init(btv);
> break;
> + case BTTV_BOARD_GEOVISION_GV800S:
> + gv800s_init(btv);
> + break;
> }
>
> /* pll configuration */
> @@ -4595,6 +4658,123 @@
> gpio_bits(0x3, mux);
> }
>
> +/*
> + * GeoVision GV-800(S) functions
> + * Bruno Christo <bchristo@inf.ufsm.br>
> +*/
> +
> +/* This is a function to control the analog switch, which determines which
> + * camera is routed to which controller. The switch comprises an X-address
> + * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
> + * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
> + * A data value (gpio bit 18) of '1' enables the switch, and '0' disables
> + * the switch. A STROBE bit (gpio bit 17) latches the data value into the
> + * specified address. There is also a chip select (gpio bit 16).
> + * The idea is to set the address and chip select together, bring
> + * STROBE high, write the data, and finally bring STROBE back to low.
> + */
> +static void gv800s_write(struct bttv *btv,
> + unsigned char xaddr,
> + unsigned char yaddr,
> + unsigned char data) {
> + /* On the "master" 878A:
> + * GPIO bits 0-9 are used for the analog switch:
> + * 00 - 03: camera selector
> + * 04 - 06: 878A (controller) selector
> + * 16: cselect
> + * 17: strobe
> + * 18: data (1->on, 0->off)
> + * 19: reset
> + */
> + const u32 ADDR = ((xaddr&0xf) | (yaddr&3)<<4);
> + const u32 CSELECT = 1<<16;
> + const u32 STROBE = 1<<17;
> + const u32 DATA = data<<18;
> +
> + gpio_bits(0x1007f, ADDR | CSELECT); /* write ADDR and CSELECT */
> + gpio_bits(0x20000, STROBE); /* STROBE high */
> + gpio_bits(0x40000, DATA); /* write DATA */
> + gpio_bits(0x20000, ~STROBE); /* STROBE low */
> +}
> +
> +/*
> + * GeoVision GV-800(S) muxsel
> + *
> + * Each of the 4 cards (controllers) use this function.
> + * The controller using this function selects the input through the GPIO pins
> + * of the "master" card. A pointer to this card is stored in master[btv->c.nr].
> + *
> + * The parameter 'input' is the requested camera number (0-4) on the
> controller.
> + * The map array has the address of each input. Note that the addresses in the
> + * array are in the sequence the original GeoVision driver uses, that is, set
> + * every controller to input 0, then to input 1, 2, 3, repeat. This means that
> + * the physical "camera 1" connector corresponds to controller 0 input 0,
> + * "camera 2" corresponds to controller 1 input 0, and so on.
> + *
> + * After getting the input address, the function then writes the appropriate
> + * data to the analog switch, and housekeeps the local copy of the switch
> + * information.
> + */
> +static void gv800s_muxsel(struct bttv *btv, unsigned int input)
> +{
> + struct bttv *mctlr;
> + char *sw_status;
> + int xaddr, yaddr;
> + static unsigned int map[4][4] = {{ 0x0, 0x4, 0xa, 0x6 },
> + { 0x1, 0x5, 0xb, 0x7 },
> + { 0x2, 0x8, 0xc, 0xe },
> + { 0x3, 0x9, 0xd, 0xf }};
> + input = input%4;
> + mctlr = master[btv->c.nr];
> + if (mctlr == NULL) {
> + // do nothing until the "master" is detected
> + return;
> + }
> + yaddr = (btv->c.nr - mctlr->c.nr) & 3;
> + sw_status = (char *)(&mctlr->mbox_we);
> + xaddr = map[yaddr][input] & 0xf;
> +
> + // Check if the controller/camera pair has changed, ignore otherwise
> + if (sw_status[yaddr] != xaddr)
> + {
> + // disable the old switch, enable the new one and save status
> + gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
> + sw_status[yaddr] = xaddr;
> + gv800s_write(mctlr, xaddr, yaddr, 1);
> + }
> +}
> +
> +/* GeoVision GV-800(S) "master" chip init */
> +static void gv800s_init(struct bttv *btv)
> +{
> + char *sw_status = (char *)(&btv->mbox_we);
> + int ix;
> +
> + gpio_inout(0xf107f, 0xf107f);
> + gpio_write(1<<19); /* reset the analog MUX */
> + gpio_write(0);
> +
> + /* Preset camera 0 to the 4 controllers */
> + for (ix = 0; ix < 4; ix++) {
> + sw_status[ix] = ix;
> + gv800s_write(btv, ix, ix, 1);
> + }
> +
> + /* Inputs on the "master" controller need this brightness fix */
> + bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
> +
> + if (btv->c.nr>BTTV_MAX-4)
> + return;
> + /*
> + * Store the "master" controller pointer in the master
> + * array for later use in the muxsel function.
> + */
> + master[btv->c.nr] = btv;
> + master[btv->c.nr+1] = btv;
> + master[btv->c.nr+2] = btv;
> + master[btv->c.nr+3] = btv;
> +}
> +
> /* ----------------------------------------------------------------------- */
> /* motherboard chipset specific stuff */
>
> diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
> --- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009 -0300
> +++ b/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 22:12:29 2009 -0300
> @@ -182,6 +182,8 @@
> #define BTTV_BOARD_VD012_X1 0x9a
> #define BTTV_BOARD_VD012_X2 0x9b
> #define BTTV_BOARD_IVCE8784 0x9c
> +#define BTTV_BOARD_GEOVISION_GV800S 0x9d
> +#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
>
>
> /* more card-specific defines */
> --
> Bruno Christo
> Bacharel em Ciência da Computação - UFSM
>
--
Bruno Christo
Bacharel em Ciência da Computação - UFSM
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] Add support for GeoVision GV-800(S)
2009-02-28 20:13 ` Bruno Christo
@ 2009-03-02 13:59 ` Nicola Soranzo
2009-03-02 17:54 ` Bruno Christo
0 siblings, 1 reply; 6+ messages in thread
From: Nicola Soranzo @ 2009-03-02 13:59 UTC (permalink / raw)
To: Bruno Christo, linux-media
Hi Bruno,
it look like that your e-mail program is line wrapping your patch.
Please read email-clients.txt in Linux Documentation and resubmit the patch,
otherwise it cannot be correctly handled by patchwork.kernel.org .
Thanks,
Nicola
Alle sabato 28 febbraio 2009, Bruno Christo ha scritto:
> I forgot to run make checkpatch before submitting the previous patch,
> here is the fixed patch:
>
> diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
> --- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
> 21:29:59 2009 -0300
> +++ b/linux/Documentation/video4linux/CARDLIST.bttv Sat Feb 28
> 17:09:23 2009 -0300
> @@ -155,3 +155,5 @@
> 154 -> PHYTEC VD-012-X1 (bt878)
> 155 -> PHYTEC VD-012-X2 (bt878)
> 156 -> IVCE-8784
> [0000:f050,0001:f050,0002:f050,0003:f050]
> +157 -> Geovision GV-800(S) (master) [800a:763d]
> +158 -> Geovision GV-800(S) (slave)
> [800b:763d,800c:763d,800d:763d]
> diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
> --- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 21:29:59
> 2009 -0300
> +++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Sat Feb 28 17:09:23
> 2009 -0300
> @@ -75,6 +75,9 @@
> static void geovision_muxsel(struct bttv *btv, unsigned int input);
>
> static void phytec_muxsel(struct bttv *btv, unsigned int input);
> +
> +static void gv800s_muxsel(struct bttv *btv, unsigned int input);
> +static void gv800s_init(struct bttv *btv);
>
> static int terratec_active_radio_upgrade(struct bttv *btv);
> static int tea5757_read(struct bttv *btv);
> @@ -312,6 +315,10 @@
> { 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
> { 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
> { 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
> + { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)"
> }, + { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S)
> (slave)" }, + { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision
> GV-800(S) (slave)" }, + { 0x763d800d,
> BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" }, { 0, -1,
> NULL }
> };
>
> @@ -2847,7 +2854,60 @@
> .pll = PLL_28,
> .tuner_type = TUNER_ABSENT,
> .tuner_addr = ADDR_UNSET,
> - }
> + },
> + [BTTV_BOARD_GEOVISION_GV800S] = {
> + /* Bruno Christo <bchristo@inf.ufsm.br>
> + *
> + * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
> + * 1 audio input per BT878A = 4 audio inputs
> + * 4 video inputs per BT878A = 16 video inputs
> + * This is the first BT878A chip of the GV-800(S). It's the
> + * "master" chip and it controls the video inputs through an
> + * analog multiplexer (a CD22M3494) via some GPIO pins. The
> + * slaves should use card type 0x9e (following this one).
> + * There is a EEPROM on the card which is currently not handled.
> + * The audio input is not working yet.
> + */
> + .name = "Geovision GV-800(S) (master)",
> + .video_inputs = 4,
> + /* .audio_inputs= 1, */
> + .tuner_type = TUNER_ABSENT,
> + .tuner_addr = ADDR_UNSET,
> + .svhs = NO_SVHS,
> + .gpiomask = 0xf107f,
> + .no_gpioirq = 1,
> + .muxsel = MUXSEL(2, 2, 2, 2),
> + .pll = PLL_28,
> + .no_msp34xx = 1,
> + .no_tda7432 = 1,
> + .no_tda9875 = 1,
> + .muxsel_hook = gv800s_muxsel,
> + },
> + [BTTV_BOARD_GEOVISION_GV800S_SL] = {
> + /* Bruno Christo <bchristo@inf.ufsm.br>
> + *
> + * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
> + * 1 audio input per BT878A = 4 audio inputs
> + * 4 video inputs per BT878A = 16 video inputs
> + * The 3 other BT878A chips are "slave" chips of the GV-800(S)
> + * and should use this card type.
> + * The audio input is not working yet.
> + */
> + .name = "Geovision GV-800(S) (slave)",
> + .video_inputs = 4,
> + /* .audio_inputs= 1, */
> + .tuner_type = TUNER_ABSENT,
> + .tuner_addr = ADDR_UNSET,
> + .svhs = NO_SVHS,
> + .gpiomask = 0x00,
> + .no_gpioirq = 1,
> + .muxsel = MUXSEL(2, 2, 2, 2),
> + .pll = PLL_28,
> + .no_msp34xx = 1,
> + .no_tda7432 = 1,
> + .no_tda9875 = 1,
> + .muxsel_hook = gv800s_muxsel,
> + },
> };
>
> static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
> @@ -3376,6 +3436,9 @@
> case BTTV_BOARD_KODICOM_4400R:
> kodicom4400r_init(btv);
> break;
> + case BTTV_BOARD_GEOVISION_GV800S:
> + gv800s_init(btv);
> + break;
> }
>
> /* pll configuration */
> @@ -4595,6 +4658,122 @@
> gpio_bits(0x3, mux);
> }
>
> +/*
> + * GeoVision GV-800(S) functions
> + * Bruno Christo <bchristo@inf.ufsm.br>
> +*/
> +
> +/* This is a function to control the analog switch, which determines which
> + * camera is routed to which controller. The switch comprises an
> X-address + * (gpio bits 0-3, representing the camera, ranging from 0-15),
> and a + * Y-address (gpio bits 4-6, representing the controller, ranging
> from 0-3). + * A data value (gpio bit 18) of '1' enables the switch, and
> '0' disables + * the switch. A STROBE bit (gpio bit 17) latches the data
> value into the + * specified address. There is also a chip select (gpio bit
> 16).
> + * The idea is to set the address and chip select together, bring
> + * STROBE high, write the data, and finally bring STROBE back to low.
> + */
> +static void gv800s_write(struct bttv *btv,
> + unsigned char xaddr,
> + unsigned char yaddr,
> + unsigned char data) {
> + /* On the "master" 878A:
> + * GPIO bits 0-9 are used for the analog switch:
> + * 00 - 03: camera selector
> + * 04 - 06: 878A (controller) selector
> + * 16: cselect
> + * 17: strobe
> + * 18: data (1->on, 0->off)
> + * 19: reset
> + */
> + const u32 ADDR = ((xaddr&0xf) | (yaddr&3)<<4);
> + const u32 CSELECT = 1<<16;
> + const u32 STROBE = 1<<17;
> + const u32 DATA = data<<18;
> +
> + gpio_bits(0x1007f, ADDR | CSELECT); /* write ADDR and CSELECT */
> + gpio_bits(0x20000, STROBE); /* STROBE high */
> + gpio_bits(0x40000, DATA); /* write DATA */
> + gpio_bits(0x20000, ~STROBE); /* STROBE low */
> +}
> +
> +/*
> + * GeoVision GV-800(S) muxsel
> + *
> + * Each of the 4 cards (controllers) use this function.
> + * The controller using this function selects the input through the GPIO
> pins + * of the "master" card. A pointer to this card is stored in
> master[btv->c.nr]. + *
> + * The parameter 'input' is the requested camera number (0-4) on the
> controller.
> + * The map array has the address of each input. Note that the addresses in
> the + * array are in the sequence the original GeoVision driver uses, that
> is, set + * every controller to input 0, then to input 1, 2, 3, repeat.
> This means that + * the physical "camera 1" connector corresponds to
> controller 0 input 0, + * "camera 2" corresponds to controller 1 input 0,
> and so on.
> + *
> + * After getting the input address, the function then writes the
> appropriate + * data to the analog switch, and housekeeps the local copy of
> the switch + * information.
> + */
> +static void gv800s_muxsel(struct bttv *btv, unsigned int input)
> +{
> + struct bttv *mctlr;
> + char *sw_status;
> + int xaddr, yaddr;
> + static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },
> + { 0x1, 0x5, 0xb, 0x7 },
> + { 0x2, 0x8, 0xc, 0xe },
> + { 0x3, 0x9, 0xd, 0xf } };
> + input = input%4;
> + mctlr = master[btv->c.nr];
> + if (mctlr == NULL) {
> + /* do nothing until the "master" is detected */
> + return;
> + }
> + yaddr = (btv->c.nr - mctlr->c.nr) & 3;
> + sw_status = (char *)(&mctlr->mbox_we);
> + xaddr = map[yaddr][input] & 0xf;
> +
> + /* Check if the controller/camera pair has changed, ignore otherwise */
> + if (sw_status[yaddr] != xaddr) {
> + /* disable the old switch, enable the new one and save status */
> + gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
> + sw_status[yaddr] = xaddr;
> + gv800s_write(mctlr, xaddr, yaddr, 1);
> + }
> +}
> +
> +/* GeoVision GV-800(S) "master" chip init */
> +static void gv800s_init(struct bttv *btv)
> +{
> + char *sw_status = (char *)(&btv->mbox_we);
> + int ix;
> +
> + gpio_inout(0xf107f, 0xf107f);
> + gpio_write(1<<19); /* reset the analog MUX */
> + gpio_write(0);
> +
> + /* Preset camera 0 to the 4 controllers */
> + for (ix = 0; ix < 4; ix++) {
> + sw_status[ix] = ix;
> + gv800s_write(btv, ix, ix, 1);
> + }
> +
> + /* Inputs on the "master" controller need this brightness fix */
> + bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
> +
> + if (btv->c.nr > BTTV_MAX-4)
> + return;
> + /*
> + * Store the "master" controller pointer in the master
> + * array for later use in the muxsel function.
> + */
> + master[btv->c.nr] = btv;
> + master[btv->c.nr+1] = btv;
> + master[btv->c.nr+2] = btv;
> + master[btv->c.nr+3] = btv;
> +}
> +
> /* -----------------------------------------------------------------------
> */ /* motherboard chipset specific stuff
> */
>
> diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
> --- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009 -0300
> +++ b/linux/drivers/media/video/bt8xx/bttv.h Sat Feb 28 17:09:23 2009 -0300
> @@ -182,6 +182,8 @@
> #define BTTV_BOARD_VD012_X1 0x9a
> #define BTTV_BOARD_VD012_X2 0x9b
> #define BTTV_BOARD_IVCE8784 0x9c
> +#define BTTV_BOARD_GEOVISION_GV800S 0x9d
> +#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
>
>
> /* more card-specific defines */
>
> 2009/2/28 Bruno Christo <brunochristo@gmail.com>:
> > Hello all,
> >
> > I have a GeoVision GV-800(S) card, it has 4 CONEXANT BT878A chips.
> > It has 16 video inputs and 4 audio inputs, and it is almost identical
> > to the GV-800, as seen on http://bttv-gallery.de .
> > The only difference appears to be the analog mux, it has a CD22M3494
> > in place of the MT8816AP. The card has a blue PCB, as seen in this
> > picture: http://www.gsbr.com.br/imagem/kits/GeoVision%20GV%20800.jpg .
> >
> > This card wasn't originally supported, and it was detected as
> > UNKNOWN/GENERIC. The video inputs weren't working, so I tried
> > "forcing" a few cards like the GeoVision GV-600, but there was still
> > no video. So I made a patch to support this card, based on the Kodicom
> > 4400r.
> >
> > The GV-800(S) is identified as follows:
> >
> > # lspci
> > ...
> > 02:00.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> > Capture (rev 11)
> > 02:00.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> > Capture (rev 11)
> > 02:04.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> > Capture (rev 11)
> > 02:04.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> > Capture (rev 11)
> > 02:08.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> > Capture (rev 11)
> > 02:08.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> > Capture (rev 11)
> > 02:0c.0 Multimedia video controller: Brooktree Corporation Bt878 Video
> > Capture (rev 11)
> > 02:0c.1 Multimedia controller: Brooktree Corporation Bt878 Audio
> > Capture (rev 11)
> >
> > # lspci -nv
> > ...
> > 02:00.0 0400: 109e:036e (rev 11)
> > Subsystem: 800a:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdfff000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> > Kernel modules: bttv
> >
> > 02:00.1 0480: 109e:0878 (rev 11)
> > Subsystem: 800a:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdffe000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> >
> > 02:04.0 0400: 109e:036e (rev 11)
> > Subsystem: 800b:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdffd000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> > Kernel modules: bttv
> >
> > 02:04.1 0480: 109e:0878 (rev 11)
> > Subsystem: 800b:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdffc000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> >
> > 02:08.0 0400: 109e:036e (rev 11)
> > Subsystem: 800c:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdffb000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> > Kernel modules: bttv
> >
> > 02:08.1 0480: 109e:0878 (rev 11)
> > Subsystem: 800c:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdffa000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> >
> > 02:0c.0 0400: 109e:036e (rev 11)
> > Subsystem: 800d:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdff9000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> > Kernel modules: bttv
> >
> > 02:0c.1 0480: 109e:0878 (rev 11)
> > Subsystem: 800d:763d
> > Flags: bus master, medium devsel, latency 32, IRQ 10
> > Memory at cdff8000 (32-bit, prefetchable) [size=4K]
> > Capabilities: [44] Vital Product Data <?>
> > Capabilities: [4c] Power Management version 2
> >
> > As you can see, the GV-800(S) card is almost identical to the GV-800
> > on bttv-gallery, so this patch might also work for that card. If not,
> > only a few changes should be required on the gv800s_write() function.
> >
> > After this patch, the video inputs work correctly. The input order may
> > seem a little odd, but it's the order the original software/driver
> > uses, and I decided to keep that order to get the most out of the
> > card.
> >
> > I tried to get the audio working with the snd-bt87x module, but I only
> > get noise from every audio input, even after selecting a different mux
> > with alsamixer. Also, after trying to play sound from those sources, I
> > randomly get a RISC error about an invalid RISC opcode, and then that
> > output stops working. I also can't change the sampling rate when
> > recording. Any pointers to adding audio support are welcome.
> >
> > Signed-off-by: Bruno Christo <bchristo@inf.ufsm.br>
> >
> > diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
> > --- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
> > 21:29:59 2009 -0300
> > +++ b/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27
> > 22:12:29 2009 -0300
> > @@ -155,3 +155,5 @@
> > 154 -> PHYTEC VD-012-X1 (bt878)
> > 155 -> PHYTEC VD-012-X2 (bt878)
> > 156 -> IVCE-8784
> > [0000:f050,0001:f050,0002:f050,0003:f050]
> > +157 -> Geovision GV-800(S) (master) [800a:763d]
> > +158 -> Geovision GV-800(S) (slave)
> > [800b:763d,800c:763d,800d:763d]
> > diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
> > --- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27
> > 21:29:59 2009 -0300
> > +++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27
> > 22:12:29 2009 -0300
> > @@ -75,6 +75,9 @@
> > static void geovision_muxsel(struct bttv *btv, unsigned int input);
> >
> > static void phytec_muxsel(struct bttv *btv, unsigned int input);
> > +
> > +static void gv800s_muxsel(struct bttv *btv, unsigned int input);
> > +static void gv800s_init(struct bttv *btv);
> >
> > static int terratec_active_radio_upgrade(struct bttv *btv);
> > static int tea5757_read(struct bttv *btv);
> > @@ -312,6 +315,10 @@
> > { 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV
> > 2" }, { 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600"
> > }, { 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" }, +
> > { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S)
> > (master)" }, + { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL,
> > "GeoVision GV-800(S) (slave)" }, + { 0x763d800c,
> > BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" }, +
> > { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S)
> > (slave)" }, { 0, -1, NULL }
> > };
> >
> > @@ -2847,7 +2854,60 @@
> > .pll = PLL_28,
> > .tuner_type = TUNER_ABSENT,
> > .tuner_addr = ADDR_UNSET,
> > - }
> > + },
> > + [BTTV_BOARD_GEOVISION_GV800S] = {
> > + /* Bruno Christo <bchristo@inf.ufsm.br>
> > + *
> > + * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
> > + * 1 audio input per BT878A = 4 audio inputs
> > + * 4 video inputs per BT878A = 16 video inputs
> > + * This is the first BT878A chip of the GV-800(S). It's
> > the + * "master" chip and it controls the video inputs
> > through an + * analog multiplexer (a CD22M3494) via some
> > GPIO pins. The + * slaves should use card type 0x9e
> > (following this one). + * There is a EEPROM on the card
> > which is currently not handled. + * The audio input is not
> > working yet.
> > + */
> > + .name = "Geovision GV-800(S) (master)",
> > + .video_inputs = 4,
> > + /* .audio_inputs= 1, */
> > + .tuner_type = TUNER_ABSENT,
> > + .tuner_addr = ADDR_UNSET,
> > + .svhs = NO_SVHS,
> > + .gpiomask = 0xf107f,
> > + .no_gpioirq = 1,
> > + .muxsel = MUXSEL(2, 2, 2, 2),
> > + .pll = PLL_28,
> > + .no_msp34xx = 1,
> > + .no_tda7432 = 1,
> > + .no_tda9875 = 1,
> > + .muxsel_hook = gv800s_muxsel,
> > + },
> > + [BTTV_BOARD_GEOVISION_GV800S_SL] = {
> > + /* Bruno Christo <bchristo@inf.ufsm.br>
> > + *
> > + * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
> > + * 1 audio input per BT878A = 4 audio inputs
> > + * 4 video inputs per BT878A = 16 video inputs
> > + * The 3 other BT878A chips are "slave" chips of the
> > GV-800(S) + * and should use this card type.
> > + * The audio input is not working yet.
> > + */
> > + .name = "Geovision GV-800(S) (slave)",
> > + .video_inputs = 4,
> > + /* .audio_inputs= 1, */
> > + .tuner_type = TUNER_ABSENT,
> > + .tuner_addr = ADDR_UNSET,
> > + .svhs = NO_SVHS,
> > + .gpiomask = 0x00,
> > + .no_gpioirq = 1,
> > + .muxsel = MUXSEL(2, 2, 2, 2),
> > + .pll = PLL_28,
> > + .no_msp34xx = 1,
> > + .no_tda7432 = 1,
> > + .no_tda9875 = 1,
> > + .muxsel_hook = gv800s_muxsel,
> > + },
> > };
> >
> > static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
> > @@ -3376,6 +3436,9 @@
> > case BTTV_BOARD_KODICOM_4400R:
> > kodicom4400r_init(btv);
> > break;
> > + case BTTV_BOARD_GEOVISION_GV800S:
> > + gv800s_init(btv);
> > + break;
> > }
> >
> > /* pll configuration */
> > @@ -4595,6 +4658,123 @@
> > gpio_bits(0x3, mux);
> > }
> >
> > +/*
> > + * GeoVision GV-800(S) functions
> > + * Bruno Christo <bchristo@inf.ufsm.br>
> > +*/
> > +
> > +/* This is a function to control the analog switch, which determines
> > which + * camera is routed to which controller. The switch comprises an
> > X-address + * (gpio bits 0-3, representing the camera, ranging from
> > 0-15), and a + * Y-address (gpio bits 4-6, representing the controller,
> > ranging from 0-3). + * A data value (gpio bit 18) of '1' enables the
> > switch, and '0' disables + * the switch. A STROBE bit (gpio bit 17)
> > latches the data value into the + * specified address. There is also a
> > chip select (gpio bit 16). + * The idea is to set the address and chip
> > select together, bring + * STROBE high, write the data, and finally bring
> > STROBE back to low. + */
> > +static void gv800s_write(struct bttv *btv,
> > + unsigned char xaddr,
> > + unsigned char yaddr,
> > + unsigned char data) {
> > + /* On the "master" 878A:
> > + * GPIO bits 0-9 are used for the analog switch:
> > + * 00 - 03: camera selector
> > + * 04 - 06: 878A (controller) selector
> > + * 16: cselect
> > + * 17: strobe
> > + * 18: data (1->on, 0->off)
> > + * 19: reset
> > + */
> > + const u32 ADDR = ((xaddr&0xf) | (yaddr&3)<<4);
> > + const u32 CSELECT = 1<<16;
> > + const u32 STROBE = 1<<17;
> > + const u32 DATA = data<<18;
> > +
> > + gpio_bits(0x1007f, ADDR | CSELECT); /* write ADDR and CSELECT
> > */ + gpio_bits(0x20000, STROBE); /* STROBE high */ +
> > gpio_bits(0x40000, DATA); /* write DATA */ +
> > gpio_bits(0x20000, ~STROBE); /* STROBE low */ +}
> > +
> > +/*
> > + * GeoVision GV-800(S) muxsel
> > + *
> > + * Each of the 4 cards (controllers) use this function.
> > + * The controller using this function selects the input through the GPIO
> > pins + * of the "master" card. A pointer to this card is stored in
> > master[btv->c.nr]. + *
> > + * The parameter 'input' is the requested camera number (0-4) on the
> > controller.
> > + * The map array has the address of each input. Note that the addresses
> > in the + * array are in the sequence the original GeoVision driver uses,
> > that is, set + * every controller to input 0, then to input 1, 2, 3,
> > repeat. This means that + * the physical "camera 1" connector corresponds
> > to controller 0 input 0, + * "camera 2" corresponds to controller 1 input
> > 0, and so on.
> > + *
> > + * After getting the input address, the function then writes the
> > appropriate + * data to the analog switch, and housekeeps the local copy
> > of the switch + * information.
> > + */
> > +static void gv800s_muxsel(struct bttv *btv, unsigned int input)
> > +{
> > + struct bttv *mctlr;
> > + char *sw_status;
> > + int xaddr, yaddr;
> > + static unsigned int map[4][4] = {{ 0x0, 0x4, 0xa, 0x6 },
> > + { 0x1, 0x5, 0xb, 0x7 },
> > + { 0x2, 0x8, 0xc, 0xe },
> > + { 0x3, 0x9, 0xd, 0xf }};
> > + input = input%4;
> > + mctlr = master[btv->c.nr];
> > + if (mctlr == NULL) {
> > + // do nothing until the "master" is detected
> > + return;
> > + }
> > + yaddr = (btv->c.nr - mctlr->c.nr) & 3;
> > + sw_status = (char *)(&mctlr->mbox_we);
> > + xaddr = map[yaddr][input] & 0xf;
> > +
> > + // Check if the controller/camera pair has changed, ignore
> > otherwise + if (sw_status[yaddr] != xaddr)
> > + {
> > + // disable the old switch, enable the new one and save
> > status + gv800s_write(mctlr, sw_status[yaddr], yaddr, 0); +
> > sw_status[yaddr] = xaddr;
> > + gv800s_write(mctlr, xaddr, yaddr, 1);
> > + }
> > +}
> > +
> > +/* GeoVision GV-800(S) "master" chip init */
> > +static void gv800s_init(struct bttv *btv)
> > +{
> > + char *sw_status = (char *)(&btv->mbox_we);
> > + int ix;
> > +
> > + gpio_inout(0xf107f, 0xf107f);
> > + gpio_write(1<<19); /* reset the analog MUX */
> > + gpio_write(0);
> > +
> > + /* Preset camera 0 to the 4 controllers */
> > + for (ix = 0; ix < 4; ix++) {
> > + sw_status[ix] = ix;
> > + gv800s_write(btv, ix, ix, 1);
> > + }
> > +
> > + /* Inputs on the "master" controller need this brightness fix */
> > + bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
> > +
> > + if (btv->c.nr>BTTV_MAX-4)
> > + return;
> > + /*
> > + * Store the "master" controller pointer in the master
> > + * array for later use in the muxsel function.
> > + */
> > + master[btv->c.nr] = btv;
> > + master[btv->c.nr+1] = btv;
> > + master[btv->c.nr+2] = btv;
> > + master[btv->c.nr+3] = btv;
> > +}
> > +
> > /*
> > -----------------------------------------------------------------------
> > */ /* motherboard chipset specific stuff
> > */
> >
> > diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
> > --- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009
> > -0300 +++ b/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 22:12:29
> > 2009 -0300 @@ -182,6 +182,8 @@
> > #define BTTV_BOARD_VD012_X1 0x9a
> > #define BTTV_BOARD_VD012_X2 0x9b
> > #define BTTV_BOARD_IVCE8784 0x9c
> > +#define BTTV_BOARD_GEOVISION_GV800S 0x9d
> > +#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
> >
> >
> > /* more card-specific defines */
> > --
> > Bruno Christo
> > Bacharel em Ciência da Computação - UFSM
--
Nicola Soranzo
http://nsoranzo.altervista.org
Presidente del GOLUG - Gorizia Linux User Group
http://www.golug.it
La mia chiave PGP: http://nsoranzo.altervista.org/key.asc
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] Add support for GeoVision GV-800(S)
2009-03-02 13:59 ` Nicola Soranzo
@ 2009-03-02 17:54 ` Bruno Christo
2009-03-02 18:06 ` Alexey Klimov
0 siblings, 1 reply; 6+ messages in thread
From: Bruno Christo @ 2009-03-02 17:54 UTC (permalink / raw)
To: Nicola Soranzo; +Cc: linux-media
[-- Attachment #1: Type: text/plain, Size: 771 bytes --]
Hi Nicola,
2009/3/2 Nicola Soranzo <nsoranzo@tiscali.it>:
> Hi Bruno,
> it look like that your e-mail program is line wrapping your patch.
> Please read email-clients.txt in Linux Documentation and resubmit the patch,
> otherwise it cannot be correctly handled by patchwork.kernel.org .
> Thanks,
> Nicola
As you requested, i'm re-submitting the patch. I read email-clients.txt,
and I tried to send the patch as part of the body via Gmail with an
external editor,
evolution, mutt and alpine, but Gmail insists in converting the tabs
to whitespace
no matter the client used, so I had no choice but to send it as a MIME
attachment.
Signed-off-by: Bruno Christo <bchristo@inf.ufsm.br>
--
Bruno Christo
Bacharel em Ciência da Computação - UFSM
[-- Attachment #2: gv800s.diff --]
[-- Type: text/x-diff, Size: 8630 bytes --]
diff -r c770b20d15c6 linux/Documentation/video4linux/CARDLIST.bttv
--- a/linux/Documentation/video4linux/CARDLIST.bttv Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/Documentation/video4linux/CARDLIST.bttv Sun Mar 01 16:01:31 2009 +0000
@@ -155,3 +155,5 @@
154 -> PHYTEC VD-012-X1 (bt878)
155 -> PHYTEC VD-012-X2 (bt878)
156 -> IVCE-8784 [0000:f050,0001:f050,0002:f050,0003:f050]
+157 -> Geovision GV-800(S) (master) [800a:763d]
+158 -> Geovision GV-800(S) (slave) [800b:763d,800c:763d,800d:763d]
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv-cards.c
--- a/linux/drivers/media/video/bt8xx/bttv-cards.c Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv-cards.c Sun Mar 01 16:01:31 2009 +0000
@@ -75,6 +75,9 @@
static void geovision_muxsel(struct bttv *btv, unsigned int input);
static void phytec_muxsel(struct bttv *btv, unsigned int input);
+
+static void gv800s_muxsel(struct bttv *btv, unsigned int input);
+static void gv800s_init(struct bttv *btv);
static int terratec_active_radio_upgrade(struct bttv *btv);
static int tea5757_read(struct bttv *btv);
@@ -312,6 +315,10 @@
{ 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
{ 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
{ 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
+ { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },
+ { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
+ { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },
{ 0, -1, NULL }
};
@@ -2847,7 +2854,60 @@
.pll = PLL_28,
.tuner_type = TUNER_ABSENT,
.tuner_addr = ADDR_UNSET,
- }
+ },
+ [BTTV_BOARD_GEOVISION_GV800S] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * This is the first BT878A chip of the GV-800(S). It's the
+ * "master" chip and it controls the video inputs through an
+ * analog multiplexer (a CD22M3494) via some GPIO pins. The
+ * slaves should use card type 0x9e (following this one).
+ * There is a EEPROM on the card which is currently not handled.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (master)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0xf107f,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
+ [BTTV_BOARD_GEOVISION_GV800S_SL] = {
+ /* Bruno Christo <bchristo@inf.ufsm.br>
+ *
+ * GeoVision GV-800(S) has 4 Conexant Fusion 878A:
+ * 1 audio input per BT878A = 4 audio inputs
+ * 4 video inputs per BT878A = 16 video inputs
+ * The 3 other BT878A chips are "slave" chips of the GV-800(S)
+ * and should use this card type.
+ * The audio input is not working yet.
+ */
+ .name = "Geovision GV-800(S) (slave)",
+ .video_inputs = 4,
+ /* .audio_inputs= 1, */
+ .tuner_type = TUNER_ABSENT,
+ .tuner_addr = ADDR_UNSET,
+ .svhs = NO_SVHS,
+ .gpiomask = 0x00,
+ .no_gpioirq = 1,
+ .muxsel = MUXSEL(2, 2, 2, 2),
+ .pll = PLL_28,
+ .no_msp34xx = 1,
+ .no_tda7432 = 1,
+ .no_tda9875 = 1,
+ .muxsel_hook = gv800s_muxsel,
+ },
};
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
@@ -3376,6 +3436,9 @@
case BTTV_BOARD_KODICOM_4400R:
kodicom4400r_init(btv);
break;
+ case BTTV_BOARD_GEOVISION_GV800S:
+ gv800s_init(btv);
+ break;
}
/* pll configuration */
@@ -4595,6 +4658,122 @@
gpio_bits(0x3, mux);
}
+/*
+ * GeoVision GV-800(S) functions
+ * Bruno Christo <bchristo@inf.ufsm.br>
+*/
+
+/* This is a function to control the analog switch, which determines which
+ * camera is routed to which controller. The switch comprises an X-address
+ * (gpio bits 0-3, representing the camera, ranging from 0-15), and a
+ * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).
+ * A data value (gpio bit 18) of '1' enables the switch, and '0' disables
+ * the switch. A STROBE bit (gpio bit 17) latches the data value into the
+ * specified address. There is also a chip select (gpio bit 16).
+ * The idea is to set the address and chip select together, bring
+ * STROBE high, write the data, and finally bring STROBE back to low.
+ */
+static void gv800s_write(struct bttv *btv,
+ unsigned char xaddr,
+ unsigned char yaddr,
+ unsigned char data) {
+ /* On the "master" 878A:
+ * GPIO bits 0-9 are used for the analog switch:
+ * 00 - 03: camera selector
+ * 04 - 06: 878A (controller) selector
+ * 16: cselect
+ * 17: strobe
+ * 18: data (1->on, 0->off)
+ * 19: reset
+ */
+ const u32 ADDRESS = ((xaddr&0xf) | (yaddr&3)<<4);
+ const u32 CSELECT = 1<<16;
+ const u32 STROBE = 1<<17;
+ const u32 DATA = data<<18;
+
+ gpio_bits(0x1007f, ADDRESS | CSELECT); /* write ADDRESS and CSELECT */
+ gpio_bits(0x20000, STROBE); /* STROBE high */
+ gpio_bits(0x40000, DATA); /* write DATA */
+ gpio_bits(0x20000, ~STROBE); /* STROBE low */
+}
+
+/*
+ * GeoVision GV-800(S) muxsel
+ *
+ * Each of the 4 cards (controllers) use this function.
+ * The controller using this function selects the input through the GPIO pins
+ * of the "master" card. A pointer to this card is stored in master[btv->c.nr].
+ *
+ * The parameter 'input' is the requested camera number (0-4) on the controller.
+ * The map array has the address of each input. Note that the addresses in the
+ * array are in the sequence the original GeoVision driver uses, that is, set
+ * every controller to input 0, then to input 1, 2, 3, repeat. This means that
+ * the physical "camera 1" connector corresponds to controller 0 input 0,
+ * "camera 2" corresponds to controller 1 input 0, and so on.
+ *
+ * After getting the input address, the function then writes the appropriate
+ * data to the analog switch, and housekeeps the local copy of the switch
+ * information.
+ */
+static void gv800s_muxsel(struct bttv *btv, unsigned int input)
+{
+ struct bttv *mctlr;
+ char *sw_status;
+ int xaddr, yaddr;
+ static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },
+ { 0x1, 0x5, 0xb, 0x7 },
+ { 0x2, 0x8, 0xc, 0xe },
+ { 0x3, 0x9, 0xd, 0xf } };
+ input = input%4;
+ mctlr = master[btv->c.nr];
+ if (mctlr == NULL) {
+ /* do nothing until the "master" is detected */
+ return;
+ }
+ yaddr = (btv->c.nr - mctlr->c.nr) & 3;
+ sw_status = (char *)(&mctlr->mbox_we);
+ xaddr = map[yaddr][input] & 0xf;
+
+ /* Check if the controller/camera pair has changed, ignore otherwise */
+ if (sw_status[yaddr] != xaddr) {
+ /* disable the old switch, enable the new one and save status */
+ gv800s_write(mctlr, sw_status[yaddr], yaddr, 0);
+ sw_status[yaddr] = xaddr;
+ gv800s_write(mctlr, xaddr, yaddr, 1);
+ }
+}
+
+/* GeoVision GV-800(S) "master" chip init */
+static void gv800s_init(struct bttv *btv)
+{
+ char *sw_status = (char *)(&btv->mbox_we);
+ int ix;
+
+ gpio_inout(0xf107f, 0xf107f);
+ gpio_write(1<<19); /* reset the analog MUX */
+ gpio_write(0);
+
+ /* Preset camera 0 to the 4 controllers */
+ for (ix = 0; ix < 4; ix++) {
+ sw_status[ix] = ix;
+ gv800s_write(btv, ix, ix, 1);
+ }
+
+ /* Inputs on the "master" controller need this brightness fix */
+ bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);
+
+ if (btv->c.nr > BTTV_MAX-4)
+ return;
+ /*
+ * Store the "master" controller pointer in the master
+ * array for later use in the muxsel function.
+ */
+ master[btv->c.nr] = btv;
+ master[btv->c.nr+1] = btv;
+ master[btv->c.nr+2] = btv;
+ master[btv->c.nr+3] = btv;
+}
+
/* ----------------------------------------------------------------------- */
/* motherboard chipset specific stuff */
diff -r c770b20d15c6 linux/drivers/media/video/bt8xx/bttv.h
--- a/linux/drivers/media/video/bt8xx/bttv.h Fri Feb 27 21:29:59 2009 -0300
+++ b/linux/drivers/media/video/bt8xx/bttv.h Sun Mar 01 16:01:31 2009 +0000
@@ -182,6 +182,8 @@
#define BTTV_BOARD_VD012_X1 0x9a
#define BTTV_BOARD_VD012_X2 0x9b
#define BTTV_BOARD_IVCE8784 0x9c
+#define BTTV_BOARD_GEOVISION_GV800S 0x9d
+#define BTTV_BOARD_GEOVISION_GV800S_SL 0x9e
/* more card-specific defines */
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH] Add support for GeoVision GV-800(S)
2009-03-02 17:54 ` Bruno Christo
@ 2009-03-02 18:06 ` Alexey Klimov
0 siblings, 0 replies; 6+ messages in thread
From: Alexey Klimov @ 2009-03-02 18:06 UTC (permalink / raw)
To: Bruno Christo; +Cc: Nicola Soranzo, linux-media
On Mon, Mar 2, 2009 at 8:54 PM, Bruno Christo <brunochristo@gmail.com> wrote:
> Hi Nicola,
>
> 2009/3/2 Nicola Soranzo <nsoranzo@tiscali.it>:
>> Hi Bruno,
>> it look like that your e-mail program is line wrapping your patch.
>> Please read email-clients.txt in Linux Documentation and resubmit the patch,
>> otherwise it cannot be correctly handled by patchwork.kernel.org .
>> Thanks,
>> Nicola
>
> As you requested, i'm re-submitting the patch. I read email-clients.txt,
> and I tried to send the patch as part of the body via Gmail with an
> external editor,
> evolution, mutt and alpine, but Gmail insists in converting the tabs
> to whitespace
> no matter the client used, so I had no choice but to send it as a MIME
> attachment.
Well, i used gmail instructions to adjust evolution and it worked well
(patches inlined okay).
And i tried mutt - it also works as expected. I read email-clients.txt
and used "preformatted" inline format in evolution as described. I
think you can try again if have free time/wish.
--
Best regards, Klimov Alexey
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-03-03 1:39 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-03 1:38 [PATCH] Add support for GeoVision GV-800(S) Bruno Christo
-- strict thread matches above, loose matches on Subject: below --
2009-02-28 18:24 Bruno Christo
2009-02-28 20:13 ` Bruno Christo
2009-03-02 13:59 ` Nicola Soranzo
2009-03-02 17:54 ` Bruno Christo
2009-03-02 18:06 ` Alexey Klimov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox