【1】基于TQ2440的MP3设计——【5、裁剪和移植Linux 2.6 内核】

来源:互联网 发布:余文乐的潮牌淘宝店铺 编辑:程序博客网 时间:2024/04/29 21:12

3、裁剪和移植Linux 2.6 内核

Linux  2.6.28 内核对基于 S3C2440 的 SMDK2440 目标板有很好支持。因为 EmbedSky 和 SMDK2410 结构相似,所以在 SMDK2440 代码的基础上移植 EmbedSky 。内核移植如下: 
1.解压源码包 

tar zxvf linux-2.6.28.tar.gz 

cd linux-2.6.28 

2.修改 Makefile 

vim Makefile 

修改 ARCH、CROSS_COMPILE 变量如下: 

ARCH     ?= arm 

CROSS_COMPILE  ?= arm-linux- 

3.取消内核的 NAND 校验 

这一步原因在于 U-Boot 的 ECC 算法和内核的 ECC 算法不一致。修改如下: 

vim driver/mtd/nand/s3c2410.c 

将 NAND_ECC_HW 和 NAND_ECC_SOFT 改成 NAND_ECC_NONE 

4.定义晶振频率(12MHz) 

vim arch/arm/arch-s3c2440/mach-smdk2440.c 

static void __init smdk2440_map_io(void){ 

s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); 

s3c24xx_init_clocks(12000000);  // 12MHz 

   ... 

5.  添加 Nand Flash 支持 

(1)  定义 Nand Flash 分区:将 Flash 分成三个区: 

第一区作为 BootLoader,容量为 0x50000 字节 

第二区作为 Kernel 内核,容量为 2M 字节 

第三区作为根文件,容量为 32M 字节 

  (2)  定义 s3c2412_nand_set 

  (3)  定义 platform_device 

  (4)  将 s3c_device_nand 加入 platform_devices: 

static struct platform_device *smdk2440_devices[] __initdata = { 

  &s3c_device_nand; 

  ... 

}; 

6.  移植 DM9000 网卡驱动 

Linux 自带的 dm9000.c 驱动不能工作,因为驱动只实现了网卡自身工作,没

有初始化系统接口引脚寄存器,添加接口初始化代码:

(1)  修改源文件 include/linux/dm9000.h,给 dm9000_plat_data 增加一个回调指

针。该回调函数的作用是初始化 s3c2440 中与 dm9000 相关的引脚: 

struct dm9000_plat_data{ 

  void (*bd_port_init)(void);  //  增加的回调 

  ... 

}; 

(2)  修改源文件 driver/net/dm9000.c,在 dm9000_probe 函数中调用该回调 

static int __devinit dm9000_probe(struct platform_device *pdev){ 

  struct dm9000_plat_data *pdata = pdev->dev.platform_data; 

  ... 

  if(pdata->bd_port_init){   //  如果非 NULL 

   pdata->bd_port_init();  //  调用该函数 

  } 

 ... 

(3)  定义 port_init_dm9000()函数作为回调的实体。该函数与具体电路相关,

函数定义见附录 II。 

(4)  将设备加入列表: 

将 s3c_device_dm9000 加入到 platform_devices 数组: 

static struct platform_device *smdk2440_devices[] __initdata = { 

  &s3c_device_nand, 

  &s3c_device_dm9000, 

`... 

}; 

7.  移植其它驱动。 

8.  内核裁剪编译。 

(1)把内核自带的 s3c2410 默认配置拷贝到根目录 

cp arch/arm/configs/s3c2410_defconfig .config 

(2).配置和裁剪内核功能 

make menuconfig 

在默认配置基础上做如下配置(内核配置选项多,选重要的说明) 

System Type   --->  

S3C2410 Machines   ---> 

[*] SMDK2410/A9M2410    #  该项一定要选(参看该项的 HELP) 

      [ ] IPAQ H1940      #  其余全部不选 

[ ] Acer N30 

[ ] Simtec Electronics BAST (EB2410ITX) 

[ ] NexVision OTOM Board 

[ ] AML M5900 Series 

[ ] Thorcom VR1000 

[ ] QT2410 

S3C2412 Machines   --->     #  清除菜单下的所有子项 

S3C2440 Machines   ---> 

[ ] Simtec Electronics ANUBIS 

[ ] Simtec IM2440D20 (OSIRIS) module 

[ ] HP iPAQ rx3715 

[*] SMDK2440      #  选中 

[ ] NexVision NEXCODER 2440 Light Board 

[*] SMDK2440 with S3C2440 CPU module  #  选中 

S3C2442 Machines   --->        #  清除菜单下所有子项 

S3C2443 Machines   --->        #  清除菜单下所有子项 

[*] Support ARM920T processor 

Boot options   ---> 

#  设置第三项启动参数(Defalt kernel command string)内容如下: 

noinitrd  root=/dev/mtdblock2  rootfstype=jffs2  console=ttySAC0,115200 

init=linuxrc mem=64m 

Device Drivers   --->  

<*> Memory Technology Device (MTD) support   ---> # NAND Flash 支持 

[*] Network device support   --->     #  网卡支持 

[*]    Ethernet (10 or 100Mbit)   ---> 

<*>    DM9000 support  

File systems   --->          #  文件系统 

< > Second extended fs support 

< > Ext3 journalling file system support  

... ... 

<*> Kernel automounter support         #  选中 

Pseudo filesystems   ---> 

[*] Virtual memory file system support (former shm fs)  # tmpfs 支持 

Miscellaneous filesystems   --->  

<*> Journalling Flash File System v2 (JFFS2) support  # JFFS2  

(0)    JFFS2 debugging verbosity (0 = quiet, 2 = noisy)  

[*]    JFFS2 write-buffering support 

[ ]      Verify JFFS2 write-buffer reads (NEW)  

[ ]    JFFS2 summary support (EXPERIMENTAL)  

[ ]    JFFS2 XATTR support (EXPERIMENTAL)  

[*]    Advanced compression options for JFFS2  #  压缩方式全选 

[*]      JFFS2 ZLIB compression support  

[*]      JFFS2 LZO compression support  

[*]      JFFS2 RTIME compression support  

[*]      JFFS2 RUBIN compression support  

[*] Network File Systems (NEW)   --->  

(3)  配置完成后保存配置,然后编译内核映像 zImage 

make zImage 

(4)  编译驱动模块 

make modules 

(5)  安装模块 

make modules_install 

(6).生成 U-Boot 格式的镜像 

./mkimage  -A  arm  -O  linux  -T  kernel  -C  none  -a  30008000  -e  30008000  -n 

'linux-2.6.24' -d arch/arm/boot/zImage uImage.bin 

生成 uImage.bin 文件。需要这一步的原因是 U-Boot 只能引导使用 mkimage

处理过的内核。内核启动参数是由 U-Boot 提供的(只要 U-Boot 定义过该参数),

内核配置选项中的 Defalt kernel command string 不影响。 


0 0
原创粉丝点击