Linux-2.6.32内核移植

我的开发板是mini2440,bootlorder是vivi ,交叉编译工具 arm-linux-4.4.3

很多人都是看公司开发板的移植方法做的很详细简单,但很多都是技术人员帮你做好的,都不是通用的,只是针对于一款硬件设备,学不到多少东西。所以下面介绍一下我的移植方法,一种通用的 

下面是详细的制作流程:

准备工作:下载Linux-2.6.32.2内核源码

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.bz2 

解压:tar xvzf linux-2.6.32.2.tar.gz 

(1)进入linux-2.6.32.2内核源码顶层目录,修改对硬件平台的支持

 gedit Makefile  

ARCH ?= $(SUBARCH)
   CROSS_COMPILE ?=
   改为:
    ARCH ?= arm
   CROSS_COMPILE ?=arm-linux- 

(注:在193 行)

(2)修改平台时钟 

不修改超级终端中会出现乱码
gedit   arch/arm/mach-s3c2440/mach-smdk2440.c        ln163

    static void __init smdk2440_map_io(void)

{

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));

s3c24xx_init_clocks(12000000); (已改,原来是16934400)      //default is 16934400, changed by yangdk

s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));

}

(3)修改机器码 (如果机器码错误,系统会提示选取平台,死机) 

 gedit arch/arm/tools/mach-types 

修改机器码,使之与bootloader的机器码相同,这里使用的是ivi,机器码为1999

(查看:在Norflash下启动选择【q】进入Vivi中,输入: param show )

$vim arch/arm/tools/mach-types

 379  s3c2440  ARCH_S3C2440  S3C2440  168 (把168改为1999

4)修改对nand的分区信息。要让内核知道nand flash的分区信息,设置成跟bootloader一致。在Norflash下启动选择【q】,然后输入:part show查看 

在arch/arm/plat-s3c24xx/common-smdk.c中修改smdk_default_nand_part[],注意这个一定要跟bootloader的一致。在我的板子中修改如下:


(5)向内核加入对YAFFS2的支持(这样在你配置内核时才有Yaffs2选项

去网上下载个yaffs2补丁包,进行解压。进入解压后的目录。

  # ./patch-ker.sh   c   /home/name/linux-2.6.32. 2/     命令完成下面三件事情
(1) 修改内核 fs/Kconfig
   增加一行:source "fs/yaffs2/Kconfig"
(2) 修改内核 fs/Kconfig
   增加一行 o jb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在内核 fs/ 目录下创建 yaffs2 目录
   将yaffs2 源码目录下面的 Makefile.kernel 文件复制为内核 fs/yaffs2/Makefie;
   将yaffs2  源码目录的 Kconfig 文件复制到内核 fs/yaffs2 目录下 ;
   将yaffs2 源码目录下的 *.c *.h 文件复制到内核 fs/yaffs2 目录下 .  

执行后 你会在linux-2.6.32.2下的/fs下看到yaffs2这个文件目录。

Makefile 文件和 Kconfig 文件也添加了 yaffs2 的配置和编译条件

(6)内核的定制

首先复制一下对于S3C2410/2440的通用配置

注:所有命令在Linux源代码顶层目录执行

cp arch/arm/configs/s3c2410_defconfig .config

make menuconfig

弹出窗口后选择以下配置。

支持EABI

Kernel Features  --->
[*] Use the ARM EABI to compile the kernel                  


[*]   Allow old ABI binaries to run with this kernel (EXPERIMENTA)

 (注:由于使用了codesourcery的工具链,此工具链支持EABI,,内核编译时也要选上,否则用这个编译器编出来的用户程序无法运行,最典型的错误是Busybox无法运行 )

支持 NandFlash

Device Drivers --->

     <*> Memory Technology Device (MTD) support --->

           [*]   MTD partitioning support

           <*> NAND Device Support --->

                <*>   NAND Flash support for S3C2410/S3C2440 SoC

                [ ]    S3C2410 NAND Hardware ECC     //这个去掉

    还有别的以下定制

system type -> 2410/arm92410


7)编译内核

如果之前编译没有成功,要先 make clean

#make zImage

编译成功会后在arch/arm/boot/下面生成zImage文件(到此恭喜你!!!),不过此文件只能用Vivi启动,如果uboot启动,需要用mkimage生成uboot可执行的文件。

使用mkimage 生成镜像文件并下载运行的方法。
首先,用u-boot/tools/mkimage 这个工具为你的内核加上 u-boot 引导所需要的文件头,具体做法如下:
[root@localhost tftpboot]#mkimage -n ‘linux-2.6. 29.4 ′ -A arm -O linux -T kernel -C none -a 30008000 -e 300080 4 0 -d zImage zImage.img
Image Name:   linux-2.6. 29.4
Created:      Fri Jan 12 17:14:50 200 9
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0×30008000
Entry Point:  0×300080 4 0

这里生成的zImage文件就可以通过uboot来引导了。

这里解释一下参数的意义:
        -A ==> set architecture to ‘arch’
        -O ==> set operating system to ‘os’
        -T ==> set image type to ‘type’
        -C ==> set compression type ‘comp’
        -a ==> set load address to ‘addr’ (hex)
        -e ==> set entry point to ‘ep’ (hex)
        -n ==> set image name to ‘name’
        -d ==> use image data from ‘datafile’
        -x ==> set XIP (execute in place)


    其中与内核引导最密切的是-e 30008000 ,也就是内核的入口地址。其它参数可以参考帮助信息。其它 UBOOT 格式的内核与原来相比,只是进行(可选)了压缩,并在前面加了一个 0x40 大小的头。这个头里放了内核的位置 (0x30007fc0) 和入口地址 (0x30008000) 和其它信息。
  bootm 命令执行时,先对头部信息等进行校验,然后把头信息放到一个结构里面。最后根据内核类型调用相应的启动函数。对于 Linux 而言就是 do_bootm_linux ,在启动函数里面,有这么一个操作: theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep); ,这是最关键的一个操作,将内核的入口地址 0x30008000 赋给了 theKernel ,在启动函数的最后,使用 theKernel (0, bd->bi_arch_number, bd->bi_boot_params); 启动内核。
  根据传参规范,三个变量分别用r0,r1,r2 传给内核,这样就巧妙地利用了函数指针进行了参数传递,实在是精妙!

上面讲完了内核的引导及传参,需要引起注意的就是在使用mkimage命令生成内核时,-e后面的地址要比-a后面的地址偏移0x40

下面分享一下修改nand Flash的校验方式,去掉ECC校验。(也可选,需要做以下改动)

      在drivers/mtd/nand/s3c2410.c 669

      将chip->ecc.mode = NAND_ECC_SOFT;

      改为 chip->ecc.mode = NAND_ECC_NONE;

      注意:关于这个去掉ECC校验的问题,在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测。而我一开始也是编译的时候就去掉了ECC校验的选项,原以为在编译选项中去掉就可以了,结果一直报这样的错:

end_request: I/O error, dev mtdblock2, sector 0

FAT: unable to read boot sector

VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)

Please append a correct "root=" boot option; here are the available partitions:

1f00        192 mtdblock0 (driver?)

1f01       1856 mtdblock1 (driver?)

1f02      30720 mtdblock2 (driver?)

1f03      32768 mtdblock3 (driver?)

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)

    后来发现配置中去掉的这个选项在代码中并没有完全去掉,只是去掉了硬件校验的方式,换成了软件校验。只有在代码中给改成NAND_ECC_NONE,才不会校验,但是这样是不提倡的,但这样系统才启动起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值