Linux 2.6.30.4 内核移植LCD驱动

Kernel:2.6.30.4

os:Ubuntu 8.10

gcc:arm-linux-gcc (3.4.4)

cpu:s3c2410

1.编译设置

使用arm-linux-交叉编译工具链

修改根目录下Makefile

193 194行

ARCH ?= arm

CROSS_COMPILE ?=arm-linux-

2.内核移植

nand 分区

修改 arch/arm/plat-s3c24xx/common-smdk.c 中的nand分区

static struct mtd_partition smdk_default_nand_part[] = {

[0] = {

.name = “bootloader “,

.size = 0x00100000,//1M

.offset = 0,

},

[1] = {

.name = “kernel”,

.offset = 0x00100000,

.size = 0x00300000,//3M

},

[2] = {

.name = “root”,

.offset = 0x00400000,

.size = 0x02800000,//40M

},

[3] = {

.name = “user”,

.offset = 0x02d00000,

.size = 0x00f00000,//15M

}

};

此时如果运行

#make s3c2410_defconfig 启用s3c2410默认内核配置

#make menuconfig

修改

boot option

default command line

root=/dev/mtdblock2 init=linuxrc console=ttySAC0,115200

运行

#make zImage

此时的内核就可在板上跑通了。

3.LCD 驱动移植

修改arch/arm/mach-s3c2410/mach-smdk2410.c

static struct s3c2410fb_display s3c2410fb_lcd_display __initdata = {

.width = 320,

.height = 240,

.xres = 320,

.yres = 240,

.bpp = 16,

.lcdcon5 = S3C2410_LCDCON5_FRM565|

S3C2410_LCDCON5_INVVCLK|

S3C2410_LCDCON5_INVVLINE|

S3C2410_LCDCON5_INVVFRAME|

S3C2410_LCDCON5_HWSWP|

(0<<7)| (0<<6)| (0<<1), .type = S3C2410_LCDCON1_TFT, .pixclock = 270000, .left_margin = 7, .right_margin = 8, .hsync_len = 29, .upper_margin = 11, .lower_margin = 14, .vsync_len = 2, }; static struct s3c2410fb_mach_info s3c2410fb_lcdcfg __initdata = { .displays = &s3c2410fb_lcd_display, .num_displays = 1, .default_display = 0, .lpcsel = 0x0, .gpccon = 0xaa9556a9, .gpccon_mask =0xfffffff, .gpcup = 0xffffffff, .gpcup_mask = 0xffffffff, .gpdcon = 0xaaaaaaaa, .gpdcon_mask = 0xfffffff, .gpdup = 0xffffffff, .gpdup_mask = 0xffffffff, }; 在static void __init smdk2410_init(void)中加入: s3c24xx_fb_set_platdata(&s3c2410fb_lcdcfg); 用提供的s3c2410fb.c 替换drivers/video/s3c2410fb.c 选上 Device Drivers ---> Graphics support —> [*] Bootup logo —>

root@yan-laptop:/home/yan/kernel/linux-2.6.30.4# make menuconfig

make: *** /home/yan/kernel/linux-2.6.30.4/arch/arm: 是一个目录。 停止。

这是因为你在没有修改Makefile之前就执行了make menuconfig

这时就生成一些pc版本的linux的配置导致错误。

解决方法:

执行make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

或者删除源文件,重新解压后修改Makefile然后执行make menuconfig

这个时候可以不执行任何设置,保存即可。

arch/arm/mach-s3c2410/mach-smdk2410.c:65: error: variable `s3c2410fb_lcd_display’ has initializer but incomplete type

定义在 ./arch/arm/mach-s3c2410/include/mach/fb.h中

添加 #include

drivers/video/s3c2410fb.c:32:31: asm/arch/regs-lcd.h: 没有该文件或目录

drivers/video/s3c2410fb.c:33:32: asm/arch/regs-gpio.h: 没有该文件或目录

drivers/video/s3c2410fb.c:34:25: asm/arch/fb.h: 没有该文件或目录

修改为 mach/regs-lcd.h

mach/