Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
设备驱动框架
结合源码认识rtthread设备的三层框架
发布于 2021-05-15 19:03:20 浏览:3284
订阅该版
[tocm] # 一、rtthread设备三层框架 绝大部分的嵌入式系统都包括一些 I/O(Input/Output,输入 / 输出)设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的 Flash 或 SD 卡,以及网络设备的以太网接口等,都是嵌入式系统中容易找到的 I/O 设备例子。 RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。其中,设备管理层和设备驱动框架层rtthread已经实现,设备驱动框架向设备管理器注册见\rt-thread\components\drivers\spi\spi_dev.c,可见spi驱动框架属于rtthread的组件,rtthread的spi设备驱动框架提供了spi总线注册函数rt_spi_bus_register(struct rt_spi_bus *bus,const char *name, const struct rt_spi_ops *ops)用于将底层的spi操作注册到驱动框架,这样我们就可以调用设备管理api(open,read、write)跟底层硬件寄存器进行数据交换(读写寄存器)。 ![QQ浏览器截图20210515185813.png](https://oss-club.rt-thread.org/uploads/20210515/1900ab4fed963451a417d4883c13df21.png) # 二、结合源码分析三层之间的注册关系 ## 2.1 设备驱动层向设备驱动框架层注册 wm_spi_ops即为硬件层的操作函数,实现寄存器的读写,如果soc原厂要使用rtthread驱动框架就是要实现spixfer函数。之后rtthread的spi驱动框架就会根据用户的rt_device_write函数去写硬件寄存器,或者通过rt_device_read读取硬件寄存器。 ```c static struct rt_spi_ops wm_spi_ops = { .configure = spi_configure, .xfer = spixfer }; struct wm_spi spi; struct rt_spi_bus wm_spi_bus; int wm_hw_spi_bus_init(void) { rt_int16_t gpio_pin; gpio_pin = wm_get_pin(WM_SPI_CK_PIN); if (gpio_pin >= 0) { wm_spi_ck_config((enum tls_io_name)gpio_pin); } gpio_pin = wm_get_pin(WM_SPI_DI_PIN); if (gpio_pin >= 0) { wm_spi_di_config((enum tls_io_name)gpio_pin); } gpio_pin = wm_get_pin(WM_SPI_DO_PIN); if (gpio_pin >= 0) { wm_spi_do_config((enum tls_io_name)gpio_pin); } wm_spi_bus.parent.user_data = &spi; #ifdef WM_SPI_BUS_NAME rt_spi_bus_register(&wm_spi_bus, WM_SPI_BUS_NAME, &wm_spi_ops); #else rt_spi_bus_register(&wm_spi_bus, "spi0", &wm_spi_ops); #endif return RT_EOK; } ``` ## 2.2 设备驱动框架层向设备管理层注册 \rt-thread\components\drivers\spi\spi_dev.c中的rt_spidev_device_init向设备管理层注册一个spi总线驱动。 ```c rt_err_t rt_spidev_device_init(struct rt_spi_device *dev, const char *name) { struct rt_device *device; RT_ASSERT(dev != RT_NULL); device = &(dev->parent); /* set device type */ device->type = RT_Device_Class_SPIDevice; #ifdef RT_USING_DEVICE_OPS device->ops = &spi_device_ops; #else device->init = RT_NULL; device->open = RT_NULL; device->close = RT_NULL; device->read = _spidev_device_read; device->write = _spidev_device_write; device->control = _spidev_device_control; #endif /* register to device manager */ return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR); } ```
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
happycode999
这家伙很懒,什么也没写!
文章
28
回答
6
被采纳
0
关注TA
发私信
相关文章
1
设备驱动框架是否线程安全?
2
硬件初始化函数 HAL_XXX_MspInit在哪里被调用了?
3
rtt uart设备驱动半双工模式
4
关于I2C驱动框架存在的问题
5
添加自定义设备驱动进入RTT的框架
6
RTT的驱动框架怎么学
7
这三个驱动有什么区别呀?
8
rt驱动框架是否像rt官方希望的方式在被使用?
9
设备驱动开发指南是不是rtthread已经都实现了
10
关于串口DMA接收时,重新配置波特率会导致接收异常的问题?
推荐文章
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部