u-boot移植--6、修改默认配置参数
来源:互联网 发布:java搭建个人博客系统 编辑:程序博客网 时间:2024/05/28 04:54
常常说自己是老年人记忆,因为看过的东西很快就忘。秉承着看自己写的东西肯定要比看别人写东西要好理解的原则。写下这个系列的u-boot移植,同时也加深自己的理解。其实到现在网上大神很多,给出了很多的解决方案。我也以他们为参考。与之不同我会加上一些我自己对某些地方的理解来进行处理。希望对大家有帮助。
开发板:天嵌TQ2440
u-boot:u-boot-1.1.6
手里的开发板是天嵌的TQ2440,看的书是韦东山老师的《嵌入式Linux开发完全手册》,有些许不同的地方,增加了移植困得,当应该也更加深自己的理解。
读书的顺序有这样一节。修改默认配置,以方便使用,其实我也不是很了解,但我们可以从网络获得更多的东西,让我们一起来揭开他神秘的面纱吧!
我们在include/configs/TQ2440.h文件中添加如下内容
#define CONFIG_SETUP_MEMORY_TAGS 1#define CONFIG_CMDLINE_TAG 1#define CONFIG_BOOTCOMMAND"nboot 0x32000000 0 0; bootm 0x32000000"#define CONFIG_BOOTDELAY3#define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"#define CONFIG_ETHADDR 08:00:3e:26:0a:5b#define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR192.168.1.17#define CONFIG_SERVERIP192.168.1.11
CONFIG_SETUP_MEMORY_TAGS与CONFIG_CMDLINE_TAG是内核传递需要用的函数,在lib_arm/armlinux.c文件中do_bootm_linux中,这个函数是用于启动内核,但是在启动内核之前,我们需要处理要进行TAG传递的数据。通过CONFIG_SETUP_MEMORY_TAGS可以将内存分布信息装填入memery tags,通过定义CONFIG_CMDLINE_TAG可以将命令行参数装填入tag,待内核启动后,就可以去对应位置查找由uboot传递的参数了。
参数TAG的地址在哪里呢,实际上在board/smdk2410.c中有定义:
/* adress of boot parameters */gd->bd->bi_boot_params = 0x30000100;
这个0x30000100就是内核参数的地址,当然,这么作只是uboot单方的,如果内核不知道,也没有用。在arch/arm/s3c2410/mach-smdk2410.c中
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch to SMDK2410 */
/* Maintainer: Jonas Dietsche */
.phys_ram = S3C2410_SDRAM_PA,
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100, 就是这里了。
.map_io = smdk2410_map_io,
.init_irq = smdk2410_init_irq,
.timer = &s3c24xx_timer,
MACHINE_END
在include/asm-arm/arch-s3c2410/map.h中
#define S3C2410_CS6 (0x30000000)
#define S3C2410_SDRAM_PA (S3C2410_CS6)
可见
.boot_params = 0x30000100 正好与uboot约定的地址吻合。
CONFIG_BOOTCOMMAND,定义内核的启动方式。上面定义的意思是将第0个NAND FLASH偏移地址0上的映像文件复制到内存0x32000000中;然后 执行bootm命令,bootm命令先将要传递的参数存储(上面有说通过bootm设置TAG),然后跳过去执行内核。0x32000000不是随便设置的,首先他不能覆盖taglist的位置,也不能覆盖uboot,更重要的是要给解压缩后内核的地址留出空间来。内核开始解压启动。到了这里,uboot已经可以从内存中消失了,
而内存中只有参数列表和正在解压缩的内核。
CONFIG_BOOTDELAY自启动前延时3秒。
两个比较重要的宏定义有CONFIG_BOOTARGS和CONFIG_BOOTCOMMAND,CONFIG_BOOTARGS是u-boot向Linux内核传递的参数实际上这个宏值就是环境变量中的bootargs的值,CONFIG_BOOTCOMMAND是系统在上电自动执行时所执行的命令对应环境变量中bootcmd的值。
CONFIG_BOOTARGS和CONFIG_BOOTCOMMAND定义的是这两个环境变量的初始值,以后我们在u-boot烧写到Flash中后,再需要修改这两个变量,需要利用命令:
setenv bootargs 值……和 setenv bootcmd 值……来改变,如果想要断电后更新过的环境变量还能使用,需要执行savenv保存到flash中去,setenv只是修改环境变量在内存中的值。
下面我具几个具体的例子来说明bootcmd的使用方法:
(1)利用NFS传输内核并完成启动,当Linux的内核在主机,我们想要把内核传输到开发板上启动时可以使用:
bootcmd=nfs 0x30008000 192.168.1.2:/home/yanghao/nfs/zImage; bootm 0x30008000
这样系统在启动会就会执行这个命令去将主机IP为"192.168.1.2"的目录"/home/yanghao/nfs/"下的内核复制到内存0x30008000,然后再zh跳转到该地址去执行。
(2)如果内核在NAND Flash中
set bootcmd nand read 0x30008000 0x600000 0x210000; bootm 0x30008000
u-boot先从NAND Flash中读取内核到内存,然后去执行内核
基本上u-boot所有的东西都已经完成了,接下来就是对于linux内核的处理。
最后再说一下,前面在DM9000中我们所提到的tftp命令是下载运行测试例程非常好用的工具大家要善于利用。
典型的应用案例如下所示。
tftp 0x30000000 xxx.binnand erase 0x0 0x00200000nand write.jffs2 0x30000000 0x0 $(filesize)第一条命令通过tftp将xxx.bin下载到0x30000000内存中;第二条命令通过nand erase命令将nand的存储空间从NAND_ADDR+0x0到NAND_ADDR+0x00200000范围内擦除;第三条命令,利用nand write命令将从0x30000000地址处开始,长度为$(filename)的文件复制到NAND_ADDR+0x0地址处。这样数据就被写进了nand中。
另外,当我们执行了上述第一条之后,还可以使用go $(addr)的命令直接执行我们下载的xxx.bin文件。
-a ==> set load address to 'addr' (hex) //指定uImage格式内核镜像文件的加载地址,一般指定为0x30008000
-e ==> set entry point to 'ep' (hex) //linux内核启动的真正入口地址,它不包括uImage内核镜像文件的头部,所以一般情况下应指定为addr+0x40。但是当指定压缩类型为none时,该参数必须与-a参数一致,因为对非压缩镜像文件的处理是:不解压,但是把镜像文件除去头部后复制到加载地址'addr'。
判断映象压缩类型(hdr->ih_comp),如果没有压缩(IH_COMP_NONE),从内核引导地址(即bootm的参数或默认参数)拷贝内核镜像文件数据部分(不包括头信息)到映象文件要求的加载地址hdr->ih_load;
注意区分内核的引导地址和加载地址,引导地址为bootm的参数或默认参数表示的地址,而加载地址为内核的真正入口地址。这个由uImage镜像头信息中的ih_load(mkuImage命令的-a)指定。
极力推荐的文章:
http://www.docin.com/p-621927570.html
http://blog.csdn.net/qq_21792169/article/details/50098749
作为这个系列的最后一篇文章,我还是有些话要说的,整个过程,我其实就像是照葫芦画瓢一样,可能有些地方我也是一知半解。所以系列中难免有错误。希望能和大家多多交流。
参考文献:
1、《嵌入式linux开发完全手册》、韦东山
2、http://blog.fang.com/35656649/14189314/articledetail.htm
3、http://www.docin.com/p-621927570.html
4、http://www.docin.com/p-398966739.html
5、http://blog.csdn.net/tommy_wxie/article/details/8762821
6、http://blog.csdn.net/qq_21792169/article/details/49384135
7、https://wenku.baidu.com/view/42df4fc52cc58bd63186bdb2.html
8、http://blog.sina.com.cn/s/blog_79c968b901018xqz.html
9、http://blog.csdn.net/chenqiang_ace/article/details/74075156
- u-boot移植--6、修改默认配置参数
- u-boot-2016.05移植:(6)、修改默认参数
- 移植u-boot学习笔记9-----u-boot裁剪和修改默认参数
- 移植u-boot学习笔记9-----u-boot裁剪和修改默认参数
- 移植u-boot-2012.04----修改默认参数、烧写yaffs文件
- u-boot-2016.05移植:(2)、修改时钟 初始化sdram 重定位u-boot 配置smdk2440.h 修改u-boot.lds
- 06-S3C2440学习之移植2012u-boot到S3C2440(移植过程五--最终)裁剪+修改默认参数+分区设置+支持文件系统下载
- U-boot移植需要修改哪些文件?
- U-Boot移植——修改提示符
- U-Boot移植需要修改的文件
- U-boot移植需要修改哪些文件?
- 移植u-boot之修改代码
- u-boot如何修改默认的控制台
- 移植u-boot-2015.07-rc3之uboot裁剪及启动参数修改(九)
- u-boot-1.1.6 移植
- u-boot移植之mmc,网卡配置
- u-boot-2016.09移植(1)-单板配置
- u-boot 分析之 默认环境变量配置
- PHP编程中尝试程序并发的几种方式总结
- 简单数组
- 指针3
- 判断是不是闰年
- QNX支持的BSP包QNX os supported board(ARM+MIPS+POWERPC+X86)
- u-boot移植--6、修改默认配置参数
- 学习Dojo笔记
- Shell脚本语法---在Makefile等文件
- 求出1到10,20到30和35到45的和?
- 微信小程序开发-导航条
- 迷茫的程序员
- 求本利之和
- Quartz-Spring集成Quartz通过注解配置的方式
- Struts2 拦截器详解(一)