ソースを参照

add: airlink,添加uart适配的框架代码

Wendal Chen 11 ヶ月 前
コミット
e4ad3a2074

+ 72 - 0
components/airlink/src/driver/luat_airlink_drv_uart.c

@@ -0,0 +1,72 @@
+#include "luat_base.h"
+#include "luat_spi.h"
+#include "luat_airlink.h"
+
+
+#include "luat_rtos.h"
+#include "luat_debug.h"
+#include "luat_spi.h"
+#include "luat_pm.h"
+#include "luat_gpio.h"
+#include "luat_airlink.h"
+#include "luat_mem.h"
+
+#define LUAT_LOG_TAG "airlink.uart"
+#include "luat_log.h"
+
+
+int luat_airlink_drv_uart_setup(luat_uart_t* conf) {
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_gpio_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x400, sizeof(luat_uart_t) + 8);
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, conf, sizeof(luat_uart_t));
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_uart_write(int uart_id, void* data, size_t length) {
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_gpio_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x401, length + 1 + 8);
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    uint8_t tmp = (uint8_t)uart_id;
+    memcpy(cmd->data + 8, &tmp, 1);
+    memcpy(cmd->data + 9, data, length);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_uart_close(int uart_id) {
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_gpio_t) + sizeof(luat_airlink_cmd_t) + 8
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x402, 8 + 1);
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    uint8_t tmp = (uint8_t)uart_id;
+    memcpy(cmd->data + 8, &tmp, 1);
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
+
+int luat_airlink_drv_uart_data_cb(int uart_id, void* buffer, size_t length) {
+    // TODO 要接收UART BUFF数据, 返回给用户代码
+    return 0;
+}

+ 52 - 0
components/airlink/src/exec/luat_airlink_cmd_exec_uart.c

@@ -0,0 +1,52 @@
+#include "luat_base.h"
+#include "luat_spi.h"
+#include "luat_airlink.h"
+
+
+#include "luat_rtos.h"
+#include "luat_debug.h"
+#include "luat_spi.h"
+#include "luat_pm.h"
+#include "luat_gpio.h"
+#include "luat_airlink.h"
+#include "luat_uart.h"
+
+#define LUAT_LOG_TAG "airlink"
+#include "luat_log.h"
+
+#undef LLOGD
+#define LLOGD(...) 
+
+// 前8字节是指令id, 用于返回执行结果, 待定.
+
+int luat_airlink_cmd_exec_uart_setup(luat_airlink_cmd_t* cmd, void* userdata) {
+    luat_uart_t* uart = cmd->data + 8;
+    if (uart->id >= 10) {
+        uart->id -= 10;
+    }
+    int ret = luat_uart_setup(uart);
+    LLOGD("uart[%d] setup baud_rate %d ret %d", uart->id, uart->baud_rate, ret);
+    return ret;
+}
+
+int luat_airlink_cmd_exec_uart_write(luat_airlink_cmd_t* cmd, void* userdata) {
+    uint8_t id = cmd->data[8];
+    if (id >= 10) {
+        id -= 10;
+    }
+    int ret = luat_uart_write(id, cmd->data + 9, cmd->len - 9);
+    LLOGD("uart[%d] write ret %d", id, ret);
+    return ret;
+}
+int luat_airlink_cmd_exec_uart_close(luat_airlink_cmd_t* cmd, void* userdata) {
+    uint8_t id = cmd->data[8];
+    if (id >= 10) {
+        id -= 10;
+    }
+    int ret = luat_uart_close(id);
+    LLOGD("uart[%d] close ret %d", id, ret);
+    return ret;
+}
+int luat_airlink_cmd_exec_uart_data_cb(luat_airlink_cmd_t* cmd, void* userdata) {
+    return 0;
+}

+ 14 - 0
components/airlink/src/luat_airlink_cmds.c

@@ -49,6 +49,12 @@ CMD_DEFINE(gpio_setup);
 CMD_DEFINE(gpio_set);
 // CMD_DEFINE(gpio_get);
 
+// UART指令, 0x400开始
+CMD_DEFINE(uart_setup);
+CMD_DEFINE(uart_write);
+CMD_DEFINE(uart_close);
+CMD_DEFINE(uart_data_cb);
+
 __USER_FUNC_IN_RAM__ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     // 最常用的放前面
     CMD_REG(0x10,  dev_info),
@@ -83,6 +89,14 @@ __USER_FUNC_IN_RAM__ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     CMD_REG(0x301, gpio_set),
 #endif
 
+#ifdef LUAT_USE_AIRLINK_EXEC_UART
+    CMD_REG(0x400, uart_setup),
+    CMD_REG(0x401, uart_write),
+    CMD_REG(0x402, uart_close),
+#else
+    CMD_REG(0x410, uart_data_cb),
+#endif
+
     CMD_REG(0x21, nop),
     {0, NULL}
 };

+ 12 - 0
components/drv/include/luat/drv_uart.h

@@ -0,0 +1,12 @@
+
+#ifndef LUAT_DRV_UART_H
+#define LUAT_DRV_UART_H
+
+
+#include "luat_uart.h"
+int luat_drv_uart_setup(luat_uart_t* uart);
+int luat_drv_uart_write(int uart_id, void* data, size_t length);
+int luat_drv_uart_read(int uart_id, void* buffer, size_t length);
+int luat_drv_uart_close(int uart_id);
+
+#endif

+ 45 - 0
components/drv/src/luat_drv_uart.c

@@ -0,0 +1,45 @@
+#include "luat_base.h"
+#include "luat_gpio.h"
+#include "luat_mem.h"
+#include "luat/drv_gpio.h"
+#include "luat/drv_uart.h"
+#include "luat_airlink.h"
+
+#define LUAT_LOG_TAG "drv.uart"
+#include "luat_log.h"
+
+int luat_drv_uart_setup(luat_uart_t* uart) {
+    if (uart->id >= 10 && uart->id <= 19) {
+        return luat_airlink_drv_uart_setup(uart);
+    }
+    else {
+        return luat_uart_setup(uart);
+    }
+}
+
+int luat_drv_uart_write(int uart_id, void* data, size_t length) {
+    if (uart_id >= 10 && uart_id <= 19) {
+        return luat_airlink_drv_uart_write(uart_id, data, length);
+    }
+    else {
+        return luat_uart_write(uart_id, data, length);
+    }
+}
+
+int luat_drv_uart_read(int uart_id, void* buffer, size_t length) {
+    if (uart_id >= 10 && uart_id <= 19) {
+        return luat_airlink_drv_uart_read(uart_id, buffer, length);
+    }
+    else {
+        return luat_uart_read(uart_id, buffer, length);
+    }
+}
+
+int luat_drv_uart_close(int uart_id) {
+    if (uart_id >= 10 && uart_id <= 19) {
+        return luat_airlink_drv_uart_close(uart_id);
+    }
+    else {
+        return luat_uart_close(uart_id);
+    }
+}