OK6410 tftp下载内核、文件系…
飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题。
代码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"
下面说一下tftp和地址相关的知识总结
再来看看很多资料中都提到的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"
同样从smdk6410.h这个文件的452行可以找到这部分配置。
代码3
#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
#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 偏移地址即可。
好了,写了那么多,就是想把这中间原由写清楚,而不是简单告诉大家怎样做就完事了,授人以鱼不如授人以渔。
转载请注明出处