如何将U-bootnand flash烧录器到Nand中?如何用tftp,nfs加载内核和文件系统

在此要特别感谢技术上的发烧友们提供的帖子给我的帮助,搞了整整一天终于搞定了。&&& 搭建好开发环境后,内核镜像烧写,flash的分区全部都弄好了,ubi文件系统备好了,准备通过NFS方式启动,它妹的出现了如下的问题。&&&& Looking up port of RPC
on 192.168.0.199&&& rpcbind: server 192.168.0.199 not responding, timed out&&& Root-NFS: Unable to get nfsd port number from server, using default&&& 当时我想怎么回事,以前NFS相当顺利,今天就重新准备了个环境就出现这个问题,没关系,搞掉他,我看到错误信息说“从服务器端获取端口出现问题”。&&& 好,马上回去看一下,启动portmap服务,用命令 “sudo /etc/init.d/portmap start”这下应该可以了吧,又重启了一下我的nfs服务端,“sudo /etc/init.d/nfs-kernel-server start”,FUCK 还不行,又出现上面的问题,我看看刚才端口服务启动的输出信息“Rather than invoking init scripts through /etc/init.d, use the service(8)& utility, e.g. service portmap start& Since the script you are attempting to invoke has been converted to an& Upstart job, you may also use the start(8) utility, e.g. start portmap”尼玛啊,我英文还算过的去,看了一下没明白到底起没起啊。FUCK& 启用终极途径,上网搜搜,有灵感,“rpcinfo -p” 查看当前所有的portmap的信息。& 我又运行了一下 &sudo /etc/init.d/nfs-kernel-server restart&,& &Rather than invoking init scripts through /etc/init.d, use the service(8)utility, e.g. service portmap restartSince the script you are attempting to invoke has been converted to anUpstart job, you may also use the restart(8) utility, e.g. restart portmapportmap start/running, process 708&& 看到了没,有portmap的进程在起着,说明启动成功,在复位一次。尼玛啊,还不行,看来问题不是在这,在上网看看,格老子的,原来出现这个问题的人这么多啊,仔细搜罗,比较受大家认同的是关掉防火墙,我很诧异,真的么。。真的么。。管他娘的先试试。& 关啊,我用的是ubuntu&先查看一下防火墙的状态&sudo ufw status& 你妹啊,根本就没开启过,一直是&inactive&,尼玛啊,还不行& 再看看,说nfs配置有问题,我靠不是吧,有这么山炮么,还是查一遍吧,我在自的虚拟你(vmware)家目录下挂载mount文件系统,靠,很成功啊。& 然后我用showmount -e 你妹啊,出问题了& 报了个这个&clnt_create: RPC: Program not registered&(我在这又去查rpc查阅好久,坑爹啊)&& 尼玛啊,之前从没遇见过。& 在看一下,试试这个,&showmount 192.168.0.199 -e&& 没问题,显示出挂载文件系统目录。& 到现在还没找到问题& 我先把启动参数 和 exports文件的内容晒一下吧& upkernel=tftp $(loadaddr) $(bootfile);nand erase clean $(kerneladdr) $(filesize);nand write.jffs2 $(loadaddr) $(kerneladdr) $(filesize);setenv kernelsize $(filesize); saveenvupsafefs=ubi create&tftp $(loadaddr) $(safefs);ubi write $(loadaddr) safefs $(filesize)uprootfs=ubi create&tftp $(loadaddr) $(rootfs);ubi write $(loadaddr) rootfs $(filesize)yboot=nand read.jffs2 $(bootmaddr) $(kerneladdr) $(kernelsize);bootm $(bootmaddr)safemode=setenv bootargs ubi.mtd=3 root=ubi0:safefs console=ttyS0,115200 mem=64M rootfstype=run ybootzhiyuan= run setset=setenv bootargs ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs console=ttyS0,115200 mem=64M, monitor=$(monitor), $(opt); saveenvmtdids=nand0=nandflash0mtdparts=mtdparts=nandflash0:1536k(bootloder),512k(params),4m(kernel),16m(safefs),-(rootfs)partition=nand0,0mtddevnum=0mtddevname=bootloderfilesize=1B49A8fileaddr=netmask=255.255.255.0kernelsize=1B49A8ipaddr=192.168.0.200serverip=192.168.0.199bootargs=root=/dev/nfsroot rw console=ttyS0,115200 nfsroot=192.168.0.199:/home/linux/work/rootfs ip=192.168.0.200:192.168.0.199:192.168.0.1:255.255.255.0::eth0:offgatewayip=192.168.0.1stdin=serialstdout=serialstderr=serial/**********************************************************************************/exports 文件内容/home/linux/work/ *(rw,sync,no_root_squash)(这里不用指定的文件系统目录,随便你指定到那个目录,他都会支持把当前目录下的文件挂载)&对了我在这要说点有意思的东西,我上google查阅,看很多外国人也有这个问题,有的外国佬说快被折磨疯了( to be crazy)(fuck),哈哈。。问题还没解决。难道是网络有问题,我之前弄的都是NAT地址转换,格老子的,今天换个桥接的(bridge)把虚拟机和板卡和主机都制定在同一个网段(ifconfig eth0&)再试试。。。。。。。。。。。。。。。。。。。。。。。。尼玛过去了尼玛啊。。。。。。。。。。。。。。。。。。又停了。。。。。。。。。。。IP-Config: Complete:&&&& device=eth0, addr=192.168.109.27, mask=255.255.255.0, gw=192.168.109.254,&&&& host=zlg, domain=, nis-domain=(none),&&&& bootserver=192.168.109.33, rootserver=192.168.109.33, rootpath=Looking up port of RPC
on 192.168.109.33Looking up port of RPC
on 192.168.109.33VFS: Mounted root (nfs filesystem).Freeing init memory: 108Kinit started: BusyBox v1.11.2 ()starting pid 321, tty '':&'/etc/rc.d/rcS'Mounting /proc and /sysStarting the hotplug events dispatcher udevdSynthesizing initial hotplug eventsSetting the hostname to zlgMounting filesystemsmount: mounting usbfs on /proc/bus/usb failed: No such file or directoryRunning sysctlSetting up networking on loopback device:Setting up networking on eth0:nfs: server 192.168.109.33 not responding, still trying不过总算过了一关。在找。。。。恩人啊。。。。我在这个问题上磨了半天了终于得到化解以下是引用恩人的语录:引用地址:http://blog.chinaunix.net/uid--id-147202.html*****在其中一篇文章中有人提到,可能是根文件系统启动的时候更改了目标板的ip,当时想这不应该,ip我通过bootargs已经传给内核了,而且也已经成功挂载了,要是更改了就不能挂载了。我晕死,当时犯浑了,挂载是发生在启动前的,是系统启动的时候改的,所以才导致系统无法启动的于是我翻找上述那一大段的信息找到了starting pid 321, tty '':&'/etc/rc.d/rcS'这是系统启动时执行的第一个文件rcS,我想问题就在这里啦。于是在主机里,打开rcS,并没有发现更改IP的地方啊,但是我看到在这个文件里有句话#load the configuration information. /etc/rc.d/rc.conf(注意,这是在开发板上的根文件目录里)这就是系统启动的时候加载的第一个配置文件了,问题应该就出现在这里了,打开这个文件惊奇的发现如下我期待已久的信息:export INTERFACE0=&eth0&export IPADDR0=&192.168.7.236&export NETMASK0=&255.255.255.0&export BROADCAST0=&192.168.7.255&export GATEWAY0=&192.168.7.1&export NAMESERVER0=&192.168.7.1&看来就是它了,于是我按照自己的配置更改了选项:export INTERFACE0=&eth0&export IPADDR0=&192.168.109.101&export NETMASK0=&255.255.255.0&export BROADCAST0=&192.168.109.255&export GATEWAY0=&192.168.109.254&export NAMESERVER0=&192.168.109.254&改好之后,保存。然后,回到Tera Term下,重启开发板,成功啦这个是参考上面的一个网友的,他这样弄最后OK了,但是我的还是不行,但是这个总结给了我启发,我发现我之前的虚拟机的网卡是eth0,现在变成eth4了,改回去试试?参考网上这个文档改了下:Linux的网卡由eth0变成了eth1,如何修复&Linux的网卡由eth0变成了eth1,如何修复 &&使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1。但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生成了eth1网卡,这可以使用ifconfig命令看的到。 &&[user@localhost ~]$ ifconfig&eth1 & & &Link encap:Ethernet &HWaddr 00:0C:29:A9:22:9D & & & & & & inet&addr:192.168.1.108 &Bcast:192.168.1.255 &Mask:255.255.255.0 & & & & & inet6 addr: fe80::20c:29ff:fea9:229d/64 Scope:Link & & & & & UP BROADCAST RUNNING MULTICAST &MTU:1500 &Metric:1 & & & & & RX packets:313 errors:0 dropped:0 overruns:0 frame:0 & & & & & TX packets:182 errors:0 dropped:0 overruns:0 carrier:0 & & & & & collisions:0 txqueuelen:1000 && & & & & RX bytes:6 KiB) &TX bytes:2 KiB) & & & & & Interrupt:19 Base address:0x2000 & &lo & & & &Link encap:Local Loopback & & & & & & inet addr:127.0.0.1 &Mask:255.0.0.0 & & & & & inet6 addr: ::1/128 Scope:Host&& & & & & UP LOOPBACK RUNNING &MTU:16436 &Metric:1&& & & & & RX packets:1788 errors:0 dropped:0 overruns:0 frame:0 & & & & & TX packets:1788 errors:0 dropped:0 overruns:0 carrier:0 & & & & & collisions:0 txqueuelen:0 && & & & & RX bytes:8 KiB) &TX bytes:8 KiB) &&使用service network restart指令来重新启动网络服务时,会看到有eth0网卡不存在的提示。 &&经过百度,了解了一些信息,特此记录在此,以备忘。&在uboot里面设置了下启动参数:set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.210:/work/nfs_root/tmp/fs_mini_mdev ip=192.168.1.105:192.168.1.106:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0虚拟机重启,开发板重启,结果OK了,终于搞好了,这个问题折腾了我好多时间,谢谢上面网友文档的支持&&为什么eth0会变成eth1? &&很多Linux distribution使用udev动态管理设备文件,并根据设备的信息对其进行持久化命名。udev会在系统引导的过程中识别网卡,将mac地址和网卡名称对应起来记录在udev的规则脚本中。而对于新的虚拟机,VMware会自动为虚拟机的网卡生成MAC地址,当你克隆或者重装虚拟机软件时,由于你使用的是以前系统虚拟硬盘的信息,而该系统中已经有eth0的信息,对于这个新的网卡,udev会自动将其命名为eth1(累加的原则),所以在你的系统启动后,你使用ifconfig看到的网卡名为eth1。 &&如何恢复到eth0? &&在fedora中,udev记录网络规则的脚本为:/etc/udev/rules.d/70-persistent-net.rules &&[user@localhost ~]$ vi /etc/udev/rules.d/70-persistent-net.rules &&# This file was automatically generated by the /lib/udev/write_net_rules # program run by the persistent-net-generator.rules rules file. #&# You can modify it, as long as you keep each rule on a single line. # PCI device 0x0 (pcnet32)&SUBSYSTEM==&net&, ACTION==&add&, DRIVERS==&?*&,&ATTR{address}==&00:0c:29:5a:6c:73&, ATTR{type}==&1&, KERNEL==&eth*&, NAME=&eth0&&SUBSYSTEM==&net&, ACTION==&add&, DRIVERS==&?*&,&ATTR{address}==&00:0c:29:a9:22:9d&, ATTR{type}==&1&, KERNEL==&eth*&, NAME=&eth1& &&打开该文件,这时你会发现,里面有eth0,eth1两个网卡的信息,但实际上你ifconfig时只能发现eth1一个网卡的信息,这时因为eth0根本就不存在。 &&将其中eth0的信息删掉,并将eth1信息中的设备名改为eth0,重启系统,你看到的网卡就是eth0了,或者删掉其中所有的信息重启系统udev会帮你发现新的设备的。 &&另外还有一个启动脚本文件/etc/sysconfig/network-scripts/ifcfg-eth0,该文件中的mac地址为原来eth0网卡的物理地址,而虚拟机为eth1分配新的物理地址,故启动脚本中的信息与实际信息时不匹配的,将MAC的地址信息修改为70-persistent-net.rules中的eth1的MAC地址,再次重启网络,就完全恢复到以前eth0网卡的状态了。-------------
新增文件夹...
新增文件夹
(多个标签用逗号分隔)
Nfs、tftp联合运行调试内核及文件系统.pdf
在烧写了 u-boot之后,为了减少烧写根文件系统、调试程序之痛苦,本文档介绍如何
通过tftp 下载内核,nfs服务挂接根文件系统启动系统,不用每次都烧到开发板上。
在烧写了 u-boot之后,为了减少烧写根文件系统、调试程序之痛苦,本文档介绍如何
通过tftp 下载内核,nfs服务挂接根文件系统启动系统,不用每次都烧到开发板上。&&
加载中...!如果长时间没有加载,请刷新页面
下载本文档需要登录,并付出相应积分()。
文件大小:99.13 KB
所需积分:& 6
相关资讯  — 
相关讨论话题  — 
浏览:1191次&& 下载:0次
上传时间: 08:51:21
同类热门文档
98201次浏览 &91次下载
16722次浏览 &52次下载
9579次浏览 &83次下载
8248次浏览 &17次下载
5517次浏览 &4次下载
6077次浏览 &11次下载
相关经验 -
& 0人评&41页
& 0人评&4页
& 1人评&8页
& 4人评&150页
& 0人评&9页
OPEN-OPEN, all rights reserved.& & & & 飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题。
&&&&&&&& 一键烧写本质上是启动位于SD卡中的Uboot,通过uboot读取sd卡中的文件到SRAM最后通过nand指令实现一键烧写,这一块可以参考飞凌提供的uboot源码中include\configs 中的smdk6410.h 的529行,代码如下:
#elif defined(FORLINX_BOOT_SD)
#define FORLINX_DEBUG
#define CONFIG_MMC
#define CONFIG_LCD
#define CONFIG_BOOT_MOVINAND
#define CFG_ENV_IS_IN_MOVINAND
#define CONFIG_BOOTCOMMAND
"nand led-fatload mmc 0:1 0x u-boot.nand write.uboot 0x 0x200000;fatload mmc 0:1 0x zInand write.e
0xxx500000; fatload mmc 0:1 0x rootfs.yaffs2; nand write.yaffs2 0xx $ 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传送的地址是,因此可能会存在混乱,因此觉得有必要在博客中总结一下。关于地址空间的分配首先还需要看一下芯片手册。芯片手册中关于地址空间的安排如图所示。
&&&&&&& 有一点需要说明的是,图中的地址空间是针对通过地址总线与数据总线进行操作的设备的,通过不同的片选信号来确定对应的地址,所以可以通过图中查表可以确定okM RAM的地址范围为0xx5FFFFFFF 256M的地址空间,因此通过tftp下载到0x也就是加载到RAM中(向后偏移了32K的地址,稍后在介绍)。到这儿对于0x这个地址的由来就初步了解了。
再来看看很多资料中都提到的0xc0008000这个地址,smdk6410.h这个文件的501行可以找到这部分配置:
//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 0xcxx500000;bootm 0xc0008000"
&&&&&&& 这部分定义了nand flash的地址空间划分和启动的地址:bootm 0xc0008000,也就是说是从内存中的这个地址启动内核的,但问题是在上图的地址划分中地址最大值也只到0x6FFFFFFF,0xc0008000这个地址是什么地方呢?一样从源码入手,继续找!
同样从smdk6410.h这个文件的452行可以找到这部分配置。
/* base address for uboot */
#ifdef CONFIG_ENABLE_MMU
#define CFG_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE
(MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))
#define CFG_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE
&&&&&&& 看了这段代码就明白了,在使能了MMU之后,这段代码相当于对地址做了一个重映射,经过(MEMORY_BASE_ADDRESS + (TEXT_BASE - 0xC0000000))计算后,因为MEMORY_BASE_ADDRESS& 为0x(可以在文件开始找到定义)所以经过这样的一个计算,0xc0008000就是0x。而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-fatload mmc 0:1 0x u-boot.nand write.uboot 0x 0x200000;fatload mmc 0:1 0x zInand write.e
0xxx500000; fatload mmc 0:1 0x rootfs.yaffs2; nand write.yaffs2 0xx $ nand led-end"
如果通过sd卡启动时跳过自动操作进入手动选择操作的话就应该有印象,可以单独选择烧写某一个文件,例如单独烧写文件系统,操作如下图所示:
那么通过找到对应的命令源码也是可以的,源码位于common/mian.c 343行:
void arm_USBfuse(void)
unsigned char select;
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;
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)
ExecuteCmd("nand erase");
ExecuteCmd("fatload mmc 0:1
u-boot.bin");
ExecuteCmd("nand write.uboot
ExecuteCmd("fatload mmc 0:1
ExecuteCmd("nand write.e 000 500000");
ExecuteCmd("fatload mmc 0:1
rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 000 $filesize");
ExecuteCmd("nand erase 0 200000");
ExecuteCmd("fatload mmc 0:1
u-boot.bin");
ExecuteCmd("nand write.uboot
ExecuteCmd("nand erase 000");
ExecuteCmd("fatload mmc 0:1
ExecuteCmd("nand write.e 000 500000");
ExecuteCmd("nand erase 700000");
ExecuteCmd("fatload mmc 0:1
rootfs.yaffs2");
ExecuteCmd("nand write.yaffs2 000 $filesize");
通过tftp单独烧写内核或者文件系统时只需要参考一键烧写的命令烧写到对应的nand 偏移地址即可。
好了,写了那么多,就是想把这中间原由写清楚,而不是简单告诉大家怎样做就完事了,授人以鱼不如授人以渔。
转载请注明出处
阅读(...) 评论()Linux 技术相关(68)
http://blog.chinaunix.net/u3/98913/showart_1978279.html
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:603002次
积分:8064
积分:8064
排名:第1536名
原创:174篇
转载:98篇
评论:108条
(1)(1)(1)(1)(2)(4)(9)(8)(3)(3)(6)(1)(6)(21)(4)(3)(1)(2)(13)(9)(2)(10)(5)(8)(18)(10)(16)(21)(13)(10)(6)(3)(5)(8)(15)(31)}

我要回帖

更多关于 tftp和nfs 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信