基于S3C2410的Linux内核移植笔记
硬件平台:S3C2410
内核版本:3.10.1
1.首先修改顶级Makefile
找到ARCH和CROSS_COMPILE选项
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2.创建默认配置
#make s3c2410_defconfig
说明:在arch/arm/configs中可找到默认配置
3.配置内核
#make menuconfig
取消其他芯片,只选中SMKD2410,
4.编译
#make
修改flash分区
修改arch/arm/mach-s3c24xx/common-smdk.c文件:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "u-boot",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "kernel",
.offset = SZ_1M,
.size = SZ_1M*3,
},
[2] = {
.name = "rootfs",
.offset = SZ_4M,
.size = SZ_1M*60,
},
};
板级资源定义:
arch/arm/mach-s3c24xx/common-smdk.c
NAND Flash及4个LED灯的资源定义(对应开发板);
arch/arm/mach-s3c24xx/mach-smdk2410.c
串口,网卡,LCD,声卡资源定义,并导入其他资源(重要);
arch/arm/plat-s3c24xx/devs.c
&s3c_device_xxx 一般定义在devs.c中(通用板级定义)
&smdk_xxx 一般定义在common-smdk.c中(通用板级定义)
&smdk2410_xxx 一般定义在mach-smdk2410.c文件中(用户板级定义)
网卡驱动:
添加cs89x0网卡支持,删除其他网卡的支持
make menuconfig
Device Drivers --->
[*] Network device support --->
[*] Ethernet driver support --->
[*] Cirrus devices
<*> CS89x0 support
[*] CS890 platform driver support
修改arch/arm/mach-s3c24xx/mach-smdk2410.c文件添加对cs89x0的板级支持
/* CS8900 */
static struct resource smdk2410_cs89x0_resources[] = {
[0] = DEFINE_RES_MEM(0x19000300, 17),
[1] = DEFINE_RES_IRQ(IRQ_EINT9),
};
static struct platform_device smdk2410_cs89x0 = {
.name = "cs89x0",
.num_resources = ARRAY_SIZE(smdk2410_cs89x0_resources),
.resource = smdk2410_cs89x0_resources,
};
注意事项:
这里添加的板级资源要与开发板上实际情况相符;
在smdk2410_devices中加入
static struct platform_device *smdk2410_devices[] __initdata = {
&smdk2410_cs89x0,
};
声卡驱动
1.修改代码:arch/arm/mach-s3c24xx/mach-smdk2410.c
添加以下代码:
#include <sound/s3c24xx_uda134x.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 uda1340_codec = {
.name = "uda134x-codec",
.id = -1,
};
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_iis,
&uda1340_codec,
&s3c24xx_uda134x,
};
修改.config
CONFIG_S3C24XX_DMA=y
因为通过make menuconfig只会使能CONFIG_S3C2410_DMA
注意事项:
通过上述配置,系统启动时,可以显示声卡设备,
但声音测试时不响。
RTC驱动程序
1.修改代码:arch/arm/mach-s3c24xx/mach-smdk2410.c
在smdk2410_devices中加入s3c_device_rtc资源
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_rtc,
};
2.配置:
<*> Real Time Clock --->
<*>
Samsung S3C series SoC RTC
3.测试:
(1) 设置时间为 2007-04-29 16:35
# date -s 042916352007
(2) 把刚刚设置的时间存入内部的RTC
# hwclock -w
(3)开机时恢复linux 系统时钟为RTC, 一般把该语句放入/etc/init.d/rcS 文件自动执行。
# hwclock -s
添加SD卡支持:
1.修改arch/arm/mach-s3c24xx/mach-smdk2410.c,添加SDI设备
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_sdi,
};
其中s3c_device_sdi定义在arch/arm/plat-s3c24xx/devs.c中.
2.修改配置,添加SD支持
Device Drivers --->
<*> MMC/SD/SDIO card support --->
<*> Samsung S3C SD/MMC Card Interface support
[*] Hardware support for SDIO IRQ
3.应用
当系统检测至SD卡时,会产生设备文件,/dev/mmcblk0p1,直接挂载至某个目录下即可进行读写
4.添加热插拔支持
修改arch/arm/mach-s3c24xx/mach-smdk2410.c,添加下面的代码
#include <mach/gpio.h>
#include <linux/mmc/host.h>
#include <linux/platform_data/mmc-s3cmci.h>
/*SDI Support*/
static struct s3c24xx_mci_pdata smdk2410_mmc_cfg __initdata = {
.gpio_detect = S3C2410_GPG(10),
.set_power = NULL,
.ocr_avail = MMC_VDD_32_33,
};
在smdk2410_init函数中添加
s3c24xx_mci_set_platdata(&smdk2410_mmc_cfg);
说明:
1.s3c24xx_mci_pdata结构体以及s3c24xx_mci_set_platdata函数定义在mmc-s3cmci.h中
2.ocr_avail表示VDD电压,其中MMC_VDD_32_33定义在linux/mmc/host.h中,表示VDD=3.2~3.3V
3.gpio_detect用于卡在位检测,必须与实际电路相符;
添加U盘支持
Device Drivers --->
[*] USB support --->
<*> Support for Host-side USB
<*> USB Mass Storage support
<*> OHCI HCD support
注意事项:
1.一定要使能OHCI支持以及添加s3c_device_ohci资源(否则不能发现磁盘);
Open Host Controller Interface(开放式主机控制接口协议)
2.需要添加SCSI Disk支持
(貌似移植SD卡已经添加进去了,保证有就行了);
Device Drivers --->
SCSI device support --->
<*> SCSI disk support