看了这段代码就明白了,在使能了MMU之后,这段代码相当于对地址做了一个重映射,经过(MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))计算后,因为MEMORY_BASE_ADDRESS 为0x50000000(可以在文件开始找到定义)所以经过这样的一个计算,0xc0008000就是0x5000c000。而0xc0008000是内核启动的起始虚拟地址,因此需要做这样的一个映射来和内核对应。
到这儿可能很多人和我当初有一样的疑惑,那就是如果tftp烧写文件系统应该烧写到哪一个地址去呢?在回到上面的地址图表,在最开始我就说过,这个表是针对使用地址总线与数据总线操作的设备而言,因此对于NOR flash、SRAM、DRAM等都是可以直接寻址读写的,而对于Nand Flash,可以参考下电路图,使用的是8个IO进行操作,右Nand控制器等相关的操作,因此是没有一个绝对的地址的。需要注意图表中的黄色框部分,One Nand并不是普通Nand Flash,区别就在于这种Nand是和NOR、SRAM一样的通过地址总线、数据总线进行操作的方式,因此它是有地址的,对于板子所用的Nand Flash来说只有偏移地址,没有绝对地址。
到这里,对于tftp下载内核、文件系统的相关操作应该清楚了,具体地址其实看看uboot源码就清楚了,可以参考代码1中的这部分:
#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"如果通过sd卡启动时跳过自动操作进入手动选择操作的话就应该有印象,可以单独选择烧写某一个文件,例如单独烧写文件系统,操作如下图所示:
那么通过找到对应的命令源码也是可以的,源码位于common/mian.c 343行:
void arm_USBfuse(void) { unsigned char select; while(1) { printf("\n##### Select the fuction #####\n"); printf("[1] Flash u-boot\n"); printf("[2] Flash kernel\n"); printf("[3] Flash system\n"); printf("[4] Exit\n"); printf("Enter your Selection:"); select = getc(); printf("%c\n", select >= ' ' && select <= 127 ? select : ' '); void arm_sdfuse(void) { unsigned char select; while(1) { printf("\n##### flash from SDcard #####\n"); printf("\n##### Select the fuction #####\n"); printf("[1] Flash all image\n"); printf("[2] Flash u-boot\n"); printf("[3] Flash kernel\n"); printf("[4] Flash system\n"); printf("[5] Exit\n"); printf("Enter your Selection:"); select = getc(); printf("%c\n", select >= ' ' && select <= 127 ? select : ' '); switch(select) { case '1': ExecuteCmd("nand erase"); ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin"); ExecuteCmd("nand write.uboot 50008000 0 200000"); ExecuteCmd("fatload mmc 0:1 50008000 zImage"); ExecuteCmd("nand write.e 50008000 200000 500000"); ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2"); ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize"); break; case '2': ExecuteCmd("nand erase 0 200000"); ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin"); ExecuteCmd("nand write.uboot 50008000 0 200000"); break; case '3': ExecuteCmd("nand erase 200000 500000"); ExecuteCmd("fatload mmc 0:1 50008000 zImage"); ExecuteCmd("nand write.e 50008000 200000 500000"); break;
case '4': ExecuteCmd("nand erase 700000"); ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2"); ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize"); break; case '5': return; default: break; } } } 通过tftp单独烧写内核或者文件系统时只需要参考一键烧写的命令烧写到对应的nand 偏移地址即可。
好了,写了那么多,就是想把这中间原由写清楚,而不是简单告诉大家怎样做就完事了,授人以鱼不如授人以渔。 上一页 [1] [2]
|