zephyr/drivers/sensor/grow_r502a/grow_r502a.h

214 lines
8.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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 doesnt 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 cant 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_*/