214 lines
8.0 KiB
C
214 lines
8.0 KiB
C
/*
|
||
* Copyright (c) 2021 Linumiz
|
||
*
|
||
* SPDX-License-Identifier: Apache-2.0
|
||
*/
|
||
#ifndef ZEPHYR_DRIVERS_SENSOR_GROW_R502A_H_
|
||
#define ZEPHYR_DRIVERS_SENSOR_GROW_R502A_H_
|
||
|
||
/*
|
||
* @brief confirmation code present in acknowledgment packet
|
||
*
|
||
*################################################################################
|
||
*|Confirmation code | Definition |
|
||
*################################################################################
|
||
*|0x00 |commad execution complete |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x01 |error when receiving data package |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x02 |no finger on the sensor |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x03 |fail to enroll the finger |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x06 |fail to generate character file due to over-disorderly |
|
||
*| |fingerprint image |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x07 |fail to generate character file due to lackness of |
|
||
*| |character point or over-smallness of fingerprint image.|
|
||
*--------------------------------------------------------------------------------
|
||
*|0x08 |finger doesn’t match |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x09 |fail to find the matching finger |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x0A |fail to combine the character files |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x0B |addressing PageID is beyond the finger library |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x0C |error reading template from library or invalid |
|
||
*| |template |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x0D |error when uploading template |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x0E |Module can’t receive the following data packages |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x0F |error when uploading image |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x10 |fail to delete the template |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x11 |fail to clear finger library |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x13 |wrong password! |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x15 |fail to generate image for the lackness of valid |
|
||
*| |primary image |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x18 |error when writing flash |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x1A |invalid register number |
|
||
*--------------------------------------------------------------------------------
|
||
*|0x1B |incorrect configuration of register |
|
||
*--------------------------------------------------------------------------------
|
||
*/
|
||
|
||
#define R502A_OK 0x00 /*commad execution complete*/
|
||
#define R502A_NOT_FOUND 0x09 /*fail to find the matching finger*/
|
||
|
||
/*Package Identifier's definition*/
|
||
#define R502A_COMMAND_PACKET 0x1 /*Command packet*/
|
||
#define R502A_DATA_PACKET 0x2 /*Data packet, must follow command packet or acknowledge packet*/
|
||
#define R502A_ACK_PACKET 0x7 /*Acknowledge packet*/
|
||
#define R502A_END_DATA_PACKET 0x8 /*End of data packet*/
|
||
|
||
/*Instruction code's definition*/
|
||
#define R502A_GENIMAGE 0x01 /*Collect finger image*/
|
||
#define R502A_IMAGE2TZ 0x02 /*To generate character file from image*/
|
||
#define R502A_MATCH 0x03 /*Carry out precise matching of two templates*/
|
||
#define R502A_SEARCH 0x04 /*Search the finger library*/
|
||
#define R502A_REGMODEL 0x05 /*To combine character files and generate template*/
|
||
#define R502A_STORE 0x06 /*To store template*/
|
||
#define R502A_LOAD 0x07 /*To read/load template*/
|
||
#define R502A_UPCHAR 0x08 /*To upload template*/
|
||
#define R502A_DOWNCHAR 0x09 /*To download template*/
|
||
#define R502A_IMGUPLOAD 0x0A /*To upload image*/
|
||
#define R502A_DELETE 0x0C /*To delete template*/
|
||
#define R502A_EMPTYLIBRARY 0x0D /*To empty the library*/
|
||
#define R502A_SETSYSPARAM 0x0E /*To set system parameter*/
|
||
#define R502A_READSYSPARAM 0x0F /*To read system parameter*/
|
||
#define R502A_SETPASSWORD 0x12 /*To set password*/
|
||
#define R502A_VERIFYPASSWORD 0x13 /*To verify password*/
|
||
#define R502A_GETRANDOM 0x14 /*To generate a random code*/
|
||
#define R502A_TEMPLATECOUNT 0x1D /*To read finger template numbers*/
|
||
#define R502A_READTEMPLATEINDEX 0x1F /*Read fingerprint template index table*/
|
||
#define R502A_LED_CONFIG 0x35 /*Aura LED Config*/
|
||
#define R502A_CHECKSENSOR 0x36 /*Check sensor*/
|
||
#define R502A_SOFTRESET 0x3D /*Soft reset*/
|
||
#define R502A_HANDSHAKE 0x40 /*Handshake*/
|
||
#define R502A_BADPACKET 0xFE /* Bad packet was sent*/
|
||
|
||
#define R502A_STARTCODE 0xEF01 /*Fixed value, High byte transferred first*/
|
||
#define R502A_DEFAULT_PASSWORD 0x00000000
|
||
#define R502A_DEFAULT_ADDRESS 0xFFFFFFFF
|
||
#define R502A_DEFAULT_CAPACITY 200
|
||
#define R502A_HANDSHAKE_BYTE 0x55
|
||
#define R02A_LIBRARY_START_IDX 0
|
||
|
||
#define R502A_STARTCODE_IDX 0
|
||
#define R502A_ADDRESS_IDX 2
|
||
#define R502A_PID_IDX 6 /* Package identifier index*/
|
||
#define R502A_PKG_LEN_IDX 7
|
||
#define R502A_CC_IDX 9 /* Confirmation code index*/
|
||
|
||
#define R502A_STARTCODE_LEN 2
|
||
#define R502A_ADDRESS_LEN 4
|
||
#define R502A_PKG_LEN 2
|
||
#define R502A_CHECKSUM_LEN 2 /* Checksum length in uart packages*/
|
||
#define R502A_HEADER_LEN 9
|
||
|
||
#define R502A_CHAR_BUF_1 1
|
||
#define R502A_CHAR_BUF_2 2
|
||
#define R502A_CHAR_BUF_SIZE 384 /* Maximum size of characteristic value buffer*/
|
||
#define R502A_TEMPLATE_SIZE 768 /* Maximum size of template, twice of CHAR_BUF*/
|
||
#define R502A_MAX_BUF_SIZE 779 /*sum of checksum, header and template sizes*/
|
||
#define R502A_BUF_SIZE 64
|
||
#define R502A_TEMPLATES_PER_PAGE 256
|
||
#define R502A_TEMP_TABLE_BUF_SIZE 32
|
||
#define R502A_DELETE_COUNT_OFFSET 1
|
||
|
||
#define R502A_DELAY 200
|
||
#define R502A_RETRY_DELAY 5
|
||
|
||
#define LED_CTRL_BREATHING 0x01
|
||
#define LED_CTRL_FLASHING 0x02
|
||
#define LED_CTRL_ON_ALWAYS 0x03
|
||
#define LED_CTRL_OFF_ALWAYS 0x04
|
||
#define LED_CTRL_ON_GRADUALLY 0x05
|
||
#define LED_CTRL_OFF_GRADUALLY 0x06
|
||
|
||
#define LED_SPEED_HALF 0x50
|
||
#define LED_SPEED_FULL 0xFF
|
||
|
||
#define LED_COLOR_RED 0x01
|
||
#define LED_COLOR_BLUE 0x02
|
||
#define LED_COLOR_PURPLE 0x03
|
||
|
||
struct led_params {
|
||
uint8_t ctrl_code;
|
||
uint8_t color_idx;
|
||
uint8_t speed; /* Speed 0x00-0xff */
|
||
uint8_t cycle; /* Number of cycles | 0-infinite, 1-255 */
|
||
};
|
||
|
||
union r502a_packet {
|
||
struct {
|
||
uint8_t start[R502A_STARTCODE_LEN];
|
||
uint8_t addr[R502A_ADDRESS_LEN];
|
||
uint8_t pid;
|
||
uint8_t len[R502A_PKG_LEN];
|
||
uint8_t data[R502A_BUF_SIZE];
|
||
};
|
||
|
||
uint8_t buf[R502A_BUF_SIZE];
|
||
};
|
||
|
||
struct r502a_buf {
|
||
uint8_t *data;
|
||
size_t len;
|
||
};
|
||
|
||
struct grow_r502a_data {
|
||
#ifdef CONFIG_GROW_R502A_TRIGGER
|
||
const struct device *gpio_dev;
|
||
struct gpio_callback gpio_cb;
|
||
|
||
sensor_trigger_handler_t th_handler;
|
||
const struct sensor_trigger *th_trigger;
|
||
#if defined(CONFIG_GROW_R502A_TRIGGER_OWN_THREAD)
|
||
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_GROW_R502A_THREAD_STACK_SIZE);
|
||
struct k_sem gpio_sem;
|
||
struct k_thread thread;
|
||
#elif defined(CONFIG_GROW_R502A_TRIGGER_GLOBAL_THREAD)
|
||
struct k_work work;
|
||
#endif
|
||
#endif /* CONFIG_GROW_R502A_TRIGGER */
|
||
|
||
struct r502a_buf tx_buf;
|
||
struct r502a_buf rx_buf;
|
||
|
||
struct k_mutex lock;
|
||
struct k_sem uart_rx_sem;
|
||
|
||
uint16_t finger_id;
|
||
uint16_t matching_score;
|
||
uint16_t template_count;
|
||
int8_t free_idx;
|
||
};
|
||
|
||
struct grow_r502a_config {
|
||
const struct device *dev;
|
||
struct gpio_dt_spec vin_gpios;
|
||
struct gpio_dt_spec act_gpios;
|
||
uint32_t comm_addr;
|
||
#ifdef CONFIG_GROW_R502A_TRIGGER
|
||
struct gpio_dt_spec int_gpios;
|
||
#endif /* CONFIG_GROW_R502A_TRIGGER */
|
||
};
|
||
|
||
#ifdef CONFIG_GROW_R502A_TRIGGER
|
||
int grow_r502a_trigger_set(const struct device *dev, const struct sensor_trigger *trig,
|
||
sensor_trigger_handler_t handler);
|
||
|
||
int grow_r502a_init_interrupt(const struct device *dev);
|
||
#endif /* CONFIG_GROW_R502A_TRIGGER */
|
||
|
||
#endif /*_GROW_R502A_H_*/
|