驱动优化
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
@@ -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
@@ -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*/
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
#include <drv_spi.h>
|
||||||
@@ -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*/
|
||||||
@@ -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*/
|
||||||
|
|||||||
Reference in New Issue
Block a user