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