分类: 嵌入式
2011-03-13 06:52:32
linux标准内核已经支持很多芯片,包括常见的s3c**系列,这些芯片的移植比较而言,还是很容易的,只需要修改少量地方就可以。
今天我想讨论的是linux内核完全不支持的芯片板级移植方法。
bootloader部分暂不讨论,假定已经没有问题。只说内核部分。
首先,bootloader启动后会给内核传递一系列参数,如command string等,这启动有个比较重要的参数是系统的架构号,也就是内核中的machine type。这个变量一定要与内核中定义的架构保持一致,否则会导致内核无法引导。查看bootloader输出的machine type方法是,进入u-boot,输入bdinfo命令,可以显示机器号。然后对照arch/arm/tools/machine_type中定义的j机器号。
除了机器号,bootloader还会传给内核串口输出参数。如果内核引导时,串口没有输出,这也是一个需要注意的地方。如果使用的是u-boot的话,可以用#printenv来查看传递的参数。
接下来就是内核本身的设置内容了。
1。内核要启动首先就要有时钟。所以首先就得把时钟初始化。这个工作一般是在初始化定时器的时候做的,因为系统时钟使用的是定时器中的一个。具体是哪个,要看芯片手册。
2。串口是内核此时跟外界沟通的重要渠道,所以这时候首先就要把串口的初始化工作做好。
3。除了以上2件事外,我们要做的还有memory map的内存映射问题。它实现的是给外设分配一段内存空间,作为地址映射用。方法是填充每个外设的map_desc结构体,主要是其基地址和分配的地址空间大小。
4。接下来我们要实现中断号的分配,及中断处理函数的设置。
以上工作的实现都是在一个描述芯片的宏里定义的。MACHINE_START开始,MACHINE_END结束。
好了,完成以上工作之后,芯片的板级移植就算完成了一个框架,要想内核完全跑起来,还要添加其它驱动,比如flash, watchdog等。