转载地址:http://emouse.cnblogs.com/

飞凌官方提供了一键下载烧写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

看了这段代码就明白了,在使能了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()
{
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 <= ? select : ' ');
void arm_sdfuse(void)
{
unsigned char select;
while()
{
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 <= ? select : ' '); switch(select)
{
case '':
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 '':
ExecuteCmd("nand erase 0 200000");
ExecuteCmd("fatload mmc 0:1 50008000 u-boot.bin");
ExecuteCmd("nand write.uboot 50008000 0 200000");
break; case '':
ExecuteCmd("nand erase 200000 500000");
ExecuteCmd("fatload mmc 0:1 50008000 zImage");
ExecuteCmd("nand write.e 50008000 200000 500000");
break; case '':
ExecuteCmd("nand erase 700000");
ExecuteCmd("fatload mmc 0:1 50008000 rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 50008000 700000 $filesize");
break;
case '':
return;
default:
break;
}
}
}

通过tftp单独烧写内核或者文件系统时只需要参考一键烧写的命令烧写到对应的nand 偏移地址即可。

好了,写了那么多,就是想把这中间原由写清楚,而不是简单告诉大家怎样做就完事了,授人以鱼不如授人以渔。

 

转 -- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结的更多相关文章

  1. OK6410&nbsp;tftp下载内核、文件系…

    飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题. 一键烧写本质上是启动位于SD卡中的Uboot ...

  2. 转载]OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]

    原文地址:OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]作者:千山我独行 由于工作的平台也是嵌入式,差不多的平台,所以一直就没有把自己买过来的ok6410板子好好玩玩.以前一直都是 ...

  3. OK6410之tftp下载内核,nfs…

    原文地址:OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]作者:千山我独行 由于工作的平台也是嵌入式,差不多的平台,所以一直就没有把自己买过来的ok6410板子好好玩玩.以前一直都是 ...

  4. 说说NAND FLASH以及相关ECC校验方法

    Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次性地将 ...

  5. 关于开发板用tftp下载失败分析

    一.想实现开发板和PC ping通:(1)windows和linux桥接(2)用路由器将开发板和PC连接起来(3)将windows和linux以及开发板的IP设置成同一网段,注意不要和你同一个局域网的 ...

  6. nand flash详解及驱动编写

    https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...

  7. 如何编写linux下nand flash驱动-3

    [读(read)操作过程详解] 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码. 解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash ...

  8. linux nand flash常用命令

    使用命令前用cat /proc/mtd 查看一下mtdchar字符设备:或者用ls -l /dev/mtd*#cat /proc/mtddev:    size   erasesize  namemt ...

  9. 嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序

    NAND FLASH是一个存储芯片. 在芯片上的DATA0-DATA7上既能传输数据也能传输地址. 当ALE为高电平时传输的是地址. 当CLE为高电平时传输的是命令. 当ALE和CLE都为低电平时传输 ...

随机推荐

  1. PAT 1053 住房空置率

    https://pintia.cn/problem-sets/994805260223102976/problems/994805273284165632 在不打扰居民的前提下,统计住房空置率的一种方 ...

  2. Cocos2d入门及第一次运行时遇到的问题

    先通过github下载cocos2d.これ:https://github.com/ZhouWeikuan/cocos2d 进入上面的网址后,如果不会用git或者svn的朋友就在页面的右下角点那个“Do ...

  3. Centos/Fedora下安装Twisted,failed with error code 1 in /tmp/pip-build-H1bj8E/twisted/解决方法

    Python踩坑之路 pip/easy_install无法安装Twisted或者安装后无法导入Twisted 看到MM网站上很多图,想用Scrapy框架爬点图,遇到各种库的问题,蛋疼. 一直twist ...

  4. css中对position的几种定位方式的最佳诠释

    关于元素的position定位的理解,牛客网的hardy给出了一个比较好的理解: 在html中网页可以看成一个立体的空间,一个完整的页面是由很多个页面堆积形成的,如上图所示   CSS中Positio ...

  5. Delphi 判断一个字符串是否为数字

    //函 数 名: IsDigit//返 回 值: boolean//日       期:2011-03-01//参       数: String//功       能: 判断一个字符串是否为数字// ...

  6. BZOJ 3143 游走(贪心+期望+高斯消元)

    一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...

  7. Java中线程同步的理解 - 其实应该叫做Java线程排队

    Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可 ...

  8. C++ STL 常用排序算法

    C++ STL 常用排序算法 merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个序列. 例如: vecIntA,vecIntB,vecIntC是用ve ...

  9. Vue使用SCSS进行模块化开发

    原文地址:http://www.cnblogs.com/JimmyBright/p/7761531.html 个人认为scss最大的好处就是能将css属性设置为变量,这样让css一键更换主题成为可能. ...

  10. 学习Spring Boot:(五)使用 devtools热部署

    前言 spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原理是在发现代码有更改之后,重新启动应用,但是比速度比手动停止后 ...