设备模型也是建立在内核对象模型基础上
目前支持的I/O 设备类型,如下:
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 /* 杂类设备 */
I/O设备支持设备驱动根据设备模型定义,创建出具备硬件访问能力的设备实例,将该设备通过
rt_device_register()
接口注册到 I/O 设备管理器中。
应用程序可以通过
rt_device_find()
接口查找到设备,然后使用 I/O 设备管理接口来访问硬件。
其他的函数实现
UART驱动
应用程序通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件,相关接口如下所示:
rt_device_find() | 查找设备 |
rt_device_open() | 打开设备 |
rt_device_read() | 读取数据 |
rt_device_write() | 写入数据 |
rt_device_control() | 控制设备 |
rt_device_set_rx_indicate() | 设置接收回调函数 |
rt_device_set_tx_complete() | 设置发送完成回调函数 |
rt_device_close() | 关闭设备 |
PIN 设备
应用程序通过 RT-Thread 提供的 PIN 设备管理接口来访问 GPIO,相关接口如下所示:
rt_pin_mode() | 设置引脚模式 |
rt_pin_write() | 设置引脚电平 |
rt_pin_read() | 读取引脚电平 |
rt_pin_attach_irq() | 绑定引脚中断回调函数 |
rt_pin_irq_enable() | 使能引脚中断 |
rt_pin_detach_irq() | 脱离引脚中断回调函数 |
需要注意RT-Thread 提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由 PIN 设备驱动程序定义,和具体的芯片相关。有2种方式可以获取引脚编号:使用宏定义或者查看PIN 驱动文件。
ADC 设备
应用程序通过 RT-Thread 提供的 ADC 设备管理接口来访问 ADC 硬件,相关接口如下所示:
rt_device_find() | 根据 ADC 设备名称查找设备获取设备句柄 |
rt_adc_enable() | 使能 ADC 设备 |
rt_adc_read() | 读取 ADC 设备数据 |
rt_adc_disable() | 关闭 ADC 设备 |
CAN 设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问 CAN 硬件控制器,相关接口如下所示:
rt_device_find | 查找设备 |
rt_device_open | 打开设备 |
rt_device_read | 读取数据 |
rt_device_write | 写入数据 |
rt_device_control | 控制设备 |
rt_device_set_rx_indicate | 设置接收回调函数 |
rt_device_close | 关闭设备 |
HWTIMER设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问硬件定时器设备,相关接口如下所示:
rt_device_find() | 查找定时器设备 |
rt_device_open() | 以读写方式打开定时器设备 |
rt_device_set_rx_indicate() | 设置超时回调函数 |
rt_device_control() | 控制定时器设备,可以设置定时模式(单次/周期)/计数频率,或者停止定时器 |
rt_device_write() | 设置定时器超时值,定时器随即启动 |
rt_device_read() | 获取定时器当前值 |
rt_device_close() | 关闭定时器设备 |
I2C 总线设备
一般情况下 MCU 的 I2C 器件都是作为主机和从机通讯,在 RT-Thread 中将 I2C 主机虚拟为 I2C总线设备,I2C 从机通过 I2C 设备接口和 I2C 总线通讯,相关接口如下所示:
rt_device_find() | 根据 I2C 总线设备名称查找设备获取设备句柄 |
rt_i2c_transfer() | 传输数据 |
PWM 设备
应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件,相关接口如下所示:
rt_device_find() | 根据 PWM 设备名称查找设备获取设备句柄 |
rt_pwm_set() | 设置 PWM 周期和脉冲宽度 |
rt_pwm_enable() | 使能 PWM 设备 |
rt_pwm_disable() | 关闭 PWM 设备 |
RTC 设备
应用程序通过 RTC 设备管理接口来访问 RTC 硬件,相关接口如下所示:
set_time() | 设置时间,时、分、秒 |
time() | 获取当前时间 |
SPI 设备
一般情况下 MCU 的 SPI 器件都是作为主机和从机通讯,在 RT-Thread 中将 SPI 主机虚拟为 SPI 总线设备,应用程序使用 SPI 设备管理接口来访问 SPI 从机器件,主要接口如下所示:
rt_device_find() | 根据 SPI 设备名称查找设备获取设备句柄 |
rt_spi_transfer_message() | 自定义传输数据 |
rt_spi_transfer() | 传输一次数据 |
rt_spi_send() | 发送一次数据 |
rt_spi_recv() | 接受一次数据 |
rt_spi_send_then_send() | 连续两次发送 |
rt_spi_send_then_recv() | 先发送后接收 |
QSPI 的数据传输接口如下所示:
rt_qspi_transfer_message() | 传输数据 |
rt_qspi_send_then_recv() | 先发送后接收 |
rt_qspi_send() | 发送一次数据 |
WATCHDOG设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问看门狗硬件,相关接口如下所示:
rt_device_find() | 根据看门狗设备设备名称查找设备获取设备句柄 |
rt_device_init() | 初始化看门狗设备 |
rt_device_control() | 控制看门狗设备 |
rt_device_close() | 关闭看门狗设备 |
WLAN 设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问看门狗硬件,相关接口如下所示:
初始化相关函数rt_wlan_init() | 初始化连接管理器 |
rt_wlan_set_mode() | 设置工作模式 |
rt_wlan_get_mode() | 获取设备工作模式 |
连接相关函数
rt_wlan_connect() | 连接热点 |
rt_wlan_connect_adv() | 无阻塞连接热点 |
rt_wlan_disconnect() | 断开热点 |
rt_wlan_is_connected() | 获取连接标志 |
rt_wlan_is_ready() | 获取就绪标志 |
rt_wlan_get_info() | 获取连接信息 |
rt_wlan_get_rssi() | 获取信号强度 |
扫描相关函数
rt_wlan_scan() | 异步扫描 |
rt_wlan_scan_sync() | 同步扫描 |
rt_wlan_scan_with_info() | 条件扫描 |
rt_wlan_scan_get_info_num() | 获取热点个数 |
rt_wlan_scan_get_info() | 拷贝热点信息 |
rt_wlan_scan_get_result() | 获取扫描缓存 |
rt_wlan_scan_result_clean() | 清理扫描缓存 |
rt_wlan_find_best_by_cache() | 查找最佳热点 |
热点相关函数
rt_wlan_start_ap() | 启动热点 |
rt_wlan_start_ap_adv() | 无阻塞启动热点 |
rt_wlan_ap_is_active() | 获取启动标志 |
rt_wlan_ap_stop() | 停止热点 |
rt_wlan_ap_get_info() | 获取热点信息 |
自动重连相关函数
rt_wlan_config_autoreconnect() | 启动/停止自动重连 |
rt_wlan_get_autoreconnect_mode() | 获取自动重连模式 |
事件回调相关函数
rt_wlan_register_event_handler() | 事件注册 |
rt_wlan_unregister_event_handler() | 解除注册 |
功耗管理相关函数
rt_wlan_set_powersave() | 设置功耗等级 |
rt_wlan_get_powersave() | 获取功耗等级 |
SENSOR设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问传感器设备,相关接口如下所示:
rt_device_find() | 根据传感器设备设备名称查找设备获取设备句柄 |
rt_device_open() | 打开传感器设备 |
rt_device_read() | 读取数据 |
rt_device_control() | 控制传感器设备 |
rt_device_set_rx_indicate() | 设置接收回调函数 |
rt_device_close() | 关闭传感器设备 |
Touch 设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问 Touch 设备,相关接口如下所示:
rt_device_find() | 根据 Touch 设备设备名称查找设备获取设备句柄 |
rt_device_open() | 打开 Touch 设备 |
rt_device_read() | 读取触点数据 |
rt_device_control() | 控制 Touch 设备 |
rt_device_set_rx_indicate() | 设置接收回调函数 |
rt_device_close() | 关闭 Touch 设备 |
CRYPTO 设备
硬件加解密框架目前已经支持 AES/DES/3DES/RC4/SHA1/SHA2/MD5/CRC/RNG/BIGNUM 等加解密相关的接口。
访问 hash 算法设备应用程序通过 RT-Thread 提供的 hash 算法设备管理接口来访问 hash 算法设备硬件,相关接口如下所示:
rt_hwcrypto_hash_create() | 创建 hash 上下文 |
rt_hwcrypto_hash_destroy() | 释放上下文 |
rt_hwcrypto_hash_finish() | 计算最终 hash 值 |
rt_hwcrypto_hash_update() | 处理一包数据 |
rt_hwcrypto_hash_cpy() | 复制上下文 |
rt_hwcrypto_hash_reset() | 重置上下文 |
rt_hwcrypto_hash_set_type() | 设置 hash 算法类型 |
应用程序通过 RT-Thread 提供的 symmetric 设备管理接口来访问 symmetric 算法设备硬件,相关接口如下所示:
rt_hwcrypto_symmetric_create() | 创建对称加解密上下文 |
rt_hwcrypto_symmetric_destroy() | 释放上下文 |
rt_hwcrypto_symmetric_crypt() | 加解密操作 |
rt_hwcrypto_symmetric_setkey() | 设置加解密密钥 |
rt_hwcrypto_symmetric_getkey() | 获取加解密密钥 |
rt_hwcrypto_symmetric_setiv() | 设置对称加解密初始化向量 |
rt_hwcrypto_symmetric_getiv() | 获取对称加解密初始化向量 |
rt_hwcrypto_symmetric_set_ivoff() | 设置对称加解密初始化向量偏移值 |
rt_hwcrypto_symmetric_get_ivoff() | 获取对称加解密初始化向量偏移值 |
rt_hwcrypto_symmetric_cpy() | 复制上下文 |
rt_hwcrypto_symmetric_reset() | 重置上下文 |
rt_hwcrypto_symmetric_set_type() | 设置加解密类型 |
应用程序通过 RT-Thread 提供的 gcm 设备管理接口来访问 gcm 算法设备硬件,相关接口如下所示:
rt_hwcrypto_gcm_create() | 创建上下文 |
rt_hwcrypto_gcm_destroy() | 释放上下文 |
rt_hwcrypto_gcm_start() | 传入附加值 |
rt_hwcrypto_gcm_finish() | 生成消息认证码 |
rt_hwcrypto_gcm_crypt() | 进行加解密 |
rt_hwcrypto_gcm_setkey() | 设置密钥 |
rt_hwcrypto_gcm_getkey() | 获取密钥 |
rt_hwcrypto_gcm_setiv() | 设置初始化向量 |
rt_hwcrypto_gcm_getiv() | 获取初始化向量 |
rt_hwcrypto_gcm_set_ivoff() | 设置初始化向量偏移 |
rt_hwcrypto_gcm_get_ivoff() | 获取初始化向量偏移 |
rt_hwcrypto_gcm_cpy() | 复制上下文 |
rt_hwcrypto_gcm_reset() | 重置上下文 |
应用程序通过 RT-Thread 提供的 CRC 设备管理接口来访问 CRC 算法设备硬件,相关接口如下所示:
rt_hwcrypto_crc_create() | 创建 CRC 上下文 |
rt_hwcrypto_crc_destroy() | 释放上下文 |
rt_hwcrypto_crc_update() | 计算一包数据 |
rt_hwcrypto_crc_cfg() | 设置上下文计算数据 |
应用程序通过 RT-Thread 提供的 RNG 设备管理接口来访问 RNG 算法设备硬件,相关接口如下所示:
rt_hwcrypto_rng_update() | 获取默认设备随机数 |
应用程序通过 RT-Thread 提供的大数设备管理接口来访问大数算法设备硬件,相关接口如下所示:
rt_hwcrypto_bignum_default() | 获取默认上下文 |
rt_hwcrypto_bignum_init() | 初始化大数对象 |
rt_hwcrypto_bignum_free() | 释放大数 |
rt_hwcrypto_bignum_get_len() | 获取大数长度 |
rt_hwcrypto_bignum_export_bin() | 以大端模式输出二进制 |
rt_hwcrypto_bignum_import_bin() | 以大端模式输入二进制 |
rt_hwcrypto_bignum_add() | 大数相加 |
rt_hwcrypto_bignum_sub() | 大数相减 |
rt_hwcrypto_bignum_mul() | 大数相乘 |
rt_hwcrypto_bignum_mulmod | 大数乘积取模 |
rt_hwcrypto_bignum_exptmod | 大数幂运算取模 |
AUDIO设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问音频设备,相关接口如下所示:
rt_device_find() | 根据音频设备设备名称查找设备获取设备句柄 |
rt_device_open() | 打开音频设备 |
rt_device_control() | 控制音频设备 |
rt_device_read() | 读取数据 |
rt_device_write() | 写入数据 |
rt_device_close() | 关闭音频设备 |
Pulse Encoder 设备
应用程序通过 RT-Thread 提供的 I/O 设备管理接口来访问脉冲编码器设备,相关接口如下所示:
rt_device_find() | 查找脉冲编码器设备 |
rt_device_open() | 打开脉冲编码器设备(仅支持只读的方式) |
rt_device_control() | 控制脉冲编码器设备,可以清空计数值、获取类型、使能设备。 |
rt_device_read() | 获取脉冲编码器当前值 |
rt_device_close() | 关闭脉冲编码器设备 |
总结:
RT-Thread系统提供了一系列的通用设备驱动,方便用户直接调用组件,加快平台搭建,专注于应用开发。
缺点:针对总线协议来说,通过牺牲一些性能来提高上层应用的可移植,无可厚非,但像ADC,PWM这类上层组件几乎没有的,可以考虑自己实现,提升性能。