基于ATMEL AT91RM9200的嵌入式Linux移植笔记(4)

2019-07-13 04:26发布

基于ATMEL AT91RM9200的嵌入式Linux移植笔记(4)

同样的方法,u-boot-1.1.2也正常启动了。另外,u-boot-1.1.2有几个小的补丁,等明天再 做一下总结。同时看看如何制作补丁,如何打补丁。具体的调试过程没有写得很仔细,要想做好一项工作,只会写程序远远不够,更为重要的是会调试。我需要加强 此方面的工作。明天把JEDI probe调试环境的建立也总结一下。2006-08-18今天学习了一下Linux下面patch的制作和使用,做了总结,放到blog上面。u-boot-1.1.2有几个diff补丁文件,具体没有分析,先附在这里。我的使用倒是还没有发现这几个问题,也许没有测试,不管它,以后如果出现问题在来仔细考虑吧。开发板由王老师用,我先学习内核裁减吧。关于移植版本,不一定非得越高越好。关于内核版本标号问题,详细参考 《Building Embedded Linux Systems》。现在还不开发产品,那么先多试用几个,总结总结经验。初步打算先移植一个2.4.x版本,然后移植一个2.6.x版本。-----------------------------Bug1:
RCS file: /home/cvs/u-boot/tools/env/fw_env.c,v
retrieving revision 1.2
diff -u -r1.2 fw_env.c
--- fw_env.c 21 Jul 2004 03:28:43 -0000 1.2
+++ fw_env.c 23 Jul 2004 05:00:25 -0000
@@ -612,8 +612,8 @@
if (!crc1_ok) {
fprintf (stderr,
"Warning: Bad CRC, using default environment ");
-    environment.data = default_environment;
-    free (addr1);
+    memset(environment.data, 0, ENV_SIZE);
+    memcpy(environment.data, default_environment, sizeof(default_environment));
}
} else {
flag1 = environment.flags;
Bug2:saveenv bad checksum
when saving environment after changing stdin,
stdout,... the checksum is not consistent.
Adding an env_crc_update() before saving environment
could solve this. i.e in common/cmd_nvedit.c in
function do_saveenv() :int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc,char *argv[])
{
extern char * env_name_spec;printf ("Saving Environment to %s... ", env_name_spec);env_crc_update();----------------------------------------2006-08-22Linux内核移植
版本:Linux-2.4.27-vrs1
Target Board:ARM
U-boot:1.1.2
toolchain:cross-2.95.31、准备
kernel下载到网站www.kernel.org,可以通过ftp方式:$ftp ,采用匿名的方式输入anonymous即可进入下载。
patch准备:到官方网站www.arm.linux.org.uk,这里提供ftp方式$ftp 
2、打好补丁,执行make mrproper清理一下代码树。
3、修改根目录的Makefile文件,只需修改ARCH和CROSS_COMPILE即可。
ARCH :=arm
CROSS_COMPILE=arm-linux-
在这里,我已经将2.95.3放到PATH中,所以不需要写全路径。如果采用其他版本的toolchain,可以指明路径,如:CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux-
4、$make at91rm9200dk_config
该 步的作用是把根目录下面的.config重命名为.config.old,然后把arch/arm/defconfig/里的at91rm9200dk开 发板的默认配置文件复制到根目录下,命名为.config。简单的说,就是要利用提供的开发板的配置文件,然后在此基础上进行修改。
下一步如果执 行make oldconfig,那么就完全按照.config来配置。而现在需要根据实际应用需要重新配置,所以不执行make oldconfig。而要执行make menuconfig。这两个命令都是首先寻找默认的.config文件并且执行,但不同的是,make oldconfig只出现.config没有的新配置选项供选择。而make menuconfig则提供所有选项,图形界面默认的是.config的配置。
在这里,还是推荐在提供的开发板配置文件的基础之上进行修改,否则后面很容易出现意想不到的问题。我就是因为开始没有使用默认配置,后面的错误一个接一个,折腾了一个上午。
5、make menuconfig在这里可以重新配置,根据你所需要的功能进行裁减。
6、make clean dep
建立依赖关系。
7、make Image 或者 make zImage。这要看你后面使用什么方式的内核映象。如果是make Image,则生成vmlinux,需要arm-linux-objcopy进行处理,生成uImage影响文件。如果是make zImage,则生成zImage,vmlinux,system.map。
zImage和uImage对应的u-boot处理的方式也不相同,分别对应着go和bootm。8、[armlinux@lqm linux-2.4.27]$ cp arch/arm/boot/zImage /home/armlinux/images/zImage-2.4.27-vrs1
[armlinux@lqm linux-2.4.27]$ cp vmlinux $PRJROOT/images/vmlinux-2.4.27-vrs1
[armlinux@lqm linux-2.4.27]$ cp System.map $PRJROOT/images/System.map-2.4.27-vrs1
[armlinux@lqm linux-2.4.27]$ cp .config $PRJROOT/images/2.4.27-vrs1.config9、生成uImage[armlinux@lqm linux-2.4.27]$ arm-linux-objcopy -O binary -S vmlinux linux.bin
[armlinux@lqm linux-2.4.27]$ gzip -v9 linux.bin
linux.bin:       55.7% -- replaced with linux.bin.gz
[armlinux@lqm linux-2.4.27]$ ../../bootloader/u-boot-1.1.2/tools/mkimage -n 'RAM disk' -A arm -O linux -T kernel -C gzip -a 0x20008000 -e 0x20008000 -d linux.bin.gz uImage//纠正:利用mkimage制作uImage,其中-T后跟type,此时应该为kernel,不应该为ramdisk。如果是ramdisk,那么bootm肯定无法正常引导,会显示Wrong Image Type for bootm command。
Image Name:   RAM disk
Created:      Wed Aug 23 09:09:27 2006
Image Type:   ARM Linux Kernel Image (gzip compressed)
Data Size:    617981 Bytes = 603.50 kB = 0.59 MB
Load Address: 0x20008000
Entry Point: 0x2000800010、准备好uImage,先通过超级终端下载到ram里面,检测,然后烧写到flash里面。可以发现已经成功。