硬件平台: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 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 #include #include /*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