linux2.6.32移植概要总结 2010-08-18

cd linux-2.6.32/arch/arm/mach-s3c2440
cp mach-smdk2440.c mach-test2440.c

 

以上,新建了一个mach-test2440的平台,同级的还有mach-mini2440,mach-at2440evb.c等文件,对应不同的开发板.  

(一)修改机器码

打开mach-test2440.c, 找到最后的MACHINE_START宏,

例如MACHINE_START(TEST2440, "TEST2440")这一行,

第二个参数无所谓,重要的是第一个参数,在gcc编译这个mach-test2440.c的时候,会把TEST2440匹配到/include/asm-arm/mach-types.h中的"#define MACH_TYPE_TEST2440 1999"这里, 如果在mach-types.h中找不到MACH_TYPE_TEST2440, gcc编译mach-test2440.c则报错;
还有,/include/asm-arm/mach-types.h是每次make zImage过程中, 由arch/arm/tools/mach-types文件生成的,
总结,修改机器码,涉及内核代码的三个地方,MACHINE_START宏,mach-types.h,mach-types,初启动时,bootloader向内核传递一个机器码,因为这里用的是友善的supervivi,所以bl传递的机器码是1999。

 

(二)修改晶振频率

还是文件mach-test2440.c, 找到static void __init smdk2440_map_io(void)函数中, 把其中的 16934400改为12000000, 晶振频率错误可能引起串口打印乱码,

 

(三)修改SMDK2440对应的函数名称

在新创建的mach-test2440.c中,把所有的smdk2440字样的函数改成test2440, 避免名称冲突.

vi mach-test2440.c

vi下输入:%s/smdk2440/test2440/g

 

(四)修改对应的Kconfig和Makefile

进入/arch/arm/mach-s3c2440目录, 编辑Makefile和Kconfig:
(1)makefile最后增加一行: obj-$(CONFIG_MACH_TEST2440) += mach-test2440.o
(2)kconfig最后一行endmenu之前增加:
    config MACH_TEST2440
        bool "TEST2440 development board By dos5gw"
        select CPU_S3C2440
        select S3C2440_XTAL_12000000
        select EEPROM_AT24
        select S3C_DEV_NAND
        select S3C_DEV_USB_HOST
        help
          Say Y here to select support for the TEST2440.
   这里可以仿照SMDK2440和MINI2440的kconfig部分

(五)初次编译测试

make s3c2410_defconfig, 载入2410的默认配置,
make menuconfig,  在system type->S3C2440 Machines选中刚才的MACH_TEST2440,并去掉其他s3c24xx处理器的支持,(暂时只剪裁这一点吧,上次因为剪裁太多,出问题了)
写入nand flash, 开机测试. 根据串口屏显查看有无进入start_kernel()函数,

 

(六)yaffs2补丁

由于根分区采用yaffs2格式, 还要打yaffs2补丁, 前面已经写过, 略.

 

(七)修改nand flash分区,

在mach-test2440.c, 中增加nand flash分区的相关代码,

mach-test2440.c中定义的platform_device,与common-smdk.c中定义的platform_device不重复,
mach-smdk2440.c中定义的platform_device,与common-smdk.c中定义的platform_device重复,
比如,mach-smdk2440.c和common-smdk.c两个文件都对同一个s3c_device_nand(platform_device类型)进行platform_add_devices()操作,则在make zImage会报错不能创建相同的设备.

(八)添加其他驱动

包括网卡,RTC,LCD背光,LCD显示,ADC,触摸屏,usb外设,SD卡,声卡驱动.

等根据板载外设, 在mach-test2440.c文件内, 每个外设都要对应创建platform_device类型的static变量,  

(注意1)所有2440平台中共用的platform_device,比如s3c_device_lcd,s3c_device_usb,s3c_device_nand等,这些使用已有的定义.
  除此之外的外设需要手动注册成platform_device, 根据板载设备的实际情况,比如板子上搭载了DM900网卡/UDA1341声卡(这两个设备在mach-mini2440.c中都有定义), 但在2440通用平台中没有定义,所以要自己定义网卡的paltform_device;

创建的platform_device变量,添加进static struct platform_device *test2440_devices[] __initdata中;

然后再_machine_init()中对添加备结构体数组.

static void __init test2440_machine_init(void){
      platform_add_devices(test2440_devices, ARRAY_SIZE(test2440_devices));
 }//把platform_device结构体数组进行add_device()操作

 

对于mach-test2440.c文件内定义的函数/结构体, 与其他平台对应的文件都是一致的, 比如mach-mini2440,mach-at2440evb.c

定义的函数都要注册进MACHINE_START 宏中,

 

(九)调整Kernel Configure中的参数

   (1)第八步中驱动文件对应的选项,
   (2)启动参数: boot option -> cmd line改为:noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200, 要与bl传递的参数一致

   (3)把不必要的选项去掉, 减小内核映像体积.

 

 

之后就是文件系统的制作了

 

 

 

你可能感兴趣的:(linux2.6.32移植概要总结 2010-08-18)