From c9efc32d327a16001823765294f351d5c499b406 Mon Sep 17 00:00:00 2001 From: Chen Peng Date: Tue, 19 May 2026 22:34:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DeviceKit/drv_device.c | 2 +- DeviceKit/drv_device.h | 2 -- DeviceKit/drv_rbtree.c | 10 +++++----- DeviceKit/drv_rbtree.h | 2 +- DeviceKit/drv_softi2c.h | 19 ++++++------------- DeviceKit/drv_spi.c | 1 + DeviceKit/drv_spi.h | 28 ++++++++++++++++++++++++++++ Kernel/SingleCore/os_config.h.in | 10 ++++++++++ 8 files changed, 52 insertions(+), 22 deletions(-) create mode 100644 DeviceKit/drv_spi.c create mode 100644 DeviceKit/drv_spi.h diff --git a/DeviceKit/drv_device.c b/DeviceKit/drv_device.c index e6fa036..d2d3805 100644 --- a/DeviceKit/drv_device.c +++ b/DeviceKit/drv_device.c @@ -66,7 +66,7 @@ void drv_device_unregister(drv_device_t* self){ drv_device_t* drv_device_find(const char* name){ drv_rbtree_node_t* p = drv_rbtree_find(&s_drv_rbtree, name); if(p==NULL) return NULL; - return &p->device; + return p->device; } diff --git a/DeviceKit/drv_device.h b/DeviceKit/drv_device.h index 40568ce..49dc85f 100644 --- a/DeviceKit/drv_device.h +++ b/DeviceKit/drv_device.h @@ -19,13 +19,11 @@ #endif /*INCLUDED_OS_LIST_H*/ - /* ------------------------------------------------------------------------------------------------------------------ */ /* */ typedef struct { void* handle; - os_list_node_t node; os_err_t (*init)(void* handle, void* args); os_err_t (*destroy)(void* handle, void* args); os_err_t (*open)(void* handle, void* args); diff --git a/DeviceKit/drv_rbtree.c b/DeviceKit/drv_rbtree.c index 2cbdece..77b902f 100644 --- a/DeviceKit/drv_rbtree.c +++ b/DeviceKit/drv_rbtree.c @@ -26,7 +26,7 @@ OS_STATIC_FORCE_INLINE void node_init(rbtree_t* tree, rbtree_node_t * self, drv_device_t* val){ self->left = self->right = self->parent = 0; self->color = RED; - self->device = *val; + self->device = val; } OS_STATIC_FORCE_INLINE @@ -78,7 +78,7 @@ void rotate_right(rbtree_t* self, rbtree_node_t * y){ static rbtree_node_t * find(rbtree_t* self, const char* key, rbtree_node_t * x){ while(x){ - int cmp = node_cmp(x->device.name, key); + int cmp = node_cmp(key, x->device->name); if(cmp < 0){ x = x->left; }else if(cmp > 0){ @@ -201,7 +201,7 @@ void node_insert_fixup(rbtree_t* tree, rbtree_node_t * node){ node_set_black(tree->root); } -OS_STATIC_FORCE_INLINE +static void node_insert(rbtree_t* tree, rbtree_node_t * node){ int cmp = 0; rbtree_node_t * y = NULL; @@ -210,7 +210,7 @@ void node_insert(rbtree_t* tree, rbtree_node_t * node){ // 1. 将红黑树当作一颗二叉查找树,将节点添加到二叉查找树中。 while (x) { y = x; - cmp = node_cmp(node->device.name, x->device.name); + cmp = node_cmp(node->device->name, x->device->name); if (cmp < 0) x = x->left; else @@ -223,7 +223,7 @@ void node_insert(rbtree_t* tree, rbtree_node_t * node){ tree->root = node; }else{ // 判断插入父节点的左边还是右边 - cmp = node_cmp(node->device.name, y->device.name); + cmp = node_cmp(node->device->name, y->device->name); if(cmp < 0){ y->left = node; }else{ diff --git a/DeviceKit/drv_rbtree.h b/DeviceKit/drv_rbtree.h index f7d2d7c..239370d 100644 --- a/DeviceKit/drv_rbtree.h +++ b/DeviceKit/drv_rbtree.h @@ -30,7 +30,7 @@ typedef struct drv_rbtree_node_s{ struct drv_rbtree_node_s* right; struct drv_rbtree_node_s* parent; char color; - drv_device_t device; + drv_device_t* device; }drv_rbtree_node_t; typedef struct { diff --git a/DeviceKit/drv_softi2c.h b/DeviceKit/drv_softi2c.h index 8536798..e79b835 100644 --- a/DeviceKit/drv_softi2c.h +++ b/DeviceKit/drv_softi2c.h @@ -8,22 +8,15 @@ typedef struct drv_softi2c_t drv_softi2c_t; struct drv_softi2c_t{ - drv_device_t root; - os_uint_t scl_clock; - void* scl_port; - os_uint_t scl_pin; - os_uint_t sda_clock; - void* sda_port; - os_uint_t sda_pin; - os_err_t (*put)(drv_softi2c_t* self, const uint8_t data); - os_err_t (*get)(drv_softi2c_t* self, uint8_t* data); + drv_device_t device; + os_err_t (*put)(void* self, uint8_t data); + os_err_t (*get)(void* self, uint8_t ack, uint8_t* data); + os_err_t (*wait_ack)(void* handle); }; #define drv_softi2c_start(dev) drv_device_open(dev) #define drv_softi2c_stop(dev) drv_device_close(dev) -#define drv_softi2c_put(dev, data) (dev)->put((drv_softi2c_t*)(dev)->handle, data) -#define drv_softi2c_get(dev, data) (dev)->get((drv_softi2c_t*)(dev)->handle, data) - - +#define drv_softi2c_put(dev, data) ((drv_softi2c_t*)(dev->handle))->put((dev)->handle, (data)) +#define drv_softi2c_get(dev, ack, data) ((drv_softi2c_t*)(dev->handle))->get((dev)->handle, (ack), (data)) #endif /*INCLUDED_DRV_SOFTI2C_H*/ diff --git a/DeviceKit/drv_spi.c b/DeviceKit/drv_spi.c new file mode 100644 index 0000000..1c95ef9 --- /dev/null +++ b/DeviceKit/drv_spi.c @@ -0,0 +1 @@ +#include diff --git a/DeviceKit/drv_spi.h b/DeviceKit/drv_spi.h new file mode 100644 index 0000000..d0a9059 --- /dev/null +++ b/DeviceKit/drv_spi.h @@ -0,0 +1,28 @@ +#ifndef INCLUDED_DRV_SPI_H +#define INCLUDED_DRV_SPI_H + +#ifndef INCLUDED_DRV_DEVICE_H +#include +#endif /*INCLUDED_DRV_DEVICE_H*/ + +/* ------------------------------------------------------------------------------------------------------------------ */ +/* */ + +typedef struct { + drv_device_t device; + os_err_t (*cs_low)(void* handle); + os_err_t (*cs_high)(void* handle); + os_err_t (*put)(void* handle, uint8_t data); + os_err_t (*get)(void* handle, uint8_t* data); + os_err_t (*send_halfword)(void* handle, uint16_t data); + os_err_t (*read_halfword)(void* handle, uint16_t* data); +}drv_spi_t; + +#define drv_spi_cs_low(dev) ((drv_spi_t*)(dev->handle))->cs_low((dev)->handle) +#define drv_spi_cs_high(dev) ((drv_spi_t*)(dev->handle))->cs_high((dev)->handle) +#define drv_spi_put(dev, data) ((drv_spi_t*)(dev->handle))->put((dev)->handle, data) +#define drv_spi_get(dev, data) ((drv_spi_t*)(dev->handle))->get((dev)->handle, data) +#define drv_spi_send_halfword(dev, data) ((drv_spi_t*)(dev->handle))->send_halfword((dev)->handle, data) +#define drv_spi_read_halfword(dev, data) ((drv_spi_t*)(dev->handle))->read_halfword((dev)->handle, data) + +#endif /*INCLUDED_DRV_SPI_H*/ diff --git a/Kernel/SingleCore/os_config.h.in b/Kernel/SingleCore/os_config.h.in index 1f4e983..54c8815 100644 --- a/Kernel/SingleCore/os_config.h.in +++ b/Kernel/SingleCore/os_config.h.in @@ -13,6 +13,8 @@ #cmakedefine OS_CFG_IDLE_TASK_STACK_SIZE @OS_CFG_IDLE_TASK_STACK_SIZE@ #cmakedefine OS_CFG_IDLE_TASK_TICKS @OS_CFG_IDLE_TASK_TICKS@ #cmakedefine OS_CFG_IDLE_TASK_PRIORITY @OS_CFG_IDLE_TASK_PRIORITY@ +#cmakedefine OS_CFG_NAME_MAX @OS_CFG_NAME_MAX@ +#cmakedefine OS_CFG_DEVICE_MAX @OS_CFG_DEVICE_MAX@ /* ==================================================================================================== */ @@ -34,4 +36,12 @@ #define OS_CFG_PRIORITY_MAX OS_CFG_CPU_INT_NBITS #endif /* OS_CFG_PRIORITY_MAX */ +#ifndef OS_CFG_NAME_MAX +#define OS_CFG_NAME_MAX 8 +#endif /* OS_CFG_NAME_MAX */ + +#ifndef OS_CFG_DEVICE_MAX +#define OS_CFG_DEVICE_MAX 10 +#endif /* OS_CFG_DEVICE_MAX */ + #endif /*INCLUDED_OS_CONFIG_H*/