Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
设备驱动框架
结合源码认识rtthread设备的三层框架
发布于 2021-05-15 19:03:20 浏览:3402
订阅该版
[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)跟底层硬件寄存器进行数据交换(读写寄存器)。  # 二、结合源码分析三层之间的注册关系 ## 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
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部