此文件提供device相关接口文件
/* 使用标准接口 可选项 */
#define RT_USING_POSIX
/* 启用设备驱动框架 必选项 */
#define RT_USING_DEVICE
/* 采用用户自定义接口 可选项 */
#define RT_USING_DEVICE_OPS
rt_err_t rt_device_register(rt_device_t dev,
const char *name,
rt_uint16_t flags);
/* 通过设备名寻找设备object */
rt_device_t rt_device_find(const char *name);
/* 通过设备object初始化设备 */
rt_err_t rt_device_init(rt_device_t dev);
/* 通过设备object初始化并打开设备 */
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag);
/* 通过设备object关闭设备 */
rt_err_t rt_device_close(rt_device_t dev);
/* 通过设备object read操作 */
rt_size_t rt_device_read(rt_device_t dev,
rt_off_t pos,
void *buffer,
rt_size_t size);
/* 通过设备object write操作 */
rt_size_t rt_device_write(rt_device_t dev,
rt_off_t pos,
const void *buffer,
rt_size_t size);
/* 通过设备object io control操作 */
rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg);
通过以下方式实现关联:
device_init-->
#ifdef RT_USING_DEVICE_OPS
#define device_init (dev->ops->init)
#define device_open (dev->ops->open)
#define device_close (dev->ops->close)
#define device_read (dev->ops->read)
#define device_write (dev->ops->write)
#define device_control (dev->ops->control)
#else
#define device_init (dev->init)
#define device_open (dev->open)
#define device_close (dev->close)
#define device_read (dev->read)
#define device_write (dev->write)
#define device_control (dev->control)
#endif
/* 通过设备object设置接收回调 【RT_USING_POSIX】启用 */
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));
/* 通过设备object设置发送完成回调 【RT_USING_POSIX】启用 */
rt_err_t
rt_device_set_tx_complete(rt_device_t dev,
rt_err_t (*tx_done)(rt_device_t dev, void *buffer))
1.注册设备
rt_err_t rt_hw_serial_register(struct rt_serial_device *serial,
const char *name,
rt_uint32_t flag,
void *data);
通过以下代码关联设备操作函数
device->init = rt_serial_init;
device->open = rt_serial_open;
device->close = rt_serial_close;
device->read = rt_serial_read;
device->write = rt_serial_write;
device->control = rt_serial_control;
2.发现设备
rt_device_find(name);
3.打开设备
rt_device_open(new, /* RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_STREAM */ RT_DEVICE_FLAG_DMA_TX);
通过此接口设置设备打开方式,例如DMA方式,poll方式等。
4.写数据
rt_device_write(_console_device, 0, str, rt_strlen(str));
通过此接口发送数据。
问题记录
1.DMA发送采用queue机制,rt_data_queue_push只负责队列的管理,数据缓存需由上层管理。
目前采用的策略:serial调用rt_data_queue_push前,动态申请内存,在发送完成后,释放掉相关内存。