Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32094
  • 博文数量: 5
  • 博客积分: 141
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 08:16
文章分类
文章存档

2012年(1)

2011年(4)

我的朋友

分类: 嵌入式

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

  1. MACHINE_START(xx, "xx")

  2. .phys_io = XX_UART_BASE & 0xfff00000,

  3. .io_pg_offst = (IO_ADDRESS(XX_UART_BASE) >> 18) & 0xfffc,

  4. .boot_params = PHYS_OFFSET+0x100,

  5. .map_io = xx_board_map_io,

  6. .init_irq = xx_init_irq,

  7. .init_machine = xx_board_init,

  8. .timer = &xx_timer,

  9. MACHINE_END

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

阅读(1404) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~