一生有你llx 阅读(87) 评论(0)
在进行U-Boot移植之前,我们会用到一些有关S5PV210的知识,在这里简单的给大家介绍一下~
硬件平台:OK210开发板
U-Boot:2011.06
  ---------------------------------第一部分-----------------------------------

  S5pv210是一个32位精简指令集、低功耗、高性能的cortex-a8处理器,它属于armv7架构。

上边的这张图,显示了S5PV210处理器的整体框图。从这张图中我们可以了解到210的主要功能,这些小的模块共同构成了210处理器。
  
  首先说一说CPU核心部分,CPU的主频可以达到800M或1GHz,我们可以通过配置U-Boot源码中对应控制主频的宏来进行主频的选择。U-boot默认的主频是1GHz。CPU的核心部分还有512KB的高速缓存。还有NEON,NEON它是ARM内部集成的可以实现复杂算法的模块,比如说图像的智能分析,数学上的运算等都是通过NEON来实现的。
  
  左上角是系统外设,这一部分主要是一些低速设备。其中:
  RTC是实时时钟,负责系统时间的控制;
  PLL是锁相环,主要起倍频作用;
  Timer with PWM是定时器模块;
  Watching Timer是看门狗,看门狗主要是在应用程序跑飞或者系统死机一段时间之后,将系统重启。看门狗在实际的项目中是要打开的。
      DMA(24ch)是24通道的DMA控制器。如果没有DMA的话,数据是通过CPU传给内存,再由内存传给系统外设的;有了DMA之后,数据可以不通过CPU。比如音频数据通过DMA控制通道直接传到内存中。DMA可以控制外设数据与外设数据、外设数据与内存数据、内存数据与内存数据之间的传输,这样可以有效的提升系统的工作效率。6410中也有DMA,只是没有210的多;
      Keypad(14x8):14x8的键盘接口;
  TS-ADC(12Bit/10ch):12位的数模转换,有些电阻屏的触摸功能就是由他来实现的;
  
  左下角是外部总线模块。从这个模块可以看到210支持IIS、AC97和PCM这样的音频标准接口;
  HSMMC/SDx4:4路MMC总线,可以接SD卡、TF卡和SDIO接口;
  USB Host2.0/OTG2.0:210支持USB Host 2.0,和师傅实际测试了一下,USB Host2.0的传输速度大概是12~16M/s;
  UARTx4:4路串口;
  IICx3:3路IIC总线,一些常用的电容屏的触摸芯片,重力传感器就是接在了IIC总线上;
  HS-SPIx2:2路SPI总线;
  GPIO:GPIO接口;
  
  下边中间的是电源管路模块,如果在做手机或者平板电脑类的产品的话,一般会用到,他的作用是通过软件动态调节CPU功耗,一般是通过升高或降低,打开或者关闭电压的方式来调节功耗的;
  
  右下角是存储接口模块,以前听到Memory总会幼稚的认为是内存的意思,其实并不是这样,Memory其实是存储的意思;
  S5PV210的NAND支持SLC和MLC两种,SLC的稳定性由于MLC,同等容量的SLC价格高于MLC;
  它还支持16位硬件ECC。由于nand flash的工艺问题,在数据读取的过程中可能会出现位错误,这时就需要Ecc来检查和纠正了;
  210 常用的芯片是LPDDR2和DDR2,这里的LP就是low power的意思,就是低功耗~
  
  右上角部分就是210强大的多媒体功能模块了;
  首先是摄像头接口;
  MFC多媒体格式转换模块,主要的任务就是视频文件的编解码;具有30帧/s的处理能力,支持H.263/H.264/MPEG4编码和解码;
  支持2D/3D图形引擎;
  HDMI,高清数字多媒体接口;
  JPEG主要用于图片文件的硬件编码,原始数据通过JPEG编码生成jpg格式文件;
  最后是LCD控制器;
  
  中间的Multi layer AHB/AXI Bus是高速总线,CPU内部各个模块与CPU就是通过这个高速总线来实现通讯的。
--------------------------------------第二部分---------------------------------------
  简单的了解了210处理器之后呢,就开始进行U-Boot的移植了。说到U-Boot,肯定会有不少朋友产生疑问,什么是U-Boot?U-Boot的功能是什么呢?其实啊,这个U-Boot它就是universal bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡中,它是在开机上点之后,操作系统起来之前用来引导的一个程序。U-boot 的主要作用是进行内存的初始化、CPU的初始化、串口初始化等一系列的初始化工作,完成这些之后,再将操作系统加载到内存中,从而运行起来。
  
  U-Boot 源码文件下包括一些目录文件和文本文件,这些文件可分为”与平台相关的文件”和”与平台无关的文件”,其中common文件夹下的文件就是与平台无关的文件;与平台相关的文件又分为CPU级相关的文件和与板级相关的文件:arch目录下的文件就是与CPU级相关的文件,而board、drivers、include等文件夹下的文件都是与板级相关的文件。我们在移植的过程中,需要修改的文件也就是这些与平台相关的文件。
  
  U-Boot 的移植过程主要包括以下四个步骤:
      1.下载U-Boot源码
      2.修改相应的文件代码 
      3.编译U-Boot
      4.烧写到开发板上,运行
  
  下面是移植2011.06版本到210处理器上时修改(或添加)的文件:
以下文件均为与CPU级相关的文件
      uboot2011.06/arch/arm/cpu/armv7/start.s               
      uboot2011.06/arch/arm/cpu/armv7/Makefile
      uboot2011.06/arch/arm/include/asm/arch-s5pc1xx/hardware.h
      uboot2011.06/arch/arm/lib/board.c
      uboot2011.06/arch/arm/lib/Makefile
      uboot2011.06/arch/arm/config.mk
以下文件均为与板级相关的文件 
      uboot2011.06/board/samsung/OK210/tools/mkv210_image.c
      uboot2011.06/board/samsung/OK210/lowlevel_init.S 
      uboot2011.06/board/samsung/OK210/mem_setup.S
      uboot2011.06/board/samsung/OK210/OK210.c 
      uboot2011.06/board/samsung/OK210/OK210_val.h
      uboot2011.06/board/samsung/OK210/mmc_boot.c 
      uboot2011.06/board/samsung/OK210/Makefile
      uboot2011.06/drivers/mtd/nand/s5pc1xx_nand.c
      uboot2011.06/drivers/mtd/nand/Makefile
      uboot2011.06/include/configs/OK210.h 
      uboot2011.06/include/s5pc110.h
      uboot2011.06/include/s5pc11x.h
      uboot2011.06/spl/Makefile
      uboot2011.06/boards.cfg
      uboot2011.06/config.mk
      uboot2011.06/Makefile
  
  在这里简单的说明一下我选择2011.06版本的uboot 进行移植的原因,在自己平时在各个论坛、贴吧中的了解,发现大家对2011.06版本的讨论相对来说多一些,所以选择的这个版本。在这里我想自己试一下U-Boot移植的过程也希望能给大家有一些帮助。
   
  另外呢,附件提供的移植参考目录是在原始U-boot-2011.06版本基础上进行的修改,把修改的文件单独拿出来,方便大家使用对比工具查看我修改了哪些内容,当然移植参考目录里面,并不是所有的文件都是从U-boot-2011.06拷贝出来的,有些文件是从U-boot-1.3.4拷贝的:目录board/samsung/OK210下面的mmcboot.c 文件,从SD启动U-Boot必须含有该文件,三星官方提供的U-boot-1.3.4源码包含有该文件,我们直接拷贝过来就可以了。
  
  下面的内容是我在移植uboot的时候师傅给我总结的移植思路(贴出来和大家一起分享一下~~):
  移植过程就是在新的U-Boot代码中增加CPU级和Board级代码,使之能够在开发板上面运行。
  
  1.看一下源代码里面是否有CPU级相关代码,比如S5PV210是ARMV7架构,看一下CPU目录下面是否有ARMV7的目录,因为U-Boot已经是嵌入式平台里面应用很广泛的Bootloader了,所以基本上都已经有了CPU级相关代码。
  
  2.下一步就是查看板级相关代码了。一款主流CPU发布的时候,厂商一般都会提供官方开发板,比如S5PV210发布的时候三星公司提供了官方开发板,使用的U-Boot是1.3.4版本,三星在U-Boot官方提供的1.3.4基础上面进行了改进,比如增加SD卡启动和NandFlash启动相关代码 等等。在移植新版本的U-Boot到开发板的时候,我们需要看一下U-Boot代码里面是否已经含有了板级代码,如果已经有了,就不需要自己改动了,编译以后就可以使用,而有的时候在较新的U-Boot代码里面,是不含有这些板级支持包的,这个时候就需要增加自己的板级包了。
  
  3.板级包的增加需要参考CPU官方提供的U-Boot代码,因为我们移植的是最小功能的U-Boot,让U-Boot能够运行起来即可,所以只需要抓最关键的代码,比如系统时钟的配置,DDR2内存的初始化代码,调试串口的初始化等,这些代码是需要参考U-Boot1.3.4的,不需要我们自己去写每一行,但是需要我们知道U-Boot 能够在S5PV210上面运行起来,必须做的工作。

--------------------------------------------------------------------------------------------------------------------------------------第三部分--------------------------------------------------------------------------------------------------------
  
  下面开始切入主题:进行我们U-Boot的移植过程吧~
  
  首先进行第一步,下载工作:输入U-Boot下载的地址,找到自己要下载的U-Boot版本,点击开始下载,下载完成之后开始解压。
  
  U-Boot下载之后压缩包的压缩方式是.tar.bz2的,所以解压命令为tar jzvf **.tar.bz2
  而我们平时经常解压的压缩包为.tar.gz格式的,所以它的解压命令为tar zxvf **.tar.gz。
  这两个解压命令只有一个参数的差别,容易搞混的友友们需要重点注意喽~!
  解压之后进入文件夹,可以看到之前给大家介绍的目录结构类似的文件夹和文本文件,然后就按照板子的配置进行相应文件的修改了~
  
  在修改的过程中,用到最多的一个宏定义就是CONFIG_SPL_BUILD,这个宏定义的主要作用就是生成BL1文件,提到BL1文件肯定又会有朋友产生疑问,在这里就这个BL1文件给大家简单的介绍一下:
  BL1文件是一段外部代码,存放在SD卡或者nandflash上,大小为8K;
  除了BL1文件,还有BL0和BL2文件。
  BL0文件是存放在CPU内部IROM中的一段固化代码,CPU上点之后,首先去运行BL0文件。
  BL2文件是完整的U-Boot代码。
  这三个文件之间的关系就是:BL0运行时会将BL1拷贝到CPU的IRAM中,然后执行BL1;BL文件执行起来之后会先进行内存的初始化,之后将BL2文件拷贝到外部内存中,也就是我现在手中这个210 板子的DDR2中。

 移植过程最主要的就是代码的修改与文件的配置了,大家可以根据我所提供的这些内容进行代码的完善与修改。
  
  修改完成之后开始编译工作,两个命令:
  make OK210_config
  make
  
  编译的过程中会生成两个重要的文件,一个是BL1文件,另一个就是uboot文件。编译完成之后将这些内容烧写到SD卡中,烧写的命令如下:
  1.dd bs=512   seek=1 if=/dev/zero of=/dev/sdb   count=2048 
  2.dd bs=512   iflag=dsync oflag=dsync  if=spl/OK210-spl.bin  of=/dev/sdb  seek=1
  3.dd bs=512   iflag=dsync oflag=dsync  if=u-boot.bin   of=/dev/sdb  seek=49
  
  在这里值得说明几点:
  dd命令是linux下非常有用的一个命令,作用就是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换;
  命令中的sdb是SD卡的设备名称,在不同的电脑上可能名称是不一样的,所以大家在烧写的过程中一定要注意这个设备名称;
  烧写到SD卡中,一定要了解一下SD卡的分区,下面是我自己画的一张有关SD卡分区的图,大家可以简单了解一下它的分区情况:

Sdcard 分区介绍:

在这里可以看到,SD卡一块的大小为512B,第一块为保留块,紧接着的8K存放BL1,所以BL1烧写的起始块标号为1,这也就是第二条烧写命令中seek=1的来源了;接下来存放环境变量,有的资料中将环境变量与BL1文件总结为BL1文件,不过这是的BL1文件就不再是8K大小了,而是加上环境变量的大小共24K了,也就是48块;之后存放BL2文件,也就是uboot.bin,起始块标号49。最后的部分是我们自己的拷贝空间了。
  
  大概了解了这个分区之后,这个烧写命令想必大家也了解的差不多了。然后输入这些烧写命令进行文件烧写,注意这里的命令是在源码的目录文件下输入的,不然的话找不到对应的文件。
  
  烧写完成,将SD卡插到开发板上,设置板子为SD卡启动,然后打开超级终端,配置好之后将板子上电,如果板子正常启动了,说明我们的移植工作顺利完成了。如果没有启动起来,那么就要检查一下哪一步出现了问题,然后继续开始回去查看相应的U-Boot源码。
----------------------------------------第四部分-------------------------------------
  
  在这一部分,主要给大家介绍一下210的启动方式。
  首先了解一下s5pv210支持的启动方式:

其中我们用的最多的是nandflash启动和SD卡启动。

其中我们用的最多的是nandflash启动和SD卡启动。

在上图中可以看出,第一启动方式中先工作的是IROM,他做了一些初始化工作,之后就是启动方式的选择,通过设置拨码开关的状态来确定启动方式。这里以SD卡启动为例,选择了SD卡启动,进入下一个流程:校验和,也就是检验文件传输过程中是否有数据传输错误,如果有的话第一启动就失败了,进入第二启动;如果传输无误,那么第一启动继续,BL1开始工作,初始化内存,加载BL2到外部内存等等,之后BL2运行起来,初始化内存、CPU、串口等等,加载操作系统,最后操作系统运行起来。第一启动方式启动成功。
  
  如果第一启动方式启动失败,那么进入第二启动方式,来看一下第二启动方式的启动流程:

   IROM的工作和第一启动方式相同,第一启动在文件传输过程中出现错误之后进入第二启动方式,如果校验和检验无误,那么接下来就是BL1,BL2和操作系统依次运行起来,最终板子启动成功;如果启动第二启动方式之后检查校验和有误,那么第二启动方式失败,进入串口启动,串口启动如果还是白,就进入USB启动,如果USB启动还失败的话,那么启动就失败了。