snifer

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

0
阅读(3411)

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_DEFAULT     S3C2410_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