Skip to content

Commit b63fe1c

Browse files
DineshDK03nashif
authored andcommitted
drivers: sensor: grow_r502a: modified Tx and Rx data handling
improvised uart tx and rx handler functions to handle large chunk of fingerprint data from/to the sensor. Signed-off-by: Dinesh Kumar K <[email protected]>
1 parent 3c8bd0b commit b63fe1c

File tree

2 files changed

+130
-53
lines changed

2 files changed

+130
-53
lines changed

drivers/sensor/grow_r502a/grow_r502a.c

Lines changed: 116 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -18,65 +18,79 @@
1818
#include <zephyr/logging/log.h>
1919
LOG_MODULE_REGISTER(GROW_R502A, CONFIG_SENSOR_LOG_LEVEL);
2020

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,
2222
union r502a_packet *rx_packet, char const data_len)
2323
{
2424
const struct grow_r502a_config *cfg = dev->config;
2525
struct grow_r502a_data *drv_data = dev->data;
26-
uint16_t check_sum, pkg_len;
2726

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;
3029

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);
3836

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]);
4141

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;
4344

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");
4546

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+
}
4865

49-
k_sem_take(&drv_data->uart_rx_sem, K_FOREVER);
66+
return 0;
5067
}
5168

5269
static void uart_cb_tx_handler(const struct device *dev)
5370
{
5471
const struct grow_r502a_config *config = dev->config;
5572
struct grow_r502a_data *drv_data = dev->data;
5673
int sent = 0;
57-
uint8_t retries = 3;
5874

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,
6177
drv_data->tx_buf.len);
78+
drv_data->tx_buf.data += sent;
6279
drv_data->tx_buf.len -= sent;
6380
}
6481

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;
7286
}
7387
}
7488

7589
static void uart_cb_handler(const struct device *dev, void *user_data)
7690
{
7791
const struct device *uart_dev = user_data;
7892
struct grow_r502a_data *drv_data = uart_dev->data;
79-
int len, pkt_sz = 0;
93+
int len = 0;
8094
int offset = drv_data->rx_buf.len;
8195

8296
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)
86100

87101
while (uart_irq_rx_ready(dev)) {
88102
len = uart_fifo_read(dev, &drv_data->rx_buf.data[offset],
89-
R502A_BUF_SIZE - offset);
103+
drv_data->pkt_len);
90104
offset += len;
91105
drv_data->rx_buf.len = offset;
92106

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;
96110
}
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+
);
98116
continue;
99117
}
118+
100119
LOG_HEXDUMP_DBG(drv_data->rx_buf.data, offset, "RX");
120+
uart_irq_rx_disable(dev);
101121
k_sem_give(&drv_data->uart_rx_sem);
102122
break;
103123
}
@@ -108,14 +128,18 @@ static int fps_led_control(const struct device *dev, struct r502a_led_params *le
108128
{
109129
union r502a_packet rx_packet = {0};
110130
char const led_ctrl_len = 5;
131+
int ret = 0;
111132

112133
union r502a_packet tx_packet = {
113134
.pid = R502A_COMMAND_PACKET,
114135
.data = { R502A_LED_CONFIG, led_control->ctrl_code,
115136
led_control->speed, led_control->color_idx, led_control->cycle}
116137
};
117138

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+
}
119143

120144
if (rx_packet.pid != R502A_ACK_PACKET) {
121145
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
@@ -137,6 +161,7 @@ static int fps_verify_password(const struct device *dev)
137161
{
138162
union r502a_packet rx_packet = {0};
139163
char const verify_pwd_len = 5;
164+
int ret = 0;
140165

141166
union r502a_packet tx_packet = {
142167
.pid = R502A_COMMAND_PACKET,
@@ -145,7 +170,10 @@ static int fps_verify_password(const struct device *dev)
145170

146171
sys_put_be32(R502A_DEFAULT_PASSWORD, &tx_packet.data[1]);
147172

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+
}
149177

150178
if (rx_packet.pid != R502A_ACK_PACKET) {
151179
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)
167195
struct grow_r502a_data *drv_data = dev->data;
168196
union r502a_packet rx_packet = {0};
169197
char const get_temp_cnt_len = 1;
198+
int ret = 0;
170199

171200
union r502a_packet tx_packet = {
172201
.pid = R502A_COMMAND_PACKET,
173202
.data = {R502A_TEMPLATECOUNT},
174203
};
175204

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+
}
177209

178210
if (rx_packet.pid != R502A_ACK_PACKET) {
179211
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)
206238

207239
k_mutex_lock(&drv_data->lock, K_FOREVER);
208240

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+
}
210245

211246
if (rx_packet.pid != R502A_ACK_PACKET) {
212247
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
@@ -244,6 +279,7 @@ static int fps_get_image(const struct device *dev)
244279
{
245280
union r502a_packet rx_packet = {0};
246281
char const get_img_len = 1;
282+
int ret = 0;
247283

248284
struct r502a_led_params led_ctrl = {
249285
.ctrl_code = R502A_LED_CTRL_BREATHING,
@@ -257,7 +293,10 @@ static int fps_get_image(const struct device *dev)
257293
.data = {R502A_GENIMAGE},
258294
};
259295

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+
}
261300

262301
if (rx_packet.pid != R502A_ACK_PACKET) {
263302
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)
282321
{
283322
union r502a_packet rx_packet = {0};
284323
char const img_to_char_len = 2;
324+
int ret = 0;
285325

286326
union r502a_packet tx_packet = {
287327
.pid = R502A_COMMAND_PACKET,
288328
.data = {R502A_IMAGE2TZ, char_buf_idx}
289329
};
290330

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+
}
292335

293336
if (rx_packet.pid != R502A_ACK_PACKET) {
294337
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
@@ -309,13 +352,17 @@ static int fps_create_model(const struct device *dev)
309352
{
310353
union r502a_packet rx_packet = {0};
311354
char const create_model_len = 1;
355+
int ret = 0;
312356

313357
union r502a_packet tx_packet = {
314358
.pid = R502A_COMMAND_PACKET,
315359
.data = {R502A_REGMODEL}
316360
};
317361

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+
}
319366

320367
if (rx_packet.pid != R502A_ACK_PACKET) {
321368
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)
354401

355402
k_mutex_lock(&drv_data->lock, K_FOREVER);
356403

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+
}
358408

359409
if (rx_packet.pid != R502A_ACK_PACKET) {
360410
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
393443

394444
k_mutex_lock(&drv_data->lock, K_FOREVER);
395445

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+
}
397450

398451
if (rx_packet.pid != R502A_ACK_PACKET) {
399452
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
@@ -426,7 +479,10 @@ static int fps_empty_db(const struct device *dev)
426479

427480
k_mutex_lock(&drv_data->lock, K_FOREVER);
428481

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+
}
430486

431487
if (rx_packet.pid != R502A_ACK_PACKET) {
432488
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)
470526

471527
k_mutex_lock(&drv_data->lock, K_FOREVER);
472528

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+
}
474533

475534
if (rx_packet.pid != R502A_ACK_PACKET) {
476535
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)
520579

521580
k_mutex_lock(&drv_data->lock, K_FOREVER);
522581

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+
}
524586

525587
if (rx_packet.pid != R502A_ACK_PACKET) {
526588
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
562624

563625
k_mutex_lock(&drv_data->lock, K_FOREVER);
564626

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+
}
566631

567632
if (rx_packet.pid != R502A_ACK_PACKET) {
568633
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
@@ -784,9 +849,13 @@ static int grow_r502a_init(const struct device *dev)
784849

785850
k_mutex_init(&drv_data->lock);
786851
k_sem_init(&drv_data->uart_rx_sem, 0, 1);
852+
k_sem_init(&drv_data->uart_tx_sem, 0, 1);
787853

788854
uart_irq_callback_user_data_set(cfg->dev, uart_cb_handler, (void *)dev);
789855

856+
uart_irq_rx_disable(cfg->dev);
857+
uart_irq_tx_disable(cfg->dev);
858+
790859
#ifdef CONFIG_GROW_R502A_TRIGGER
791860
ret = grow_r502a_init_interrupt(dev);
792861

0 commit comments

Comments
 (0)