1、IO设备类型
RT_Device_Class_Char = 0, /**< character device */ RT_Device_Class_Block, /**< block device */ RT_Device_Class_NetIf, /**< net interface */ RT_Device_Class_MTD, /**< memory device */ RT_Device_Class_CAN, /**< CAN device */ RT_Device_Class_RTC, /**< RTC device */ RT_Device_Class_Sound, /**< Sound device */ RT_Device_Class_Graphic, /**< Graphic device */ RT_Device_Class_I2CBUS, /**< I2C bus device */ RT_Device_Class_USBDevice, /**< USB slave device */ RT_Device_Class_USBHost, /**< USB host bus */ RT_Device_Class_SPIBUS, /**< SPI bus device */ RT_Device_Class_SPIDevice, /**< SPI device */ RT_Device_Class_SDIO, /**< SDIO bus device */ RT_Device_Class_Timer, /**< Timer device */ RT_Device_Class_Miscellaneous, /**< misc device */ RT_Device_Class_Sensor, /**< Sensor device */ RT_Device_Class_Touch, /**< Touch device */ RT_Device_Class_Unknown /**< unknown device */
2、设备被创建后,需要实现它访问硬件的操作方法
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);
3、设备被创建后,需要注册到 I/O 设备管理器中,应用程序才能够访问
/** * This function registers a device driver with specified name. * * @param dev the pointer of device driver structure * @param name the device driver's name * @param flags the capabilities flag of device 设备模式标志 * * @return the error code, RT_EOK on initialization successfully. */rt_err_t rt_device_register(rt_device_t dev, const char *name, rt_uint16_t 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发送*/
4、设备注销后的,设备将从设备管理器中移除,也就不能再通过设备查找搜索到该设备。注销设备不会释放设备控制块占用的内存
/** * This function removes a previously registered device driver * * @param dev the pointer of device driver structure * * @return the error code, RT_EOK on successfully. */rt_err_t rt_device_unregister(rt_device_t dev)
5、数据收发回调,当硬件设备收到数据时,可以通过如下函数回调另一个函数来设置数据接收指示,通知上层应用线程有数据到达
/** * This function will set the reception indication callback function. * This callback function * is invoked when this device receives data. * * @param dev the pointer of device driver structure * @param rx_ind the indication callback function * * @return RT_EOK */rt_err_trt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size))/** * This function will set the indication callback function when device has * written data to physical hardware. * * @param dev the pointer of device driver structure * @param tx_done the indication callback function * * @return RT_EOK */rt_err_trt_device_set_tx_complete(rt_device_t dev, rt_err_t (*tx_done)(rt_device_t dev, void *buffer))
示例
#include <rtthread.h>#define DBG_TAG "main"#define DBG_LVL DBG_LOG#include <rtdbg.h>int main(void){ rt_device_t dev; dev = rt_device_find("demo"); rt_device_init(dev); rt_device_open(dev,RT_DEVICE_OFLAG_RDWR); rt_device_close(dev); //rt_device_destroy(dev); return 0;}
#include <rtdevice.h>rt_err_t demo_init(rt_device_t dev){ rt_kprintf("demo_init...\n"); return 0;}rt_err_t demo_open(rt_device_t dev, rt_uint16_t oflag){ rt_kprintf("demo_open...\n"); return 0;}rt_err_t demo_close(rt_device_t dev){ rt_kprintf("demo_close...\n"); return 0;}int rt_demo_init(void){ rt_device_t demo_dev; demo_dev = rt_device_create(RT_Device_Class_Char, 512); demo_dev->init = demo_init; demo_dev->open = demo_open; demo_dev->close = demo_close; rt_device_register(demo_dev, "demo", RT_DEVICE_FLAG_RDWR); return 0;}INIT_BOARD_EXPORT(rt_demo_init);