123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- #include <soc.h>
- #include <board.h>
- #include <device.h>
- #include <drivers/uart.h>
- #include <aem_core_if.h>
- #include <logging/log.h>
- #include "aem_device.h"
- #include "aem_adapter_dev.h"
- #include <drivers/hrtimer.h>
- LOG_MODULE_REGISTER(uart2_rec, LOG_LEVEL_INF);
- #define CONFIG_UART2_REC_DEV_NAME "uart2_rec"
- #define UART2_REC_DEV_NAME CONFIG_UART_2_NAME
- #define UART_FIFO_MAX 64
- #define REC_DATA_BUFFER_SIZE 192
- #define DEVICE_ID_SIZE 8
- #define PROJECT_ID_SIZE 4
- #define WRITE_KEY_SIZE 160
- #define DEVICE_SN_SIZE 6
- #define FW_VERSION_SIZE 3
- #define DEVICE_ID_CMD 0xB1
- #define PROJECT_ID_CMD 0xB2
- #define WRITE_KEY_CMD 0xB3
- #define IS_KEY_INSIDE_CMD 0xB4
- #define SET_TIME_CMD 0xC1
- #define GET_DEVICE_SN_CMD 0xD1
- #define GET_FW_VERSION_CMD 0xD3
- #define FRAME_HEADER1 0xAA
- #define FRAME_HEADER2 0x55
- #define FRAME_TAIL1 0x55
- #define FRAME_TAIL2 0xAA
- struct uart2_rec_data {
- const struct device *uart_gpio_dev;
- uint8_t rec_data[REC_DATA_BUFFER_SIZE];
-
- };
- static struct uart2_rec_data uart2_rec_data;
- static struct hrtimer g_rtc_uart_proc;
- uint8_t bySetTimeStep = 0;
- extern uint8_t bySetHour;
- extern uint8_t bySetMinute;
- extern uint8_t bySetWeekday;
- extern uint16_t wSetYear;
- extern uint8_t bySetMonth;
- extern uint8_t bySetDay;
- extern void uart2_poll_out_ch(int c);
- extern bool aem_read_aem_key_record(aem_key_w_record_t *record);
- extern bool aem_write_aem_key_record(uint8_t mothod, uint8_t is_pass);
- extern bool aem_defender_factory_write_key(uint8_t * data, uint16_t len);
- extern uint16_t aem_factory_get_product_info(uint8_t *data, uint16_t in_len);
- uint8_t calculate_checksum(uint8_t cmd, uint8_t *data, uint8_t data_len)
- {
- uint8_t checksum = cmd + data_len;
- for (uint8_t i = 0; i < data_len; i++) {
- checksum += data[i];
- }
- return checksum;
- }
- void send_frame(uint8_t cmd, uint8_t *data, uint8_t data_len)
- {
- uint8_t checksum = calculate_checksum(cmd, data, data_len);
-
- uart2_poll_out_ch(FRAME_HEADER1);
- uart2_poll_out_ch(FRAME_HEADER2);
-
- uart2_poll_out_ch(cmd);
-
- uart2_poll_out_ch(data_len);
-
- for (uint8_t i = 0; i < data_len; i++) {
- uart2_poll_out_ch(data[i]);
- }
-
- uart2_poll_out_ch(checksum);
-
- uart2_poll_out_ch(FRAME_TAIL1);
- uart2_poll_out_ch(FRAME_TAIL2);
- }
- bool check_receive_frame(uint8_t *data)
- {
- uint8_t calculated_checksum;
- uint8_t data_len = data[3];
-
- if (data[0] != FRAME_HEADER1)
- {
- return false;
- }
- if (data[1] != FRAME_HEADER2)
- {
- return false;
- }
-
-
- calculated_checksum = calculate_checksum(data[2], data + 4, data_len);
-
- if (data[data_len + 4] != calculated_checksum) {
- return false;
- }
-
- if (data[data_len + 5] != FRAME_TAIL1 || data[data_len + 6] != FRAME_TAIL2) {
- return false;
- }
- return true;
- }
- static void uart_proc_timer_acts_handler(struct k_work *work)
- {
-
- uint8_t tx_buff[2];
-
- aem_key_w_record_t key_record;
-
- switch (uart2_rec_data.rec_data[2])
- {
- case WRITE_KEY_CMD:
-
- tx_buff[0] = 0;
-
- if (aem_defender_factory_write_key(&uart2_rec_data.rec_data[4], WRITE_KEY_SIZE))
- {
- aem_write_aem_key_record(0, 1);
- tx_buff[0] = 0xAA;
- }
- send_frame(WRITE_KEY_CMD, tx_buff, 1);
- break;
- case IS_KEY_INSIDE_CMD:
- tx_buff[0] = 0;
- if (aem_read_aem_key_record(&key_record))
- {
-
- {
- if (key_record.is_pass)
- tx_buff[0] = 0xAA;
- }
- }
- send_frame(IS_KEY_INSIDE_CMD, tx_buff, 1);
- break;
- default:
- break;
- }
-
- }
- K_WORK_DEFINE(uart_proc_timer_acts, uart_proc_timer_acts_handler);
- static void htimer_uart_proc(struct hrtimer *ttimer, void *expiry_fn_arg)
- {
- k_work_submit(&uart_proc_timer_acts);
- }
- static uint8_t byAACnt = 0;
- static uint8_t by55Cnt = 0;
- static bool bReceiveFrameDone = false;
- static void uart_fifo_callback(const struct device *dev, void *user_data)
- {
- uint8_t rx_buff[UART_FIFO_MAX];
- uint8_t tx_buff[UART_FIFO_MAX];
- char mac_str[7] = { 0 };
- int read_size;
- static uint8_t cnt;
- aem_dev_info_t info;
-
- uart_irq_update(dev);
- if (uart_irq_rx_ready(dev)) {
- read_size = uart_fifo_read(dev, rx_buff, UART_FIFO_MAX);
-
- if (read_size == UART_FIFO_MAX)
- printk("uart fifo buffer overflow\n");
- for (int i = 0; i < read_size; i++)
- {
- switch (rx_buff[i]) {
- case FRAME_HEADER1:
- if (byAACnt == 0)
- byAACnt++;
- else if (byAACnt == 1 && by55Cnt == 2)
- byAACnt++;
- if (by55Cnt == 0 && byAACnt == 1)
- {
- cnt = 0;
- bReceiveFrameDone = false;
- }
- else if (by55Cnt == 2 && byAACnt == 2)
- {
- bReceiveFrameDone = true;
- by55Cnt = 0;
- byAACnt = 0;
- }
- uart2_rec_data.rec_data[cnt++] = rx_buff[i];
- break;
- case FRAME_HEADER2:
- if (by55Cnt == 0 && cnt == 1)
- by55Cnt++;
- if (cnt > 4 && (cnt - 5 == uart2_rec_data.rec_data[3]))
- by55Cnt++;
- uart2_rec_data.rec_data[cnt++] = rx_buff[i];
- break;
- default:
- uart2_rec_data.rec_data[cnt++] = rx_buff[i];
-
- if (cnt >= REC_DATA_BUFFER_SIZE)
- cnt--;
- break;
- }
- }
- if (bReceiveFrameDone && check_receive_frame(uart2_rec_data.rec_data))
- {
- printk("receive frame success\n");
- switch (uart2_rec_data.rec_data[2])
- {
- case DEVICE_ID_CMD:
- aem_factory_get_product_info(tx_buff, 64);
- send_frame(DEVICE_ID_CMD, tx_buff, DEVICE_ID_SIZE);
- break;
- case PROJECT_ID_CMD:
- tx_buff[0] = 0x0F;
- tx_buff[1] = 0x6B;
- tx_buff[2] = 0x3B;
- tx_buff[3] = 0xD8;
- send_frame(PROJECT_ID_CMD, tx_buff, PROJECT_ID_SIZE);
- break;
- case WRITE_KEY_CMD:
- case IS_KEY_INSIDE_CMD:
-
- hrtimer_init(&g_rtc_uart_proc, htimer_uart_proc, NULL);
- hrtimer_start(&g_rtc_uart_proc, 1000*10, 0);
- break;
- case SET_TIME_CMD:
- if (uart2_rec_data.rec_data[3] == 6)
- {
- bySetMinute = uart2_rec_data.rec_data[4];
- bySetHour = uart2_rec_data.rec_data[5];
- bySetDay = uart2_rec_data.rec_data[6];
- bySetWeekday = uart2_rec_data.rec_data[7];
- bySetMonth = uart2_rec_data.rec_data[8];
- wSetYear = uart2_rec_data.rec_data[9];
- bySetTimeStep = 1;
- }
-
- send_frame(SET_TIME_CMD, tx_buff, 0);
- break;
- case GET_DEVICE_SN_CMD:
- aem_get_ble_mac_addr(mac_str, 6);
- for (int i = 0; i < DEVICE_SN_SIZE; i++)
- {
- tx_buff[i] = 0xFF - mac_str[i];
- }
- send_frame(GET_DEVICE_SN_CMD, tx_buff, DEVICE_SN_SIZE);
- break;
- case GET_FW_VERSION_CMD:
- info = get_device_info();
- tx_buff[0] = info.major_v;
- tx_buff[1] = info.minor_v;
- tx_buff[2] = info.micro_v;
- send_frame(GET_FW_VERSION_CMD, tx_buff, FW_VERSION_SIZE);
- break;
-
- default:
- break;
- }
- }
- }
- }
- static int uart2_rec_init(const struct device *dev)
- {
- struct uart2_rec_data *data = (struct uart2_rec_data *)dev->data;
- printk("uart2_rec_init\n");
- data->uart_gpio_dev = device_get_binding(UART2_REC_DEV_NAME);
- if (data->uart_gpio_dev == NULL) {
- printk("Couldn't find uart2\n");
- return -ENODEV;
- }
- uart_irq_callback_set(data->uart_gpio_dev, uart_fifo_callback);
-
- uart_irq_rx_enable(data->uart_gpio_dev);
- return 0;
- }
- #if IS_ENABLED(CONFIG_UART_ACTS)
- DEVICE_DEFINE(uart2_rec, CONFIG_UART2_REC_DEV_NAME, &uart2_rec_init, NULL, &uart2_rec_data, NULL, POST_KERNEL, 60, NULL);
- #endif
|