Q群:
电话:
邮箱:
地址:
嵌入式软件通常需要操作各类外设(片内、片外),而外设的种类、操作方法纷繁复杂。
OneOS在各类外设的基础上抽象出了设备驱动模型,有效提高了代码可复用性、可移植性,模块分层解耦,降低了各层的开发难度。
下层向上层提供统一的访问接口
分层设计,屏蔽硬件差异
每一层只跟其相邻的层建立联系
系统调用接口、设备管理层、设备框架层、设备驱动层
系统调用提供统一的 API 接口
接口 | 说明 |
---|---|
os_device_find() | 查找设备 |
os_device_init() | 初始化设备(第一次打开的时候进行初始化) |
os_device_open() | 打开设备 |
os_device_read() | 读取数据 |
os_device_write() | 写入数据 |
os_device_control() | 控制设备 |
os_device_close() | 关闭设备 |
该函数根据设备名查找对应的设备,函数原型如下:
os_device_t *os_device_find(const char *name);
参数 | 说明 |
---|---|
name | 设备名(uart1,i2c1,spi1 等) |
返回 | 说明 |
设备指针 | 成功返回对应的设备指针 |
OS_NULL | 没有找到指定的设备 |
该函数在第一次打开设备时调用,用于建立驱动数据结构、初始化硬件,函数原型如下:
os_err_t os_device_init(os_device_t *dev);
参数 | 说明 |
---|---|
dev | 设备指针 |
返回 | 说明 |
OS_EOK | 设备初始化成功 |
其他错误码 | 设备初始化失败 |
该函数用于打开设备,第一次打开设备会调用设备初始化接口,函数原型如下:
os_err_t os_device_open(os_device_t *dev, os_uint16_t oflag);
参数 | 说明 |
---|---|
dev | 设备指针 |
oflag | 设备模式标志 |
返回 | 说明 |
OS_EOK | 设备打开成功 |
其他错误码 | 设备打开失败 |
该函数用于从设备中读取数据,函数原型如下:
os_size_t os_device_read(os_device_t *dev, os_off_t pos, void *buffer, os_size_t size);
参数 | 说明 |
---|---|
dev | 设备指针 |
pos | 读取数据偏移量 |
buffer | 缓冲区指针,读取的数据将会被保存在缓冲区中 |
size | 读取数据的大小 |
返回 | 说明 |
读到数据的实际大小 | 如果是字符设备,返回大小以字节为单位 |
0 | 需要读取当前线程的 errno 来判断错误状态 |
该函数用于向设备中写入数据,函数原型如下:
os_size_t os_device_write(os_device_t *dev, os_off_t pos, const void *buffer, os_size_t size);
参数 | 说明 |
---|---|
dev | 设备指针 |
pos | 写入数据偏移量 |
buffer | 内存缓冲区指针,放置要写入的数据 |
size | 写入数据的大小 |
返回 | 说明 |
写入数据的实际大小 | 如果是字符设备,返回大小以字节为单位; |
0 | 需要读取当前线程的 errno 来判断错误状态 |
该函数用于对设备进行配置,如串口波特率、spi工作模式等参数,函数原型如下:
os_err_t os_device_control(os_device_t *dev, int cmd, void *arg);
参数 | 说明 |
---|---|
dev | 设备指针 |
cmd | 命令控制字,可选值由具体驱动决定 |
arg | 控制的参数,可选值由具体驱动决定 |
返回 | 说明 |
OS_EOK | 函数执行成功 |
OS_ENOSYS | 执行失败,设备不支持 control 接口 |
其他错误码 | 执行失败 |
该函数用于关闭设备,函数原型如下:
os_err_t os_device_close(os_device_t *dev);
参数 | 说明 |
---|---|
dev | 设备指针 |
返回 | 说明 |
OS_EOK | 关闭设备成功 |
OS_ERROR | 设备已经完全关闭,不能重复关闭设备 |
其他错误码 | 关闭设备失败 |
设备管理层实现了对设备驱动程序的封装,向上对接系统调用接口。
设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。
设备驱动层是一组驱使硬件设备工作的程序,实现访问硬件设备的功能,它负责创建和注册设备。