接着前一篇:u-boot-2009.08在飞凌OK2440/FL2440上的移植(六)——让u-boot引导内核启动 下面来完成linux-2.6.35.4的移植;
前一篇中对内核的修改有:
1.arch/arm/mach-s3c2440/mach-smdk2440.c 中修改与uboot一致的机器码
2.arch/arm/kernel/head.S中手动赋给内核机器码
下面要做的工作还有:1.修改内核时钟与你开发板上的晶振时钟一致;2.设置交叉编译器路径;3.给内核打yaffs补丁;4.修改内核分区;5.关闭ECC校验;6.增加devfs文件管理器的支持;7.修改对nand flash 的支持;8.内核基本配置;9.移植内核设备驱动,包括:USB host驱动、RTC驱动、UDA1341驱动、DM9000驱动、看门狗等;
(一)修改内核时钟与你开发板上的晶振时钟一致,否则出现乱码;
文件:arch/arm/mach-s3c2440/mach-smdk2440.c
修改:s3c24xx_init_clocks(16934400); 为: s3c24xx_init_clocks(12000000);
(二)设置交叉编译器路径;
文件:顶层目录下Makefile
ARCH?=arm
CROSS_COMPILE ?=/4.3.2/bin/arm-linux- //本机的交叉编译器路径,我是放在虚拟机的根目录下的,这里按照你的路径写
(三)给内核打yaffs补丁;
成功后打印信息:
Updating /file/fl/linux-2.6.28.7/fs/Kconfig
Updating /file/fl/linux-2.6.28.7/fs/Makefile
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "Para",
.offset = SZ_1M, //这个需要和uboot中环境变量的offset一致;
.size = SZ_256K,
},
[2] = {
.name = "Kernel",
.offset = SZ_1M * 5,
.size = SZ_1M * 5,
},
[3] = {
.name = "fs-yaffs",
.offset = SZ_1M * 10,
.size = MTDPART_SIZ_FULL, //这个宏表示剩下的全部空间
}
/*[4] = {
.name = "S3C2410 flash partition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}*/
};
注意:
一、bootloader中有分区的话,必须跟bootloader分区一样。
二、文件系统fs-yaffs在第4个分区,即索引号为3(mtdblock3)。
文件:drivers/mtd/nand/s3c2410.c
函数:s3c2410_nand_init_chip
修改:chip->ecc.mode = NAND_ECC_SOFT; 为: chip->ecc.mode = NAND_ECC_NONE;
因为所用的文件系统使用的是devfs文件管理器。修改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
将以下两个部分进行修改
static struct nand_bbt_descrlargepage_memorybased = {
.options = 0,
.offs = 0,
.len = 1, //原始值为2,改成1
.pattern = scan_ff_pattern
};
static struct nand_bbt_descrlargepage_flashbased = {
.options = NAND_BBT_SCAN2NDPAGE,
.offs = 0,
.len = 2, //原始值为2,改成1
.pattern = scan_ff_pattern
};
进入linux-2.6.35.4目录,把s3c2410的默认配置写入config文件。
make s3c2410_defconfig
make menuconfig
配置内核特点使用ARM EABI编译
配置文件系统选项
配置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
配置cpu相关选项
修改配置如下:
System Type --->
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
去掉S3C2400 Machines、S3C2410 Machines、S3C2412 Machines、S3C2442 Machines的所有选项 ,
否则会报错。如果现在编译内核,下载到开发板中,内核就可以正常启动了.有了雏形,继续移植设备驱动。
这里,内核选项*代表编译至内核,M代表编译为模块 。
(九)移植内核设备驱动
1.移植USB host驱动
在这个版本的linux内核,已经对USB驱动进行来很好的支持,仅仅需要修改配置。
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
2. 移植 RTC 驱动
在这个版本的linux内核,已经对RTC驱动进行来很好的支持,不需要修改配置。相应配置如下
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
然后添加对设备的支持
打开arch/arm/mach-s3c2440/mach-smdk2440.c ,添加设备,代码如下:
- static struct platform_device *smdk2440_devices[] __initdata = {
- &s3c_device_ohci,
- &s3c_device_lcd,
- &s3c_device_wdt,
- &s3c_device_i2c0,
- &s3c_device_iis,
- &s3c_device_rtc,
- };
在平台上添加和配置UDA1341:
修改arch/arm/mach-s3c2440/mach-smdk2440.c ,在开始添加头文件
#include <sound/s3c24xx_uda134x.h>
#include <mach/gpio-fns.h>
- static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {
- .l3_clk = S3C2410_GPB(4),
- .l3_data = S3C2410_GPB(3),
- .l3_mode = S3C2410_GPB(2),
- .model = UDA134X_UDA1341,
- };
- static struct platform_device s3c24xx_uda134x = {
- .name = "s3c24xx_uda134x",
- .dev = {
- .platform_data = &s3c24xx_uda134x_data,
- }
- };
- static struct platform_device *smdk2440_devices[] __initdata = {
- &s3c_device_ohci,
- &s3c_device_lcd,
- &s3c_device_wdt,
- &s3c_device_i2c0,
- &s3c_device_iis,
- &s3c_device_rtc,
- &s3c24xx_uda134x,
- };
内核配置如下
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> OSS Mixer API
<*> OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include plugin system
[*] Support old ALSA API
[*] Verbose procfs contents
[*] Verbose printk
[*] Generic sound devices --->
<*> ALSA for SoC audio support --->
<*> SoC Audio for the Samsung S3C24XX chips
<*> SoC I2S Audio support UDA134X wired to a S3C24XX
4.移植DM9000AEP驱动
a、修改 drivers/net/dm9000.c 文件:
头文件增加:
#include <mach/regs-gpio.h>
#include <mach/irqs.h>
#include <mach/hardware.h>
在dm9000_probe 函数 开始增加:
- unsigned char ne_def_eth_mac_addr[]={0x00,0x12,0x34,0x56,0x80,0x49};
- static void *bwscon;
- static void *gpfcon;
- static void *extint0;
- static void *intmsk;
- #define BWSCON (0x48000000)
- #define GPFCON (0x56000050)
- #define EXTINT0 (0x56000088)
- #define INTMSK (0x4A000008)
- bwscon=ioremap_nocache(BWSCON,0x0000004);
- gpfcon=ioremap_nocache(GPFCON,0x0000004);
- extint0=ioremap_nocache(EXTINT0,0x0000004);
- intmsk=ioremap_nocache(INTMSK,0x0000004);
- writel(readl(bwscon)|0xc0000,bwscon);
- writel( (readl(gpfcon) & ~(0x3 << 14)) | (0x2 << 14), gpfcon);
- writel( readl(gpfcon) | (0x1 << 7), gpfcon); // Disable pull-up
- writel( (readl(extint0) & ~(0xf << 28)) | (0x4 << 28), extint0); //rising edge
- writel( (readl(intmsk)) & ~0x80, intmsk);
在这个函数的最后需要修改:
- if (!is_valid_ether_addr(ndev->dev_addr)) {
- /* try reading from mac */
- mac_src = "chip";
- for (i = 0; i < 6; i++)
- //ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
- ndev->dev_addr[i] = ne_def_eth_mac_addr[i];
- }
b、修改arch/arm/mach-s3c2440/mach-smdk2440.c ,添加设备
- static struct platform_device *smdk2440_devices[] __initdata = {
- &s3c_device_ohci,
- &s3c_device_lcd,
- &s3c_device_wdt,
- &s3c_device_i2c0,
- &s3c_device_iis,
- &s3c_device_rtc,
- &s3c24xx_uda134x,
- &s3c_device_dm9000,
- };
c、修改 arch/arm/plat-s3c24xx/devs.c
添加头文件
#include <linux/dm9000.h>
添加以下代码
- static struct resource s3c_dm9000_resource[] = {
- [0] = {
- .start = S3C24XX_PA_DM9000,
- .end = S3C24XX_PA_DM9000+ 0x3,
- .flags = IORESOURCE_MEM
- },
- [1]={
- .start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2
- .end = S3C24XX_PA_DM9000 + 0x4 + 0x7c,
- .flags = IORESOURCE_MEM
- },
- [2] = {
- .start = IRQ_EINT7,
- .end = IRQ_EINT7,
- .flags = IORESOURCE_IRQ
- },
- };
- static struct dm9000_plat_data s3c_device_dm9000_platdata = {
- .flags= DM9000_PLATF_16BITONLY,
- };
- struct platform_device s3c_device_dm9000 = {
- .name= "dm9000",
- .id= 0,
- .num_resources= ARRAY_SIZE(s3c_dm9000_resource),
- .resource= s3c_dm9000_resource,
- .dev= {
- .platform_data = &s3c_device_dm9000_platdata,
- }
- };
- EXPORT_SYMBOL(s3c_device_dm9000);
d、修改 arch/arm/plat-samsung/include/plat/devs.h 45行附近, 添加
- extern struct platform_device s3c_device_dm9000;
e、修改arch/arm/mach-s3c2410/include/mach/map.h 文件
/* DM9000 */
#define S3C24XX_PA_DM9000 0x20000300
#define S3C24XX_VA_DM9000 0xE0000000
5.移植看门狗
修改配置
Device Drivers --->
[*] Watchdog Timer Support --->
<*> S3C2410 Watchdog
最后:make zImage
这次移植并没有移植LCD的驱动,需要移植的话可参考:点击打开链接
编译完成后执行命令:cd arch/arm/boot/ 可看到本次编译生成的zImage
在当前目录下,执行以下命令将zImage生成适合bootm 引导起动的uImage.img文件:
mkimage -n 'linux' -A arm -O linux -T kernel -C none -a 0x31000000 -e 0x31000040 -d zImage uImage.img
注意:在执行该命令之前,把uboot源码包里/tool/目录下的 mkimage 工具拷贝到 交叉编译器所在的bin目录下,本机是/4.3.2/bin/将uImage.img上传到tftp服务器目录,用tftp 下载到内存中,再写入nand flash 分好的装载内核的区中,本移植用到如下命令:
tftp 30000000 uImage.img
nand erase 500000 500000
nand write 0 30000000 500000 500000
接下来就是要制作根文件系统,让内核挂载。下一篇将会介绍用NFS方式挂载根文件系统。
感谢网上的各位大牛,本博文主要参考: