《李阳阳-SPI驱动框架精妙设计.pptx》由会员分享,可在线阅读,更多相关《李阳阳-SPI驱动框架精妙设计.pptx(14页珍藏版)》请在三个皮匠报告上搜索。
1、SPI驱动框架精妙设计李阳阳(https:/ IO设备如何管理rt_err_t rt_device_register(rt_device_t dev,const char*name,rt_uint16_t flags);rt_device_t rt_device_find(const char*name);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
2、 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 /*registe
3、r to device manager*/return rt_device_register(device,name,RT_DEVICE_FLAG_RDWR);rt_err_t rt_spi_bus_device_init(struct rt_spi_bus*bus,const char*name)struct rt_device*device;RT_ASSERT(bus!=RT_NULL);device=&bus-parent;/*set device type*/device-type =RT_Device_Class_SPIBUS;/*initialize device interfac
4、e*/#ifdef RT_USING_DEVICE_OPS device-ops =&spi_bus_ops;#else device-init =RT_NULL;device-open =RT_NULL;device-close =RT_NULL;device-read =_spi_bus_device_read;device-write =_spi_bus_device_write;device-control=RT_NULL;#endif /*register to device manager*/return rt_device_register(device,name,RT_DEVI
5、CE_FLAG_RDWR);1、添加到内核相关链表进行管理。2、对接相关接口统一应用程序接口。SPI硬件模型抽象之SPI控制器根据RT-Thread面向对象的思维方式,对SPI控制器进行模型抽象:属性:SPI控制器是QSPI控制器还是普通SPI控制器。当前正在使用SPI控制器传输数据的SPI设备。为了方便管理设备,使用IO设备的注册机制,继承IO设备rt_device。行为:传输数据。配置SPI控制器。SPI硬件模型抽象之SPI设备根据RT-Thread面向对象的思维方式,对SPI设备进行模型抽象:属性:SPI设备挂载在哪个SPI控制器上面。SPI设备的一些配置信息,包括工作模式和速率等。SP
6、I设备使用到的cs片选引脚。为了方便管理设备,使用IO设备的注册机制,继承IO设备rt_device。行为:无。为什么每个设备需要单独记录自己的配置信息?SPI控制器的注册和调用流程/注册rt_err_t rt_spi_bus_register(struct rt_spi_bus*bus,const char*name,const struct rt_spi_ops*ops);/调用rt_ssize_t rt_device_write(rt_device_t dev,rt_off_t pos,const void*buffer,rt_size_t size);SPI设备的注册和调用流程/注册r