TE2440开发板内核移植笔记
参考:http://bbs.witech.com.cn/thread-468-1-1.html
宿主机:fedora9
目标机:s3c2440
交叉编译器:arm-linux-gcc-4.3.2
交叉编译器路径:/usr/local/arm/4.3.2
要移植的内核版本:linux-2.6.32.2
文件系统类型: yaffs2 ( 后续移植 )
移植内核要求:驱动包括nandflash,usb ,lcd ,rtc.
笔记作者:redxu
-
下载内核linux-2.6.32.2.tar.gz(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz 中可以找到) ,然后还需要下载yaffs2 文件系统,目的是为了给内核打补丁。下载地址为:http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs2.tar.gz?view=tar ( 此步骤很重要,如果yaffs2 不正确,可能引起无法正常编译通过) 。
-
将下载的文件存放在/usr/src/ 中。
-
分别解压缩:
[root@WEB188 src]# tar xzf linux-2.6.32.2.tar.gz
[root@WEB188 src]# tar xzf yaffs2.tar.gz
(一)为内核增加yaffs2 补丁
[root@WEB188 src]# cd yaffs2
[root@WEB188 yaffs2]# ./patch-ker.sh c ../linux-2.6.32.2/
Updating ../linux-2.6.32.2//fs/Kconfig
Updating ../linux-2.6.32.2//fs/Makefile
(二)修改机器码。进入内核目录,修改机器码跟bootloader 的机器码一致(TE2440为193 )
[root@WEB188 yaffs2]# cd ../linux-2.6.32.2
[root@WEB188 linux-2.6.32.2]#vi arch/arm/tools/mach-types
首先屏蔽以下行:
smdk2410 ARCH_S3C2410 S3C2410 193
然后将以下行:
s3c2440 ARCH_S3C2440 S3C2440 362
修改为:
s3c2440 ARCH_S3C2440 S3C2440 193
(三)指定目标板machine 、编译器和编译器路径。修改Makefile 文件,注意将CROSS_COMPILE 对应到你系统中交叉编译器地址
[root@WEB188 yaffs2]# vi Makefile
将两行:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
修改为以下两行:
ARCH ?= arm
CROSS_COMPILE ?=/usr/local/arm/4.3.2/bin/arm-linux-
/*********************************************************************/
这一步不要加,在高版本的内核中已经取消了对devfs的支持,源代码/arch/arm/mach-s3c2440/dev.c都已经没有了。
(四)增加devfs 文件管理器的支持。(在linux自启动的时候会自动根据设备状况自动挂在到/dev里。)
[root@WEB188 linux-2.6.32.2]# vi fs/Kconfig
找到以下行:
menu "Pseudo filesystems"
在此行后面增加以下内容:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
/*********************************************************************/
(五)修改晶振频率( 可解决打印信息乱码问题 ) 。修改文件arch/arm/mach-s3c2440/mach-smdk2440.c
[root@WEB188 linux-2.6.32.2]# vi arch/arm/mach-s3c2440/mach-smdk2440.c
将如下行:
s3c24xx_init_clocks(16934400);
修改为:
s3c24xx_init_clocks(12000000);
(六)修改MTD 分区。打开文件arch/arm/plat-s3c24xx/common-smdk.c ,此处注意两个地方:一、必须跟bootloader 分区一样,二、文件系统fs_yaffs 必须在第4 个分区,即索引号为3 。其他一些分区信息可以不要,如下:
[root@WEB188 linux-2.6.32.2]# vi arch/arm/plat-s3c24xx/common-smdk.c
找到static struct mtd_partition smdk_default_nand_part[] 的结构体,将内容修改为:
[0] = {
.name = "boot",
.size = 0x00020000,
.offset = 0
},
[1] = {
.name = "bootParam",
.size = 0x00060000,
.offset = 0x00020000,
},
[2] = {
.name = "Kernel",
.size = 0x00300000,
.offset = 0x00500000,
},
[3] = {
.name = "fs_yaffs",
.size = 0x03c00000,
.offset = 0x00800000,
},
[4] = {
.name = "eboot",
.size = 0x00080000,
.offset = 0x04400000,
},
[5] = {
.name = "WINCE",
.size = 0x03b80000,
.offset = 0x04480000,
}
(七)关闭ECC 校验。修改文件drivers/mtd/nand/s3c2410.c
[root@WEB188 linux-2.6.32.2]# vi drivers/mtd/nand/s3c2410.c
将以下行:
chip->ecc.mode = NAND_ECC_SOFT;
修改为:
chip->ecc.mode = NAND_ECC_NONE;
(八)修改nandflash 驱动,支持K9F1G08 的nandflash 。文件为:drivers/mtd/nand/nand_bbt.c
[root@WEB188 linux-2.6.32.2]# vi drivers/mtd/nand/nand_bbt.c
将以下两个部分进行修改
static struct nand_bbt_descr largepage_memorybased = {
.options = 0,
.offs = 0,
.len = 1, // 原始值为2 ,改成1
.pattern = scan_ff_pattern
};
static struct nand_bbt_descr largepage_flashbased = {
.options = NAND_BBT_SCAN2NDPAGE,
.offs = 0,
.len = 2, // 原始值为2 ,改成1
.pattern = scan_ff_pattern
};
(九)把s3c2410 的默认配置写入config 文件(有的yaffs2 可能会出错)。
[root@WEB188 linux-2.6.32.2]# make s3c2410_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
HOSTCC scripts/basic/hash
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/lex.zconf.c
SHIPPED scripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
fs/yaffs2/Kconfig:179: unknown option "boot"
make[1]: *** [s3c2410_defconfig] 错误 1
make: *** [s3c2410_defconfig] 错误 2
以上出现错误,主要是补丁造成,修改fs/yaffs2/Kconfig 的179 行,将boot 改成bool ,即改成如下:
bool "Disable yaffs2 block refreshing"
[root@WEB188 linux-2.6.32.2]# make s3c2410_defconfig
#
# configuration written to .config
#
(十)配置内核,注意System Type 中,S3C2440 中只选择以下内容即可。
[root@WEB188 linux-2.6.32.2]# make menuconfig
配置CPU 选项(记得跟S3C2440 Machines 平级的其它以及子项都不选)
System Type --->
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
配置yaffs2 选项
File systems --->
[*] Miscellaneous filesystems --->
<*> YAFFS2 file system support
-*- 512 byte / page devices
-*- 2048 byte (or larger) / page devices
[*] Autoselect yaffs2 format
[*] Cache short names in RAM
(十一)最后等着基本内核大功告成把。
[root@WEB188 linux-2.6.32.2]# make zImage
(十二)移植USB host 驱动,仅仅需要修改配置即可
[root@WEB188 linux-2.6.32.2]# make menuconfig
Device Drivers --->
[*] USB support --->
{*} Support for Host-side USB
[*] USB device filesystem (DEPRECATED)
[*] USB device class-devices (DEPRECATED)
<*> OHCI HCD support
<*> USB Mass Storage support
[*] HID Devices --->
{*} Generic HID support
[*] /dev/hidraw raw HID device support
SCSI device support --->
<*> SCSI device support
[*] legacy /proc/scsi/ support
<*> SCSI disk support
<*> SCSI tape support
(十三)移植RTC 驱动
[root@WEB188 linux-2.6.32.2]# make menuconfig
Device Drivers --->
<*> Real Time Clock --->
[*] Set system time from RTC on startup and resume
(rtc0) RTC used to set the system time
[ ] RTC debug support
*** RTC interfaces ***
[*] /sys/class/rtc/rtcN (sysfs)
[*] /proc/driver/rtc (procfs for rtc0)
[*] /dev/rtcN (character devices)
<*> Samsung S3C series SoC RTC
然后添加对设备的支持
[root@WEB188 linux-2.6.32.2]# vi arch/arm/mach-s3c2440/mach-smdk2440.c
将smdk2440_devices 增加一行&s3c_device_rtc, 。最终效果如下:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc,// 新增的一行
};
(十四).移植LCD (我用的是群创的7寸屏)
打开文件arch/arm/mach-s3c2410/mach-smdk2410.c
[root@WEB188 linux-2.6.32.2]# vi arch/arm/mach-s3c2410/mach-smdk2410.c
在以下两个结构体中static struct s3c2410fb_display smdk2440_lcd_cfg[] __initdata ,static struct s3c2410fb_mach_info smdk2440_fb_info __initdata ,改成如下代码
/* LCD driver info */
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 800,
.height = 480,
.pixclock = 40000, /* HCLK 60 MHz, divisor 10 */
.xres = 800,
.yres = 480,
.bpp = 16,
.left_margin = 41,
.right_margin = 68,
.hsync_len = 32,
.upper_margin = 26,
.lower_margin = 6,
.vsync_len = 2,
};
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
.displays = &smdk2440_lcd_cfg,
.num_displays = 1,
.default_display = 0,
.lpcsel = 0xf82,
/* currently setup by downloader */
.gpccon = 0xaa955659,
.gpccon_mask = 0xffc003cc,
.gpcup = 0x0000ffff,
.gpcup_mask = 0xffffffff,
.gpdcon = 0xaa95aaa1,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0x0000faff,
.gpdup_mask = 0xffffffff,
// .lpcsel = ((0xCE6) & ~7) | 1<<4,
};
移植到此,基本满足了我的需要了。在向板子下载kernel,rootfs的时候要注意一点,一定要把nand清理干净!