1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。......
2023-11-22
首先来看看DM 3730中断控制器的框架,如图4-29所示。图4-29引自《DM 3730芯片手册》中第2406页的框图。
图4-29 DM 3730中断控制器框图
从图4-29可见,中断控制器的时钟等信号是在PRCM的管理之下,所以相应的也有电源管理的功能,后续的代码注释中对相关的代码进行了说明。但是由于电源管理的框架还没有进行介绍,所以中断控制器中相关电源管理的代码可以先浏览,等到了解电源管理框架之后会有更加深入的理解。
接下来分步说明中断处理的具体实现。
1ᤫ中断号实现
从图4-29中可见,中断控制器有96个中断,这些中断号是如何定义的,又如何让系统知道正确的中断数目的呢?
Linux内核irqdesc.h中有如下定义:
这里可见宏NR_IRQS描述了所有中断的个数,这个数目应该是和处理器相关的。DM3730上NR_IRQS的具体值以及中断号的定义在arch/arm/plat-omap/include/mach/irqs.h中可见,具体如下:
这里为什么不是96的数值,而是另外的一个宏呢?其实这是为了解决中断级联的问题。之前在框架设计中已经看到,通过irq_action可以解决中断共享,但是并没有说明如何解决中断级联。其实中断级联就是通过irq_desc自身解决的,比如GPIO做中断源的话就会产生级联中断的情况,这样中断号就需要增加,就像需求中讨论的某些中断号(如INT_34XX_GPIO_BANKx)会作为特殊中断来进行处理,在Linux内核中,是通过set_irq_chained_han-dler来实现该功能的。注意DM 3730内核不支持配置CONFIG_SPARSE_IRQ,所以不能用动态申请的方式支持级联,而只能采用静态扩大中断号的方式。具体的级联中断的解决办法留到相应模块中进行详细说明。
2ᤫARM向量表到中断处理的实现
ARM内核的中断处理是从向量表开始的。向量表在arch/arm/kernel/entry_armv.S中定义:
这部分代码主要分为两部分:其一是真正的向量表,位于_vectors_start和_vectors_end之间;其二是处理跳转的部分,位于_stubs_start和_stubs_end之间。
这句其实是宏把宏展开后就定义了vector_irq。根据进入中断前的处理器模式,分别跳转到_irq_usr或_irq_svc。
这句宏展开后就定义了vector_dabt,根据进入中断前的处理器模式,分别跳转到_dabt_usr或_dabt_svc。
在系统启动阶段,由early_trap_init()(位于arch/arm/kernel/traps.c中)初始化向量表的过程如下:
以上两个memcpy会把_vectors_start开始的代码复制到0xffff0000处,把_stubs_start开始的代码复制到0xffff0000+0x200处,和相对跳转的偏移相同。这样异常中断到来时,CPU就可以正确地跳转到相应中断向量入口并执行了。
为什么要将_stubs_start开始的内容进行如此的复制呢?这里说明一下,先看看内核编译后的符号表:
可见stubs_start在向量表内容之前,而根据向量处理的映射,整个向量处理的代码都需要在0xffff0000之后的一个页内,所以就需要将_stubs_start开始的内容进行复制,这也是需要进行偏移修正的原因。
对于中断使用vector_stub方式如下:
进一步分析vector_stub:
(www.chuimin.cn)
中断处理上述代码,最终会根据之前的模式进入_irq_usr或者_irq_svc执行,二者最终都会进入irq_handler这个宏:
get_irqnr_preamble和get_irqnr_and_base这两个宏由板级支持的代码在arch/arm/plat-omap/include/mach/entry-macro.S中定义,目的就是从中断控制器中获得正确的中断号,来看看相应的实现:
从这可见,无论DM 3730、TI 816X还是OMAP4都有自己的实现,其中比较重要的是宏OMAPx_IRQ_BASE,这是中断控制器的基地址,get_irqnr_preamble就是通过该宏获得中断控制器的基地址的。而get_irqnr_and_base也需要该基地址来获得正确的触发中断的中断号。在irq_handler获得正确的中断号之后,紧接着就调用asm_do_IRQ,从这个函数开始,中断程序进入C代码中。该函数在arch/arm/kernel/irq.c中,实现如下:
到这里,中断处理就完成了从向量表到体系结构无关的generic_handle_irq中断处理的转换,后续可以根据正确的中断号进行中断处理了。
3ᤫ中断控制器的处理
接下来看看DM 3730的内核是如何实现中断控制器的管理的。首先,看一下DM 3730中断控制器的内部框架,如图4-30所示。图4-30引自《DM 3730芯片手册》中第2411页的框图。
图4-30 DM 3730中断控制器内部框架
从图4-30中可见,该中断控制器可进行中断的优先级管理,并能屏蔽中断,以及伪中断的检查,这些都是内核需要的中断控制器的功能。DM 3730中断控制器的实现代码在linux/arch/arm/mach-omap2/irq.c中。中断控制器的管理主要是实现irq_chip的操作接口,该接口提供给内核的中断处理框架,通过这些接口,内核可在其提供的标准中断处理流程接口irq_flow_handler_t中调用如ack、mask、unmask等操作,从而正确完成整个的中断处理流程。现将中断控制器管理相关的代码整理到一起,并注释如下:
4ᤫ中断控制器初始化
中断控制器初始化相关的代码和具体实现说明如下:
5ᤫ电源管理相关
最后来看看电源管理相关的代码,先对模块的电源管理有个初步的了解。
电源管理没有中断控制器唤醒的相关实现,由于这部分是在ARM主处理器的电源域中,并不需要这部分功能。会由其他的部分来唤醒系统。
有关深入剖析Linux内核与设备驱动的文章
1芯片片内内存使用TI芯片相关的内存管理,对片外内存来说,可以通过启动参数将需要内核管理的内存进行设置。这样做的原因是由于需要连续的物理内存空间,并且对内核的物理内存管理影响最小。3独立cmem管理之前简单说明芯片厂商的独立内存管理,针对于TI的视频芯片,TI提供了cmem的内存管理驱动,主要是连续内存管理。有了该内存管理功能,TI的多媒体框架和编解码库就可以使用连续的物理内存空间,高效地完成多媒体处理相关的功能。......
2023-11-22
图4-24DM 3730物理空间设置IO空间映射的目的就是将这些物理地址映射到整个内核的地址空间中。首先来看ioremap虚拟地址返回是如何实现的。DM 3730等TI芯片就是通过该方法来实现该功能的。注意__arm_ioremap_caller使用的是vmalloc的空间进行映射,在相应版本内核中vmalloc的空间和TI芯片的IO映射空间是完全分开的,所以这里要直接返回相应的虚拟地址。......
2023-11-22
具体Sitara系列芯片应用说明见表2-5。表2-5Sitara系列芯片应用说明表2-5中AM 3894和AM 3892是从DM 816X系列芯片精简得来的;AM 3874和AM3871是从DM 814X系列芯片精简得来的;AM 3715和AM 3703是从DM 3730系列芯片精简得来的。为了适应相应的市场需求,TI于2011年推出了AM 335X系列处理器,Cortex-A8的核心最低价格低于5美元,性价比还是很高的。......
2023-11-22
DM 3730的MMC控制器框架如图7-11所示。图7-11DM 3730 MMC框架图从图7-11可见,MMC控制器中有复杂的命令和数据管理,控制器内部带有buffer用于数据缓冲,数据主要通过DMA读写。关于DM 3730 MMC的驱动部分,主要分析其相关的初始化和总线传输以及card状态变化的操作。......
2023-11-22
1基本中断处理流程Linux内核的中断处理框架当然要满足之前提到的各种需求。对Linux内核来说,每个中断号都是通过irq_desc进行描述的,可以说irq_desc是中断处理的核心。通过这些抽象结构就可以实现整个中断处理的框架。2中断处理延时操作下面介绍系统如何解决中断中大数据量时的延时处理问题。图4-28是Linux内核中断处理流程。......
2023-11-22
由于部分Sitara芯片是从对应的无线终端芯片和视频芯片精简而来的,这里就重点介绍AM 335X系列处理器的框架。AM 335X系列处理器框架如图2-14所示。AM 335X有五种核心处理单元:①ARM Cortex-A8:负责系统控制和外围接口驱动。图2-14AM 335X系列处理器框图②PowerVR SGX:负责3D渲染的硬件加速单元。②64K Shared RAM:片内RAM,使系统在外部内存没有初始化好的情况下仍可运行。③L3 and L4 Interconnect:片内总线,负责在片内各个模块间建立通道。......
2023-11-22
对DM 3730的开发板,相关的输入设备是电源管理芯片中的键盘矩阵,这里对相关的输入设备驱动进行分析。在硬件介绍中已经见到DM 3730与电源管理芯片是通过I2C总线进行连接的,所以该键盘驱动需要建立在I2C总线操作之上。具体获得相关信息的方法都是通过类似twl4030_read_kp_matrix_state的操作完成的,其中会进行实际的I2C总线操作,具体的细节会在总线部分进行介绍。在驱动获得硬件的信息后就是向输入设备框架汇报相应的事件,框架会上传给even than-dler,最终被用户读取。......
2023-11-22
对视频驱动的具体实现,以DM3730 ISP驱动的设计与实现为例进行介绍。ISP驱动中使用isp_video作为以上单一矩形节点的抽象以及管理实体。可见实际的操作是由子设备完成的,子设备与具体功能相关。具体如下:这里操作的主要目的就是注册v4l2的子设备和I2C的设备,通过I2C总线适配将视频子设备与I2C的Camera Sensor关联起来,从而实现完整的驱动和设备连接。......
2023-11-22
相关推荐