arm linux板级移植

来源:互联网 发布:用手机淘宝代卖怎么做 编辑:程序博客网 时间:2024/06/06 01:48

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结束。


  MACHINE_START(xx, "xx").phys_io      = XX_UART_BASE & 0xfff00000,.io_pg_offst  = (IO_ADDRESS(XX_UART_BASE) >> 18) & 0xfffc,.boot_params  = PHYS_OFFSET+0x100,.map_io       = xx_board_map_io,.init_irq     = xx_init_irq,.init_machine = xx_board_init,.timer        = &xx_timer,MACHINE_END
 

好了,完成以上工作之后,芯片的板级移植就算完成了一个框架,要想内核完全跑起来,还要添加其它驱动,比如flash, watchdog等。