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)把不必要的选项去掉, 减小内核映像体积.
之后就是文件系统的制作了