1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
|
#ifndef _BFLB_IR_H
#define _BFLB_IR_H
#include "bflb_core.h"
/** @addtogroup LHAL
* @{
*/
/** @addtogroup IR
* @{
*/
#if !defined(BL616)
/** @defgroup IR_TX_MODE ir tx mode definition
* @{
*/
#define IR_TX_NEC 0
#define IR_TX_RC5 1
#define IR_TX_SWM 2
#define IR_TX_CUSTOMIZE 3
/**
* @}
*/
/** @defgroup IR_TX_FIFO_WIDTH ir tx fifo width valid width definition
* @{
*/
#if !defined(BL602) && !defined(BL702)
#define IR_TX_FIFO_WIDTH_8BIT 0
#define IR_TX_FIFO_WIDTH_16BIT 1
#define IR_TX_FIFO_WIDTH_24BIT 2
#endif
#define IR_TX_FIFO_WIDTH_32BIT 3
/**
* @}
*/
/** @defgroup IR_TX_INTEN ir tx interrupt enable definition
* @{
*/
#define IR_TX_INTEN_END (1 << 0)
#if !defined(BL602) && !defined(BL702)
#define IR_TX_INTEN_FIFO (1 << 1)
#define IR_TX_INTEN_FER (1 << 2)
#endif
/**
* @}
*/
/** @defgroup IR_TX_INTSTS ir tx interrupt status definition
* @{
*/
#define IR_TX_INTSTS_END (1 << 0)
#if !defined(BL602) && !defined(BL702)
#define IR_TX_INTSTS_FIFO (1 << 1)
#define IR_TX_INTSTS_FER (1 << 2)
#endif
/**
* @}
*/
#endif
#if !defined(BL702L)
/** @defgroup IR_RX_MODE ir rx mode definition
* @{
*/
#define IR_RX_NEC 0
#define IR_RX_RC5 1
#define IR_RX_SWM 2
/**
* @}
*/
/** @defgroup IR_RX_INTEN ir rx interrupt enable definition
* @{
*/
#define IR_RX_INTEN_END (1 << 0)
#if !defined(BL602) && !defined(BL702)
#define IR_RX_INTEN_FIFO (1 << 1)
#define IR_RX_INTEN_FER (1 << 2)
#endif
/**
* @}
*/
/** @defgroup IR_RX_INTSTS ir rx interrupt status definition
* @{
*/
#define IR_RX_INTSTS_END (1 << 0)
#if !defined(BL602) && !defined(BL702)
#define IR_RX_INTSTS_FIFO (1 << 1)
#define IR_RX_INTSTS_FER (1 << 2)
#endif
/**
* @}
*/
#endif
#if !defined(BL616)
/**
* @brief IR TX configuration structure
*
* @param tx_mode TX mode select, use @ref IR_TX_MODE
* @param data_bits Bit count of data phase (don't care if tx freerun mode is enabled)
* @param tail_inverse Enable or disable signal of tail pulse inverse (don't care if SWM is enabled)
* @param tail_enable Enable or disable signal of tail pulse (don't care if SWM is enabled)
* @param head_inverse Enable or disable signal of head pulse inverse (don't care if SWM is enabled)
* @param head_enable Enable or disable signal of head pulse (don't care if SWM is enabled)
* @param logic1_inverse Enable or disable signal of logic 1 pulse inverse (don't care if SWM is enabled)
* @param logic0_inverse Enable or disable signal of logic 0 pulse inverse (don't care if SWM is enabled)
* @param data_enable Enable or disable signal of data pulse (don't care if SWM is enabled)
* @param swm_enable Enable or disable software mode(SWM)
* @param output_modulation Enable or disable signal of output modulation
* @param output_inverse Enable or disable signal of output inverse,0:output stays at low during idle state,1:stay at high
* @param freerun_enable Enable or disable tx freerun mode (don't care if SWM is enabled)
* @param continue_enable Disable:idle time between frames = (tailPulseWidth_0+tailPulseWidth_1)*pulseWidthUnit,Enable:no idle time between frames
* @param fifo_width IR frame size(also the valid width for each fifo entry), use @ref IR_TX_FIFO_WIDTH
* @param fifo_threshold TX FIFO threshold
* @param logic0_pulse_width_1 Pulse width of logic 0 pulse phase 1 (don't care if SWM is enabled)
* @param logic0_pulse_width_0 Pulse width of logic 0 pulse phase 0 (don't care if SWM is enabled)
* @param logic1_pulse_width_1 Pulse width of logic 1 pulse phase 1 (don't care if SWM is enabled)
* @param logic1_pulse_width_0 Pulse width of logic 1 pulse phase 0 (don't care if SWM is enabled)
* @param head_pulse_width_1 Pulse width of head pulse phase 1 (don't care if SWM is enabled)
* @param head_pulse_width_0 Pulse width of head pulse phase 0 (don't care if SWM is enabled)
* @param tail_pulse_width_1 Pulse width of tail pulse phase 1 (don't care if SWM is enabled)
* @param tail_pulse_width_0 Pulse width of tail pulse phase 0 (don't care if SWM is enabled)
* @param modu_width_1 Modulation phase 1 width
* @param modu_width_0 Modulation phase 0 width
* @param pulse_width_unit Pulse width unit
*/
struct bflb_ir_tx_config_s {
uint8_t tx_mode;
uint8_t data_bits;
uint8_t tail_inverse;
uint8_t tail_enable;
uint8_t head_inverse;
uint8_t head_enable;
uint8_t logic1_inverse;
uint8_t logic0_inverse;
uint8_t data_enable;
uint8_t swm_enable;
uint8_t output_modulation;
uint8_t output_inverse;
uint8_t freerun_enable;
uint8_t continue_enable;
uint8_t fifo_width;
uint8_t fifo_threshold;
uint8_t logic0_pulse_width_1;
uint8_t logic0_pulse_width_0;
uint8_t logic1_pulse_width_1;
uint8_t logic1_pulse_width_0;
uint8_t head_pulse_width_1;
uint8_t head_pulse_width_0;
uint8_t tail_pulse_width_1;
uint8_t tail_pulse_width_0;
uint8_t modu_width_1;
uint8_t modu_width_0;
uint16_t pulse_width_unit;
};
#endif
#if !defined(BL702L)
/**
* @brief IR RX configuration structure
*
* @param rx_mode RX mode select, use @ref IR_RX_MODE
* @param input_inverse Enable or disable signal of input inverse
* @param deglitch_enable Enable or disable signal of rx input de-glitch function
* @param deglitch_cnt De-glitch function cycle count
* @param data_threshold Pulse width threshold for logic 0/1 detection (don't care if SWM is enabled)
* @param end_threshold Pulse width threshold to trigger end condition
* @param fifo_threshold RX FIFO threshold
*/
struct bflb_ir_rx_config_s {
uint8_t rx_mode;
uint8_t input_inverse;
uint8_t deglitch_enable;
uint8_t deglitch_cnt;
uint16_t data_threshold;
uint16_t end_threshold;
uint16_t fifo_threshold;
};
#endif
#ifdef __cplusplus
extern "C" {
#endif
#if !defined(BL616)
/**
* @brief Initialize ir tx.
*
* @param [in] dev device handle
* @param [in] config pointer to ir tx configure structure
*/
void bflb_ir_tx_init(struct bflb_device_s *dev, const struct bflb_ir_tx_config_s *config);
/**
* @brief Send data in NEC/RC5/customize mode.
*
* @param [in] dev device handle
* @param [in] data data buffer to send
* @param [in] length length of data buffer
*/
void bflb_ir_send(struct bflb_device_s *dev, uint32_t *data, uint32_t length);
/**
* @brief Send data in software mode.
*
* @param [in] dev device handle
* @param [in] data data data buffer to send
* @param [in] length length of data buffer
*/
void bflb_ir_swm_send(struct bflb_device_s *dev, uint16_t *data, uint8_t length);
/**
* @brief Enable or disable ir tx.
*
* @param [in] dev device handle
* @param [in] enable enable or disable
*/
void bflb_ir_tx_enable(struct bflb_device_s *dev, bool enable);
/**
* @brief Mask or unmask ir tx interrupt.
*
* @param [in] dev device handle
* @param [in] int_type ir tx interrupt type, use @ref IR_TX_INTEN
* @param [in] mask mask or unmask
*/
void bflb_ir_txint_mask(struct bflb_device_s *dev, uint8_t int_type, bool mask);
/**
* @brief Get ir tx interrupt status.
*
* @param [in] dev device handle
* @return Ir tx interrupt status
*/
uint32_t bflb_ir_get_txint_status(struct bflb_device_s *dev);
/**
* @brief Clear ir tx interrupt.
*
* @param [in] dev device handle
*/
void bflb_ir_txint_clear(struct bflb_device_s *dev);
#if !defined(BL602) && !defined(BL702)
/**
* @brief Enable or disable ir tx dma mode.
*
* @param [in] dev device handle
* @param [in] enable enable or disable
*/
void bflb_ir_link_txdma(struct bflb_device_s *dev, bool enable);
/**
* @brief Get ir tx fifo available count.
*
* @param [in] dev device handle
* @return Ir tx fifo available count
*/
uint8_t bflb_ir_get_txfifo_cnt(struct bflb_device_s *dev);
/**
* @brief Clear ir tx fifo.
*
* @param [in] dev device handle
*/
void bflb_ir_txfifo_clear(struct bflb_device_s *dev);
#endif
#endif
#if !defined(BL702L)
/**
* @brief Initialize ir rx.
*
* @param [in] dev device handle
* @param [in] config config pointer to ir rx configure structure
*/
void bflb_ir_rx_init(struct bflb_device_s *dev, const struct bflb_ir_rx_config_s *config);
/**
* @brief Receive data in NEC/RC5/customize mode.
*
* @param [in] dev device handle
* @param [out] data data received
* @return Bit count of data received
*/
uint8_t bflb_ir_receive(struct bflb_device_s *dev, uint64_t *data);
/**
* @brief Receive data in software mode.
*
* @param [in] dev device handle
* @param [out] data data buffer to receive
* @param [in] length of data buffer
* @return Length of data received
*/
uint8_t bflb_ir_swm_receive(struct bflb_device_s *dev, uint16_t *data, uint8_t length);
/**
* @brief Enable or disable ir rx.
*
* @param [in] dev device handle
* @param [in] enable enable or disable
*/
void bflb_ir_rx_enable(struct bflb_device_s *dev, bool enable);
/**
* @brief Get ir rx fifo available count.
*
* @param [in] dev device handle
* @return Ir rx fifo available count
*/
uint8_t bflb_ir_get_rxfifo_cnt(struct bflb_device_s *dev);
/**
* @brief Clear ir rx fifo.
*
* @param [in] dev device handle
*/
void bflb_ir_rxfifo_clear(struct bflb_device_s *dev);
/**
* @brief Mask ir rx interrupt.
*
* @param [in] dev device handle
* @param [in] int_type ir rx interrupt type, use @ref IR_RX_INTEN
* @param [in] mask mask or unmask
*/
void bflb_ir_rxint_mask(struct bflb_device_s *dev, uint8_t int_type, bool mask);
/**
* @brief Get ir rx interrupt status.
*
* @param [in] dev device handle
* @return Ir rx interrupt status
*/
uint32_t bflb_ir_get_rxint_status(struct bflb_device_s *dev);
/**
* @brief Clear ir rx interrupt.
*
* @param [in] dev device handle
*/
void bflb_ir_rxint_clear(struct bflb_device_s *dev);
#endif
/**
* @brief Control ir feature.
*
* @param [in] dev device handle
* @param [in] cmd feature command
* @param [in] arg user data
* @return A negated errno value on failure
*/
int bflb_ir_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
#ifdef __cplusplus
}
#endif
/**
* @}
*/
/**
* @}
*/
#endif
|