驱动优化

This commit is contained in:
2026-05-19 22:34:08 +08:00
parent add7af4222
commit c9efc32d32
8 changed files with 52 additions and 22 deletions
+1 -1
View File
@@ -66,7 +66,7 @@ void drv_device_unregister(drv_device_t* self){
drv_device_t* drv_device_find(const char* name){ drv_device_t* drv_device_find(const char* name){
drv_rbtree_node_t* p = drv_rbtree_find(&s_drv_rbtree, name); drv_rbtree_node_t* p = drv_rbtree_find(&s_drv_rbtree, name);
if(p==NULL) return NULL; if(p==NULL) return NULL;
return &p->device; return p->device;
} }
-2
View File
@@ -19,13 +19,11 @@
#endif /*INCLUDED_OS_LIST_H*/ #endif /*INCLUDED_OS_LIST_H*/
/* ------------------------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------------------------ */
/* */ /* */
typedef struct { typedef struct {
void* handle; void* handle;
os_list_node_t node;
os_err_t (*init)(void* handle, void* args); os_err_t (*init)(void* handle, void* args);
os_err_t (*destroy)(void* handle, void* args); os_err_t (*destroy)(void* handle, void* args);
os_err_t (*open)(void* handle, void* args); os_err_t (*open)(void* handle, void* args);
+5 -5
View File
@@ -26,7 +26,7 @@ OS_STATIC_FORCE_INLINE
void node_init(rbtree_t* tree, rbtree_node_t * self, drv_device_t* val){ void node_init(rbtree_t* tree, rbtree_node_t * self, drv_device_t* val){
self->left = self->right = self->parent = 0; self->left = self->right = self->parent = 0;
self->color = RED; self->color = RED;
self->device = *val; self->device = val;
} }
OS_STATIC_FORCE_INLINE 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){ static rbtree_node_t * find(rbtree_t* self, const char* key, rbtree_node_t * x){
while(x){ while(x){
int cmp = node_cmp(x->device.name, key); int cmp = node_cmp(key, x->device->name);
if(cmp < 0){ if(cmp < 0){
x = x->left; x = x->left;
}else if(cmp > 0){ }else if(cmp > 0){
@@ -201,7 +201,7 @@ void node_insert_fixup(rbtree_t* tree, rbtree_node_t * node){
node_set_black(tree->root); node_set_black(tree->root);
} }
OS_STATIC_FORCE_INLINE static
void node_insert(rbtree_t* tree, rbtree_node_t * node){ void node_insert(rbtree_t* tree, rbtree_node_t * node){
int cmp = 0; int cmp = 0;
rbtree_node_t * y = NULL; rbtree_node_t * y = NULL;
@@ -210,7 +210,7 @@ void node_insert(rbtree_t* tree, rbtree_node_t * node){
// 1. 将红黑树当作一颗二叉查找树,将节点添加到二叉查找树中。 // 1. 将红黑树当作一颗二叉查找树,将节点添加到二叉查找树中。
while (x) { while (x) {
y = x; y = x;
cmp = node_cmp(node->device.name, x->device.name); cmp = node_cmp(node->device->name, x->device->name);
if (cmp < 0) if (cmp < 0)
x = x->left; x = x->left;
else else
@@ -223,7 +223,7 @@ void node_insert(rbtree_t* tree, rbtree_node_t * node){
tree->root = node; tree->root = node;
}else{ }else{
// 判断插入父节点的左边还是右边 // 判断插入父节点的左边还是右边
cmp = node_cmp(node->device.name, y->device.name); cmp = node_cmp(node->device->name, y->device->name);
if(cmp < 0){ if(cmp < 0){
y->left = node; y->left = node;
}else{ }else{
+1 -1
View File
@@ -30,7 +30,7 @@ typedef struct drv_rbtree_node_s{
struct drv_rbtree_node_s* right; struct drv_rbtree_node_s* right;
struct drv_rbtree_node_s* parent; struct drv_rbtree_node_s* parent;
char color; char color;
drv_device_t device; drv_device_t* device;
}drv_rbtree_node_t; }drv_rbtree_node_t;
typedef struct { typedef struct {
+6 -13
View File
@@ -8,22 +8,15 @@
typedef struct drv_softi2c_t drv_softi2c_t; typedef struct drv_softi2c_t drv_softi2c_t;
struct drv_softi2c_t{ struct drv_softi2c_t{
drv_device_t root; drv_device_t device;
os_uint_t scl_clock; os_err_t (*put)(void* self, uint8_t data);
void* scl_port; os_err_t (*get)(void* self, uint8_t ack, uint8_t* data);
os_uint_t scl_pin; os_err_t (*wait_ack)(void* handle);
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);
}; };
#define drv_softi2c_start(dev) drv_device_open(dev) #define drv_softi2c_start(dev) drv_device_open(dev)
#define drv_softi2c_stop(dev) drv_device_close(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_put(dev, data) ((drv_softi2c_t*)(dev->handle))->put((dev)->handle, (data))
#define drv_softi2c_get(dev, data) (dev)->get((drv_softi2c_t*)(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*/ #endif /*INCLUDED_DRV_SOFTI2C_H*/
+1
View File
@@ -0,0 +1 @@
#include <drv_spi.h>
+28
View File
@@ -0,0 +1,28 @@
#ifndef INCLUDED_DRV_SPI_H
#define INCLUDED_DRV_SPI_H
#ifndef INCLUDED_DRV_DEVICE_H
#include <drv_device.h>
#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*/
+10
View File
@@ -13,6 +13,8 @@
#cmakedefine OS_CFG_IDLE_TASK_STACK_SIZE @OS_CFG_IDLE_TASK_STACK_SIZE@ #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_TICKS @OS_CFG_IDLE_TASK_TICKS@
#cmakedefine OS_CFG_IDLE_TASK_PRIORITY @OS_CFG_IDLE_TASK_PRIORITY@ #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 #define OS_CFG_PRIORITY_MAX OS_CFG_CPU_INT_NBITS
#endif /* OS_CFG_PRIORITY_MAX */ #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*/ #endif /*INCLUDED_OS_CONFIG_H*/