标题:
Uboot在S3C2440上的移植(3)
[打印本页]
作者:
yuyang911220
时间:
2015-2-26 14:48
标题:
Uboot在S3C2440上的移植(3)
3.2 从Nand Flash中运行
3.2.1添加Nand Flash驱动
S3C2440支持从Nand Flash启动,考虑到移植的通用性,对于没有Nor Flash的板子,就需要从Nand Flash启动。在.\drivers目录下有两种Nand的驱动,.\Nand和.\Nand_legacy两种驱动可以选择,其中.\Nand能够自动识别很多型号的Nand Flash,并且是更新版本,因此选择这种驱动。根据Nand.c中的
#if(CONFIG_COMMANDS&CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY)
#include <nand.h>
条件编译选择Nand驱动,首先在板级配置头文件qq2440v3.h中的宏定义CONFIG_COMMAND中添加CFG_CMD_NAND,并且不定义CFG_NAND_LEGACY。在start_armboot()函数中会对外设逐一初始化,Nand初始化代码如下:
#ifdefined(CFG_MAX_NAND_DEVICE) nand_init;
#endif
需要在板级配置头文件qq2440v3.h中宏定义CFG_MAX_NAND_DEVICE,因为smdk2410开发板不支持Nand Flash,因此需要自己来编写Nand Flash驱动函数board_nand_init来被nand_init以及nand_init_chip调用,以完成Nand Flash的硬件初始化,包括使能Nand Flash控制器、初始化ECC、使能片选信号、设置时序等。
3.2.2添加cmd命令
为了丰富Nand与网卡功能,还需要在配置文件中添加Nand与网卡相关命令来调用相关函数。在板级配置头文件qq2440v3.h中的CONFIG_COMMANDS宏定义中以逻辑“或”的形式添加CFG_CMD_NAND与CFG_CMD_NET,这样便可以通过命令方式实现Nand Flash的读写以及网络下载功能。
Uboot的网络功能很强大,可以方便地通过TFTP引导或者是NFS引导内核映像或者文件系统到SDRAM,然后直接go到此处执行,在SDRAM中调试完成后,再将映像文件烧录到Flash中,不仅调试方便,而且还节省下载时间。
3.2.3 编译并调试
编译过程跟Nor Flash启动一样,最后串口输出信息如图7所示。
此时,整个Uboot的移植就算完成了,由于支持串口跟网卡驱动,可以很方便地用这个Uboot来通过网卡下载内核映像与文件系统到Flash,通过串口输出信息调试Uboot。
4 Uboot引导Linux内核
4.1 内核启动参数的传递
Uboot在引导内核启动时,通过标记列表的方式向内核传递启动参数。这些启动参数预先以环境变量的方式保存在Flash中,在./Lib_arm/Board.c中的初始化环境变量函数env_init()初始化,下面的函数来实现向kernel跳转。
theKernel (0, bd->bi_arch_number, bd->bi_boot_params); thekernel其实不是个函数,而是指向内核入口地址的指针,为0x30008000。这里把它强行转化为带三个参数的函数指针,会把三个参数保存到通用寄存器中,实现了向kernel传递信息的功能,R0赋值为0,R1赋值为机器号,R2赋值为启动参数数据结构的首地址[6]。
标记列表实际上是内存中的结构体组成的列表,在./Lib_arm/Armlinux.c中函数setup_start_tag()来创建标记列表。
4.2 tftp加载内核映像
对于已经编译好了的内核映像文件zImage,其格式是ELF的可执行文件,首先要把它转化成U-boot格式的文件uImage,实际是添加了一个header定义,直接用tools目录下的工具mkimage就可用实现,具体在终端中执行如下操作:
①arm-linux-objcopy -O binary -R .note -R .comment -S vmlinux linux.bin
②gzip -9 linux.bin
③mkimage -A arm -O linux -T kernel -C gzip -a 0x30008000 -e 0x30008040 -n "Linux Kernel Image" -d linux.bin.gz uImage
先从内核文件中提取二进制文件,然后压缩,最后构造文件头信息,包括名称、大小、类型、CRC校验码等,添加的头信息占用0x40大小空间。完成后下载内核映像uImage,如下操作:
开启主机tftp服务,将uImage放置tftp目录下,然后启动Uboot,运行tftp下载,镲除、烧写Nand Flash,具体如图8所示。
最后烧写文件系统映像,与烧写内核映像一样,先tftp下载到内存,然后再烧写,不同类型的文件系统nand烧写命令不一样,本文用到的是yaffs文件类型,则通过Nand write.yaffs 0x30000000 0x1d0000 $(filesize)命令来烧写。
本文研究了Uboot在基于S3C2440系统上的移植,并且提出了可行性方案,通过边搭建硬件环境边调试Uboot,使Uboot在嵌入式系统板上正常运行,实现了串口通信、网口下载、Flash烧录等功能,并且成功引导了Linux系统,为后续的系统驱动程序开发奠定了基础,使得Uboot的移植具有开发的通用性。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0