OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结 飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题。 一键烧写本质上是启动位于SD卡中的Uboot,通过uboot读取sd卡中的文件到SRAM最后通过nand指令实现一键烧写,这一块可以参考飞凌提供的uboot源码中include\configs 中的smdk6410.h 的529行,代码如下:
代码1:
#elif defined(FORLINX_BOOT_SD) #define FORLINX_DEBUG #define CONFIG_MMC 1 #define CONFIG_LCD #define CONFIG_BOOT_MOVINAND #define CFG_ENV_IS_IN_MOVINAND
#define CONFIG_BOOTCOMMAND "nand led-start;nand erase ;fatload mmc 0:1 0x50008000 u-boot.bin;nand write.uboot 0x50008000 0 0x200000;fatload mmc 0:1 0x50008000 zImage;nand write.e 0x50008000 0x200000 0x500000; fatload mmc 0:1 0x50008000 rootfs.yaffs2; nand write.yaffs2 0x50008000 0x00700000 $filesize; nand beep; nand led-end" 从这段代码代码可以看出,uboot中通过宏定义的方式,当定义为FORLINX_BOOT_SD 式通过对相应配置相应的环境变量完成特定的操作,其中定义CONFIG_BOOTCOMMAND 后就可以自动进行nand的查处,从sd卡加载uboot等,这段代码内容稍后继续分析。
下面说一下tftp和地址相关的知识总结
tftp是指通过tftp协议通过网络的方式进行文件传输,需要说明的是ok6410的出厂uboot是不支持网络的,这也就意味着nfs根文件系统以及通过tftp下载内核等都无法操作,其实解决这个问题也很简单,只需要替换网卡相关的文件就可以了,改动不是很大,这个可以找到很多资料,这里不再赘述。不过飞凌在12年9月的更新光盘中已经做了更新,uboot已经支持网络操作了,查一下源码也就是改了那几个文件,因此可以下载烧写最新版uboot。
在进行tftp的操作时最开始可能容易搞混的就是烧写内核啥的应该烧写到哪一个地址去,最开始也有点混,比如有人的博客里是tftp c0008000 zImage 这个地址是c0008000,国嵌的视频教程中是c0800000,各不相同,没看到具体的叙述,而在通过usb等方式中通过usb传送的地址是50008000,因此可能会存在混乱,因此觉得有必要在博客中总结一下。关于地址空间的分配首先还需要看一下芯片手册。芯片手册中关于地址空间的安排如图所示。
有一点需要说明的是,图中的地址空间是针对通过地址总线与数据总线进行操作的设备的,通过不同的片选信号来确定对应的地址,所以可以通过图中查表可以确定ok6410的256M RAM的地址范围为0x50000000-0x5FFFFFFF 256M的地址空间,因此通过tftp下载到0x50008000也就是加载到RAM中(向后偏移了32K的地址,稍后在介绍)。到这儿对于0x50008000这个地址的由来就初步了解了。
再来看看很多资料中都提到的0xc0008000这个地址,smdk6410.h这个文件的501行可以找到这部分配置:
代码2
//uboot-2M ,zImage-5M ,FS-200M,user-other #define CFG_NAND_ERASE_LEN 0xCF00000 //200MB
#if defined(FORLINX_BOOT_NAND) #define CONFIG_BOOT_NAND #define CFG_ENV_IS_IN_NAND //#define CFG_NAND_LARGEPAGE_SAVEENV //#define CFG_NAND_FLASH_BBT #define CONFIG_BOOTCOMMAND "nand read 0xc0008000 0x200000 0x500000;bootm 0xc0008000" 这部分定义了nand flash的地址空间划分和启动的地址:bootm 0xc0008000,也就是说是从内存中的这个地址启动内核的,但问题是在上图的地址划分中地址最大值也只到0x6FFFFFFF,0xc0008000这个地址是什么地方呢?一样从源码入手,继续找!
同样从smdk6410.h这个文件的452行可以找到这部分配置。
代码3
/* base address for uboot */ #ifdef CONFIG_ENABLE_MMU #define CFG_UBOOT_BASE TEXT_BASE #define CFG_PHY_UBOOT_BASE (MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000)) #else #define CFG_UBOOT_BASE TEXT_BASE #define CFG_PHY_UBOOT_BASE TEXT_BASE #endif
[1] [2] 下一页
|