DM 3730的MMC控制器框架如图7-11所示。图7-11DM 3730 MMC框架图从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。......
2023-11-22
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的信息进行初始化,这个初始化十分重要。下面详细了解其内容:
图7-7 DM 3730 SPI总线控制器框架
因为SPI对吞吐量要求比较高,所以每个控制器采用单独的work处理,而系统通常有多个SPI总线控制器,继续提高吞吐量的方法就是建立work queue,这些是在omap2_mcspi_init初始化中进行的,细节如下:
可见,为了SPI总线传输单独创建了work queue,以保证整体的性能。
2.总线传输接口
对于SPI总线的传输,由于性能的需求,主要使用DMA进行相关的操作。而在SPI总线框架,主要提供了两个传输接口,分别是spi_master中的setup和transfer。下面看看DM3730的具体实现过程。(www.chuimin.cn)
先来看看setup接口,setup接口主要是创建传输需要的资源,如申请DMA等。
这里主要是对于与控制器相关的设备状态的初始化、DMA的申请,以及根据相应信号属性来初始化相关寄存器。
接下来看看transfer接口的实现过程:
主要的工作仍在设置上,这里是为DMA分配空间建立映射,并唤醒work queue执行实际的操作。work在初始化时已经设置了相应的操作omap2_mcspi_work,这是执行实际的总线传输的操作。下面看看实现细节:
可见DM 3730总线控制器的传输操作考虑了性能以及功耗的需求,通过单独的内核执行实体进行操作,并考虑到效率的需求,根据传输数据量进行DMA或者处理器直接操作的方式进行实际的IO操作,实际的操作参见相关代码。
到这里整个传输从设置到实际操作就介绍完了。
有关深入剖析Linux内核与设备驱动的文章
DM 3730的MMC控制器框架如图7-11所示。图7-11DM 3730 MMC框架图从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。......
2023-11-22
实际音频驱动的分析会以DM 3730的相关驱动为例进行说明。图6-17引自《DM 3730芯片手册》中第3096页框图。下面来看看dai相关的实现细节。4codec模块对codec模块部分,之前在codec的注册函数snd_soc_register_codec定义可见其会将co-dec driver和codec侧的dai同时注册,因为这两者都是与codec相关的。这里以DM3 730板上的twl4030为例,介绍相关的框架。对于codec主要是由codec driver来提供控制接口,而由codec dai来提供数据传输能力。......
2023-11-22
对DM 3730的开发板,相关的输入设备是电源管理芯片中的键盘矩阵,这里对相关的输入设备驱动进行分析。在硬件介绍中已经见到DM 3730与电源管理芯片是通过I2C总线进行连接的,所以该键盘驱动需要建立在I2C总线操作之上。具体获得相关信息的方法都是通过类似twl4030_read_kp_matrix_state的操作完成的,其中会进行实际的I2C总线操作,具体的细节会在总线部分进行介绍。在驱动获得硬件的信息后就是向输入设备框架汇报相应的事件,框架会上传给even than-dler,最终被用户读取。......
2023-11-22
图6-10DM3730显示子系统软件整体架构从图6-10可见,在驱动框架部分,DSS的设计支持frame buffer和V4L2两种架构,这是由于两种类型的设备都是通过硬件的display子系统进行显示,它们之间可以通过叠加子系统进行叠加,这样相当于在硬件层进行了硬件加速,可以实现良好的显示效果。开放的sys接口如下:图6-11DSS软件模块与硬件对应关系图通过以上的设置就可以实现显示的切换、叠加等复杂的功能。TI frame buffer驱动的核心管理实体是omapfb2_device。驱动应对这种修改通过mapfb_apply_changes来实现。......
2023-11-22
下面以4.1.1节所介绍的系统初始化流程为例,来看看不同的处理器启动流程的区别。图4-4和图4-5分别是DM 816X和DM 3730的启动流程。其中原因是芯片内部片内内存大小。接下来以TI芯片为基础进行整个系统的初始化过程详解。之前讨论内核初始化需求的时候,提到初始化代码应该在初始化之后释放相应的内存空间,这里可以看出Linux内核已经将初始化相关的代码统一存放并管理,一方面方便初始化时调用,另一方面可以在系统初始化之后将这部分空间释放。......
2023-11-22
图4-24DM 3730物理空间设置IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。首先来看ioremap虚拟地址返回是如何实现的。DM 3730等TI芯片就是通过该方法来实现该功能的。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。......
2023-11-22
要了解具体芯片的DMA使用和管理,首先要看一下硬件的设计。图4-44DM 3730 SDMA与其他模块联系系统框图从图4-44可见,SDMA共有96个DMA请求,用于设备请求DMA进行数据传输处理。SDMA可以访问到外设并可以响应芯片外部的DMA请求。为了提高整个的DMA性能,DMA提供多个中断信号给处理器,来加速系统对DMA处理数据过程的响应。DMA是很多驱动都需要使用的基础功能之一,以上进行了详细的代码级分析。......
2023-11-22
对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
2023-11-22
相关推荐