参考材料:
移 植Linux2.6.22.2到博创2410-S(s3c2410A)(补:LCD驱动移植)
http://blog.chinaunix.net/u1/34474/showart_396609.html
解决了移植2.6.24内核的LCD驱动移植问题
http://www.linuxdiyf.com/viewarticle.php?id=84032
一. 移植LCD 驱动程序
在Linux2.6.2 4 . 7 下移植 LCD驱动程序 十分简单,只要在 内核源码 arch/arm/mach-s3c2410/mach-smdk2410.c里添加初始化 s3c2410 的 LCD 控制器时所需要的参数。 而这些参数可以参考 arch/arm/mach-s3c2410/mach-qt2410.c 文件中对 SHARP LQ080V3DG01 型LCD 控制器初始化的相关代码。 现在我介绍一下移植过程:
1. 修改arch/arm/mach-s3c2410/mach-smdk2410.c 文件
( 1 )添加头文件
#include <asm/arch/fb.h>
( 2 )添加初始化s3c2410 的 LCD 控制器时所需的参数
这些参数可参考 arch/arm/mach-s3c2410/mach-qt2410.c 文件中对 SHARP LQ080V3DG01 型LCD 控制器初始化的相关代码。添加如下代码:
/* LCD driver info */
/* Configuration for 640x480 SHARP LQ080V3DG01 */
static struct s3c2410fb_mach_info qt2410_lcd_info __initdata = {
.type = S3C2410_LCDCON1_TFT,
.regs = {
.lcdcon1 = S3C2410_LCDCON1_TFT16BPP |
S3C2410_LCDCON1_TFT |
S3C2410_LCDCON1_CLKVAL(0x01), /* HCLK/4 */
.lcdcon2 = S3C2410_LCDCON2_VBPD(18) | /* 19 */
S3C2410_LCDCON2_LINEVAL(479) |
S3C2410_LCDCON2_VFPD(10) | /* 11 */
S3C2410_LCDCON2_VSPW(14), /* 15 */
.lcdcon3 = S3C2410_LCDCON3_HBPD(43) | /* 44 */
S3C2410_LCDCON3_HOZVAL(639) | /* 640 */
S3C2410_LCDCON3_HFPD(115), /* 116 */
.lcdcon4 = S3C2410_LCDCON4_MVAL(0) |
S3C2410_LCDCON4_HSPW(95), /* 96 */
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
},
.lpcsel = ((0xCE6) & ~7) | 1<<4,
.gpccon= 0xaa8002a8,
.gpccon_mask= 0xffc003fc,
.gpcup= 0xf81e,
.gpcup_mask= 0xf81e,
.gpdcon= 0xaa80aaa0,
.gpdcon_mask= 0xffc0fff0,
.gpdup= 0xf8fc,
.gpdup_mask= 0xf8fc,
.width = 640,
.height = 480,
.xres = {
.min = 640,
.max = 640,
.defval = 640,
},
.yres = {
.min = 480,
.max = 480,
.defval = 480,
},
.bpp = {
.min = 16,
.max = 16,
.defval = 16,
},
};
但linux 2.6.24内核中数据结构有了重大的变化, 原 s3c2410fb_mach_info 结构体已被 拆成了二部分,一个是s3c2410fb_display , 另一个是s3c2410fb_mach_info 。另外,在linux2.6.24 内核中, LCD 控制 寄存器lcdcon1-4 全部用函数进行了自动设置 。
对于这两个数据结构的初始化,也可参考 linux2.6.24内核 arch/arm/mach-s3c2410/mach-qt2410.c 文件中对 SHARP LQ080V3DG01 型LCD 控制器初始化的相关代码。针对 2.6.24内核 , 其添加如下代码:
/* Configuration for 640x480 SHARP LQ080V3DG01 */
static struct s3c2410fb_display qt2410_lcd_cfg __initdata = {
/* lcd configuration registers */
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
/* LCD type */
.type = S3C2410_LCDCON1_TFT,
/* Screen size */
.width = 640,
.height = 480,
/* Screen info */
.xres = 640,
.yres = 480,
.bpp = 16,
.pixclock = 40000,
.left_margin = 44,
.right_margin = 116,
.hsync_len = 96,
.upper_margin = 19,
.lower_margin = 11,
.vsync_len = 15,
};
//LCD driver info
static struct s3c2410fb_mach_info qt2410_ lcd_i nfo __initdata = {
.displays = &qt2410_lcd_cfg, /* attached diplays info */
.num_displays = 1, /* number of defined displays */
.default_display = 0,
/* GPIOs */
.gpccon = 0xaa8002a8,
.gpccon_mask = 0xffc003fc,
.gpcup = 0xf81e,
.gpcup_mask = 0xf81e,
.gpdcon = 0xaa80aaa0,
.gpdcon_mask = 0xffc0fff0,
.gpdup = 0xf8fc,
.gpdup_mask = 0xf8fc,
/* lpc3600 control register */
.lpcsel = ((0xCE6) & ~7) | 1<<4,
};
( 3 )添加LCD 控制器 的寄存器参数设置 函数
查找 smdk2410_init ,添加如下代码 。
static void __init smdk2410_init(void)
{
//设置 LCD控制器 的寄存器参数
s3c24xx_fb_set_platdata(&qt2410_lcd_ info ); //add code
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
}
2 . 配置内核
输入以下命令,开始配置内核。
#make menuconfig
添加如下选项:
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
<*> S3C2410 LCD framebuffer support
Display device support --->
<*> Display panel/monitor support
Console display driver support --->
<*> Framebuffer Console support
[*] Framebuffer Console Rotation
[*] Select compiled-in fonts
[*] VGA 8x8 font
[*] VGA 8x16 font
[*] Mini 4x6 font
[*] Sparc console 8x16 font
[*] Bootup logo --->
--- Bootup logo
[*] Standard 224-color Linux logo
上面只涉及移植LCD 驱动必须添加的选项,内核详细配置过程可参考网络上相关资料。
配置好内核后,输入以下命令, 重新编译内核 。
# make dep 提供变量依赖关系信息
# make clean 删除生成的模块和目标文件
# make zImage 编译内核生成压缩的映像
# make modules 编译模块
# make modules_install 安装编译完成的模块
编译完成后, 在arch/arm/boot 目录下生成了 zImage 文件,即为压缩的内核 镜像 。 再通过,Windows 操作系统下的超级终端将新的内核镜像烧写到 flash 上的相应分区。
烧写完成后,启动开发板,就可以看到linux 的 logo ——小企鹅。
二. LCD驱动的测试
通过将MPlayer 移植到 ARM2410 开发板上,来对刚移植完的 LCD 驱动进行测试。
1. 移植MPlayer
(1) 搭建交叉编译环境
使用root 登陆宿主机 linux 系统,将 arm-linux-gcc-3.3.2.tar.gz 软件包解压到 /usr/local/arm 之中。这样, arm-linux 工具链就在 /usr/local/arm/3.3.2/bin 文件夹之中。
然后,修改/root/.bash_profile 文件,在 PATH 变量的定义后面加上下面一行代码,保存后退出。
PATH=${PATH}:/usr/local/arm/3.3.2/bin
在提示符之后输入source /root/.bash_profile
在提示符之后输入arm 并且连续按两次 table 键,确认系统已经包含 arm-linux-gcc-3.3.2 编译器,如图 3 所示。
(2 )解压 MPlayer-1.0pre7try2.tar.bz2
在实验目录下,解压MPlayer-1.0pre7try2.tar.bz2 软件包,并改名为 MPlayer
# tar jxvf MPlayer-1.0pre7try2.tar.bz2
# mv MPlayer-1.0pre7try2 MPlayer
(3) 编译生成MPlayer 应用程序
进入MPlayer 目录之后,输入如下命令:
# ./configure --cc=arm-linux-gcc-3.3.2 --host-cc=gcc --target=arm-armv4l-linux --enable- linux-devfs --disable-win32 --disable-dvdread --enable-fbdev --disable-mencoder --enable- libavcodec --enable-liba52 --disable-libmpeg2 --enable-static --disable-mp3lib --disable-live
执行make ,完成之后会在该目录下生成可执行文件 mplayer
# make
2. 测试LCD 驱动
启动开发板,远程mount 宿主机的程序目录,运行 MPlayer :
# mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.123:/arm2410s /tmp
# cd /tmp/MPlayer
# ./mplayer test.avi
随后,便可在LCD 上看到 MPlayer 显示效果 。