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"
(我的问题是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 启动参数
引用别人之前的解决的一个问题:
上面只是一些最基本的环境变量,板子里原本是没有环境变量的,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的内容是否一致。