aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/IR/mceusb.c
diff options
context:
space:
mode:
authorJarod Wilson <jarod@redhat.com>2010-11-09 16:41:03 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-20 11:11:07 -0500
commit1cd50f25614226e99ac7a1518311e8474ea024e3 (patch)
tree173a17802a43ba449662fe2db5a021e62ce5194d /drivers/media/IR/mceusb.c
parentb7582815b3fc772e23ee5da884e9a2307bdc1025 (diff)
[media] mceusb: fix up reporting of trailing space
We were storing a bunch of spaces at the end of each signal, rather than a single long space. The in-kernel decoders were actually okay with this, but lirc isn't. As suggested by David Härdeman, switch to storing samples using ir_raw_event_store_with_filter, which auto-merges the consecutive space samples for us. This also allows us to bypass having to store rawir samples in our device struct, further simplifying the buffer parsing state machine. Both in-kernel decoders and lirc are happy again with this change. Also included in this patch is proper parsing of 0x9f 0x01 commands, the removal of some magic number usage and some printk spew fixups. Signed-off-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/IR/mceusb.c')
-rw-r--r--drivers/media/IR/mceusb.c45
1 files changed, 13 insertions, 32 deletions
diff --git a/drivers/media/IR/mceusb.c b/drivers/media/IR/mceusb.c
index e453c6bc0c68..18110987597e 100644
--- a/drivers/media/IR/mceusb.c
+++ b/drivers/media/IR/mceusb.c
@@ -74,6 +74,7 @@
74#define MCE_PACKET_LENGTH_MASK 0x1f /* Packet length mask */ 74#define MCE_PACKET_LENGTH_MASK 0x1f /* Packet length mask */
75 75
76/* Sub-commands, which follow MCE_COMMAND_HEADER or MCE_HW_CMD_HEADER */ 76/* Sub-commands, which follow MCE_COMMAND_HEADER or MCE_HW_CMD_HEADER */
77#define MCE_CMD_SIG_END 0x01 /* End of signal */
77#define MCE_CMD_PING 0x03 /* Ping device */ 78#define MCE_CMD_PING 0x03 /* Ping device */
78#define MCE_CMD_UNKNOWN 0x04 /* Unknown */ 79#define MCE_CMD_UNKNOWN 0x04 /* Unknown */
79#define MCE_CMD_UNKNOWN2 0x05 /* Unknown */ 80#define MCE_CMD_UNKNOWN2 0x05 /* Unknown */
@@ -422,6 +423,7 @@ static int mceusb_cmdsize(u8 cmd, u8 subcmd)
422 case MCE_CMD_G_RXSENSOR: 423 case MCE_CMD_G_RXSENSOR:
423 datasize = 2; 424 datasize = 2;
424 break; 425 break;
426 case MCE_CMD_SIG_END:
425 case MCE_CMD_S_TXMASK: 427 case MCE_CMD_S_TXMASK:
426 case MCE_CMD_S_RXSENSOR: 428 case MCE_CMD_S_RXSENSOR:
427 datasize = 1; 429 datasize = 1;
@@ -502,6 +504,9 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
502 break; 504 break;
503 case MCE_COMMAND_HEADER: 505 case MCE_COMMAND_HEADER:
504 switch (subcmd) { 506 switch (subcmd) {
507 case MCE_CMD_SIG_END:
508 dev_info(dev, "End of signal\n");
509 break;
505 case MCE_CMD_PING: 510 case MCE_CMD_PING:
506 dev_info(dev, "Ping\n"); 511 dev_info(dev, "Ping\n");
507 break; 512 break;
@@ -539,7 +544,7 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
539 if (len == 2) 544 if (len == 2)
540 dev_info(dev, "Get receive sensor\n"); 545 dev_info(dev, "Get receive sensor\n");
541 else 546 else
542 dev_info(dev, "Received pulse count is %d\n", 547 dev_info(dev, "Remaining pulse count is %d\n",
543 ((data1 << 8) | data2)); 548 ((data1 << 8) | data2));
544 break; 549 break;
545 case MCE_RSP_CMD_INVALID: 550 case MCE_RSP_CMD_INVALID:
@@ -763,7 +768,7 @@ static int mceusb_set_tx_carrier(void *priv, u32 carrier)
763 768
764 if (carrier == 0) { 769 if (carrier == 0) {
765 ir->carrier = carrier; 770 ir->carrier = carrier;
766 cmdbuf[2] = 0x01; 771 cmdbuf[2] = MCE_CMD_SIG_END;
767 cmdbuf[3] = MCE_IRDATA_TRAILER; 772 cmdbuf[3] = MCE_IRDATA_TRAILER;
768 dev_dbg(ir->dev, "%s: disabling carrier " 773 dev_dbg(ir->dev, "%s: disabling carrier "
769 "modulation\n", __func__); 774 "modulation\n", __func__);
@@ -816,25 +821,11 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
816 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) 821 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
817 * MCE_TIME_UNIT * 1000; 822 * MCE_TIME_UNIT * 1000;
818 823
819 if ((ir->buf_in[i] & MCE_PULSE_MASK) == 0x7f) {
820 if (ir->rawir.pulse == rawir.pulse) {
821 ir->rawir.duration += rawir.duration;
822 } else {
823 ir->rawir.duration = rawir.duration;
824 ir->rawir.pulse = rawir.pulse;
825 }
826 if (ir->rem)
827 break;
828 }
829 rawir.duration += ir->rawir.duration;
830 ir->rawir.duration = 0;
831 ir->rawir.pulse = rawir.pulse;
832
833 dev_dbg(ir->dev, "Storing %s with duration %d\n", 824 dev_dbg(ir->dev, "Storing %s with duration %d\n",
834 rawir.pulse ? "pulse" : "space", 825 rawir.pulse ? "pulse" : "space",
835 rawir.duration); 826 rawir.duration);
836 827
837 ir_raw_event_store(ir->idev, &rawir); 828 ir_raw_event_store_with_filter(ir->idev, &rawir);
838 break; 829 break;
839 case CMD_DATA: 830 case CMD_DATA:
840 ir->rem--; 831 ir->rem--;
@@ -851,16 +842,8 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
851 } 842 }
852 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK); 843 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK);
853 mceusb_dev_printdata(ir, ir->buf_in, i, ir->rem + 1, false); 844 mceusb_dev_printdata(ir, ir->buf_in, i, ir->rem + 1, false);
854 if (ir->rem) { 845 if (ir->rem)
855 ir->parser_state = PARSE_IRDATA; 846 ir->parser_state = PARSE_IRDATA;
856 break;
857 }
858 /*
859 * a package with len=0 (e. g. 0x80) means end of
860 * data. We could use it to do the call to
861 * ir_raw_event_handle(). For now, we don't need to
862 * use it.
863 */
864 break; 847 break;
865 } 848 }
866 849
@@ -1092,7 +1075,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1092 bool tx_mask_inverted; 1075 bool tx_mask_inverted;
1093 bool is_polaris; 1076 bool is_polaris;
1094 1077
1095 dev_dbg(&intf->dev, ": %s called\n", __func__); 1078 dev_dbg(&intf->dev, "%s called\n", __func__);
1096 1079
1097 idesc = intf->cur_altsetting; 1080 idesc = intf->cur_altsetting;
1098 1081
@@ -1122,7 +1105,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1122 ep_in = ep; 1105 ep_in = ep;
1123 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT; 1106 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
1124 ep_in->bInterval = 1; 1107 ep_in->bInterval = 1;
1125 dev_dbg(&intf->dev, ": acceptable inbound endpoint " 1108 dev_dbg(&intf->dev, "acceptable inbound endpoint "
1126 "found\n"); 1109 "found\n");
1127 } 1110 }
1128 1111
@@ -1137,12 +1120,12 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1137 ep_out = ep; 1120 ep_out = ep;
1138 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT; 1121 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
1139 ep_out->bInterval = 1; 1122 ep_out->bInterval = 1;
1140 dev_dbg(&intf->dev, ": acceptable outbound endpoint " 1123 dev_dbg(&intf->dev, "acceptable outbound endpoint "
1141 "found\n"); 1124 "found\n");
1142 } 1125 }
1143 } 1126 }
1144 if (ep_in == NULL) { 1127 if (ep_in == NULL) {
1145 dev_dbg(&intf->dev, ": inbound and/or endpoint not found\n"); 1128 dev_dbg(&intf->dev, "inbound and/or endpoint not found\n");
1146 return -ENODEV; 1129 return -ENODEV;
1147 } 1130 }
1148 1131
@@ -1169,8 +1152,6 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1169 ir->flags.no_tx = mceusb_model[model].no_tx; 1152 ir->flags.no_tx = mceusb_model[model].no_tx;
1170 ir->model = model; 1153 ir->model = model;
1171 1154
1172 init_ir_raw_event(&ir->rawir);
1173
1174 /* Saving usb interface data for use by the transmitter routine */ 1155 /* Saving usb interface data for use by the transmitter routine */
1175 ir->usb_ep_in = ep_in; 1156 ir->usb_ep_in = ep_in;
1176 ir->usb_ep_out = ep_out; 1157 ir->usb_ep_out = ep_out;