Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024_RSOC】设备和驱动——2.基础接口总结
发布于 2024-07-26 09:04:27 浏览:196
订阅该版
#设备和驱动——2.基础接口总结 ##1.创建设备 #####动态创建设备 ```c rt_device_t rt_device_create(int type, int attach_size); (type)设备类型: RT_Device_Class_Char /* 字符设备 */ RT_Device_Class_Block /* 块设备 */ RT_Device_Class_NetIf /* 网络接口设备 */ RT_Device_Class_MTD /* 内存设备 */ RT_Device_Class_RTC /* RTC 设备 */ RT_Device_Class_Sound /* 声音设备 */ RT_Device_Class_Graphic /* 图形设备 */ RT_Device_Class_I2CBUS /* I2C 总线设备 */ RT_Device_Class_USBDevice /* USB device 设备 */ RT_Device_Class_USBHost /* USB host 设备 */ RT_Device_Class_SPIBUS /* SPI 总线设备 */ RT_Device_Class_SPIDevice /* SPI 设备 */ RT_Device_Class_SDIO /* SDIO 设备 */ RT_Device_Class_Miscellaneous /* 杂类设备 */ (attach_size)用户数据大小 (返回):设备句柄 ``` 调用该接口时,系统会从动态堆内存中分配一个设备控制块,大小为 struct rt_device 和 attach_size 的和,设备的类型由参数 type 设定。设备被创建后,需要实现它访问硬件的操作方法。 ```c struct rt_device_ops { /* common device interface */ rt_err_t (*init) (rt_device_t dev); rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag); rt_err_t (*close) (rt_device_t dev); rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); rt_err_t (*control)(rt_device_t dev, int cmd, void *args); }; ``` **init**:初始化设备。设备初始化完成后,设备控制块的 flag 会被置成已激活状态 (RT_DEVICE_FLAG_ACTIVATED)。如果设备控制块中的 flag 标志已经设置成激活状态,那么再运行初始化接口时会立刻返回,而不会重新进行初始化。 **open**:打开设备。有些设备并不是系统一启动就已经打开开始运行,或者设备需要进行数据收发,但如果上层应用还未准备好,设备也不应默认已经使能并开始接收数据。所以建议在写底层驱动程序时,在调用 open 接口时才使能设备。 **close**:关闭设备。在打开设备时,设备控制块会维护一个打开计数,在打开设备时进行 + 1 操作,在关闭设备时进行 - 1 操作,当计数器变为 0 时,才会进行真正的关闭操作。 **read**:从设备读取数据。参数 pos 是读取数据的偏移量,但是有些设备并不一定需要指定偏移量,例如串口设备,设备驱动应忽略这个参数。而对于块设备来说,pos 以及 size 都是以块设备的数据块大小为单位的。例如块设备的数据块大小是 512,而参数中 pos = 10, size = 2,那么驱动应该返回设备中第 10 个块 (从第 0 个块做为起始),共计 2 个块的数据。这个接口返回的类型是 rt_size_t,即读到的字节数或块数目。正常情况下应该会返回参数中 size 的数值,如果返回零请设置对应的 errno 值。 **write**:向设备写入数据。参数 pos 是写入数据的偏移量。与读操作类似,对于块设备来说,pos 以及 size 都是以块设备的数据块大小为单位的。这个接口返回的类型是 rt_size_t,即真实写入数据的字节数或块数目。正常情况下应该会返回参数中 size 的数值,如果返回零请设置对应的 errno 值。 **control**:根据 cmd 命令控制设备。命令往往是由底层各类设备驱动自定义实现。例如参数 RT_DEVICE_CTRL_BLK_GETGEOME,意思是获取块设备的大小信息。 #####动态删除设备 void rt_device_destroy(rt_device_t device); #####静态创建设备 ? ? ? ##2.注册设备(设备被创建后,需要注册到 I/O 设备管理器中,应用程序才能够访问) ```c rt_err_t rt_device_register(rt_device_t dev, const char* name, rt_uint8_t flags); dev:设备句柄 name;设备名称,设备名称的最大长度由 rtconfig.h 中定义的宏 RT_NAME_MAX 指定,多余部分会被自动截掉 flags:设备模式标志 #define RT_DEVICE_FLAG_RDONLY 0x001 /* 只读 */ #define RT_DEVICE_FLAG_WRONLY 0x002 /* 只写 */ #define RT_DEVICE_FLAG_RDWR 0x003 /* 读写 */ #define RT_DEVICE_FLAG_REMOVABLE 0x004 /* 可移除 */ #define RT_DEVICE_FLAG_STANDALONE 0x008 /* 独立 */ #define RT_DEVICE_FLAG_SUSPENDED 0x020 /* 挂起 */ #define RT_DEVICE_FLAG_STREAM 0x040 /* 流模式 */ #define RT_DEVICE_FLAG_INT_RX 0x100 /* 中断接收 */ #define RT_DEVICE_FLAG_DMA_RX 0x200 /* DMA 接收 */ #define RT_DEVICE_FLAG_INT_TX 0x400 /* 中断发送 */ #define RT_DEVICE_FLAG_DMA_TX 0x800 /* DMA 发送 */ ``` ##3.查找设备 应用程序根据设备名称获取设备句柄,进而可以操作设备 ```c rt_device_t rt_device_find(const char* name); name:设备名称 返回:设备句柄 ``` ##4.初始化设备 rt_err_t rt_device_init(rt_device_t dev); dev:设备句柄 ##5.打开和设备 通过设备句柄,应用程序可以打开和关闭设备,打开设备时,会检测设备是否已经初始化,**没有初始化则会默认调用初始化接口初始化设备**。 ```c rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags); dev:设备句柄 oflags:设备打开模式标志 #define RT_DEVICE_OFLAG_CLOSE 0x000 /* 设备已经关闭(内部使用)*/ #define RT_DEVICE_OFLAG_RDONLY 0x001 /* 以只读方式打开设备 */ #define RT_DEVICE_OFLAG_WRONLY 0x002 /* 以只写方式打开设备 */ #define RT_DEVICE_OFLAG_RDWR 0x003 /* 以读写方式打开设备 */ #define RT_DEVICE_OFLAG_OPEN 0x008 /* 设备已经打开(内部使用)*/ #define RT_DEVICE_FLAG_STREAM 0x040 /* 设备以流模式打开 */ #define RT_DEVICE_FLAG_INT_RX 0x100 /* 设备以中断接收模式打开 */ #define RT_DEVICE_FLAG_DMA_RX 0x200 /* 设备以 DMA 接收模式打开 */ #define RT_DEVICE_FLAG_INT_TX 0x400 /* 设备以中断发送模式打开 */ #define RT_DEVICE_FLAG_DMA_TX 0x800 /* 设备以 DMA 发送模式打开 */ ``` ##6.关闭设备 rt_err_t rt_device_close(rt_device_t dev); dev:设备句柄 ##7.控制设备 rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg); dev:设备句柄 cmd:命令控制字,这个参数通常与设备驱动程序相关 参数 cmd 的通用设备命令可取如下宏定义: #define RT_DEVICE_CTRL_RESUME 0x01 /* 恢复设备 */ #define RT_DEVICE_CTRL_SUSPEND 0x02 /* 挂起设备 */ #define RT_DEVICE_CTRL_CONFIG 0x03 /* 配置设备 */ #define RT_DEVICE_CTRL_SET_INT 0x10 /* 设置中断 */ #define RT_DEVICE_CTRL_CLR_INT 0x11 /* 清中断 */ #define RT_DEVICE_CTRL_GET_INT 0x12 /* 获取中断状态 */ arg:控制的参数 ##9.读设备 rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos,void* buffer, rt_size_t size); dev:设备句柄 pos:读取数据偏移量,pos 根据不同的设备类别有不同的意义。 buffer:内存缓冲区指针,读取的数据将会被保存在缓冲区中,个缓冲区的最大长度是 size size:读取数据的大小 返回:读到数据的实际大小,如果是字符设备,返回大小以字节为单位,如果是块设备,返回的大小以块为单位 ##9.写设备 rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos,const void* buffer, rt_size_t size); dev:设备句柄 pos:写入数据偏移量,pos 根据不同的设备类别有不同的意义。 buffer:内存缓冲区指针,写入的数据将会被保存在缓冲区中,个缓冲区的最大长度是 size size:写入数据的大小 返回:写入数据的实际大小,如果是字符设备,返回大小以字节为单位,如果是块设备,返回的大小以块为单位 ##10.设置接收数据回调 **该函数的回调函数由调用者提供**。当硬件设备接收到数据时,会回调这个函数并把收到的数据长度放在 size 参数中传递给上层应用,知上层应用线程有数据到达 rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size)); dev:设备句柄 rx_ind:回调函数指针
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
马桶盖盖子
这家伙很懒,什么也没写!
文章
7
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部