OMAP3730开发板uboot学习以及nfs网络启动根文件系统

1、首先,贴出NAND 256MiB 地址空间中的内容。

NAND device: Manufacturer ID: 0x2c, Chip ID: 0xba (Micron NAND 256MiB 1,8V 16-bit)
[   17.450469] Creating 5 MTD partitions on "omap2-nand.0":
[   17.455841] 0x000000000000-0x000000080000 : "X-Loader"
[   17.463104] 0x000000080000-0x000000260000 : "U-Boot"
[   17.470428] 0x000000260000-0x000000280000 : "U-Boot Env"
[   17.477294] 0x000000280000-0x000000680000 : "Kernel"
[   17.485382] 0x000000680000-0x000010000000 : "File System"

如果发生因为uboot环境配置出错导致板子无法正常启动的情况的解决办法:

(我的问题是bootargs变量配置有问题,使用setenv bootargs 都无法删除bootargs变量 只有想办法清楚掉整个uboot环境配置了,加载完内核booting the kernel 后就卡住不动了)

首先找到uboot环境变量在nand flash 中的地址 我这里是

0x000000260000-0x000000280000
使用命令 nand erase 260000 2000
擦除了uboot的变量配置
然后重新启动开发板,就能 正常启动了

2、然后配置开发板进行nfs网络方式启动:

在uboot环境变量中的配置

setenv ipaddr 10.10.204.50

setenv serverip 10.10.204.63

setenv gatewayip 10.10.204.1

setenv netmak 255.0.0.0

最终要的设置对nandargs与bootargs 启动参数

setenv nandargs setenv bootargs console=ttyS0,115200n8 noinitrd ip=10.10.204.50:10.10.204.63:10.10.204.1:255.0.0.0::eth0:off root=/dev/nfs rw nfsroot=10.10.204.63:
/home/ema/rootfs,nolock mem=99M 

在nfs服务器上搭建好nfs环境 详细方法参照另一篇博客:http://blog.csdn.net/a656343072/article/details/8635290
设置/etc/exports中的目录 /home/ema/rootfs *(rw,sync,no_root_squash)  与开发板中配置的目录一致

nfs设置操作以及容易遇到的问题解决办法:http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=network:NFS

下面总结下uboot环境配置的一些重要的环境变量以及参数:

OMAP3730开发板uboot学习以及nfs网络启动根文件系统_第1张图片

引用别人之前的解决的一个问题:

上面只是一些最基本的环境变量,板子里原本是没有环境变量的,u-boot的缺省情况下会有一些基本的环境变量,在你执行了saveenv之后,环境变量会第一次保存到flash中,之后你对环境变量的修改、保存都是基于保存在flash中的环境变量的操作。U-boot的环境变量值得注意的有两个: bootcmd 和bootargs。

(1)bootcmd,是自动启动时默认执行的一些命令,因此你可以在当前环境中定义各种不同配置,不同环境的参数设置,然后设置bootcmd为你经常使用的那种参数。

(2)bootargs,是环境变量中的重中之重,可以说整个环境变量都是围绕着bootargs来设置的。bootargs的种类非常非常的多,我们平常只是使用了几种而已,bootargs非常的灵活,内核和文件系统的不同搭配就会有不同的设置方法,甚至你也可以不设置bootargs而直接将其写到内核中去(在配置内核的选项中可以进行这样的设置)。

A,root:用来指定rootfs的位置,常见的情况有:root=/dev/mtdx rw 或 root=/dev/mtdblockx rw 或 root=/dev/mtdblock/x rw等。

B,rootfstype:这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区。

C,console:console=tty<n>  使用虚拟串口终端设备 <n>。比如console=ttySAC0,115200

D,mem:mem=xxM 指定内存的大小,不是必须的。

E,ramdisk_size:ramdisk_size=xxxxx,告诉ramdisk 驱动,创建的ramdisk的size。

F, initrd, noinitrd:当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在

内存中的位置,size表示initrd的大小。

G. init:init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了。

         说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:

1),假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:

setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’

2),假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:

setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’

注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)

3),假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下

setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’  

         补充一下bootargs的解析过程:在/arch/arm/kernel/setup.c,查找函数parse_tag_cmdline(),bootloader的命令行就是通过这个函数传递给kernel的。可以直接屏蔽掉这个函数中的命令行传递,在kernel的.config下直接写入你想要的命令行参数。


测试:通常我们会回写数据来测试写入跟读取的数据是否一致,如:

假设Download Address: 0xc0000000,Download Filesize:0x1df48c

nand erase 600000 300000             //擦除c0600000为开始的300000个字节

nand write c0000000 600000 300000       //往刚擦除的空间写入内存起始地址的数据共300000个长度

nand read c0600000 600000 300000        //读取刚写入的NAND地址共300000个长度到偏移600000的内存中

cmp c0600000 c0000000 300000              //比较两段内存的数据是否相同

       此通常会用在DDR调试上,比如128MDDR的MEMORY MAP基地址是0X50000000,空间从0X50000000-0X58000000,如果要改软件支持到256M,假设DOWNLOAD地址是0XC0000000,通过内存拷贝和比较命令来对比0XC0000000和0X59000000的内容是否一致。


你可能感兴趣的:(OMAP3730开发板uboot学习以及nfs网络启动根文件系统)