第20章 Linux芯片级移植及底层驱动

本章知识点

在一个新的ARM SoC上,如何移植Linux。

1、介绍Linux 3.x之后的内核在底层BSP上做了哪些优化。

2、如何提供操作系统的运行节拍。

3、中断控制器驱动以及它如何为驱动提供标准接口。

4、多核SMP芯片的启动。

5、作为Linux运行底层基础设施的GPIO、pinctrl(管脚控制器)、时钟和dmaengine驱动。

本章有助于工程师理解驱动调用的底层API的来源,以及直接进行Linux的平台移植。

20.1 ARM Linux底层驱动的组成和现状

    让Linux在一个全新的ARM SoC上运行,需提供大量的底层支撑,如定时器节拍、中断控制器、SMP启动、CPU热插拔以及底层的GPIO、时钟、pinctrl和DMA硬件的封装等。定时器节拍为Linux基于时间片的调度机制以及内核和用户空间的定时器提供支撑,中断控制器的驱动则使得Linux内核的工程师可以直接调用local_irq_disable()、disable_irq()等通用的中断API,SMP启动支持则用于让SoC内部的多个CPU核都投入运行,CPU热插拔则运行运行时挂载或拔除CPU

在GPIO、时钟、pinctrl和DMA驱动方面,在Linux 2.6时代,内核已或多或少有GPIO、时钟等底层驱动的架构,但是核心层的代码太薄弱,各SoC在这些基础设施实现方面存在巨大差异,而且每个SoC仍然需要实现大量的代码。pinctrl和DMA则最为混乱,几乎各家公司都定义了自己独特的实现和API。

社区必须改变这种局面,Linux社区在2011年后进行了如下工作,这些工作在目前的Linux内核中基本准备就绪:

1、STEricsson公司的工程师Linus Walleij提供新的pinctrl驱动架构,内核中新增加一个drivers/pinctrl目录,支撑SoC上的引脚复用,各个SoC的实现代码统一放入该目录。

2、TI公司的工程师Mike Turquette提供通用时钟框架,让具体SoC实现clk_ops()成员函数,并通过
clk_register()、clk_register_clkdev()注册时钟源以及源与设备的对应关系,具体的时钟驱动都统一迁

移到drivers/clk目录中。

3、建议各SoC统一采用dmaengine架构实现DMA驱动,该架构提供通用的DMA通道API,如

dmaengine_prep_slave_single()、dmaengine_submit()等,要求SoC实现dma_device的成员函数,实现代码统一放入drivers/dma目录中。

4、在GPIO方面,drivers/gpio下的gpiolib已能与新的pinctrl完美共存,实现引脚的GPIO和其他功能之间的复用,具体的SoC只需实现通用的gpio_chip结构体的成员函数

经过以上工作,基本上就把芯片底层基础架构方面的驱动架构统一了,实现方法也统一了。目前GPIO、时钟、pinmux等都能良好地进行设备树的映射处理,可以方便地在.dts中定义一个设备要的时钟、pinmux引脚以及GPIO。

除了上述基础设施以外,在将Linux移植入新的SoC过程中,工程师常常强烈依赖于早期的printk功能,内核则提供了相关的DEBUG_LL和EARLY_PRINTK支持,只需要SoC提供商实现少量的回调函数或宏。

本章主要对上述各个组成部分进行架构上的剖析以及对关键的实现部分的实例分析,以求完整归纳出将Linux移植入新SoC的主要工作。



你可能感兴趣的:(Linux驱动开发)