要了解具体芯片的DMA使用和管理,首先要看一下硬件的设计。图4-44DM 3730 SDMA与其他模块联系系统框图从图4-44可见,SDMA共有96个DMA请求,用于设备请求DMA进行数据传输处理。SDMA可以访问到外设并可以响应芯片外部的DMA请求。为了提高整个的DMA性能,DMA提供多个中断信号给处理器,来加速系统对DMA处理数据过程的响应。DMA是很多驱动都需要使用的基础功能之一,以上进行了详细的代码级分析。......
2023-11-22
TI芯片GPIO管理的具体实现仍是以DM 3730为例,关于GPIO模块本身,DM81XX等处理器与DM 3730是相同的,只是一些寄存器地址和参数不同。
先来看看硬件的框架和细节。DM 3730GPIO子系统框图如图4-50所示,引自《DM3730芯片手册》中第3478页框图。
图4-50 DM 3730GPIO子系统框图
从图4-50可见,DM 3730一共有6组GPIO管理单元,每组管理32个GPIO。其中GPIO1是比较特殊的,其原因在硬件电源管理技术中已提到,GPIO1在WKUP domain中,而其他组的GPIO在其他的power domain中。WKUP domain是特殊的power domain,该do-main的模块会一直供电。在每组GPIO中,除了标准的时钟之外,还有debounce clock用来进行debounce处理(主要在作为input时去抖,避免抖动产生的错误结果),另外还有唤醒系统的功能。GPIO的中断信号同样可以提供给ARMMPU和IVADSP,从而不同的核都可以对外部的GPIO进行操作。
关于GPIO内部的系统设计如图4-51所示。图4-51引自《DM 3730芯片手册》中第3490页框图。
图4-51 DM 3730GPIO内部系统设计图
从图4-51中可见,一组GPIO的设置寄存器接口,主要由系统控制、中断管理、去抖模块、输入输出特性等不同功能设置寄存器对相应的功能进行设置。
针对软件的实现,使用GPIO lib提供的管理实体gpio_chip不能满足DM 3730关于GPIO控制管理的需求,所以在芯片代码中对gpio_chip进行了封装并加入芯片特定的管理属性形成gpio_bank结构,详细内容如下:
作为DM 3730芯片GPIO管理的核心数据结构,gpio_bank中已经包含了GPIO lib需要的gpio_chip,这样的实现符合面向对象的方法,从体系结构层次的角度考虑也是底层包含上层的内容。另外gpio_bank中还包含了用于GPIO控制的属性,这些属性会在具体的操作中用到。
下面介绍详细的实现。
1ᤫ重要的初始化实现
对于GPIO功能芯片特殊的实现和GPIO lib的接口就是gpio_chip。而芯片特殊实现本身也和填充gpio_chip以及注册gpio_chip相关,这些都是在初始化中实现的,了解这些初始化工作就可以大致了解GPIO芯片的特性。DM 3730相关的初始化函数是omap_gpio_chip_init,详细的内容和注释如下:
分析了重要的初始化函数omap_gpio_chip_init之后,可见GPIO分为两个重要的功能组,一组是gpio_chip相关的功能接口,另一组是和中断相关的功能。下面分两部分进行详细的代码解析。
2ᤫgpio_chip功能接口
GPIO的功能主要是通过gpio_chip的功能接口实现的。下面对相关实现代码进行详细解析:
(www.chuimin.cn)
对GPIO相关功能的芯片特殊实现,主要进行了函数功能的分析,具体到子函数的细节可以查看相关代码。
3ᤫGPIO中断相关实现
GPIO中断相关的实现,最主要的是中断控制器相关的接口实现以及中断级联中GPIO组的中断处理函数。
先来看看GPIO的中断控制器相关接口。这里实际实现了级联的中断处理。
该中断控制器负责一组GPIO的中断处理,详细的接口代码分析如下:
从中可见,GPIO不仅有基本的中断操作,还有唤醒系统的能力,所以提供了中断控制器中set_wake的接口(该接口是老的接口,但是可以通过新的接口irq_set_wake转换调用,内核中断处理框架irq_chip_set_defaults会建立这种转换)。
接下来解析一下级联的中断处理,由于ARM无法获得一组GPIO中具体哪个GPIO上报的中断,所以需要通过该级联中断处理,进行具体的解析并需要对具体的GPIO中断进行处理。
至此,关于GPIO的中断部分主要框架就分析完了。中断处理还要注意电平触发和边沿触发的流程是不同的,这些都要体现在级联的中断处理中。
有关深入剖析Linux内核与设备驱动的文章
要了解具体芯片的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
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芯片时钟管理框架的实现也是分层次的。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
实际音频驱动的分析会以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
相关推荐