文章目录
- 轻量级设备驱动框架设计与实现
- 一、设计目标与原则
-
- 二、核心组件设计
- 2.1 设备管理器
- 2.2 设备注册机制
- 2.3 设备操作接口
- 三、回调机制实现
-
- 四、实际应用示例
-
- 五、错误处理与调试
-
- 六、性能优化建议
- 七、注意事项
轻量级设备驱动框架设计与实现
一、设计目标与原则
1.1 设计目标
- 轻量化:最小化代码体积和资源占用
- 跨平台:支持多种操作系统和硬件平台
- 易扩展:方便添加新设备和功能
- 标准化:统一的设备操作接口
1.2 设计原则
二、核心组件设计
2.1 设备管理器
struct list_head header = LIST_HEAD_INIT(header);
/* 设备查找 */
usr_device_t usr_device_find(const char *name)
{
struct list_head *pos = NULL;
taskENTER_CRITICAL();
list_for_each(pos, &header) {
usr_device_t dev = container_of(pos, struct usr_device, list);
if(strncmp(dev->name, name, DEV_NAME_MAX) == 0) {
taskEXIT_CRITICAL();
return dev;
}
}
taskEXIT_CRITICAL();
return NULL;
}
2.2 设备注册机制
int usr_device_register(usr_device_t dev, const char *name)
{
/* 检查设备名是否已存在 */
if(usr_device_find(name) != NULL)
return SL_ERROR;
/* 初始化设备名称 */
strncpy(dev->name, name, DEV_NAME_MAX);
/* 初始化链表节点并添加到全局链表 */
INIT_LIST_HEAD(&(dev->list));
taskENTER_CRITICAL();
list_add_tail(&dev->list, &header);
taskEXIT_CRITICAL();
return SL_EOK;
}
2.3 设备操作接口
/* 设备初始化 */
int usr_device_init(usr_device_t dev)
{
if(device_init != NULL)
return device_init(dev);
return SL_EOK;
}
/* 设备读取操作 */
int usr_device_read(usr_device_t dev, int pos, void *buffer, int size)
{
if(device_read != NULL)
return device_read(dev, pos, buffer, size);
return 0;
}
/* 设备写入操作 */
int usr_device_write(usr_device_t dev, int pos, const void *buffer, int size)
{
if(device_write != NULL)
return device_write(dev, pos, buffer, size);
return 0;
}
/* 设备控制操作 */
int usr_device_control(usr_device_t dev, int cmd, void *args)
{
if(device_control != NULL)
return device_control(dev, cmd, args);
return SL_ERROR;
}
三、回调机制实现
3.1 接收回调设置
int usr_device_set_rx_indicate(usr_device_t dev,
int (*rx_indicate)(usr_device_t dev, int size))
{
taskENTER_CRITICAL();
dev->rx_indicate = rx_indicate;
taskEXIT_CRITICAL();
return SL_EOK;
}
3.2 发送完成回调设置
int usr_device_set_tx_complete(usr_device_t dev,
int (*tx_complete)(usr_device_t dev, void *buffer))
{
taskENTER_CRITICAL();
dev->tx_complete = tx_complete;
taskEXIT_CRITICAL();
return SL_EOK;
}
四、实际应用示例
4.1 串口设备实现
struct uart_device {
struct usr_device parent; /* 继承基类设备 */
int port; /* 串口号 */
int baudrate; /* 波特率 */
uint8_t *rx_buffer; /* 接收缓冲区 */
uint8_t *tx_buffer; /* 发送缓冲区 */
int rx_size; /* 接收缓冲区大小 */
int tx_size; /* 发送缓冲区大小 */
};
/* 串口初始化实现 */
static int uart_init(usr_device_t dev)
{
struct uart_device *uart = (struct uart_device *)dev;
/* 分配缓冲区 */
uart->rx_buffer = malloc(UART_BUFFER_SIZE);
uart->tx_buffer = malloc(UART_BUFFER_SIZE);
if (!uart->rx_buffer || !uart->tx_buffer)
return SL_ERROR;
/* 配置串口硬件 */
return uart_hw_init(uart);
}
/* 串口读取实现 */
static int uart_read(usr_device_t dev, int pos, void *buffer, int size)
{
struct uart_device *uart = (struct uart_device *)dev;
return uart_hw_read(uart, buffer, size);
}
/* 串口写入实现 */
static int uart_write(usr_device_t dev, int pos, const void *buffer, int size)
{
struct uart_device *uart = (struct uart_device *)dev;
return uart_hw_write(uart, buffer, size);
}
4.2 使用示例
int main()
{
struct uart_device uart;
char buffer[128];
/* 初始化串口设备 */
memset(&uart, 0, sizeof(uart));
uart.parent.init = uart_init;
uart.parent.read = uart_read;
uart.parent.write = uart_write;
uart.port = 1;
uart.baudrate = 115200;
/* 注册设备 */
if (usr_device_register(&uart.parent, "uart1") != SL_EOK) {
printf("设备注册失败\n");
return -1;
}
/* 初始化设备 */
if (usr_device_init(&uart.parent) != SL_EOK) {
printf("设备初始化失败\n");
return -1;
}
/* 设置接收回调 */
usr_device_set_rx_indicate(&uart.parent, uart_rx_callback);
/* 读写操作 */
usr_device_read(&uart.parent, 0, buffer, sizeof(buffer));
usr_device_write(&uart.parent, 0, "Hello", 5);
return 0;
}
五、错误处理与调试
5.1 错误码定义
#define SL_EOK 0 /* 成功 */
#define SL_ERROR -1 /* 一般错误 */
#define SL_EBUSY -2 /* 设备忙 */
#define SL_ETIMEOUT -3 /* 超时错误 */
5.2 调试接口
#ifdef DEBUG
#define DEV_DEBUG(fmt, args...) printf("[DEV] "fmt, ##args)
#else
#define DEV_DEBUG(fmt, args...)
#endif
六、性能优化建议
- 合理使用互斥锁,避免长时间持有
- 优化设备查找算法
- 使用合适的缓冲区大小
- 实现设备休眠机制
- 异步操作支持
七、注意事项
- 设备名称唯一性检查
- 资源释放和内存管理
- 回调函数的线程安全性
- 错误处理的完整性
- 跨平台兼容性