4
4
* SPDX-License-Identifier: Apache-2.0
5
5
*/
6
6
7
- #define DT_DRV_COMPAT hzgrow_r502a
8
-
9
7
#include <zephyr/init.h>
10
8
#include <zephyr/kernel.h>
11
9
#include <zephyr/drivers/gpio.h>
12
10
#include <zephyr/drivers/sensor.h>
13
11
#include <zephyr/drivers/uart.h>
14
12
#include <zephyr/sys/byteorder.h>
13
+ #include <zephyr/drivers/led.h>
15
14
16
15
#include <zephyr/drivers/sensor/grow_r502a.h>
17
16
#include "grow_r502a.h"
@@ -105,7 +104,7 @@ static void uart_cb_handler(const struct device *dev, void *user_data)
105
104
}
106
105
}
107
106
108
- static int fps_led_control (const struct device * dev , struct led_params * led_control )
107
+ static int fps_led_control (const struct device * dev , struct r502a_led_params * led_control )
109
108
{
110
109
union r502a_packet rx_packet = {0 };
111
110
char const led_ctrl_len = 5 ;
@@ -246,10 +245,10 @@ static int fps_get_image(const struct device *dev)
246
245
union r502a_packet rx_packet = {0 };
247
246
char const get_img_len = 1 ;
248
247
249
- struct led_params led_ctrl = {
250
- .ctrl_code = LED_CTRL_BREATHING ,
251
- .color_idx = LED_COLOR_BLUE ,
252
- .speed = LED_SPEED_HALF ,
248
+ struct r502a_led_params led_ctrl = {
249
+ .ctrl_code = R502A_LED_CTRL_BREATHING ,
250
+ .color_idx = R502A_LED_COLOR_BLUE ,
251
+ .speed = R502A_LED_SPEED_HALF ,
253
252
.cycle = 0x01 ,
254
253
};
255
254
@@ -269,8 +268,8 @@ static int fps_get_image(const struct device *dev)
269
268
fps_led_control (dev , & led_ctrl );
270
269
LOG_DBG ("Image taken" );
271
270
} else {
272
- led_ctrl .ctrl_code = LED_CTRL_ON_ALWAYS ;
273
- led_ctrl .color_idx = LED_COLOR_RED ;
271
+ led_ctrl .ctrl_code = R502A_LED_CTRL_ON_ALWAYS ;
272
+ led_ctrl .color_idx = R502A_LED_COLOR_RED ;
274
273
fps_led_control (dev , & led_ctrl );
275
274
LOG_ERR ("Error getting image 0x%X" , rx_packet .buf [R502A_CC_IDX ]);
276
275
return - EIO ;
@@ -340,10 +339,10 @@ static int fps_store_model(const struct device *dev, uint16_t id)
340
339
char const store_model_len = 4 ;
341
340
int ret = 0 ;
342
341
343
- struct led_params led_ctrl = {
344
- .ctrl_code = LED_CTRL_BREATHING ,
345
- .color_idx = LED_COLOR_BLUE ,
346
- .speed = LED_SPEED_HALF ,
342
+ struct r502a_led_params led_ctrl = {
343
+ .ctrl_code = R502A_LED_CTRL_BREATHING ,
344
+ .color_idx = R502A_LED_COLOR_BLUE ,
345
+ .speed = R502A_LED_SPEED_HALF ,
347
346
.cycle = 0x01 ,
348
347
};
349
348
@@ -364,8 +363,8 @@ static int fps_store_model(const struct device *dev, uint16_t id)
364
363
}
365
364
366
365
if (rx_packet .buf [R502A_CC_IDX ] == R502A_OK ) {
367
- led_ctrl .color_idx = LED_COLOR_BLUE ;
368
- led_ctrl .ctrl_code = LED_CTRL_FLASHING ;
366
+ led_ctrl .color_idx = R502A_LED_COLOR_BLUE ;
367
+ led_ctrl .ctrl_code = R502A_LED_CTRL_FLASHING ;
369
368
led_ctrl .cycle = 0x03 ;
370
369
fps_led_control (dev , & led_ctrl );
371
370
LOG_INF ("Fingerprint stored! at ID #%d" , id );
@@ -455,10 +454,10 @@ static int fps_search(const struct device *dev, struct sensor_value *val)
455
454
char const search_len = 6 ;
456
455
int ret = 0 ;
457
456
458
- struct led_params led_ctrl = {
459
- .ctrl_code = LED_CTRL_BREATHING ,
460
- .color_idx = LED_COLOR_BLUE ,
461
- .speed = LED_SPEED_HALF ,
457
+ struct r502a_led_params led_ctrl = {
458
+ .ctrl_code = R502A_LED_CTRL_BREATHING ,
459
+ .color_idx = R502A_LED_COLOR_BLUE ,
460
+ .speed = R502A_LED_SPEED_HALF ,
462
461
.cycle = 0x01 ,
463
462
};
464
463
@@ -480,23 +479,23 @@ static int fps_search(const struct device *dev, struct sensor_value *val)
480
479
}
481
480
482
481
if (rx_packet .buf [R502A_CC_IDX ] == R502A_OK ) {
483
- led_ctrl .ctrl_code = LED_CTRL_FLASHING ;
484
- led_ctrl .color_idx = LED_COLOR_PURPLE ;
482
+ led_ctrl .ctrl_code = R502A_LED_CTRL_FLASHING ;
483
+ led_ctrl .color_idx = R502A_LED_COLOR_PURPLE ;
485
484
led_ctrl .cycle = 0x01 ;
486
485
fps_led_control (dev , & led_ctrl );
487
486
val -> val1 = sys_get_be16 (& rx_packet .data [1 ]);
488
487
val -> val2 = sys_get_be16 (& rx_packet .data [3 ]);
489
488
LOG_INF ("Found a matching print! at ID #%d" , val -> val1 );
490
489
} else if (rx_packet .buf [R502A_CC_IDX ] == R502A_NOT_FOUND_CC ) {
491
- led_ctrl .ctrl_code = LED_CTRL_BREATHING ;
492
- led_ctrl .color_idx = LED_COLOR_RED ;
490
+ led_ctrl .ctrl_code = R502A_LED_CTRL_BREATHING ;
491
+ led_ctrl .color_idx = R502A_LED_COLOR_RED ;
493
492
led_ctrl .cycle = 0x02 ;
494
493
fps_led_control (dev , & led_ctrl );
495
494
LOG_ERR ("Did not find a match" );
496
495
ret = - ENOENT ;
497
496
} else {
498
- led_ctrl .ctrl_code = LED_CTRL_ON_ALWAYS ;
499
- led_ctrl .color_idx = LED_COLOR_RED ;
497
+ led_ctrl .ctrl_code = R502A_LED_CTRL_ON_ALWAYS ;
498
+ led_ctrl .color_idx = R502A_LED_COLOR_RED ;
500
499
fps_led_control (dev , & led_ctrl );
501
500
LOG_ERR ("Error searching for image 0x%X" , rx_packet .buf [R502A_CC_IDX ]);
502
501
ret = - EIO ;
@@ -549,10 +548,10 @@ static int fps_match_templates(const struct device *dev, struct sensor_value *va
549
548
char const match_templates_len = 1 ;
550
549
int ret = 0 ;
551
550
552
- struct led_params led_ctrl = {
553
- .ctrl_code = LED_CTRL_BREATHING ,
554
- .color_idx = LED_COLOR_BLUE ,
555
- .speed = LED_SPEED_HALF ,
551
+ struct r502a_led_params led_ctrl = {
552
+ .ctrl_code = R502A_LED_CTRL_BREATHING ,
553
+ .color_idx = R502A_LED_COLOR_BLUE ,
554
+ .speed = R502A_LED_SPEED_HALF ,
556
555
.cycle = 0x01 ,
557
556
};
558
557
@@ -581,8 +580,8 @@ static int fps_match_templates(const struct device *dev, struct sensor_value *va
581
580
LOG_ERR ("Fingerprint not matched" );
582
581
ret = - ENOENT ;
583
582
} else {
584
- led_ctrl .ctrl_code = LED_CTRL_ON_ALWAYS ;
585
- led_ctrl .color_idx = LED_COLOR_RED ;
583
+ led_ctrl .ctrl_code = R502A_LED_CTRL_ON_ALWAYS ;
584
+ led_ctrl .color_idx = R502A_LED_COLOR_RED ;
586
585
fps_led_control (dev , & led_ctrl );
587
586
LOG_ERR ("Error Matching templates 0x%X" ,
588
587
rx_packet .buf [R502A_CC_IDX ]);
@@ -627,10 +626,10 @@ static int fps_init(const struct device *dev)
627
626
struct grow_r502a_data * drv_data = dev -> data ;
628
627
int ret ;
629
628
630
- struct led_params led_ctrl = {
631
- .ctrl_code = LED_CTRL_FLASHING ,
632
- .color_idx = LED_COLOR_PURPLE ,
633
- .speed = LED_SPEED_HALF ,
629
+ struct r502a_led_params led_ctrl = {
630
+ .ctrl_code = R502A_LED_CTRL_FLASHING ,
631
+ .color_idx = R502A_LED_COLOR_PURPLE ,
632
+ .speed = R502A_LED_SPEED_HALF ,
634
633
.cycle = 0x02 ,
635
634
};
636
635
@@ -678,6 +677,8 @@ static int grow_r502a_channel_get(const struct device *dev, enum sensor_channel
678
677
static int grow_r502a_attr_set (const struct device * dev , enum sensor_channel chan ,
679
678
enum sensor_attribute attr , const struct sensor_value * val )
680
679
{
680
+ struct grow_r502a_data * drv_data = dev -> data ;
681
+
681
682
if ((enum sensor_channel_grow_r502a )chan != SENSOR_CHAN_FINGERPRINT ) {
682
683
LOG_ERR ("Channel not supported" );
683
684
return - ENOTSUP ;
@@ -808,6 +809,53 @@ static const struct sensor_driver_api grow_r502a_api = {
808
809
#endif
809
810
};
810
811
812
+ #ifdef CONFIG_LED
813
+ static int grow_r502a_led_set_color (const struct device * dev , uint32_t led ,
814
+ uint8_t num_colors , const uint8_t * color )
815
+ {
816
+ struct grow_r502a_data * drv_data = dev -> data ;
817
+
818
+ if (!(* color )) {
819
+ LOG_ERR ("invalid color code value" );
820
+ return - ENOTSUP ;
821
+ }
822
+ drv_data -> led_color = * color ;
823
+
824
+ return 0 ;
825
+ }
826
+
827
+ static int grow_r502a_led_on (const struct device * dev , uint32_t led )
828
+ {
829
+ struct grow_r502a_data * drv_data = dev -> data ;
830
+
831
+ if (!drv_data -> led_color ) {
832
+ drv_data -> led_color = R502A_LED_COLOR_BLUE ;
833
+ }
834
+
835
+ struct r502a_led_params led_ctrl = {
836
+ .ctrl_code = R502A_LED_CTRL_ON_ALWAYS ,
837
+ .color_idx = drv_data -> led_color ,
838
+ };
839
+
840
+ return fps_led_control (dev , & led_ctrl );
841
+ }
842
+
843
+ static int grow_r502a_led_off (const struct device * dev , uint32_t led )
844
+ {
845
+ struct r502a_led_params led_ctrl = {
846
+ .ctrl_code = R502A_LED_CTRL_OFF_ALWAYS ,
847
+ };
848
+
849
+ return fps_led_control (dev , & led_ctrl );
850
+ }
851
+
852
+ static const struct led_driver_api grow_r502a_leds_api = {
853
+ .set_color = grow_r502a_led_set_color ,
854
+ .on = grow_r502a_led_on ,
855
+ .off = grow_r502a_led_off ,
856
+ };
857
+ #endif
858
+
811
859
#define GROW_R502A_INIT (index ) \
812
860
static struct grow_r502a_data grow_r502a_data_##index; \
813
861
\
@@ -822,7 +870,20 @@ static const struct sensor_driver_api grow_r502a_api = {
822
870
}; \
823
871
\
824
872
DEVICE_DT_INST_DEFINE(index, &grow_r502a_init, NULL, &grow_r502a_data_##index, \
825
- &grow_r502a_config_##index, POST_KERNEL, \
826
- CONFIG_SENSOR_INIT_PRIORITY, &grow_r502a_api);
873
+ &grow_r502a_config_##index, POST_KERNEL, \
874
+ CONFIG_SENSOR_INIT_PRIORITY, &grow_r502a_api); \
827
875
876
+ #define GROW_R502A_LED_INIT (index ) \
877
+ DEVICE_DT_INST_DEFINE(index, NULL, NULL, &grow_r502a_data_##index, \
878
+ &grow_r502a_config_##index, POST_KERNEL, \
879
+ CONFIG_LED_INIT_PRIORITY, &grow_r502a_leds_api); \
880
+
881
+ #define DT_DRV_COMPAT hzgrow_r502a
828
882
DT_INST_FOREACH_STATUS_OKAY (GROW_R502A_INIT )
883
+ #undef DT_DRV_COMPAT
884
+
885
+ #ifdef CONFIG_LED
886
+ #define DT_DRV_COMPAT hzgrow_r502a_led
887
+ DT_INST_FOREACH_STATUS_OKAY (GROW_R502A_LED_INIT )
888
+ #undef DT_DRV_COMPAT
889
+ #endif
0 commit comments