首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Uboot在S3C2440上的移植(3)

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的移植具有开发的通用性。
继承事业,薪火相传
返回列表