RTThread-设备驱动

设备驱动

1. device.c --> 设备驱动

此文件提供device相关接口文件

 

相关宏定义 -->rttconfig.h配置项

/* 使用标准接口 可选项 */

#define RT_USING_POSIX

 

/* 启用设备驱动框架 必选项 */

#define RT_USING_DEVICE

 

/* 采用用户自定义接口 可选项 */

#define RT_USING_DEVICE_OPS

 

接口说明

/* 通过此接口创建设备object */

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))

 

 

 

2. serial.c <-->串行设备框架

应用步骤

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前,动态申请内存,在发送完成后,释放掉相关内存。

 

 

 

你可能感兴趣的:(rtthread,Mcu)