snifer

[原创]linux-3.9.8移植全过程

0
阅读(3233)

linux已经发展到了3.9.8,不过仍然摆脱不了嵌入式专用操作系统的尴尬位置,虽然目前在很多领域都取得了斐然的成绩,但是远远没有达到作用的最大化,今天就这个新版本的移植过程给大家分享一下。

1、下载地址,当然是:https://www.kernel.org

二、解压源码

# tar xvf linux-3.9.8.tar.xz

三、打补丁

# xz patch-3.9.8.xz

# mv patch-3.9.8 linux-3.9.8

# cd linux-3.9.8

# patch -Np1 -i patch-3.9.8

四、选择板子,这个地方需要好好修改一下。

4.1、修改顶层目录下的Makefile

指定交叉编译工具链

ARCH?= $(SUBARCH)

CROSS_COMPILE?= $(CONFIG_CROSS_COMPILE:"%"=%)

改为:

ARCH?= arm

CROSS_COMPILE?= /opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-

4.2、使用缺省配置

# cp arch/arm/configs/s5pc100_defconfig ./

# make s5pc100_defconfig

4.3、修改缺省配置及相应代码

4.3.1、修改arch/arm/mach-s5pc100/Kconfig

config MACH_SMDKC100

bool "SMDKC100"

select CPU_S5PC100

select S3C_DEV_FB

select S3C_DEV_HSMMC

select S3C_DEV_HSMMC1

select S3C_DEV_HSMMC2

select S3C_DEV_I2C1

select S3C_DEV_RTC

select S3C_DEV_WDT

select S5PC100_SETUP_FB_24BPP

select S5PC100_SETUP_I2C1

select S5PC100_SETUP_IDE

select S5PC100_SETUP_KEYPAD

select S5PC100_SETUP_SDHCI

select S5P_DEV_FIMC0

select S5P_DEV_FIMC1

select S5P_DEV_FIMC2

select SAMSUNG_DEV_ADC

select SAMSUNG_DEV_BACKLIGHT

select SAMSUNG_DEV_IDE

select SAMSUNG_DEV_KEYPAD

select SAMSUNG_DEV_PWM

select SAMSUNG_DEV_TS

help

Machine support for the Samsung SMDKC100

改为:

config MACH_SMDKC100

bool "SMDKC100"

select CPU_S5PC100

select S3C_DEV_FB

select S3C_DEV_HSMMC

select S3C_DEV_HSMMC1

select S3C_DEV_HSMMC2

select S3C_DEV_I2C1

select S3C_DEV_RTC

select S5PC100_SETUP_FB_24BPP

select S5PC100_SETUP_I2C1

select S5PC100_SETUP_SDHCI

select S5P_DEV_FIMC0

select S5P_DEV_FIMC1

select S5P_DEV_FIMC2

select SAMSUNG_DEV_ADC

select SAMSUNG_DEV_TS

help

Machine support for the Samsung SMDKC100

4.3.2、板文件定制

arch/arm/mach-s5pc100/mach-smdkc100.c

保留串口设备信息外,其他设备信息全部删除,设备列表中设备清空。

修改为:

...

/* Following are default values for UCON, ULCON and UFCON UART registers */

#define SMDKC100_UCON_DEFAULT(S3C2410_UCON_TXILEVEL |\

S3C2410_UCON_RXILEVEL |\

S3C2410_UCON_TXIRQMODE |\

S3C2410_UCON_RXIRQMODE |\

S3C2410_UCON_RXFIFO_TOI |\

S3C2443_UCON_RXERR_IRQEN)

#define SMDKC100_ULCON_DEFAULTS3C2410_LCON_CS8

#define SMDKC100_UFCON_DEFAULT(S3C2410_UFCON_FIFOMODE |\

S3C2440_UFCON_RXTRIG8 |\

S3C2440_UFCON_TXTRIG16)

static struct s3c2410_uartcfg smdkc100_uartcfgs[] __initdata = {

[0] = {

.hwport= 0,

.flags= 0,

.ucon= SMDKC100_UCON_DEFAULT,

.ulcon= SMDKC100_ULCON_DEFAULT,

.ufcon= SMDKC100_UFCON_DEFAULT,

},

[1] = {

.hwport= 1,

.flags= 0,

.ucon= SMDKC100_UCON_DEFAULT,

.ulcon= SMDKC100_ULCON_DEFAULT,

.ufcon= SMDKC100_UFCON_DEFAULT,

},

[2] = {

.hwport= 2,

.flags= 0,

.ucon= SMDKC100_UCON_DEFAULT,

.ulcon= SMDKC100_ULCON_DEFAULT,

.ufcon= SMDKC100_UFCON_DEFAULT,

},

[3] = {

.hwport= 3,

.flags= 0,

.ucon= SMDKC100_UCON_DEFAULT,

.ulcon= SMDKC100_ULCON_DEFAULT,

.ufcon= SMDKC100_UFCON_DEFAULT,

},

};

static struct platform_device *smdkc100_devices[] __initdata = {

};

static void __init smdkc100_map_io(void)

{

s5pc100_init_io(NULL, 0);

s3c24xx_init_clocks(12000000);

s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs));

}

static void __init smdkc100_machine_init(void)

{

platform_add_devices(smdkc100_devices, ARRAY_SIZE(smdkc100_devices));

}

...

4.3.3、修改arch/arm/mach-s5pc100/common.c初始化函数

void __init s5pc100_map_io(void)

{

/* initialise device information early */

s5pc100_default_sdhci0();

s5pc100_default_sdhci1();

s5pc100_default_sdhci2();

s3c_adc_setname("s3c64xx-adc");

/* the i2c devices are directly compatible with s3c2440 */

s3c_i2c0_setname("s3c2440-i2c");

s3c_i2c1_setname("s3c2440-i2c");

s3c_onenand_setname("s5pc100-onenand");

s3c_fb_setname("s5pc100-fb");

s3c_cfcon_setname("s5pc100-pata");

s3c64xx_spi_setname("s5pc100-spi");

}

改为:

void __init s5pc100_map_io(void)

{

/* initialise device information early */

//s5pc100_default_sdhci0();

//s5pc100_default_sdhci1();

//s5pc100_default_sdhci2();

//s3c_adc_setname("s3c64xx-adc");

/* the i2c devices are directly compatible with s3c2440 */

//s3c_i2c0_setname("s3c2440-i2c");

//s3c_i2c1_setname("s3c2440-i2c");

//s3c_fb_setname("s5pc100-fb");

}

4.3.4、修改时钟初始化代码

arch/arm/mach-s5pc100/clock.c

改为:

static struct clk_lookup s5pc100_clk_lookup[] = {

CLKDEV_INIT(NULL, "clk_uart_baud2", &clk_p),

CLKDEV_INIT(NULL, "clk_uart_baud3", &clk_sclk_uart.clk),

CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.0", &clk_hsmmc0),

CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.0", &clk_hsmmc1),

CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.0", &clk_hsmmc2),

#if 0

CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &clk_sclk_mmc0.clk),

CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &clk_sclk_mmc1.clk),

CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &clk_sclk_mmc2.clk),

#endif

CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),

CLKDEV_INIT("s5pc100-spi.0", "spi_busclk1", &clk_48m_spi0),

CLKDEV_INIT("s5pc100-spi.0", "spi_busclk2", &clk_sclk_spi0.clk),

CLKDEV_INIT("s5pc100-spi.1", "spi_busclk1", &clk_48m_spi1),

CLKDEV_INIT("s5pc100-spi.1", "spi_busclk2", &clk_sclk_spi1.clk),

CLKDEV_INIT("s5pc100-spi.2", "spi_busclk1", &clk_48m_spi2),

CLKDEV_INIT("s5pc100-spi.2", "spi_busclk2", &clk_sclk_spi2.clk),

CLKDEV_INIT("samsung-i2s.0", "i2s_opclk0", &clk_i2s0),

CLKDEV_INIT("samsung-i2s.1", "i2s_opclk0", &clk_i2s1),

CLKDEV_INIT("samsung-i2s.2", "i2s_opclk0", &clk_i2s2),

};

4.3.5、修改Makefile

arch/arm/mach-s5pc100/Makefile

obj-y+= dev-audio.o

改为:

#obj-y+= dev-audio.o

arch/arm/plat-samsung/Makefile

obj-y+= devs.o

改为:

#obj-y+= devs.o

五、选配内核

# make menuconfig

General setup--->

[*] System V IPC

[*] Embedded system

[*] Enable loadable module support--->

[*]Module unloading

[*]Module versioning support

[*]Source checksum for all modules

[*] Enable the block layer--->

Partition Types--->

[*]PC BIOS (MSDOS partition tables) support

Boot options--->

[*]Provide old way to pass kernel parameters

六、编译验证

# make

Baidu
map