#include #include #include "os_align.h" /* ------------------------------------------------------------------------------------------------------------------ */ /* */ #define NODE_BLOCK_SIZE (DRV_RBTREE_NODE_SIZE * OS_CFG_DEVICE_MAX) /* ------------------------------------------------------------------------------------------------------------------ */ /* */ static volatile uint8_t s_drv_device_id_cnt; OS_ALIGNED(OS_ALIGN_SIZE) static uint8_t s_drv_device_rbtree_node_block[NODE_BLOCK_SIZE]; static drv_rbtree_t s_drv_rbtree; /* ------------------------------------------------------------------------------------------------------------------ */ /* */ void drv_device_system_init(void){ s_drv_device_id_cnt = 0; drv_rbtree_init(&s_drv_rbtree, s_drv_device_rbtree_node_block, NODE_BLOCK_SIZE); } void drv_device_register(drv_device_t* self, const char* name, void* handle, os_err_t (*init)(void* handle, void* args), os_err_t (*destroy)(void* handle, void* args), os_err_t (*open)(void* handle, void* args), os_err_t (*close)(void* handle, void* args), os_err_t (*read)(void* handle, uint8_t * buf, os_size_t buf_size, os_size_t * rd_size, void* args), os_err_t (*write)(void* handle, const uint8_t * data, os_size_t data_size, os_size_t * wr_size, void* args), void* args) { self->handle = handle; self->init = init; self->destroy = destroy; self->open = open; self->close = close; self->read = read; self->write = write; self->args = args; if(name){ os_size_t name_len = strlen(name); name_len = OS_MIN(name_len, OS_ARRAY_SIZE(self->name)-1); strncpy(self->name, name, name_len); self->name[name_len] = '\0'; }else{ snprintf(self->name, OS_ARRAY_SIZE(self->name), "drv_%d", s_drv_device_id_cnt++); } drv_rbtree_insert(&s_drv_rbtree, self); } void drv_device_unregister(drv_device_t* self){ if(!self) return; drv_rbtree_remove(&s_drv_rbtree, self->name); } 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; }