飞凌官方提供了一键下载烧写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(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 偏移地址即可。

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2013/01/19/2868014.html,如需转载请自行联系原作者

OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结相关推荐

  1. tftp下载内核和文件系统

    按q进入openJTAG模式,执行menu命令回到原目录. tftp下载内核: 1.打开tftp软件,把当前目录设置为要下载文件所在的目录:服务器ip设好,为Windows的ip. 2.在openJT ...

  2. RealARM开发板 TFTP下载内核和NFS挂载文件系统 基于S5PV210开发板

    对于RealARM的210开发板要想使用TFTP下载内核和NFS挂载PC的文件系统,那么在u-boot命令行下,输入如下命令. setenv bootcmd "tftp C0008000 z ...

  3. PXA270-基于ARM9内核Processor外部NAND FLASH的控制实现

    于ARM9内核Processor外部NAND FLASH的控制实现 夏 涛 (上海交通大学微电子学院 上海 200030) 1 NAND FLASH NAND写回速度快.芯片面积小,特别是大容量使其优 ...

  4. 【uboot 】uboot通过tftp下载内核

    1.开发板uboot,虚拟机能相互ping通 2.ubuntu搭建好tftp服务器,设置好文件夹,放置好文件 sudo apt install tftpd-hpa  //安装服务程序 sudo sys ...

  5. NAND flash基本概念整理

    1.nand基本数据结构 DEVICE: device就是封装好的nand flash单元,包含了一个或者多个target. TARGET(chip): 一个target包含了一个或者多个lun,一个 ...

  6. 从单片机开发转向Linux开发系列博客五:Nand Flash根文件系统制作

    版本 作者 参与者 日期 备注 V1.0 wuya(微信号:wangwenxue1989) 2019/05/17 创建 1.引言 之前系列的文章介绍了如何编译Uboot.Kernel以及使用默认的ra ...

  7. DM365 linux内核文件系统的烧写步骤及其uboot参数配置

    DM365 linux内核&文件系统的烧写步骤及其uboot参数配置     目录 源文档下载:http://download.csdn.net/detail/zhangjikuan/6443 ...

  8. u-boot nand flash read/write cmd

    支援的命令函數說明 1. nand info/nand device 功能:顯示當前nand flash晶片資訊. 函數調用關係如下(按先後順序): static void nand_print(st ...

  9. nand flash 个人觉得写得比较好的文章

    [详解]如何编写Linux下Nand Flash驱动 版本:v2.2.1 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flas ...

最新文章

  1. jQuery.post() 函数格式详解
  2. Pandas与openpyxl库的 完美 融合!
  3. oracle的scn增量备份,【Oracle】基于SCN的增量备份修复DataGuard GAP
  4. 【U3D】掉落物设计
  5. 关于在Android中访问和使用到上下文变量
  6. 90 条 Python 程序建议
  7. 【MySQL学习】Unknown column 'PASSWORD'|Access denied for user 'root'@'localhost'
  8. 获取位置_原神蜥蜴尾巴怎么获得 蜥蜴尾巴获取位置分享
  9. Flutter进阶第7篇: 调用原生硬件Api实现照相机拍照和相册选择 以及拍照上传到服务器
  10. C1. Simple Polygon Embedding(计算几何)
  11. 购买大米云主机并配置php环境搭建企业网站
  12. monthcalendar_Python日历模块| 带有示例的monthcalendar()方法
  13. 先有鸡还是先有蛋?应用程序开发与安全
  14. 简单个人网页设计作业 静态HTML个人博客主页——HTML+CSS+JavaScript 明星鹿晗(7页)
  15. 1000元如何让旧电脑升级改造?这些方案你得学会
  16. 工作室SWS自动化脚本
  17. 达内php难吗,深圳达内php教学好吗 说说我学习的经历
  18. 餐厅设置套餐 html,餐厅如何设计爆款套餐?掌握这5个原则就够了
  19. Java实现的信号灯
  20. 初学pwn-攻防世界(get_shell)

热门文章

  1. nopcommerce商城系统--源代码结构和架构
  2. Windows平台Eclipse配置Maven
  3. 次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102
  4. 活动目录网域中禁用移动存储(U盘)
  5. 我的选车经历--学习比经验更重要
  6. JSP、Servlet、Tomcat、JDK、J2EE版本比较
  7. 过年回家抢不到火车票?教你用 Python 开发 12306 查票神器
  8. 大牛推荐的5本 Linux 经典必读书
  9. python内置库绘制33角形_33 python format练习题 利用format方法生成一个星号三角形...
  10. SpringAMQP--DirectExchange