uboot TFTP引导内核

分类: LINUX

TQ2440 + uboot1.1.6
1. uboot修改
1.1 common/main.c

  1. 在函数 main_loop大约513行:
  2.     char cmd_buf[200];
  3.     printf("Booting Linux ...\n");
  4.     //boot_zImage(0x200000,0x200000);                           //注释boot_zImage        
  5.     strcpy(cmd_buf,"tftp 0x30008000 zImage; boot_zImage");      //tftp内核到内存的0x30008000,然后启动zImage;  
  6.     run_command(cmd_buf, 0);                                    //这儿只不过是由以前的从nandflash取数据改变为从nand flash取数据
1.2 lib_arm/boot_zImage.c
  1. 151 int boot_zImage(ulong from, size_t size)
  2. 152 {
  3. 162      /*printk("Copy linux kernel from 0x%08lx to 0x%08lx, size = 0x%08lx ... ", from, to, size);//注掉从nand_flash中拷kernel部分,当然这儿也可以自己添加新的命令
  4. 163          ret = copy_kernel_img(to,(char *)from, size);
  5. 164          if (ret) {
  6. 165             printk("failed\n");
  7. 166             return -1;
  8. 167         } else {
  9. 168             printk("Copy Kernel to SDRAM done,");
  10. 169      }*/
  11. 177 }
重新编译后,将uboot烧到nand flash中

2.  ubuntu中tftp的安装
  a . root@ubuntu : ~ # apt - get install tftpd tftp openbsd - inetd ; 安装
  1. b. root@ubuntu:~# vi im /etc/inetd.conf;配置tftp文件路径
  2.             tftp dgram udp wait nobody/usr/sbin/tcpd/usr/sbin/in.tftpd/tmp
  3. c. root@ubuntu:~# chmod 777 /tmp
  4. d. root@ubuntu:~#/etc/init.d/openbsd-inetd restart ;重启服务,使配置生效
  5.    root@ubuntu:~# netstat -an| grep 69;查看69端口是否打开
  6.    root@ubuntu:~# tftp 192.168.1.2;tftp 本机ip测试一下
  7.    tftp>get test.txt
  8. 注意: /root不可以作为tftp根目录,设置tftproot为:/tmp
3. 修改内核Makefile
  1.  arch/arm/boot/Makefile中
  2.  56 $(obj)/zImage: $(obj)/compressed/vmlinux FORCE
  3.  57 $(call if_changed,objcopy)
  4.  58 cp-arf arch/arm/boot/zImage/tmp/zImage 
  5.  59 @echo ' Kernel: $@is ready

将新生成的zImage拷贝到 /tmp中



Nfs、tftp联合运行调试内核及文件系统
参考:[http://dev.firnow.com/course/6_system/linux/Linuxjs/2008831/139066.html]
在烧写了u-boot之后,为了减少烧写根文件系统、调试程序之痛苦,本文档介绍如何通过tftp下载内核,nfs服务挂接根文件系统启动系统,不用每次都烧到开发板上。
一、NFS服务挂载根文件系统
1、Linux服务器端NFS服务器的配置
以root身份登陆Linux服务器,编辑/etc目录下的共享目录配置文件exports,指定共享目录及权限等。执行如下命令编辑文件/etc/exports:#sudoapt-getinstallnfs-kernel-server#vi/etc/exports
在该文件里添加如下内容:
/home/lisongqing/ARM/rootfs192.168.0.*(rw,sync,no_root_squash)
然后保存退出(添加的内容意思是:允许ip地址范围在192.168.0.*的计算机以读写的权限来访问/home/lisongqing/ARM/rootfs目录,/home/lisongqing/ARM/rootfs也称为服务器输出共享目录)。
括号内的参数意义描述如下:
1)rw:读/写权限,只读权限的参数为ro;
2)sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘;
3)no_root_squash:NFS服务器共享目录用户的属性,如果用户是非root,那么对于这个共享目录来说就具有root的权限;
如果用户想修改/etc/exports以修改后或添加其它共享目录,可执行命令1)#sudoexportfs-rv使/etc/exports文件生效2)接着执行如下命令,启动端口映射:
#/etc/init.d/portmapstart(或:#sudoserviceportmapstart)
3)最后启动NFS服务,此时NFS会激活守护进程,然后就开始监听Client端的请求:#/etc/init.d/nfs-kernel-serverrestart(或:#sudoservicenfs-kernel-serverrestart)
Linux服务器端NFS服务器的配置到此就已经配置好了。
二、开发板启动参数设置
当在第一步启动Linux主机NFS服务后,现在就可以在超级终端u-boot控制界面修改命令行参数通过NFS启动根文件系统了。假设Linux主机IP为192.168.0.100,NFS目录为/home/lisongqing/ARM/rootfs,就可以如下设置命令行参数后启动内核。方式一:
#setbootargsnoinitrdroot=/dev/nfsconsole=ttySAC0,115200nfsroot=192.168.0.100:/home/lisongqing/ARM/rootfsip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0::eth0:off方式二:
#setbootargsroot=/dev/nfsnfsroot=192.168.0.100:/home/lisongqing/ARM/rootfsip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0console=ttySAC0,115200mem=64M


     五一长假除了旅游 还能做什么?  辅导补习  美容养颜  家庭家务  加班须知      
 


方式三:
#setbootargsroot=/dev/nfsnfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs,rsize=1500,wsize=1500ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0console=ttySAC0,115200mem=64M
增加rsize和wsize参数,增加块大小(默认为1024),我猜想可以减小丢包概率;#saveenv
命令参数行解释:TargetboardIPaddr:192.168.0.150HostPCIPaddr:192.168.0.100Gateway:192.168.0.1
Nfsdir
:192.168.0.100:/home/lisongqing/ARM/rootfs
各命令行格式:
1、root=/dev/nfs:并非真的设备,而是一个告诉内核经由网络取得根文件系统的旗标2、nfsroot
参数nfsroot这个参数告诉内核以那一台机器,那个目录以及那个网络文件系统选项作为根文件系统使用,命令格式:
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
1)<server-ip>--指定网络文件系统服务端的互联网地址(IPaddress)。如果没有给定此栏位,则使用由nfsaddrs变量(见下面)所决定的值。此参数的用途之一是允许使用不同机器作为反向地址解析协议(RARP)及网络文件系统服务端。通常你可以不管它(设为空白)。
2)<root-dir>--服务端上要作为根挂入的目录名称。如果字串中有个‘%s’符记(token),此符记将代换为客户端互联网地址之ASCII表示法。
3)<nfs-options>--标准的网络文件系统选项,所有选项都以逗号分开。如果没有给定此选项栏位则使用下列的预设值:port=asgivenbyserverportmapdaemonrsize=1024wsize=1024timeo=7retrans=3acregmin=3acregmax=60acdirmin=30acdirmax=60flags=hard,nointr,noposix,cto,ac3、nfsaddrs
参数nfsaddrs设定网络通讯所需的各种网络接口地址。如果没有给定这个参数,则内核核会试著使用反向地址解析协议以及/或是启动协议(BOOTP)以找出这些参数。其格式如下:
nfsaddrs=<my-ip>:<serv-ip>:<gw-ip>:<netmask>:<name>:<dev>:<auto>
1)<name>--客户端的名称。如果空白,则使用客户端互联网地址之ASCII-标记法,或由启动协议接收的值;2)<dev>--要使用的网络设备名称。如果为空白,所有设备都会用来发出反向地址解析请求,



 


启动协议请求由最先找到的设备发出。网络文件系统使用接收到反向地址解析协议或启动协议回应的设备。如果你只有一个设备那你可以不管它。
3)<auto>--用以作为自动配置的方法。如果是`rarp'或是`bootp'则使用所指示的协议;如果此值为`both'或空白,若配置核心时有打开这两种协议则都使用;`none'表示不使用自动配置,这种情况下你必须指定前述栏位中所有必要的值。
此<auto>参数可以作为nfsaddrs的参数单独使用(前面没有任何`:`字符),这种情况下会使用自动配置。然而,此种情况不能使用`none'作为值。
三、内核配置要求
添加内核对NFS的支持:
1)选中networkingsupport->networkingoptions->IP:kernellevelauloconfiguralion项2)选中filesystems->networkfilesystems->下的rootfilesystemonnfs和nfsfilesystemsupport
四、TFTP服务器配置
tftpd-hpa是一个功能增强的TFTP服务器。它提供了很多TFTP的增强功能,它已经被移植到大多数的现代UNIX系统。1.sudoapt-getinstalltftp-hpatftpd-hpa2.mkdir~/tftprootchmod777tftproot3.sudovim/etc/default/tftpd-hpa原内容为:
#/etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"TFTP_ADDRESS="0.0.0.0:69"TFTP_OPTIONS="--secure"修改为:
#/etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
#TFTP_DIRECTORY="/var/lib/tftpboot"TFTP_DIRECTORY="~/tftproot"TFTP_ADDRESS="0.0.0.0:69"#TFTP_OPTIONS="--secure"TFTP_OPTIONS="-l-c-s"
4.sudorestarttftpd-hpa或者sudoservicetftpd-hparestart5.检测tftp
1)>echohelloworld>~/a.txt
2)>echotftptest>~/tftproot/b.txt3)>cd~
4)>tftplocalhost或者tftp127.0.0.15)>tftp>puta.txt6)>tftp>getb.txt



 


7)>tftp>q
五、设置启动命令
bootcmd=tftp0x32000000uImage;bootm0x32000000
六、启动开发板
1)拷贝内核景象到~/tftproot2)拷贝文件系统到nfs目录3)开发板上电
七、挂载问题及解决
1、挂载根文件系统启动内核时出现错误Startingkernel...
UncompressingLinux...done,bootingthekernel.
Error:unrecognized/unsupportedmachineID(r1=0x000003f0).Availablemachinesupport:ID(hex)NAME0000016aSMDK2440
Pleasecheckyourkernelconfigand/orbootloader.修改方法:
修改bootloader和内核配置一致
内核定义文件:arch/arm/tools/mach-typessmdk2440MACH_SMDK2440SMDK24401008s3c2440MACH_S3C2440S3C2440362内核配置开发板:arch/arm/mach-s3c2440/mach-smdk2440.cMACHINE_START(S3C2440,"smdk2440")
Uboot定义文件:include/asm/mach-types.h#defineMACH_TYPE_S3C2440182#defineMACH_TYPE_SMDK24401008
Uboot配置开发板:board/samsung/my2440/my2440.c中的board_init()gd->bd->bi_arch_number=MACH_TYPE_SMDK2440;方法一:
MACHINE_START(S3C2440,"smdk2440")修改为MACHINE_START(SMDK2440,"smdk2440")方法二:
gd->bd->bi_arch_number=MACH_TYPE_SMDK2440;修改为gd->bd->bi_arch_number=MACH_TYPE_S3C2440;
2、nfs:server192.168.0.100notresponding,stilltrying
挂载文件系统时出现
dm9000dm9000.0:WARNING:noIRQresourceflagsset.eth0:linkup,100Mbps,full-duplex,lpa0xC5E1IP-Config:Complete:



 


device=eth0,addr=192.168.0.150,mask=255.255.255.0,gw=192.168.0.1,host=192.168.0.150,domain=,nis-domain=(none),
bootserver=192.168.0.100,rootserver=192.168.0.100,rootpath=LookingupportofRPC100003/2on192.168.0.100LookingupportofRPC100005/1on192.168.0.100VFS:Mountedroot(nfsfilesystem)ondevice0:12.Freeinginitmemory:144K----------muntall----------------networkinterface解决方法:修改启动参数:setenvbootargsnoinitrdroot=/dev/nfsnfsroot=192.168.0.100:/home/lisongqing/ARM/rootfs,tcp,nolock
ip=192.168.0.150:192.168.0.100:192.168.0.1:255.255.255.0::eth0:offconsole=ttySAC0,115200尝试后还是不能挂载
然后检查,原来“dm9000dm9000.0:WARNING:noIRQresourceflagsset”,原来是网卡没启动好。
修改arch/arm/plat-s3c24xx/devs.c
staticstructresources3c_dm9000_resource[]={
[0]={
.start=S3C24XX_PA_DM9000,
.end=S3C24XX_PA_DM9000+0x3,.flags=IORESOURCE_MEM},[1]={
.start=S3C24XX_PA_DM9000+0x4,//CMDpinisA2.end=S3C24XX_PA_DM9000+0x4+0x7c,.flags=IORESOURCE_MEM},[2]={
.start=IRQ_EINT7,.end=IRQ_EINT7,
.flags=IORESOURCE_IRQ},
};
修改为
staticstructresources3c_dm9000_resource[]={
[0]={
.start=S3C24XX_PA_DM9000,
.end=S3C24XX_PA_DM9000+0x3,.flags=IORESOURCE_MEM},[1]={
.start=S3C24XX_PA_DM9000+0x4,//CMDpinisA2



 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值