aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/dvb-usb
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2010-10-12 16:22:32 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-20 23:18:14 -0400
commit1cd72781db93c00fbee0bf4aed9e310a1d589738 (patch)
treec38f395682c51cd3193343a634047dc4634af5c6 /drivers/media/dvb/dvb-usb
parent3cbf5072ee0f38da278d67b7fafcfd6c86f83d36 (diff)
[media] af9015: move remote controllers to new RC core
Use new RC core instead of old legacy RC implementation. Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/dvb-usb')
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.c227
-rw-r--r--drivers/media/dvb/dvb-usb/af9015.h418
2 files changed, 121 insertions, 524 deletions
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c
index b04e25a631d1..63ba76bc2339 100644
--- a/drivers/media/dvb/dvb-usb/af9015.c
+++ b/drivers/media/dvb/dvb-usb/af9015.c
@@ -701,106 +701,97 @@ error:
701 return ret; 701 return ret;
702} 702}
703 703
704struct af9015_setup { 704struct af9015_rc_setup {
705 unsigned int id; 705 unsigned int id;
706 struct ir_scancode *rc_key_map; 706 char *rc_codes;
707 unsigned int rc_key_map_size;
708}; 707};
709 708
710static const struct af9015_setup *af9015_setup_match(unsigned int id, 709static char *af9015_rc_setup_match(unsigned int id,
711 const struct af9015_setup *table) 710 const struct af9015_rc_setup *table)
712{ 711{
713 for (; table->rc_key_map; table++) 712 for (; table->rc_codes; table++)
714 if (table->id == id) 713 if (table->id == id)
715 return table; 714 return table->rc_codes;
716 return NULL; 715 return NULL;
717} 716}
718 717
719static const struct af9015_setup af9015_setup_modparam[] = { 718static const struct af9015_rc_setup af9015_rc_setup_modparam[] = {
720 { AF9015_REMOTE_A_LINK_DTU_M, af9015_rc_a_link, 719 { AF9015_REMOTE_A_LINK_DTU_M, RC_MAP_ALINK_DTU_M },
721 ARRAY_SIZE(af9015_rc_a_link) }, 720 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, RC_MAP_MSI_DIGIVOX_II },
722 { AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, af9015_rc_msi, 721 { AF9015_REMOTE_MYGICTV_U718, RC_MAP_TOTAL_MEDIA_IN_HAND },
723 ARRAY_SIZE(af9015_rc_msi) }, 722 { AF9015_REMOTE_DIGITTRADE_DVB_T, RC_MAP_DIGITTRADE },
724 { AF9015_REMOTE_MYGICTV_U718, af9015_rc_mygictv, 723 { AF9015_REMOTE_AVERMEDIA_KS, RC_MAP_AVERMEDIA_RM_KS },
725 ARRAY_SIZE(af9015_rc_mygictv) },
726 { AF9015_REMOTE_DIGITTRADE_DVB_T, af9015_rc_digittrade,
727 ARRAY_SIZE(af9015_rc_digittrade) },
728 { AF9015_REMOTE_AVERMEDIA_KS, af9015_rc_avermedia_ks,
729 ARRAY_SIZE(af9015_rc_avermedia_ks) },
730 { } 724 { }
731}; 725};
732 726
733/* don't add new entries here anymore, use hashes instead */ 727static const struct af9015_rc_setup af9015_rc_setup_hashes[] = {
734static const struct af9015_setup af9015_setup_usbids[] = { 728 { 0xb8feb708, RC_MAP_MSI_DIGIVOX_II },
735 { USB_VID_LEADTEK, af9015_rc_leadtek, 729 { 0xa3703d00, RC_MAP_ALINK_DTU_M },
736 ARRAY_SIZE(af9015_rc_leadtek) }, 730 { 0x9b7dc64e, RC_MAP_TOTAL_MEDIA_IN_HAND }, /* MYGICTV U718 */
737 { USB_VID_VISIONPLUS, af9015_rc_twinhan,
738 ARRAY_SIZE(af9015_rc_twinhan) },
739 { USB_VID_KWORLD_2, af9015_rc_kworld,
740 ARRAY_SIZE(af9015_rc_kworld) },
741 { USB_VID_AVERMEDIA, af9015_rc_avermedia,
742 ARRAY_SIZE(af9015_rc_avermedia) },
743 { USB_VID_MSI_2, af9015_rc_msi_digivox_iii,
744 ARRAY_SIZE(af9015_rc_msi_digivox_iii) },
745 { USB_VID_TERRATEC, af9015_rc_terratec,
746 ARRAY_SIZE(af9015_rc_terratec) },
747 { } 731 { }
748}; 732};
749 733
750static const struct af9015_setup af9015_setup_hashes[] = { 734static const struct af9015_rc_setup af9015_rc_setup_usbids[] = {
751 { 0xb8feb708, af9015_rc_msi, ARRAY_SIZE(af9015_rc_msi) }, 735 { (USB_VID_TERRATEC << 16) + USB_PID_TERRATEC_CINERGY_T_STICK_DUAL_RC,
752 { 0xa3703d00, af9015_rc_a_link, ARRAY_SIZE(af9015_rc_a_link) }, 736 RC_MAP_TERRATEC_SLIM },
753 { 0x9b7dc64e, af9015_rc_mygictv, ARRAY_SIZE(af9015_rc_mygictv) }, 737 { (USB_VID_VISIONPLUS << 16) + USB_PID_AZUREWAVE_AD_TU700,
738 RC_MAP_AZUREWAVE_AD_TU700 },
739 { (USB_VID_VISIONPLUS << 16) + USB_PID_TINYTWIN,
740 RC_MAP_AZUREWAVE_AD_TU700 },
741 { (USB_VID_MSI_2 << 16) + USB_PID_MSI_DIGI_VOX_MINI_III,
742 RC_MAP_MSI_DIGIVOX_III },
743 { (USB_VID_LEADTEK << 16) + USB_PID_WINFAST_DTV_DONGLE_GOLD,
744 RC_MAP_LEADTEK_Y04G0051 },
745 { (USB_VID_AVERMEDIA << 16) + USB_PID_AVERMEDIA_VOLAR_X,
746 RC_MAP_AVERMEDIA_M135A },
747 { (USB_VID_AFATECH << 16) + USB_PID_TREKSTOR_DVBT,
748 RC_MAP_TREKSTOR },
754 { } 749 { }
755}; 750};
756 751
757static void af9015_set_remote_config(struct usb_device *udev, 752static void af9015_set_remote_config(struct usb_device *udev,
758 struct dvb_usb_device_properties *props) 753 struct dvb_usb_device_properties *props)
759{ 754{
760 const struct af9015_setup *table = NULL; 755 u16 vid = le16_to_cpu(udev->descriptor.idVendor);
761 756 u16 pid = le16_to_cpu(udev->descriptor.idProduct);
762 if (dvb_usb_af9015_remote) { 757
763 /* load remote defined as module param */ 758 /* try to load remote based module param */
764 table = af9015_setup_match(dvb_usb_af9015_remote, 759 props->rc.core.rc_codes = af9015_rc_setup_match(
765 af9015_setup_modparam); 760 dvb_usb_af9015_remote, af9015_rc_setup_modparam);
766 } else { 761
767 u16 vendor = le16_to_cpu(udev->descriptor.idVendor); 762 /* try to load remote based eeprom hash */
768 763 if (!props->rc.core.rc_codes)
769 table = af9015_setup_match(af9015_config.eeprom_sum, 764 props->rc.core.rc_codes = af9015_rc_setup_match(
770 af9015_setup_hashes); 765 af9015_config.eeprom_sum, af9015_rc_setup_hashes);
771 766
772 if (!table && vendor == USB_VID_AFATECH) { 767 /* try to load remote based USB ID */
773 /* Check USB manufacturer and product strings and try 768 if (!props->rc.core.rc_codes)
774 to determine correct remote in case of chip vendor 769 props->rc.core.rc_codes = af9015_rc_setup_match(
775 reference IDs are used. 770 (vid << 16) + pid, af9015_rc_setup_usbids);
776 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. 771
777 */ 772 /* try to load remote based USB iManufacturer string */
778 char manufacturer[10]; 773 if (!props->rc.core.rc_codes && vid == USB_VID_AFATECH) {
779 memset(manufacturer, 0, sizeof(manufacturer)); 774 /* Check USB manufacturer and product strings and try
780 usb_string(udev, udev->descriptor.iManufacturer, 775 to determine correct remote in case of chip vendor
781 manufacturer, sizeof(manufacturer)); 776 reference IDs are used.
782 if (!strcmp("MSI", manufacturer)) { 777 DO NOT ADD ANYTHING NEW HERE. Use hashes instead. */
783 /* iManufacturer 1 MSI 778 char manufacturer[10];
784 iProduct 2 MSI K-VOX */ 779 memset(manufacturer, 0, sizeof(manufacturer));
785 table = af9015_setup_match( 780 usb_string(udev, udev->descriptor.iManufacturer,
786 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, 781 manufacturer, sizeof(manufacturer));
787 af9015_setup_modparam); 782 if (!strcmp("MSI", manufacturer)) {
788 } else if (udev->descriptor.idProduct == 783 /* iManufacturer 1 MSI
789 cpu_to_le16(USB_PID_TREKSTOR_DVBT)) { 784 iProduct 2 MSI K-VOX */
790 table = &(const struct af9015_setup){ 0, 785 props->rc.core.rc_codes = af9015_rc_setup_match(
791 af9015_rc_trekstor, 786 AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
792 ARRAY_SIZE(af9015_rc_trekstor) }; 787 af9015_rc_setup_modparam);
793 } 788 }
794 } else if (!table)
795 table = af9015_setup_match(vendor, af9015_setup_usbids);
796 }
797
798 if (table) {
799 props->rc.legacy.rc_key_map = table->rc_key_map;
800 props->rc.legacy.rc_key_map_size = table->rc_key_map_size;
801 } 789 }
790 return;
802} 791}
803 792
793static int af9015_rc_query(struct dvb_usb_device *d);
794
804static int af9015_read_config(struct usb_device *udev) 795static int af9015_read_config(struct usb_device *udev)
805{ 796{
806 int ret; 797 int ret;
@@ -825,10 +816,11 @@ static int af9015_read_config(struct usb_device *udev)
825 deb_info("%s: IR mode:%d\n", __func__, val); 816 deb_info("%s: IR mode:%d\n", __func__, val);
826 for (i = 0; i < af9015_properties_count; i++) { 817 for (i = 0; i < af9015_properties_count; i++) {
827 if (val == AF9015_IR_MODE_DISABLED) { 818 if (val == AF9015_IR_MODE_DISABLED) {
828 af9015_properties[i].rc.legacy.rc_key_map = NULL; 819 af9015_properties[i].rc.core.rc_query = NULL;
829 af9015_properties[i].rc.legacy.rc_key_map_size = 0; 820 } else {
830 } else 821 af9015_properties[i].rc.core.rc_query = af9015_rc_query;
831 af9015_set_remote_config(udev, &af9015_properties[i]); 822 af9015_set_remote_config(udev, &af9015_properties[i]);
823 }
832 } 824 }
833 825
834 /* TS mode - one or two receivers */ 826 /* TS mode - one or two receivers */
@@ -1009,34 +1001,41 @@ static int af9015_identify_state(struct usb_device *udev,
1009 return ret; 1001 return ret;
1010} 1002}
1011 1003
1012static int af9015_rc_query(struct dvb_usb_device *d, u32 *event, int *state) 1004static int af9015_rc_query(struct dvb_usb_device *d)
1013{ 1005{
1014 struct af9015_state *priv = d->priv; 1006 struct af9015_state *priv = d->priv;
1015 int ret; 1007 int ret;
1016 u8 ircode[5], repeat; 1008 u8 repeat, keycode[4];
1017 1009
1018 /* read registers needed to detect remote controller code */ 1010 /* read registers needed to detect remote controller code */
1011 /* TODO: Implement read multiple registers to reduce idle USB traffic.
1012 Currently three reads are needed for one idle rc polling. */
1019 ret = af9015_read_reg(d, 0x98df, &repeat); 1013 ret = af9015_read_reg(d, 0x98df, &repeat);
1020 if (ret) 1014 if (ret)
1021 goto error; 1015 goto error;
1022 1016
1023 ret = af9015_read_reg(d, 0x98e7, &ircode[3]); 1017 ret = af9015_read_reg(d, 0x98e7, &keycode[2]);
1024 if (ret) 1018 if (ret)
1025 goto error; 1019 goto error;
1026 1020
1027 ret = af9015_read_reg(d, 0x98e8, &ircode[4]); 1021 ret = af9015_read_reg(d, 0x98e8, &keycode[3]);
1028 if (ret) 1022 if (ret)
1029 goto error; 1023 goto error;
1030 1024
1031 if (ircode[3] || ircode[4]) { 1025 if (keycode[2] || keycode[3]) {
1032 deb_rc("%s: key pressed\n", __func__);
1033 ircode[0] = 1; /* DVB_USB_RC_NEC_KEY_PRESSED */
1034
1035 /* read 1st address byte */ 1026 /* read 1st address byte */
1036 ret = af9015_read_reg(d, 0x98e5, &ircode[1]); 1027 ret = af9015_read_reg(d, 0x98e5, &keycode[0]);
1028 if (ret)
1029 goto error;
1030
1031 /* read 2nd address byte */
1032 ret = af9015_read_reg(d, 0x98e6, &keycode[1]);
1037 if (ret) 1033 if (ret)
1038 goto error; 1034 goto error;
1039 1035
1036 deb_rc("%s: key pressed ", __func__);
1037 debug_dump(keycode, sizeof(keycode), deb_rc);
1038
1040 /* clean data bytes from mem */ 1039 /* clean data bytes from mem */
1041 ret = af9015_write_reg(d, 0x98e7, 0); 1040 ret = af9015_write_reg(d, 0x98e7, 0);
1042 if (ret) 1041 if (ret)
@@ -1046,26 +1045,28 @@ static int af9015_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
1046 if (ret) 1045 if (ret)
1047 goto error; 1046 goto error;
1048 1047
1049 /* FIXME: Hack to pass checksum on the custom field for the 1048 if (keycode[2] == (u8) ~keycode[3]) {
1050 remote controllers using NEC extended address. 1049 if (keycode[0] == (u8) ~keycode[1]) {
1051 That must done since dvb_usb_nec_rc_key_to_event() 1050 /* NEC */
1052 does not support NEC extended address format. */ 1051 priv->rc_keycode = keycode[0] << 8 | keycode[2];
1053 ircode[2] = ~ircode[1]; 1052 } else {
1053 /* NEC extended*/
1054 priv->rc_keycode = keycode[0] << 16 |
1055 keycode[1] << 8 | keycode[2];
1056 }
1057 ir_keydown(d->rc_input_dev, priv->rc_keycode, 0);
1058 } else {
1059 priv->rc_keycode = 0; /* clear just for sure */
1060 }
1054 } else if (priv->rc_repeat != repeat) { 1061 } else if (priv->rc_repeat != repeat) {
1055 deb_rc("%s: key repeated\n", __func__); 1062 deb_rc("%s: key repeated\n", __func__);
1056 ircode[0] = 2; /* DVB_USB_RC_NEC_KEY_REPEATED */ 1063 ir_keydown(d->rc_input_dev, priv->rc_keycode, 0);
1057 } else { 1064 } else {
1058 deb_rc("%s: no key press\n", __func__); 1065 deb_rc("%s: no key press\n", __func__);
1059 ircode[0] = 0; /* DVB_USB_RC_NEC_EMPTY */
1060 } 1066 }
1061 1067
1062 priv->rc_repeat = repeat; 1068 priv->rc_repeat = repeat;
1063 1069
1064 deb_rc("%s: ", __func__);
1065 debug_dump(ircode, sizeof(ircode), deb_rc);
1066
1067 dvb_usb_nec_rc_key_to_event(d, ircode, event, state);
1068
1069error: 1070error:
1070 if (ret) 1071 if (ret)
1071 err("%s: failed:%d", __func__, ret); 1072 err("%s: failed:%d", __func__, ret);
@@ -1359,9 +1360,13 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1359 1360
1360 .identify_state = af9015_identify_state, 1361 .identify_state = af9015_identify_state,
1361 1362
1362 .rc.legacy = { 1363 .rc.core = {
1363 .rc_query = af9015_rc_query, 1364 .protocol = IR_TYPE_NEC,
1365 .module_name = "af9015",
1364 .rc_interval = AF9015_RC_INTERVAL, 1366 .rc_interval = AF9015_RC_INTERVAL,
1367 .rc_props = {
1368 .allowed_protos = IR_TYPE_NEC,
1369 },
1365 }, 1370 },
1366 1371
1367 .i2c_algo = &af9015_i2c_algo, 1372 .i2c_algo = &af9015_i2c_algo,
@@ -1483,9 +1488,13 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1483 1488
1484 .identify_state = af9015_identify_state, 1489 .identify_state = af9015_identify_state,
1485 1490
1486 .rc.legacy = { 1491 .rc.core = {
1487 .rc_query = af9015_rc_query, 1492 .protocol = IR_TYPE_NEC,
1493 .module_name = "af9015",
1488 .rc_interval = AF9015_RC_INTERVAL, 1494 .rc_interval = AF9015_RC_INTERVAL,
1495 .rc_props = {
1496 .allowed_protos = IR_TYPE_NEC,
1497 },
1489 }, 1498 },
1490 1499
1491 .i2c_algo = &af9015_i2c_algo, 1500 .i2c_algo = &af9015_i2c_algo,
@@ -1592,9 +1601,13 @@ static struct dvb_usb_device_properties af9015_properties[] = {
1592 1601
1593 .identify_state = af9015_identify_state, 1602 .identify_state = af9015_identify_state,
1594 1603
1595 .rc.legacy = { 1604 .rc.core = {
1596 .rc_query = af9015_rc_query, 1605 .protocol = IR_TYPE_NEC,
1606 .module_name = "af9015",
1597 .rc_interval = AF9015_RC_INTERVAL, 1607 .rc_interval = AF9015_RC_INTERVAL,
1608 .rc_props = {
1609 .allowed_protos = IR_TYPE_NEC,
1610 },
1598 }, 1611 },
1599 1612
1600 .i2c_algo = &af9015_i2c_algo, 1613 .i2c_algo = &af9015_i2c_algo,
diff --git a/drivers/media/dvb/dvb-usb/af9015.h b/drivers/media/dvb/dvb-usb/af9015.h
index 948e50b47ae1..f20cfa6ed690 100644
--- a/drivers/media/dvb/dvb-usb/af9015.h
+++ b/drivers/media/dvb/dvb-usb/af9015.h
@@ -101,6 +101,7 @@ enum af9015_ir_mode {
101struct af9015_state { 101struct af9015_state {
102 struct i2c_adapter i2c_adap; /* I2C adapter for 2nd FE */ 102 struct i2c_adapter i2c_adap; /* I2C adapter for 2nd FE */
103 u8 rc_repeat; 103 u8 rc_repeat;
104 u32 rc_keycode;
104}; 105};
105 106
106struct af9015_config { 107struct af9015_config {
@@ -120,421 +121,4 @@ enum af9015_remote {
120/* 5 */ AF9015_REMOTE_AVERMEDIA_KS, 121/* 5 */ AF9015_REMOTE_AVERMEDIA_KS,
121}; 122};
122 123
123/* LeadTek - Y04G0051 */
124/* Leadtek WinFast DTV Dongle Gold */
125static struct ir_scancode af9015_rc_leadtek[] = {
126 { 0x0300, KEY_POWER2 },
127 { 0x0303, KEY_SCREEN },
128 { 0x0304, KEY_RIGHT },
129 { 0x0305, KEY_1 },
130 { 0x0306, KEY_2 },
131 { 0x0307, KEY_3 },
132 { 0x0308, KEY_LEFT },
133 { 0x0309, KEY_4 },
134 { 0x030a, KEY_5 },
135 { 0x030b, KEY_6 },
136 { 0x030c, KEY_UP },
137 { 0x030d, KEY_7 },
138 { 0x030e, KEY_8 },
139 { 0x030f, KEY_9 },
140 { 0x0310, KEY_DOWN },
141 { 0x0311, KEY_AGAIN },
142 { 0x0312, KEY_0 },
143 { 0x0313, KEY_OK }, /* 1st ok */
144 { 0x0314, KEY_MUTE },
145 { 0x0316, KEY_OK }, /* 2nd ok */
146 { 0x031e, KEY_VIDEO }, /* 2nd video */
147 { 0x031b, KEY_AUDIO },
148 { 0x031f, KEY_TEXT },
149 { 0x0340, KEY_SLEEP },
150 { 0x0341, KEY_DOT },
151 { 0x0342, KEY_REWIND },
152 { 0x0343, KEY_PLAY },
153 { 0x0344, KEY_FASTFORWARD },
154 { 0x0345, KEY_TIME },
155 { 0x0346, KEY_STOP }, /* 2nd stop */
156 { 0x0347, KEY_RECORD },
157 { 0x0348, KEY_CAMERA },
158 { 0x0349, KEY_ESC },
159 { 0x034a, KEY_NEW },
160 { 0x034b, KEY_RED },
161 { 0x034c, KEY_GREEN },
162 { 0x034d, KEY_YELLOW },
163 { 0x034e, KEY_BLUE },
164 { 0x034f, KEY_MENU },
165 { 0x0350, KEY_STOP }, /* 1st stop */
166 { 0x0351, KEY_CHANNEL },
167 { 0x0352, KEY_VIDEO }, /* 1st video */
168 { 0x0353, KEY_EPG },
169 { 0x0354, KEY_PREVIOUS },
170 { 0x0355, KEY_NEXT },
171 { 0x0356, KEY_TV },
172 { 0x035a, KEY_VOLUMEDOWN },
173 { 0x035b, KEY_CHANNELUP },
174 { 0x035e, KEY_VOLUMEUP },
175 { 0x035f, KEY_CHANNELDOWN },
176};
177
178/* TwinHan AzureWave AD-TU700(704J) */
179static struct ir_scancode af9015_rc_twinhan[] = {
180 { 0x0000, KEY_TAB }, /* Tab */
181 { 0x0001, KEY_2 },
182 { 0x0002, KEY_CHANNELDOWN },
183 { 0x0003, KEY_1 },
184 { 0x0004, KEY_LIST }, /* Record List */
185 { 0x0005, KEY_CHANNELUP },
186 { 0x0006, KEY_3 },
187 { 0x0007, KEY_SLEEP }, /* Hibernate */
188 { 0x0008, KEY_SWITCHVIDEOMODE }, /* A/V */
189 { 0x0009, KEY_4 },
190 { 0x000a, KEY_VOLUMEDOWN },
191 { 0x000c, KEY_CANCEL }, /* Cancel */
192 { 0x000d, KEY_7 },
193 { 0x000e, KEY_AGAIN }, /* Recall */
194 { 0x000f, KEY_TEXT }, /* Teletext */
195 { 0x0010, KEY_MUTE },
196 { 0x0011, KEY_RECORD },
197 { 0x0012, KEY_FASTFORWARD }, /* FF >> */
198 { 0x0013, KEY_BACK }, /* Back */
199 { 0x0014, KEY_PLAY },
200 { 0x0015, KEY_0 },
201 { 0x0016, KEY_POWER },
202 { 0x0017, KEY_FAVORITES }, /* Favorite List */
203 { 0x0018, KEY_RED },
204 { 0x0019, KEY_8 },
205 { 0x001a, KEY_STOP },
206 { 0x001b, KEY_9 },
207 { 0x001c, KEY_EPG }, /* Info/EPG */
208 { 0x001d, KEY_5 },
209 { 0x001e, KEY_VOLUMEUP },
210 { 0x001f, KEY_6 },
211 { 0x0040, KEY_REWIND }, /* FR << */
212 { 0x0041, KEY_PREVIOUS }, /* Replay */
213 { 0x0042, KEY_NEXT }, /* Skip */
214 { 0x0043, KEY_SUBTITLE }, /* Subtitle / CC */
215 { 0x0045, KEY_KPPLUS }, /* Zoom+ */
216 { 0x0046, KEY_KPMINUS }, /* Zoom- */
217 { 0x0047, KEY_TV2 }, /* PIP */
218 { 0x0048, KEY_INFO }, /* Preview */
219 { 0x0049, KEY_AUDIO }, /* L/R */ /* TODO better event */
220 { 0x004a, KEY_CLEAR }, /* Clear */
221 { 0x004b, KEY_UP }, /* up arrow */
222 { 0x004c, KEY_PAUSE },
223 { 0x004d, KEY_ZOOM }, /* Full Screen */
224 { 0x004e, KEY_LEFT }, /* left arrow */
225 { 0x004f, KEY_ENTER }, /* Enter / ok */
226 { 0x0050, KEY_LANGUAGE }, /* SAP */
227 { 0x0051, KEY_DOWN }, /* down arrow */
228 { 0x0052, KEY_RIGHT }, /* right arrow */
229 { 0x0053, KEY_GREEN },
230 { 0x0054, KEY_CAMERA }, /* Capture */
231 { 0x005e, KEY_YELLOW },
232 { 0x005f, KEY_BLUE },
233};
234
235/* A-Link DTU(m) - 3x6 slim remote */
236static struct ir_scancode af9015_rc_a_link[] = {
237 { 0x0800, KEY_VOLUMEUP },
238 { 0x0801, KEY_1 },
239 { 0x0802, KEY_3 },
240 { 0x0803, KEY_7 },
241 { 0x0804, KEY_9 },
242 { 0x0805, KEY_ZOOM },
243 { 0x0806, KEY_0 },
244 { 0x0807, KEY_GOTO }, /* jump */
245 { 0x080d, KEY_5 },
246 { 0x080f, KEY_2 },
247 { 0x0812, KEY_POWER },
248 { 0x0814, KEY_CHANNELUP },
249 { 0x0816, KEY_VOLUMEDOWN },
250 { 0x0818, KEY_6 },
251 { 0x081a, KEY_MUTE },
252 { 0x081b, KEY_8 },
253 { 0x081c, KEY_4 },
254 { 0x081d, KEY_CHANNELDOWN },
255};
256
257/* MSI DIGIVOX mini II V3.0 */
258static struct ir_scancode af9015_rc_msi[] = {
259 { 0x0002, KEY_2 },
260 { 0x0003, KEY_UP }, /* up */
261 { 0x0004, KEY_3 },
262 { 0x0005, KEY_CHANNELDOWN },
263 { 0x0008, KEY_5 },
264 { 0x0009, KEY_0 },
265 { 0x000b, KEY_8 },
266 { 0x000d, KEY_DOWN }, /* down */
267 { 0x0010, KEY_9 },
268 { 0x0011, KEY_7 },
269 { 0x0014, KEY_VOLUMEUP },
270 { 0x0015, KEY_CHANNELUP },
271 { 0x0016, KEY_ENTER },
272 { 0x0017, KEY_POWER },
273 { 0x001a, KEY_1 },
274 { 0x001c, KEY_4 },
275 { 0x001d, KEY_6 },
276 { 0x001f, KEY_VOLUMEDOWN },
277};
278
279/* MYGICTV U718 */
280/* Uses NEC extended 0x02bd. Extended byte removed for compatibility... */
281static struct ir_scancode af9015_rc_mygictv[] = {
282 { 0x0200, KEY_1 },
283 { 0x0201, KEY_2 },
284 { 0x0202, KEY_3 },
285 { 0x0203, KEY_4 },
286 { 0x0204, KEY_5 },
287 { 0x0205, KEY_6 },
288 { 0x0206, KEY_7 },
289 { 0x0207, KEY_8 },
290 { 0x0208, KEY_9 },
291 { 0x0209, KEY_0 },
292 { 0x020a, KEY_MUTE },
293 { 0x020b, KEY_CYCLEWINDOWS }, /* yellow, min / max */
294 { 0x020c, KEY_SWITCHVIDEOMODE }, /* TV / AV */
295 { 0x020e, KEY_VOLUMEDOWN },
296 { 0x020f, KEY_TIME }, /* TimeShift */
297 { 0x0210, KEY_RIGHT }, /* right arrow */
298 { 0x0211, KEY_LEFT }, /* left arrow */
299 { 0x0212, KEY_UP }, /* up arrow */
300 { 0x0213, KEY_DOWN }, /* down arrow */
301 { 0x0214, KEY_POWER },
302 { 0x0215, KEY_ENTER }, /* ok */
303 { 0x0216, KEY_STOP },
304 { 0x0217, KEY_CAMERA }, /* Snapshot */
305 { 0x0218, KEY_CHANNELUP },
306 { 0x0219, KEY_RECORD },
307 { 0x021a, KEY_CHANNELDOWN },
308 { 0x021c, KEY_ESC }, /* Esc */
309 { 0x021e, KEY_PLAY },
310 { 0x021f, KEY_VOLUMEUP },
311 { 0x0240, KEY_PAUSE },
312 { 0x0241, KEY_FASTFORWARD }, /* FF >> */
313 { 0x0242, KEY_REWIND }, /* FR << */
314 { 0x0243, KEY_ZOOM }, /* 'select' (?) */
315 { 0x0244, KEY_SHUFFLE }, /* Shuffle */
316 { 0x0245, KEY_POWER },
317};
318
319/* KWorld PlusTV Dual DVB-T Stick (DVB-T 399U) */
320/* FIXME: This mapping is totally incomplete and probably even wrong... */
321/* Uses NEC extended 0x866b. Extended byte removed for compatibility... */
322static struct ir_scancode af9015_rc_kworld[] = {
323 { 0x8600, KEY_1 },
324 { 0x8601, KEY_2 },
325 { 0x8602, KEY_3 },
326 { 0x8603, KEY_4 },
327 { 0x8604, KEY_5 },
328 { 0x8605, KEY_6 },
329 { 0x8606, KEY_7 },
330 { 0x8607, KEY_8 },
331 { 0x8608, KEY_9 },
332 { 0x860a, KEY_0 },
333};
334
335/* AverMedia Volar X */
336static struct ir_scancode af9015_rc_avermedia[] = {
337 { 0x0200, KEY_POWER }, /* POWER */
338 { 0x0201, KEY_PROG1 }, /* SOURCE */
339 { 0x0203, KEY_TEXT }, /* TELETEXT */
340 { 0x0204, KEY_EPG }, /* EPG */
341 { 0x0205, KEY_1 }, /* 1 */
342 { 0x0206, KEY_2 }, /* 2 */
343 { 0x0207, KEY_3 }, /* 3 */
344 { 0x0208, KEY_AUDIO }, /* AUDIO */
345 { 0x0209, KEY_4 }, /* 4 */
346 { 0x020a, KEY_5 }, /* 5 */
347 { 0x020b, KEY_6 }, /* 6 */
348 { 0x020c, KEY_ZOOM }, /* FULL SCREEN */
349 { 0x020d, KEY_7 }, /* 7 */
350 { 0x020e, KEY_8 }, /* 8 */
351 { 0x020f, KEY_9 }, /* 9 */
352 { 0x0210, KEY_PROG3 }, /* 16-CH PREV */
353 { 0x0211, KEY_0 }, /* 0 */
354 { 0x0212, KEY_LEFT }, /* L / DISPLAY */
355 { 0x0213, KEY_RIGHT }, /* R / CH RTN */
356 { 0x0214, KEY_MUTE }, /* MUTE */
357 { 0x0215, KEY_MENU }, /* MENU */
358 { 0x0217, KEY_PROG2 }, /* SNAP SHOT */
359 { 0x0218, KEY_PLAY }, /* PLAY */
360 { 0x0219, KEY_RECORD }, /* RECORD */
361 { 0x021a, KEY_PLAYPAUSE }, /* TIMESHIFT / PAUSE */
362 { 0x021b, KEY_STOP }, /* STOP */
363 { 0x021c, KEY_FORWARD }, /* >> / YELLOW */
364 { 0x021d, KEY_BACK }, /* << / RED */
365 { 0x021e, KEY_VOLUMEDOWN }, /* VOL DOWN */
366 { 0x021f, KEY_VOLUMEUP }, /* VOL UP */
367
368 { 0x0300, KEY_LAST }, /* >>| / BLUE */
369 { 0x0301, KEY_FIRST }, /* |<< / GREEN */
370 { 0x0302, KEY_CHANNELDOWN }, /* CH DOWN */
371 { 0x0303, KEY_CHANNELUP }, /* CH UP */
372};
373
374/* AverMedia KS */
375/* FIXME: mappings are not 100% correct? */
376static struct ir_scancode af9015_rc_avermedia_ks[] = {
377 { 0x0501, KEY_POWER },
378 { 0x0502, KEY_CHANNELUP },
379 { 0x0503, KEY_CHANNELDOWN },
380 { 0x0504, KEY_VOLUMEUP },
381 { 0x0505, KEY_VOLUMEDOWN },
382 { 0x0506, KEY_MUTE },
383 { 0x0507, KEY_RIGHT },
384 { 0x0508, KEY_PROG1 },
385 { 0x0509, KEY_1 },
386 { 0x050a, KEY_2 },
387 { 0x050b, KEY_3 },
388 { 0x050c, KEY_4 },
389 { 0x050d, KEY_5 },
390 { 0x050e, KEY_6 },
391 { 0x050f, KEY_7 },
392 { 0x0510, KEY_8 },
393 { 0x0511, KEY_9 },
394 { 0x0512, KEY_0 },
395 { 0x0513, KEY_AUDIO },
396 { 0x0515, KEY_EPG },
397 { 0x0516, KEY_PLAY },
398 { 0x0517, KEY_RECORD },
399 { 0x0518, KEY_STOP },
400 { 0x051c, KEY_BACK },
401 { 0x051d, KEY_FORWARD },
402 { 0x054d, KEY_LEFT },
403 { 0x0556, KEY_ZOOM },
404};
405
406/* Digittrade DVB-T USB Stick */
407static struct ir_scancode af9015_rc_digittrade[] = {
408 { 0x0000, KEY_9 },
409 { 0x0001, KEY_EPG }, /* EPG */
410 { 0x0002, KEY_VOLUMEDOWN }, /* Vol Dn */
411 { 0x0003, KEY_TEXT }, /* TELETEXT */
412 { 0x0004, KEY_8 },
413 { 0x0005, KEY_MUTE }, /* MUTE */
414 { 0x0006, KEY_POWER }, /* POWER */
415 { 0x0009, KEY_ZOOM }, /* FULLSCREEN */
416 { 0x000a, KEY_RECORD }, /* RECORD */
417 { 0x000d, KEY_SUBTITLE }, /* SUBTITLE */
418 { 0x000e, KEY_STOP }, /* STOP */
419 { 0x0010, KEY_LAST }, /* RETURN */
420 { 0x0011, KEY_2 },
421 { 0x0012, KEY_4 },
422 { 0x0015, KEY_3 },
423 { 0x0016, KEY_5 },
424 { 0x0017, KEY_CHANNELDOWN }, /* Ch Dn */
425 { 0x0019, KEY_CHANNELUP }, /* CH Up */
426 { 0x001a, KEY_PAUSE }, /* PAUSE */
427 { 0x001b, KEY_1 },
428 { 0x001d, KEY_AUDIO }, /* DUAL SOUND */
429 { 0x001e, KEY_PLAY }, /* PLAY */
430 { 0x001f, KEY_PRINT }, /* SNAPSHOT */
431 { 0x0040, KEY_VOLUMEUP }, /* Vol Up */
432 { 0x0048, KEY_7 },
433 { 0x004c, KEY_6 },
434 { 0x004d, KEY_PLAYPAUSE }, /* TIMESHIFT */
435 { 0x0054, KEY_0 },
436};
437
438/* TREKSTOR DVB-T USB Stick */
439static struct ir_scancode af9015_rc_trekstor[] = {
440 { 0x0084, KEY_0 },
441 { 0x0085, KEY_MUTE }, /* Mute */
442 { 0x0086, KEY_AGAIN }, /* Home */
443 { 0x0087, KEY_UP }, /* Up */
444 { 0x0088, KEY_ENTER }, /* OK */
445 { 0x0089, KEY_RIGHT }, /* Right */
446 { 0x008a, KEY_FASTFORWARD }, /* Fast forward */
447 { 0x008b, KEY_VOLUMEUP }, /* Volume + */
448 { 0x008c, KEY_DOWN }, /* Down */
449 { 0x008d, KEY_PLAY }, /* Play/Pause */
450 { 0x008e, KEY_STOP }, /* Stop */
451 { 0x008f, KEY_EPG }, /* Info/EPG */
452 { 0x0090, KEY_7 },
453 { 0x0091, KEY_4 },
454 { 0x0092, KEY_1 },
455 { 0x0093, KEY_CHANNELDOWN }, /* Channel - */
456 { 0x0094, KEY_8 },
457 { 0x0095, KEY_5 },
458 { 0x0096, KEY_2 },
459 { 0x0097, KEY_CHANNELUP }, /* Channel + */
460 { 0x0098, KEY_9 },
461 { 0x0099, KEY_6 },
462 { 0x009a, KEY_3 },
463 { 0x009b, KEY_VOLUMEDOWN }, /* Volume - */
464 { 0x009c, KEY_ZOOM }, /* TV */
465 { 0x009d, KEY_RECORD }, /* Record */
466 { 0x009e, KEY_REWIND }, /* Rewind */
467 { 0x009f, KEY_LEFT }, /* Left */
468};
469
470/* MSI DIGIVOX mini III */
471/* Uses NEC extended 0x61d6. Extended byte removed for compatibility... */
472static struct ir_scancode af9015_rc_msi_digivox_iii[] = {
473 { 0x6101, KEY_VIDEO }, /* Source */
474 { 0x6102, KEY_3 },
475 { 0x6103, KEY_POWER2 }, /* ShutDown */
476 { 0x6104, KEY_1 },
477 { 0x6105, KEY_5 },
478 { 0x6106, KEY_6 },
479 { 0x6107, KEY_CHANNELDOWN }, /* CH- */
480 { 0x6108, KEY_2 },
481 { 0x6109, KEY_CHANNELUP }, /* CH+ */
482 { 0x610a, KEY_9 },
483 { 0x610b, KEY_ZOOM }, /* Zoom */
484 { 0x610c, KEY_7 },
485 { 0x610d, KEY_8 },
486 { 0x610e, KEY_VOLUMEUP }, /* Vol+ */
487 { 0x610f, KEY_4 },
488 { 0x6110, KEY_ESC }, /* [back up arrow] */
489 { 0x6111, KEY_0 },
490 { 0x6112, KEY_OK }, /* [enter arrow] */
491 { 0x6113, KEY_VOLUMEDOWN }, /* Vol- */
492 { 0x6114, KEY_RECORD }, /* Rec */
493 { 0x6115, KEY_STOP }, /* Stop */
494 { 0x6116, KEY_PLAY }, /* Play */
495 { 0x6117, KEY_MUTE }, /* Mute */
496 { 0x6118, KEY_UP },
497 { 0x6119, KEY_DOWN },
498 { 0x611a, KEY_LEFT },
499 { 0x611b, KEY_RIGHT },
500 { 0x611c, KEY_RED },
501 { 0x611d, KEY_GREEN },
502 { 0x611e, KEY_YELLOW },
503 { 0x611f, KEY_BLUE },
504 { 0x6143, KEY_POWER }, /* [red power button] */
505};
506
507/* TerraTec - 4x7 slim remote */
508/* Uses NEC extended 0x02bd. Extended byte removed for compatibility... */
509static struct ir_scancode af9015_rc_terratec[] = {
510 { 0x0200, KEY_1 },
511 { 0x0201, KEY_2 },
512 { 0x0202, KEY_3 },
513 { 0x0203, KEY_4 },
514 { 0x0204, KEY_5 },
515 { 0x0205, KEY_6 },
516 { 0x0206, KEY_7 },
517 { 0x0207, KEY_8 },
518 { 0x0208, KEY_9 },
519 { 0x0209, KEY_0 },
520 { 0x020a, KEY_MUTE },
521 { 0x020b, KEY_ZOOM }, /* symbol: PIP or zoom ? */
522 { 0x020e, KEY_VOLUMEDOWN },
523 { 0x020f, KEY_PLAYPAUSE },
524 { 0x0210, KEY_RIGHT },
525 { 0x0211, KEY_LEFT },
526 { 0x0212, KEY_UP },
527 { 0x0213, KEY_DOWN },
528 { 0x0215, KEY_OK },
529 { 0x0216, KEY_STOP },
530 { 0x0217, KEY_CAMERA }, /* snapshot */
531 { 0x0218, KEY_CHANNELUP },
532 { 0x0219, KEY_RECORD },
533 { 0x021a, KEY_CHANNELDOWN },
534 { 0x021c, KEY_ESC },
535 { 0x021f, KEY_VOLUMEUP },
536 { 0x0244, KEY_EPG },
537 { 0x0245, KEY_POWER2 }, /* [red power button] */
538};
539
540#endif 124#endif