diff options
Diffstat (limited to 'drivers/media/video/cx23885/cx23885-input.c')
-rw-r--r-- | drivers/media/video/cx23885/cx23885-input.c | 72 |
1 files changed, 50 insertions, 22 deletions
diff --git a/drivers/media/video/cx23885/cx23885-input.c b/drivers/media/video/cx23885/cx23885-input.c index d0b1613ede2f..bb61870b8d6e 100644 --- a/drivers/media/video/cx23885/cx23885-input.c +++ b/drivers/media/video/cx23885/cx23885-input.c | |||
@@ -44,40 +44,26 @@ | |||
44 | 44 | ||
45 | #define MODULE_NAME "cx23885" | 45 | #define MODULE_NAME "cx23885" |
46 | 46 | ||
47 | static void convert_measurement(u32 x, struct ir_raw_event *y) | ||
48 | { | ||
49 | if (x == V4L2_SUBDEV_IR_PULSE_RX_SEQ_END) { | ||
50 | y->pulse = false; | ||
51 | y->duration = V4L2_SUBDEV_IR_PULSE_MAX_WIDTH_NS; | ||
52 | return; | ||
53 | } | ||
54 | |||
55 | y->pulse = (x & V4L2_SUBDEV_IR_PULSE_LEVEL_MASK) ? true : false; | ||
56 | y->duration = x & V4L2_SUBDEV_IR_PULSE_MAX_WIDTH_NS; | ||
57 | } | ||
58 | |||
59 | static void cx23885_input_process_measurements(struct cx23885_dev *dev, | 47 | static void cx23885_input_process_measurements(struct cx23885_dev *dev, |
60 | bool overrun) | 48 | bool overrun) |
61 | { | 49 | { |
62 | struct cx23885_kernel_ir *kernel_ir = dev->kernel_ir; | 50 | struct cx23885_kernel_ir *kernel_ir = dev->kernel_ir; |
63 | struct ir_raw_event kernel_ir_event; | ||
64 | 51 | ||
65 | u32 sd_ir_data[64]; | ||
66 | ssize_t num; | 52 | ssize_t num; |
67 | int count, i; | 53 | int count, i; |
68 | bool handle = false; | 54 | bool handle = false; |
55 | struct ir_raw_event ir_core_event[64]; | ||
69 | 56 | ||
70 | do { | 57 | do { |
71 | num = 0; | 58 | num = 0; |
72 | v4l2_subdev_call(dev->sd_ir, ir, rx_read, (u8 *) sd_ir_data, | 59 | v4l2_subdev_call(dev->sd_ir, ir, rx_read, (u8 *) ir_core_event, |
73 | sizeof(sd_ir_data), &num); | 60 | sizeof(ir_core_event), &num); |
74 | 61 | ||
75 | count = num / sizeof(u32); | 62 | count = num / sizeof(struct ir_raw_event); |
76 | 63 | ||
77 | for (i = 0; i < count; i++) { | 64 | for (i = 0; i < count; i++) { |
78 | convert_measurement(sd_ir_data[i], &kernel_ir_event); | ||
79 | ir_raw_event_store(kernel_ir->inp_dev, | 65 | ir_raw_event_store(kernel_ir->inp_dev, |
80 | &kernel_ir_event); | 66 | &ir_core_event[i]); |
81 | handle = true; | 67 | handle = true; |
82 | } | 68 | } |
83 | } while (num != 0); | 69 | } while (num != 0); |
@@ -99,8 +85,10 @@ void cx23885_input_rx_work_handler(struct cx23885_dev *dev, u32 events) | |||
99 | switch (dev->board) { | 85 | switch (dev->board) { |
100 | case CX23885_BOARD_HAUPPAUGE_HVR1850: | 86 | case CX23885_BOARD_HAUPPAUGE_HVR1850: |
101 | case CX23885_BOARD_HAUPPAUGE_HVR1290: | 87 | case CX23885_BOARD_HAUPPAUGE_HVR1290: |
88 | case CX23885_BOARD_TEVII_S470: | ||
89 | case CX23885_BOARD_HAUPPAUGE_HVR1250: | ||
102 | /* | 90 | /* |
103 | * The only board we handle right now. However other boards | 91 | * The only boards we handle right now. However other boards |
104 | * using the CX2388x integrated IR controller should be similar | 92 | * using the CX2388x integrated IR controller should be similar |
105 | */ | 93 | */ |
106 | break; | 94 | break; |
@@ -148,6 +136,7 @@ static int cx23885_input_ir_start(struct cx23885_dev *dev) | |||
148 | switch (dev->board) { | 136 | switch (dev->board) { |
149 | case CX23885_BOARD_HAUPPAUGE_HVR1850: | 137 | case CX23885_BOARD_HAUPPAUGE_HVR1850: |
150 | case CX23885_BOARD_HAUPPAUGE_HVR1290: | 138 | case CX23885_BOARD_HAUPPAUGE_HVR1290: |
139 | case CX23885_BOARD_HAUPPAUGE_HVR1250: | ||
151 | /* | 140 | /* |
152 | * The IR controller on this board only returns pulse widths. | 141 | * The IR controller on this board only returns pulse widths. |
153 | * Any other mode setting will fail to set up the device. | 142 | * Any other mode setting will fail to set up the device. |
@@ -170,7 +159,38 @@ static int cx23885_input_ir_start(struct cx23885_dev *dev) | |||
170 | * mark is received as low logic level; | 159 | * mark is received as low logic level; |
171 | * falling edges are detected as rising edges; etc. | 160 | * falling edges are detected as rising edges; etc. |
172 | */ | 161 | */ |
173 | params.invert = true; | 162 | params.invert_level = true; |
163 | break; | ||
164 | case CX23885_BOARD_TEVII_S470: | ||
165 | /* | ||
166 | * The IR controller on this board only returns pulse widths. | ||
167 | * Any other mode setting will fail to set up the device. | ||
168 | */ | ||
169 | params.mode = V4L2_SUBDEV_IR_MODE_PULSE_WIDTH; | ||
170 | params.enable = true; | ||
171 | params.interrupt_enable = true; | ||
172 | params.shutdown = false; | ||
173 | |||
174 | /* Setup for a standard NEC protocol */ | ||
175 | params.carrier_freq = 37917; /* Hz, 455 kHz/12 for NEC */ | ||
176 | params.carrier_range_lower = 33000; /* Hz */ | ||
177 | params.carrier_range_upper = 43000; /* Hz */ | ||
178 | params.duty_cycle = 33; /* percent, 33 percent for NEC */ | ||
179 | |||
180 | /* | ||
181 | * NEC max pulse width: (64/3)/(455 kHz/12) * 16 nec_units | ||
182 | * (64/3)/(455 kHz/12) * 16 nec_units * 1.375 = 12378022 ns | ||
183 | */ | ||
184 | params.max_pulse_width = 12378022; /* ns */ | ||
185 | |||
186 | /* | ||
187 | * NEC noise filter min width: (64/3)/(455 kHz/12) * 1 nec_unit | ||
188 | * (64/3)/(455 kHz/12) * 1 nec_units * 0.625 = 351648 ns | ||
189 | */ | ||
190 | params.noise_filter_min_width = 351648; /* ns */ | ||
191 | |||
192 | params.modulation = false; | ||
193 | params.invert_level = true; | ||
174 | break; | 194 | break; |
175 | } | 195 | } |
176 | v4l2_subdev_call(dev->sd_ir, ir, rx_s_parameters, ¶ms); | 196 | v4l2_subdev_call(dev->sd_ir, ir, rx_s_parameters, ¶ms); |
@@ -244,12 +264,20 @@ int cx23885_input_init(struct cx23885_dev *dev) | |||
244 | switch (dev->board) { | 264 | switch (dev->board) { |
245 | case CX23885_BOARD_HAUPPAUGE_HVR1850: | 265 | case CX23885_BOARD_HAUPPAUGE_HVR1850: |
246 | case CX23885_BOARD_HAUPPAUGE_HVR1290: | 266 | case CX23885_BOARD_HAUPPAUGE_HVR1290: |
247 | /* Integrated CX23888 IR controller */ | 267 | case CX23885_BOARD_HAUPPAUGE_HVR1250: |
268 | /* Integrated CX2388[58] IR controller */ | ||
248 | driver_type = RC_DRIVER_IR_RAW; | 269 | driver_type = RC_DRIVER_IR_RAW; |
249 | allowed_protos = IR_TYPE_ALL; | 270 | allowed_protos = IR_TYPE_ALL; |
250 | /* The grey Hauppauge RC-5 remote */ | 271 | /* The grey Hauppauge RC-5 remote */ |
251 | rc_map = RC_MAP_RC5_HAUPPAUGE_NEW; | 272 | rc_map = RC_MAP_RC5_HAUPPAUGE_NEW; |
252 | break; | 273 | break; |
274 | case CX23885_BOARD_TEVII_S470: | ||
275 | /* Integrated CX23885 IR controller */ | ||
276 | driver_type = RC_DRIVER_IR_RAW; | ||
277 | allowed_protos = IR_TYPE_ALL; | ||
278 | /* A guess at the remote */ | ||
279 | rc_map = RC_MAP_TEVII_NEC; | ||
280 | break; | ||
253 | default: | 281 | default: |
254 | return -ENODEV; | 282 | return -ENODEV; |
255 | } | 283 | } |