Skip to content

Commit 7ae0158

Browse files
DineshDK03nashif
authored andcommitted
drivers: sensor: grow_r502a: add set/read system parameter
Add functionality for read and set system parameter of sensor device. Signed-off-by: Dinesh Kumar K <[email protected]>
1 parent b63fe1c commit 7ae0158

File tree

6 files changed

+204
-4
lines changed

6 files changed

+204
-4
lines changed

drivers/sensor/grow_r502a/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ menuconfig GROW_R502A
1313

1414
if GROW_R502A
1515

16+
config R502A_DATA_PKT_SIZE
17+
int "Template data packet size"
18+
default 128
19+
help
20+
Template data packet size for upload and download
21+
to the sensor device.
22+
valid values are:
23+
32, 64, 128, 256.
24+
1625
choice
1726
prompt "Trigger mode"
1827
default GROW_R502A_TRIGGER_NONE

drivers/sensor/grow_r502a/grow_r502a.c

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <zephyr/drivers/uart.h>
1212
#include <zephyr/sys/byteorder.h>
1313
#include <zephyr/drivers/led.h>
14+
#include <zephyr/sys/util.h>
1415

1516
#include <zephyr/drivers/sensor/grow_r502a.h>
1617
#include "grow_r502a.h"
@@ -124,6 +125,103 @@ static void uart_cb_handler(const struct device *dev, void *user_data)
124125
}
125126
}
126127

128+
/**
129+
* @brief Set sensor device's basic parameters like baud rate, security level
130+
* and data package length.
131+
*/
132+
static int fps_set_sys_param(const struct device *dev, const struct sensor_value *val)
133+
{
134+
union r502a_packet rx_packet = {0};
135+
int ret = 0;
136+
char const set_sys_param_len = 3;
137+
138+
union r502a_packet tx_packet = {
139+
.pid = R502A_COMMAND_PACKET,
140+
.data = { R502A_SETSYSPARAM, val->val1, val->val2}
141+
};
142+
143+
ret = transceive_packet(dev, &tx_packet, &rx_packet, set_sys_param_len);
144+
if (ret != 0) {
145+
return ret;
146+
}
147+
148+
if (rx_packet.pid != R502A_ACK_PACKET) {
149+
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
150+
return -EIO;
151+
}
152+
153+
if (rx_packet.buf[R502A_CC_IDX] == R502A_OK) {
154+
LOG_DBG("R502A set system parameter success");
155+
} else {
156+
LOG_ERR("R502A set system parameter error %d", rx_packet.buf[R502A_CC_IDX]);
157+
return -EIO;
158+
}
159+
160+
return 0;
161+
}
162+
163+
int r502a_read_sys_param(const struct device *dev, struct r502a_sys_param *val)
164+
{
165+
struct grow_r502a_data *drv_data = dev->data;
166+
167+
union r502a_packet rx_packet = {0};
168+
int offset = 0, ret = 0;
169+
char const read_sys_param_len = 1;
170+
171+
union r502a_packet tx_packet = {
172+
.pid = R502A_COMMAND_PACKET,
173+
.data = {R502A_READSYSPARAM}
174+
};
175+
176+
k_mutex_lock(&drv_data->lock, K_FOREVER);
177+
178+
ret = transceive_packet(dev, &tx_packet, &rx_packet, read_sys_param_len);
179+
if (ret != 0) {
180+
goto unlock;
181+
}
182+
183+
if (rx_packet.pid != R502A_ACK_PACKET) {
184+
LOG_ERR("Error receiving ack packet 0x%X", rx_packet.pid);
185+
ret = -EIO;
186+
goto unlock;
187+
}
188+
189+
if (rx_packet.buf[R502A_CC_IDX] == R502A_OK) {
190+
LOG_DBG("R502A read system parameter success");
191+
} else {
192+
LOG_ERR("R502A read system parameter error %d", rx_packet.buf[R502A_CC_IDX]);
193+
ret = -EIO;
194+
goto unlock;
195+
}
196+
197+
val->status_reg = sys_get_be16(
198+
&rx_packet.data[offsetof(struct r502a_sys_param, status_reg) + 1]
199+
);
200+
val->system_id = sys_get_be16(
201+
&rx_packet.data[offsetof(struct r502a_sys_param, system_id) + 1]
202+
);
203+
val->lib_size = sys_get_be16(
204+
&rx_packet.data[offsetof(struct r502a_sys_param, lib_size) + 1]
205+
);
206+
val->sec_level = sys_get_be16(
207+
&rx_packet.data[offsetof(struct r502a_sys_param, sec_level) + 1]
208+
);
209+
val->addr = sys_get_be32(
210+
&rx_packet.data[offsetof(struct r502a_sys_param, addr) + 1]
211+
);
212+
offset = sys_get_be16(
213+
&rx_packet.data[offsetof(struct r502a_sys_param, data_pkt_size) + 1]
214+
);
215+
val->data_pkt_size = 32 * (1 << offset);
216+
val->baud = sys_get_be16(
217+
&rx_packet.data[offsetof(struct r502a_sys_param, baud) + 1]
218+
) * 9600;
219+
220+
unlock:
221+
k_mutex_unlock(&drv_data->lock);
222+
return ret;
223+
}
224+
127225
static int fps_led_control(const struct device *dev, struct r502a_led_params *led_control)
128226
{
129227
union r502a_packet rx_packet = {0};
@@ -689,6 +787,7 @@ static int fps_capture(const struct device *dev)
689787
static int fps_init(const struct device *dev)
690788
{
691789
struct grow_r502a_data *drv_data = dev->data;
790+
struct sensor_value val;
692791
int ret;
693792

694793
struct r502a_led_params led_ctrl = {
@@ -705,6 +804,13 @@ static int fps_init(const struct device *dev)
705804
goto unlock;
706805
}
707806

807+
val.val1 = R502A_DATA_PKG_LEN;
808+
val.val2 = LOG2(CONFIG_R502A_DATA_PKT_SIZE >> 5);
809+
ret = fps_set_sys_param(dev, &val);
810+
if (ret != 0) {
811+
goto unlock;
812+
}
813+
708814
ret = fps_led_control(dev, &led_ctrl);
709815

710816
unlock:
@@ -762,6 +868,22 @@ static int grow_r502a_attr_set(const struct device *dev, enum sensor_channel cha
762868
return fps_empty_db(dev);
763869
case SENSOR_ATTR_R502A_RECORD_LOAD:
764870
return fps_load_template(dev, val->val1);
871+
case SENSOR_ATTR_R502A_SYS_PARAM: {
872+
int ret = 0;
873+
874+
if (val->val1 == R502A_DATA_PKG_LEN) {
875+
LOG_ERR("Data package length should not be runtime configurable");
876+
return -EINVAL;
877+
};
878+
k_mutex_lock(&drv_data->lock, K_FOREVER);
879+
ret = fps_set_sys_param(dev, val);
880+
if (ret != 0) {
881+
k_mutex_unlock(&drv_data->lock);
882+
return ret;
883+
}
884+
k_mutex_unlock(&drv_data->lock);
885+
return 0;
886+
}
765887
default:
766888
LOG_ERR("Sensor attribute not supported");
767889
return -ENOTSUP;

drivers/sensor/grow_r502a/grow_r502a.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,8 @@
126126

127127
#define R502A_CHAR_BUF_SIZE 384 /* Maximum size of characteristic value buffer*/
128128
#define R502A_TEMPLATE_SIZE 768 /* Maximum size of template, twice of CHAR_BUF*/
129-
#define R502A_BUF_SIZE 64
130129

131-
#define R502A_MAX_BUF_SIZE R502A_BUF_SIZE + R502A_COMMON_ACK_LEN
130+
#define R502A_MAX_BUF_SIZE (CONFIG_R502A_DATA_PKT_SIZE + R502A_COMMON_ACK_LEN)
132131

133132
#define R502A_TEMPLATES_PER_PAGE 256
134133
#define R502A_TEMP_TABLE_BUF_SIZE 32
@@ -183,7 +182,7 @@ union r502a_packet {
183182
uint32_t addr;
184183
uint8_t pid;
185184
uint16_t len;
186-
uint8_t data[R502A_BUF_SIZE];
185+
uint8_t data[CONFIG_R502A_DATA_PKT_SIZE];
187186
} __packed;
188187

189188
uint8_t buf[R502A_MAX_BUF_SIZE];

include/zephyr/drivers/sensor/grow_r502a.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,43 @@ enum r502a_led_color_idx {
2020
R502A_LED_COLOR_PURPLE,
2121
};
2222

23+
#define R502A_BAUD_9600 1
24+
#define R502A_BAUD_19200 2
25+
#define R502A_BAUD_38400 4
26+
#define R502A_BAUD_57600 6
27+
#define R502A_BAUD_115200 12
28+
29+
enum r502a_sec_level {
30+
R502A_SEC_LEVEL_1 = 1,
31+
R502A_SEC_LEVEL_2,
32+
R502A_SEC_LEVEL_3,
33+
R502A_SEC_LEVEL_4,
34+
R502A_SEC_LEVEL_5
35+
};
36+
37+
enum r502a_data_len {
38+
R502A_PKG_LEN_32,
39+
R502A_PKG_LEN_64,
40+
R502A_PKG_LEN_128,
41+
R502A_PKG_LEN_256
42+
};
43+
44+
enum r502a_sys_param_set {
45+
R502A_BAUD_RATE = 4,
46+
R502A_SECURITY_LEVEL,
47+
R502A_DATA_PKG_LEN
48+
};
49+
50+
struct r502a_sys_param {
51+
uint16_t status_reg;
52+
uint16_t system_id;
53+
uint16_t lib_size;
54+
uint16_t sec_level;
55+
uint32_t addr;
56+
uint16_t data_pkt_size;
57+
uint32_t baud;
58+
} __packed;
59+
2360
enum sensor_channel_grow_r502a {
2461
/** Fingerprint template count, ID number for enrolling and searching*/
2562
SENSOR_CHAN_FINGERPRINT = SENSOR_CHAN_PRIV_START,
@@ -78,8 +115,19 @@ enum sensor_attribute_grow_r502a {
78115
* val->val2 matching score.
79116
*/
80117
SENSOR_ATTR_R502A_COMPARE,
118+
/** To read and write device's system parameters */
119+
/** sensor_attr_set
120+
* @param val->val1 parameter number from enum r502a_sys_param_set.
121+
* @param val->val2 content to be written for the respective parameter.
122+
*/
123+
/** sensor_attr_get
124+
* @result val->ex.data buffer holds the system parameter values.
125+
*/
126+
SENSOR_ATTR_R502A_SYS_PARAM,
81127
};
82128

129+
int r502a_read_sys_param(const struct device *dev, struct r502a_sys_param *val);
130+
83131
#ifdef __cplusplus
84132
}
85133
#endif

samples/sensor/grow_r502a/prj.conf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ CONFIG_UART_INTERRUPT_DRIVEN=y
44
CONFIG_SENSOR=y
55
CONFIG_LED=y
66
CONFIG_GROW_R502A_TRIGGER_OWN_THREAD=y
7+
8+
# Minimum stack size needed
9+
CONFIG_GROW_R502A_THREAD_STACK_SIZE=1536

samples/sensor/grow_r502a/src/main.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include <zephyr/drivers/led.h>
1313

1414
static bool enroll;
15-
static struct sensor_value fid_get, count, find, del;
15+
static struct sensor_value fid_get, count, find, del, param;
1616

1717
static void finger_find(const struct device *dev)
1818
{
@@ -123,6 +123,23 @@ static void trigger_handler(const struct device *dev,
123123
}
124124
}
125125

126+
static void read_fps_param(const struct device *dev)
127+
{
128+
int ret = 0;
129+
struct r502a_sys_param res;
130+
131+
ret = r502a_read_sys_param(dev, &res);
132+
if (ret != 0) {
133+
printk("r502a read system parameter failed %d\n", ret);
134+
return;
135+
}
136+
137+
printk("baud %d\n", res.baud);
138+
printk("addr 0x%x\n", res.addr);
139+
printk("lib_size %d\n", res.lib_size);
140+
printk("data_pkt_size %d\n", res.data_pkt_size);
141+
}
142+
126143
int main(void)
127144
{
128145
int ret;
@@ -147,6 +164,8 @@ int main(void)
147164

148165
template_count_get(dev);
149166

167+
read_fps_param(dev);
168+
150169
del.val1 = 3;
151170
ret = sensor_attr_set(dev, SENSOR_CHAN_FINGERPRINT, SENSOR_ATTR_R502A_RECORD_DEL, &del);
152171
if (ret != 0) {

0 commit comments

Comments
 (0)