DM 3730的SPI控制器框架如图7-7所示。对于DM 3730 SPI的驱动部分,主要分析相关的初始化和总线传输的操作。......
2023-11-22
DM 3730的MMC控制器框架如图7-11所示。图7-11引自《DM 3730芯片手册》中第3398页的框图。
图7-11 DM 3730 MMC框架图
从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。
关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。
1.初始化
先来看看初始化部分,这里还是通过platform driver的probe函数来了解细节,其内容如下:
从分析中可见,主要的工作是进行属性设置、资源申请和接口注册,然后通过mmc_add_host的调用实现功能。
相应的platform device是在系统初始化时通过omap_mmc_add进行的,这里就不详述了。
2.总线传输
总线传输的控制器接口是由mmc_host_ops中的request来定义的,DM 3730 MMC控制器相应的操作是omap_hsmmc_request。下面详细分析其功能:
(www.chuimin.cn)
从中可见,主要是进行操作前的准备工作,如果有数据传输操作,则需要在函数omap_hsmmc_prepare_data中进行DMA申请、配置、启动等完成相关的准备工作,剩下的就是等待硬件信号来完成数据部分的操作。
总线控制器的传输启动操作是通过omap_hsmmc_start_command来实现的,详细分析如下:
主要是根据传输的命令以及状态进行寄存器设置。接下来控制器会根据操作执行的情况上报中断,中断处理函数omap_hsmmc_irq会进行状态的检查,根据状态做必要处理。如进行数据操作时有错误,则需要进行必要的DMA清理,最终通过mmc_request_done来向MMC框架层报告,mmcre quest的操作完整状态信息都在mmc_request中。这样就完成了整个的传输操作。
3.card状态变化
MMC总线设备有插拔的可能,这就需要能够检测设备的状态,下面来看看具体如何实现。在初始化时,已经见到一个检测相应信号的中断,当卡的状态发生变化时会有中断产生,在实现中由omap_hsmmc_cd_handler进行处理,具体如下:
可见通过work来进行延迟操作,具体分析如下:
主要的操作就是获得当前卡的状态,并执行mmc_detect_change,但是会根据状态的不同进行延时后再执行设备发现操作。
具体的卡状态检测由omap_hsmmc_card_detect来执行,具体分析如下:
这样整个状态变化的操作就完整了。
有关深入剖析Linux内核与设备驱动的文章
对DM 3730的开发板,相关的输入设备是电源管理芯片中的键盘矩阵,这里对相关的输入设备驱动进行分析。在硬件介绍中已经见到DM 3730与电源管理芯片是通过I2C总线进行连接的,所以该键盘驱动需要建立在I2C总线操作之上。具体获得相关信息的方法都是通过类似twl4030_read_kp_matrix_state的操作完成的,其中会进行实际的I2C总线操作,具体的细节会在总线部分进行介绍。在驱动获得硬件的信息后就是向输入设备框架汇报相应的事件,框架会上传给even than-dler,最终被用户读取。......
2023-11-22
下面以4.1.1节所介绍的系统初始化流程为例,来看看不同的处理器启动流程的区别。图4-4和图4-5分别是DM 816X和DM 3730的启动流程。其中原因是芯片内部片内内存大小。接下来以TI芯片为基础进行整个系统的初始化过程详解。之前讨论内核初始化需求的时候,提到初始化代码应该在初始化之后释放相应的内存空间,这里可以看出Linux内核已经将初始化相关的代码统一存放并管理,一方面方便初始化时调用,另一方面可以在系统初始化之后将这部分空间释放。......
2023-11-22
要了解具体芯片的DMA使用和管理,首先要看一下硬件的设计。图4-44DM 3730 SDMA与其他模块联系系统框图从图4-44可见,SDMA共有96个DMA请求,用于设备请求DMA进行数据传输处理。SDMA可以访问到外设并可以响应芯片外部的DMA请求。为了提高整个的DMA性能,DMA提供多个中断信号给处理器,来加速系统对DMA处理数据过程的响应。DMA是很多驱动都需要使用的基础功能之一,以上进行了详细的代码级分析。......
2023-11-22
图4-53引自《DM 3730芯片手册》中第2449的表。图4-53DM 3730引脚复用相关寄存器图4-54DM 3730引脚配置寄存器设置从图4-54中可见,引脚的设置除了具体针对模块功能之外,还有不同的引脚属性配置。2引脚复用管理数据结构下面看看TI的引脚复用的重要数据结构和详细说明。3引脚复用管理相关函数引脚的管理分为整体和设备模块相关两部分。对于omap_hwmod相关的代码会在TI的SoC电源管理部分进行详细介绍。......
2023-11-22
TI芯片GPIO管理的具体实现仍是以DM 3730为例,关于GPIO模块本身,DM81XX等处理器与DM 3730是相同的,只是一些寄存器地址和参数不同。图4-50DM 3730GPIO子系统框图从图4-50可见,DM 3730一共有6组GPIO管理单元,每组管理32个GPIO。1重要的初始化实现对于GPIO功能芯片特殊的实现和GPIO lib的接口就是gpio_chip。3GPIO中断相关实现GPIO中断相关的实现,最主要的是中断控制器相关的接口实现以及中断级联中GPIO组的中断处理函数。......
2023-11-22
接下来分步说明中断处理的具体实现。Linux内核irqdesc.h中有如下定义:这里可见宏NR_IRQS描述了所有中断的个数,这个数目应该是和处理器相关的。具体的级联中断的解决办法留到相应模块中进行详细说明。3中断控制器的处理接下来看看DM 3730的内核是如何实现中断控制器的管理的。图4-30引自《DM 3730芯片手册》中第2411页的框图。电源管理没有中断控制器唤醒的相关实现,由于这部分是在ARM主处理器的电源域中,并不需要这部分功能。......
2023-11-22
TI芯片时钟管理框架的实现也是分层次的。3不同时钟类型的具体实现由之前的代码和struct clk中可见,操作接口有两种,一种是在struct clkops中表示的,另外一种是直接在struct clk中的,如set_rate等。仔细看struct clkops中的操作接口是和时钟enable和disable相关的,而struct clk中的操作接口是和频率设定相关的。操作接口分析如下:4时钟管理初始化实际的芯片中所有时钟的信息都在clockxxxx_data.c内,DM3730的时钟信息是在clock3xxx_data.c内,其中不仅包含了详细的时钟信息,还包含芯片相关的时钟管理初始化操作。......
2023-11-22
相关推荐