import
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
#include <drv_device.h>
|
||||
#include <drv_rbtree.h>
|
||||
#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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user