18
18
#include <zephyr/logging/log.h>
19
19
LOG_MODULE_REGISTER (GROW_R502A , CONFIG_SENSOR_LOG_LEVEL );
20
20
21
- static void transceive_packet (const struct device * dev , union r502a_packet * tx_packet ,
21
+ static int transceive_packet (const struct device * dev , union r502a_packet * tx_packet ,
22
22
union r502a_packet * rx_packet , char const data_len )
23
23
{
24
24
const struct grow_r502a_config * cfg = dev -> config ;
25
25
struct grow_r502a_data * drv_data = dev -> data ;
26
- uint16_t check_sum , pkg_len ;
27
26
28
- pkg_len = data_len + R502A_CHECKSUM_LEN ;
29
- check_sum = ( pkg_len >> 8 ) + ( pkg_len & 0xFF ) + tx_packet -> pid ;
27
+ if ( tx_packet ) {
28
+ uint16_t check_sum , pkg_len ;
30
29
31
- sys_put_be16 (R502A_STARTCODE , tx_packet -> start );
32
- sys_put_be32 (cfg -> comm_addr , tx_packet -> addr );
33
- sys_put_be16 (pkg_len , tx_packet -> len );
34
- for (int i = 0 ; i < data_len ; i ++ ) {
35
- check_sum += tx_packet -> data [i ];
36
- }
37
- sys_put_be16 (check_sum , & tx_packet -> buf [data_len + R502A_HEADER_LEN ]);
30
+ pkg_len = data_len + R502A_CHECKSUM_LEN ;
31
+ check_sum = (pkg_len >> 8 ) + (pkg_len & 0xFF ) + tx_packet -> pid ;
32
+
33
+ tx_packet -> start = sys_cpu_to_be16 (R502A_STARTCODE );
34
+ tx_packet -> addr = sys_cpu_to_be32 (cfg -> comm_addr );
35
+ tx_packet -> len = sys_cpu_to_be16 (pkg_len );
38
36
39
- drv_data -> tx_buf .len = pkg_len + R502A_HEADER_LEN ;
40
- drv_data -> tx_buf .data = tx_packet -> buf ;
37
+ for (int i = 0 ; i < data_len ; i ++ ) {
38
+ check_sum += tx_packet -> data [i ];
39
+ }
40
+ sys_put_be16 (check_sum , & tx_packet -> buf [data_len + R502A_HEADER_LEN ]);
41
41
42
- drv_data -> rx_buf .data = rx_packet -> buf ;
42
+ drv_data -> tx_buf .len = pkg_len + R502A_HEADER_LEN ;
43
+ drv_data -> tx_buf .data = tx_packet -> buf ;
43
44
44
- LOG_HEXDUMP_DBG (drv_data -> tx_buf .data , drv_data -> tx_buf .len , "TX" );
45
+ LOG_HEXDUMP_DBG (drv_data -> tx_buf .data , drv_data -> tx_buf .len , "TX" );
45
46
46
- uart_irq_rx_disable (cfg -> dev );
47
- uart_irq_tx_enable (cfg -> dev );
47
+ uart_irq_tx_enable (cfg -> dev );
48
+
49
+ if (k_sem_take (& drv_data -> uart_tx_sem , K_MSEC (1500 )) != 0 ) {
50
+ LOG_ERR ("Tx data timeout" );
51
+ return - ETIMEDOUT ;
52
+ }
53
+ }
54
+
55
+ if (rx_packet ) {
56
+ drv_data -> rx_buf .data = rx_packet -> buf ;
57
+ drv_data -> rx_buf .len = 0 ;
58
+ drv_data -> pkt_len = R502A_HEADER_LEN ;
59
+ uart_irq_rx_enable (cfg -> dev );
60
+ if (k_sem_take (& drv_data -> uart_rx_sem , K_MSEC (1500 )) != 0 ) {
61
+ LOG_ERR ("Rx data timeout" );
62
+ return - ETIMEDOUT ;
63
+ }
64
+ }
48
65
49
- k_sem_take ( & drv_data -> uart_rx_sem , K_FOREVER ) ;
66
+ return 0 ;
50
67
}
51
68
52
69
static void uart_cb_tx_handler (const struct device * dev )
53
70
{
54
71
const struct grow_r502a_config * config = dev -> config ;
55
72
struct grow_r502a_data * drv_data = dev -> data ;
56
73
int sent = 0 ;
57
- uint8_t retries = 3 ;
58
74
59
- while (drv_data -> tx_buf .len ) {
60
- sent = uart_fifo_fill (config -> dev , & drv_data -> tx_buf .data [ sent ] ,
75
+ if (drv_data -> tx_buf .len > 0 ) {
76
+ sent = uart_fifo_fill (config -> dev , drv_data -> tx_buf .data ,
61
77
drv_data -> tx_buf .len );
78
+ drv_data -> tx_buf .data += sent ;
62
79
drv_data -> tx_buf .len -= sent ;
63
80
}
64
81
65
- while (retries -- ) {
66
- if (uart_irq_tx_complete (config -> dev )) {
67
- uart_irq_tx_disable (config -> dev );
68
- drv_data -> rx_buf .len = 0 ;
69
- uart_irq_rx_enable (config -> dev );
70
- break ;
71
- }
82
+ if (!drv_data -> tx_buf .len && uart_irq_tx_complete (config -> dev ) > 0 ) {
83
+ uart_irq_tx_disable (config -> dev );
84
+ k_sem_give (& drv_data -> uart_tx_sem );
85
+ return ;
72
86
}
73
87
}
74
88
75
89
static void uart_cb_handler (const struct device * dev , void * user_data )
76
90
{
77
91
const struct device * uart_dev = user_data ;
78
92
struct grow_r502a_data * drv_data = uart_dev -> data ;
79
- int len , pkt_sz = 0 ;
93
+ int len = 0 ;
80
94
int offset = drv_data -> rx_buf .len ;
81
95
82
96
if ((uart_irq_update (dev ) > 0 ) && (uart_irq_is_pending (dev ) > 0 )) {
@@ -86,18 +100,24 @@ static void uart_cb_handler(const struct device *dev, void *user_data)
86
100
87
101
while (uart_irq_rx_ready (dev )) {
88
102
len = uart_fifo_read (dev , & drv_data -> rx_buf .data [offset ],
89
- R502A_BUF_SIZE - offset );
103
+ drv_data -> pkt_len );
90
104
offset += len ;
91
105
drv_data -> rx_buf .len = offset ;
92
106
93
- if (offset >= R502A_HEADER_LEN ) {
94
- pkt_sz = R502A_HEADER_LEN +
95
- drv_data -> rx_buf . data [ R502A_HEADER_LEN - 1 ] ;
107
+ if (drv_data -> pkt_len != len ) {
108
+ drv_data -> pkt_len -= len ;
109
+ continue ;
96
110
}
97
- if (offset < pkt_sz ) {
111
+
112
+ if (offset == R502A_HEADER_LEN ) {
113
+ drv_data -> pkt_len = sys_get_be16 (
114
+ & drv_data -> rx_buf .data [R502A_PKG_LEN_IDX ]
115
+ );
98
116
continue ;
99
117
}
118
+
100
119
LOG_HEXDUMP_DBG (drv_data -> rx_buf .data , offset , "RX" );
120
+ uart_irq_rx_disable (dev );
101
121
k_sem_give (& drv_data -> uart_rx_sem );
102
122
break ;
103
123
}
@@ -108,14 +128,18 @@ static int fps_led_control(const struct device *dev, struct r502a_led_params *le
108
128
{
109
129
union r502a_packet rx_packet = {0 };
110
130
char const led_ctrl_len = 5 ;
131
+ int ret = 0 ;
111
132
112
133
union r502a_packet tx_packet = {
113
134
.pid = R502A_COMMAND_PACKET ,
114
135
.data = { R502A_LED_CONFIG , led_control -> ctrl_code ,
115
136
led_control -> speed , led_control -> color_idx , led_control -> cycle }
116
137
};
117
138
118
- transceive_packet (dev , & tx_packet , & rx_packet , led_ctrl_len );
139
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , led_ctrl_len );
140
+ if (ret != 0 ) {
141
+ return ret ;
142
+ }
119
143
120
144
if (rx_packet .pid != R502A_ACK_PACKET ) {
121
145
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -137,6 +161,7 @@ static int fps_verify_password(const struct device *dev)
137
161
{
138
162
union r502a_packet rx_packet = {0 };
139
163
char const verify_pwd_len = 5 ;
164
+ int ret = 0 ;
140
165
141
166
union r502a_packet tx_packet = {
142
167
.pid = R502A_COMMAND_PACKET ,
@@ -145,7 +170,10 @@ static int fps_verify_password(const struct device *dev)
145
170
146
171
sys_put_be32 (R502A_DEFAULT_PASSWORD , & tx_packet .data [1 ]);
147
172
148
- transceive_packet (dev , & tx_packet , & rx_packet , verify_pwd_len );
173
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , verify_pwd_len );
174
+ if (ret != 0 ) {
175
+ return ret ;
176
+ }
149
177
150
178
if (rx_packet .pid != R502A_ACK_PACKET ) {
151
179
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -167,13 +195,17 @@ static int fps_get_template_count(const struct device *dev)
167
195
struct grow_r502a_data * drv_data = dev -> data ;
168
196
union r502a_packet rx_packet = {0 };
169
197
char const get_temp_cnt_len = 1 ;
198
+ int ret = 0 ;
170
199
171
200
union r502a_packet tx_packet = {
172
201
.pid = R502A_COMMAND_PACKET ,
173
202
.data = {R502A_TEMPLATECOUNT },
174
203
};
175
204
176
- transceive_packet (dev , & tx_packet , & rx_packet , get_temp_cnt_len );
205
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , get_temp_cnt_len );
206
+ if (ret != 0 ) {
207
+ return ret ;
208
+ }
177
209
178
210
if (rx_packet .pid != R502A_ACK_PACKET ) {
179
211
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -206,7 +238,10 @@ static int fps_read_template_table(const struct device *dev, uint32_t *free_idx)
206
238
207
239
k_mutex_lock (& drv_data -> lock , K_FOREVER );
208
240
209
- transceive_packet (dev , & tx_packet , & rx_packet , temp_table_len );
241
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , temp_table_len );
242
+ if (ret != 0 ) {
243
+ goto unlock ;
244
+ }
210
245
211
246
if (rx_packet .pid != R502A_ACK_PACKET ) {
212
247
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -244,6 +279,7 @@ static int fps_get_image(const struct device *dev)
244
279
{
245
280
union r502a_packet rx_packet = {0 };
246
281
char const get_img_len = 1 ;
282
+ int ret = 0 ;
247
283
248
284
struct r502a_led_params led_ctrl = {
249
285
.ctrl_code = R502A_LED_CTRL_BREATHING ,
@@ -257,7 +293,10 @@ static int fps_get_image(const struct device *dev)
257
293
.data = {R502A_GENIMAGE },
258
294
};
259
295
260
- transceive_packet (dev , & tx_packet , & rx_packet , get_img_len );
296
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , get_img_len );
297
+ if (ret != 0 ) {
298
+ return ret ;
299
+ }
261
300
262
301
if (rx_packet .pid != R502A_ACK_PACKET ) {
263
302
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -282,13 +321,17 @@ static int fps_image_to_char(const struct device *dev, uint8_t char_buf_idx)
282
321
{
283
322
union r502a_packet rx_packet = {0 };
284
323
char const img_to_char_len = 2 ;
324
+ int ret = 0 ;
285
325
286
326
union r502a_packet tx_packet = {
287
327
.pid = R502A_COMMAND_PACKET ,
288
328
.data = {R502A_IMAGE2TZ , char_buf_idx }
289
329
};
290
330
291
- transceive_packet (dev , & tx_packet , & rx_packet , img_to_char_len );
331
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , img_to_char_len );
332
+ if (ret != 0 ) {
333
+ return ret ;
334
+ }
292
335
293
336
if (rx_packet .pid != R502A_ACK_PACKET ) {
294
337
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -309,13 +352,17 @@ static int fps_create_model(const struct device *dev)
309
352
{
310
353
union r502a_packet rx_packet = {0 };
311
354
char const create_model_len = 1 ;
355
+ int ret = 0 ;
312
356
313
357
union r502a_packet tx_packet = {
314
358
.pid = R502A_COMMAND_PACKET ,
315
359
.data = {R502A_REGMODEL }
316
360
};
317
361
318
- transceive_packet (dev , & tx_packet , & rx_packet , create_model_len );
362
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , create_model_len );
363
+ if (ret != 0 ) {
364
+ return ret ;
365
+ }
319
366
320
367
if (rx_packet .pid != R502A_ACK_PACKET ) {
321
368
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -354,7 +401,10 @@ static int fps_store_model(const struct device *dev, uint16_t id)
354
401
355
402
k_mutex_lock (& drv_data -> lock , K_FOREVER );
356
403
357
- transceive_packet (dev , & tx_packet , & rx_packet , store_model_len );
404
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , store_model_len );
405
+ if (ret != 0 ) {
406
+ goto unlock ;
407
+ }
358
408
359
409
if (rx_packet .pid != R502A_ACK_PACKET ) {
360
410
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -393,7 +443,10 @@ static int fps_delete_model(const struct device *dev, uint16_t id, uint16_t coun
393
443
394
444
k_mutex_lock (& drv_data -> lock , K_FOREVER );
395
445
396
- transceive_packet (dev , & tx_packet , & rx_packet , delete_model_len );
446
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , delete_model_len );
447
+ if (ret != 0 ) {
448
+ goto unlock ;
449
+ }
397
450
398
451
if (rx_packet .pid != R502A_ACK_PACKET ) {
399
452
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -426,7 +479,10 @@ static int fps_empty_db(const struct device *dev)
426
479
427
480
k_mutex_lock (& drv_data -> lock , K_FOREVER );
428
481
429
- transceive_packet (dev , & tx_packet , & rx_packet , empty_db_len );
482
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , empty_db_len );
483
+ if (ret != 0 ) {
484
+ goto unlock ;
485
+ }
430
486
431
487
if (rx_packet .pid != R502A_ACK_PACKET ) {
432
488
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -470,7 +526,10 @@ static int fps_search(const struct device *dev, struct sensor_value *val)
470
526
471
527
k_mutex_lock (& drv_data -> lock , K_FOREVER );
472
528
473
- transceive_packet (dev , & tx_packet , & rx_packet , search_len );
529
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , search_len );
530
+ if (ret != 0 ) {
531
+ goto unlock ;
532
+ }
474
533
475
534
if (rx_packet .pid != R502A_ACK_PACKET ) {
476
535
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -520,7 +579,10 @@ static int fps_load_template(const struct device *dev, uint16_t id)
520
579
521
580
k_mutex_lock (& drv_data -> lock , K_FOREVER );
522
581
523
- transceive_packet (dev , & tx_packet , & rx_packet , load_tmp_len );
582
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , load_tmp_len );
583
+ if (ret != 0 ) {
584
+ goto unlock ;
585
+ }
524
586
525
587
if (rx_packet .pid != R502A_ACK_PACKET ) {
526
588
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -562,7 +624,10 @@ static int fps_match_templates(const struct device *dev, struct sensor_value *va
562
624
563
625
k_mutex_lock (& drv_data -> lock , K_FOREVER );
564
626
565
- transceive_packet (dev , & tx_packet , & rx_packet , match_templates_len );
627
+ ret = transceive_packet (dev , & tx_packet , & rx_packet , match_templates_len );
628
+ if (ret != 0 ) {
629
+ goto unlock ;
630
+ }
566
631
567
632
if (rx_packet .pid != R502A_ACK_PACKET ) {
568
633
LOG_ERR ("Error receiving ack packet 0x%X" , rx_packet .pid );
@@ -784,9 +849,13 @@ static int grow_r502a_init(const struct device *dev)
784
849
785
850
k_mutex_init (& drv_data -> lock );
786
851
k_sem_init (& drv_data -> uart_rx_sem , 0 , 1 );
852
+ k_sem_init (& drv_data -> uart_tx_sem , 0 , 1 );
787
853
788
854
uart_irq_callback_user_data_set (cfg -> dev , uart_cb_handler , (void * )dev );
789
855
856
+ uart_irq_rx_disable (cfg -> dev );
857
+ uart_irq_tx_disable (cfg -> dev );
858
+
790
859
#ifdef CONFIG_GROW_R502A_TRIGGER
791
860
ret = grow_r502a_init_interrupt (dev );
792
861
0 commit comments