硬件平台: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