首页 理论教育TI芯片SPI总线驱动实现详解

TI芯片SPI总线驱动实现详解

【摘要】:DM 3730的SPI控制器框架如图7-7所示。对于DM 3730 SPI的驱动部分,主要分析相关的初始化和总线传输的操作。

DM 3730的SPI控制器框架如图7-7所示。图7-7引自《DM 3730芯片手册》中第2998页的框图。

从图7-7可见,作为SPI控制器既可以做master也可以做slave,在Linux内核中主要是实现master的功能;FIFO用于进行数据缓冲,可以通过处理器读写,也可以通过DMA读写,由于SPI总线速度要高,所以当进行大量数据读写时需要使用DMA进行操作。另外不同的channel代表不同CS控制的设备,这样可以对设备进行单独的操作。

对于DM 3730 SPI的驱动部分,主要分析相关的初始化和总线传输的操作。

1.初始化

先来看看初始化部分,SPI总线控制器作为SoC片内的控制器,相应的驱动主要作为platform driver存在,在系统初始化时会注册相应的platform device(通过omap_init_mcspi来实现),而在platform driver的probe函数中会根据platform device的信息进行初始化,这个初始化十分重要。下面详细了解其内容:

978-7-111-49426-3-Chapter07-85.jpg

978-7-111-49426-3-Chapter07-86.jpg

978-7-111-49426-3-Chapter07-87.jpg

图7-7 DM 3730 SPI总线控制器框架

978-7-111-49426-3-Chapter07-88.jpg

978-7-111-49426-3-Chapter07-89.jpg

978-7-111-49426-3-Chapter07-90.jpg

因为SPI对吞吐量要求比较高,所以每个控制器采用单独的work处理,而系统通常有多个SPI总线控制器,继续提高吞吐量的方法就是建立work queue,这些是在omap2_mcspi_init初始化中进行的,细节如下:

978-7-111-49426-3-Chapter07-91.jpg

可见,为了SPI总线传输单独创建了work queue,以保证整体的性能。

2.总线传输接口

对于SPI总线的传输,由于性能的需求,主要使用DMA进行相关的操作。而在SPI总线框架,主要提供了两个传输接口,分别是spi_master中的setup和transfer。下面看看DM3730的具体实现过程。(www.chuimin.cn)

先来看看setup接口,setup接口主要是创建传输需要的资源,如申请DMA等。

978-7-111-49426-3-Chapter07-92.jpg

978-7-111-49426-3-Chapter07-93.jpg

978-7-111-49426-3-Chapter07-94.jpg

这里主要是对于与控制器相关的设备状态的初始化、DMA的申请,以及根据相应信号属性来初始化相关寄存器。

接下来看看transfer接口的实现过程:

978-7-111-49426-3-Chapter07-95.jpg

978-7-111-49426-3-Chapter07-96.jpg

主要的工作仍在设置上,这里是为DMA分配空间建立映射,并唤醒work queue执行实际的操作。work在初始化时已经设置了相应的操作omap2_mcspi_work,这是执行实际的总线传输的操作。下面看看实现细节:

978-7-111-49426-3-Chapter07-97.jpg

978-7-111-49426-3-Chapter07-98.jpg

978-7-111-49426-3-Chapter07-99.jpg

978-7-111-49426-3-Chapter07-100.jpg

可见DM 3730总线控制器的传输操作考虑了性能以及功耗的需求,通过单独的内核执行实体进行操作,并考虑到效率的需求,根据传输数据量进行DMA或者处理器直接操作的方式进行实际的IO操作,实际的操作参见相关代码。

到这里整个传输从设置到实际操作就介绍完了。