DM 3730的MMC控制器框架如图7-11所示。图7-11DM 3730 MMC框架图从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。......
2023-11-22
要了解具体芯片的DMA使用和管理,首先要看一下硬件的设计。DM 3730芯片内部的DMA是System DMA(SDMA)。SDMA和其他模块联系的系统框图如图4-44所示。图4-44引自《DM 3730芯片手册》中第2339页的框图。
图4-44 DM 3730 SDMA与其他模块联系系统框图
从图4-44可见,SDMA共有96个DMA请求,用于设备请求DMA进行数据传输处理。SDMA可以访问到外设并可以响应芯片外部的DMA请求。为了提高整个的DMA性能,DMA提供多个中断信号给处理器,来加速系统对DMA处理数据过程的响应。需要注意的是DM3730中有两个主要的处理器:一个是ARMMPU,另一个是IVA(实际是DSP)。两个主核都有对DMA的需求,所以在DMA处理部分也要考虑多核相关的支持,保证多核间不会对DMA内部资源访问造成冲突。
SDMA系统内部的框架如图4-45所示。图4-45引自《DM 3730芯片手册》中第2344页框图。
从图4-45可见,SDMA只有一个用于读操作和一个用于写操作的端口,SDMA内部通过logical channel管理不同的传输请求,通过调度器以及优先级来进行调度,另外通过FIFO来缓冲每个逻辑channel的数据。SDMA有32个逻辑channel,每个channel均可单独设置,并且可以将多个channel串成逻辑链。
接下来分几部分进行详细的解析。
1ᤫ逻辑channel的管理
对于逻辑channel的管理主要是请求和释放。
图4-45 SDMA系统内部框图
2ᤫ逻辑channel的参数设置接口
逻辑channel的各种设置包括很多的寄存器操作,会涉及芯片手册的一些细节,对细节中设计芯片手册的内容,直接在注释中以英文的形式存在。相应的接口主要是对申请到的逻辑channel进行设置:
(www.chuimin.cn)
3ᤫ逻辑channel的操作接口
逻辑channel的操作接口主要是启动、停止以及中断响应接口。详细的解析如下:
4ᤫSDMA管理初始化及防止多核冲突的实现
SDMA初始化还是以platform驱动的形式存在,而相应的防止多核使用DMA冲突的接口是omap_dma_cmdline_reserve_ch,原理是通过启动参数设定ARM MPU保留的DMA逻辑channel,使得ARM MPU只能使用保留的逻辑channel。
DMA是很多驱动都需要使用的基础功能之一,以上进行了详细的代码级分析。以上的代码与DMA engine框架的功能类似,可以看做是DMA engine的芯片级实现。需要注意的是DM 816X系列芯片内部不是SDMA而是EDMA,与SDMA差别主要是操作的寄存器不同,但是由于相应的设备驱动已经使用omap的DMA接口实现,最简单的移植就是将EDMA的操作以omap的DMA接口封装,相应的sdma2edma.c就是实现该功能。
有关深入剖析Linux内核与设备驱动的文章
DM 3730的MMC控制器框架如图7-11所示。图7-11DM 3730 MMC框架图从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。......
2023-11-22
对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
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
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
图4-53引自《DM 3730芯片手册》中第2449的表。图4-53DM 3730引脚复用相关寄存器图4-54DM 3730引脚配置寄存器设置从图4-54中可见,引脚的设置除了具体针对模块功能之外,还有不同的引脚属性配置。2引脚复用管理数据结构下面看看TI的引脚复用的重要数据结构和详细说明。3引脚复用管理相关函数引脚的管理分为整体和设备模块相关两部分。对于omap_hwmod相关的代码会在TI的SoC电源管理部分进行详细介绍。......
2023-11-22
SoC电源管理框架与SoC的设计息息相关。platform总线相关的电源管理功能已经在设备模型部分进行了介绍。接下来主要以DM 3730为例对TI芯片SoC电源管理实现进行介绍。从图8-1可见,DM 3730 SoC电源管理的核心是omap_device,其中包含了platform_de-vice和hwmod,platform_device部分包含了与platform bus相关的部分,而hwmod包含了DM3730中各个控制器的硬件信息。......
2023-11-22
相关推荐