James Guo <jin...@yahoo.com> writes:

> Have a tv tuner believe to be sinovideo 1300, and the remote has h-338 in the
> back, the tuner is detected as saa7134 proteus 2309, and working fine, the
> patch is for the remote.

Since we don't know what exact encoding does it use... Can you test with
the attached patch? You have to add/substitute your card ID in place of
AVERMEDIA_SUPER_007 and "modprobe saa7134 gpio_tracking=1".

Press a single RC button.

It should produce a lot of messages like:
$ dmesg | grep GPIO:
saa7133[0] GPIO: time=1248041038.165525 mode=0x0000000 in=0x0040000 
out=0x0000000 [pre-init]
saa7133[0] GPIO: time=1248041061.000769 mode=0x0200000 in=0x0000000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.001691 mode=0x0200000 in=0x0040000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.002539 mode=0x0200000 in=0x0000000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.004376 mode=0x0200000 in=0x0040000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.005198 mode=0x0200000 in=0x0000000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.006124 mode=0x0200000 in=0x0040000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.007858 mode=0x0200000 in=0x0000000 
out=0x0200000 [GPIO18 IRQ]
saa7133[0] GPIO: time=1248041061.009672 mode=0x0200000 in=0x0040000 
out=0x0200000 [GPIO18 IRQ]

If you send all of that to me I should be able to figure out the code used.
-- 
Krzysztof Halasa

diff --git a/drivers/media/video/saa7134/saa7134-cards.c 
b/drivers/media/video/saa7134/saa7134-cards.c
index fdb1944..73de219 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -6105,6 +6105,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
        case SAA7134_BOARD_AVERMEDIA_307:
        case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
        case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
+       case SAA7134_BOARD_AVERMEDIA_SUPER_007:
        case SAA7134_BOARD_AVERMEDIA_777:
        case SAA7134_BOARD_AVERMEDIA_M135A:
 /*      case SAA7134_BOARD_SABRENT_SBTTVFM:  */ /* not finished yet */
diff --git a/drivers/media/video/saa7134/saa7134-core.c 
b/drivers/media/video/saa7134/saa7134-core.c
index 2def6fe..aeeef0e 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -101,18 +101,22 @@ int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
 
 void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
 {
-       unsigned long mode,status;
+       unsigned long mode, status;
+       struct timeval tv;
 
        if (!gpio_tracking)
                return;
        /* rising SAA7134_GPIO_GPRESCAN reads the status */
-       saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,0);
-       
saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,SAA7134_GPIO_GPRESCAN);
+       saa_andorb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN, 0);
+       saa_andorb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN,
+                  SAA7134_GPIO_GPRESCAN);
        mode   = saa_readl(SAA7134_GPIO_GPMODE0   >> 2) & 0xfffffff;
        status = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & 0xfffffff;
-       printk(KERN_DEBUG
-              "%s: gpio: mode=0x%07lx in=0x%07lx out=0x%07lx [%s]\n",
-              dev->name, mode, (~mode) & status, mode & status, msg);
+       do_gettimeofday(&tv);
+
+       printk(KERN_DEBUG "%s GPIO: time=%lu.%06lu mode=0x%07lx in=0x%07lx"
+              " out=0x%07lx [%s]\n", dev->name, tv.tv_sec, tv.tv_usec,
+              mode, (~mode) & status, mode & status, msg);
 }
 
 void saa7134_set_gpio(struct saa7134_dev *dev, int bit_no, int value)
@@ -566,24 +570,17 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
                        }
                }
 
-               if (report & SAA7134_IRQ_REPORT_GPIO18) {
-                       switch (dev->has_remote) {
-                               case SAA7134_REMOTE_GPIO:
-                                       if (!dev->remote)
-                                               break;
-                                       if ((dev->remote->mask_keydown & 
0x40000) ||
-                                           (dev->remote->mask_keyup & 
0x40000)) {
-                                               saa7134_input_irq(dev);
-                                       }
-                                       break;
-
-                               case SAA7134_REMOTE_I2C:
-                                       break;                  /* FIXME: 
invoke I2C get_key() */
-
-                               default:                        /* GPIO18 not 
used by IR remote */
-                                       break;
-                       }
+               if (report & SAA7134_IRQ_REPORT_GPIO18 &&
+                   dev->has_remote == SAA7134_REMOTE_GPIO && dev->remote &&
+                   (dev->remote->mask_keydown |
+                    dev->remote->mask_keyup) & 0x40000) {
+                       if (gpio_tracking)
+                               saa7134_track_gpio(dev, "GPIO18 IRQ");
+                       saa7134_input_irq(dev);
                }
+
+               /* SAA7134_REMOTE_I2C: FIXME: invoke I2C get_key() */
+               /* GPIO18 not used by IR remote */
        }
 
        if (10 == loop) {
@@ -695,9 +692,9 @@ static int saa7134_hw_enable2(struct saa7134_dev *dev)
        if (dev->has_remote == SAA7134_REMOTE_GPIO && dev->remote) {
                if (dev->remote->mask_keydown & 0x10000)
                        irq2_mask |= SAA7134_IRQ2_INTE_GPIO16;
-               else if (dev->remote->mask_keydown & 0x40000)
+               if (dev->remote->mask_keydown & 0x40000) /* raising edge */
                        irq2_mask |= SAA7134_IRQ2_INTE_GPIO18;
-               else if (dev->remote->mask_keyup & 0x40000)
+               if (dev->remote->mask_keyup & 0x40000) /* falling edge */
                        irq2_mask |= SAA7134_IRQ2_INTE_GPIO18A;
        }
 
diff --git a/drivers/media/video/saa7134/saa7134-input.c 
b/drivers/media/video/saa7134/saa7134-input.c
index 8a106d3..9d5a433 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -483,6 +483,12 @@ int saa7134_input_init1(struct saa7134_dev *dev)
                saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
                saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
                break;
+       case SAA7134_BOARD_AVERMEDIA_SUPER_007:
+               ir_codes     = ir_codes_avermedia;
+               mask_keyup   = 0x40000; /* show falling edge of GPIO18 */
+               mask_keydown = 0x40000; /* show raising edge of GPIO18 */
+               rc5_gpio     = 1;
+               break;
        case SAA7134_BOARD_KWORLD_TERMINATOR:
                ir_codes     = ir_codes_pixelview;
                mask_keycode = 0x00001f;
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to