移植Linux内核自带LCD驱动程序到JZ2440开发板
内核版本:Linux3.14.27开发板:JZ2440通常来说移植LCD驱动程序到嵌入式Linux平台并不是一件很难的事情。一般移植LCD到Linux开发平台有两种选择,一种是编写自己的LCD驱动程序并嵌入到Linux内核,另一种是根据自己所使用开发平台的硬件手册直接修改内核里面相关的代码。后一种方法比前一种方法简单一些,下面就以JZ2440 4.3寸LCD开发板为例移植内
内核版本:Linux3.14.27
开发板:JZ2440
通常来说移植LCD驱动程序到嵌入式Linux平台并不是一件很难的事情。一般移植LCD到Linux开发平台有两种选择,一种是编写自己的LCD驱动程序并嵌入到Linux内核,另一种是根据自己所使用开发平台的硬件手册直接修改内核里面相关的代码。后一种方法比前一种方法简单一些,下面就以JZ2440 4.3寸LCD开发板为例移植内核自带的LCD驱动程序,其中所使用的的Linux内核版本为Linux3.14.27。
1.移植
修改linux-3.14.27/arch/arm/mach-s3c24xx目录下mach-smdk2440.c文件中的相关代码:
1.1修改s3c2410fb_display结构体
这个结构体非常重要,用来向内核提供LCD屏的尺寸和时序上的一些要求等,用于LCD控制寄存器的配置,s3c2410fb_display结构修改以后的内容为:
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 480,
.height = 272,
.pixclock = 100000, /* HCLK 100 MHz,pixclk = 10^12 / VCLK */
.xres = 480,
.yres = 272,
.bpp = 16,
.left_margin = 1, /* For HBPD */
.right_margin = 1, /* For HFPD */
.hsync_len = 40, /* For HSPW */
.upper_margin = 1, /* For VPBD */
.lower_margin = 1, /* For VFBD */
.vsync_len = 9, /* For VSWP */
};
s3c2410fb_display结构中相关成员的含义,及计算方法:(这些参数的取值LCD生产厂家会有数据手册予以说明)
pixclock的计算方法:pixclk = 10^12 / VCLK;(VCLK是LCD的时钟频率,这里根据LCD数据手册选择10MHz)
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin;
VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的lower_margin;
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len;
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,对应驱动中的left_margin;
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,对应驱动中的right_margin;
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算,对应驱动中的hsync_len;
1.2 修改s3c2410fb_mach_info结构体
这个结构用于向内核提供用于控制LCD的GPIO管脚的配置信息,s3c2410fb_mach_info结构修改后的内容为:
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
.displays = &smdk2440_lcd_cfg,
.num_displays = 1,
.default_display = 0,
#if 1
/* currently setup by downloader */
.gpccon = 0xaaaaaaaa, /* 将GPC端口配置为LCD控制管脚 */
.gpccon_mask = 0xffffffff,
.gpcup = 0xffff, /* 禁止GPC端口内部上拉 */
.gpcup_mask = 0x0000,
.gpdcon = 0xaaaaaaaa, /* 将GPD端口配置为LCD控制管脚 */
.gpdcon_mask = 0xffffffff,
.gpdup = 0xffff, /* 禁止GPD端口内部上拉 */
.gpdup_mask = 0x0000,
#endif
//.lpcsel = ((0xCE6) & ~7) | 1<<4,
};
1.3初始化LCD背光控制引脚,打开背光
smdk2440_machine_init函数用于完成设备的添加和相关初始化,在smdk2440_machine_init函数的后面添加LCD背光控制代码如下所示:
static void __init smdk2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&smdk2440_fb_info);
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));
smdk_machine_init();
/* 添加以下两句代码 */
writel((readl(S3C2410_GPBCON) & ~(3)) | 1, S3C2410_GPBCON); // 初始化背光控制引脚为输出
writel((readl(S3C2410_GPBDAT) | 1), S3C2410_GPBDAT); // 打开背光
}
2.配置内核添加图形支持
在linux-3.14.27/目录下输入“make menuconfig”,配置如下:
linux-3.14.27# make menuconfig
General setup --->
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
--- Support for frame buffer devices
[*] Enable firmware EDID
[ ] Framebuffer foreign endianness support ----
[ ] Enable Tile Blitting Support
*** Frame buffer hardware drivers **
< > OpenCores VGA/LCD core 2.0 framebuffer support
< > Epson S1D13XXX framebuffer support
<*> S3C2410 LCD framebuffer support
[ ] S3C2410 lcd debug messages
<*> Silicon Motion SM501 framebuffer support
< > SMSC UFX6000/7000 USB Framebuffer suppor
< > Displaylink USB Framebuffer support
< > Goldfish Framebuffer
< > Virtual Frame Buffer support (ONLY FOR TESTING!)
< > E-Ink Metronome/8track controller support
< > E-Ink Broadsheet/Epson S1D13521 controller suppor
< > AUO-K190X EPD controller support
[ ] Simple framebuffer support
[*] Bootup logo --->
--- Bootup logo
[ ] Standard black and white Linux logo
[ ] Standard 16-color Linux logo
[*] Standard 224-color Linux logo
3.测试
3.1编译出新的内核
在linux-3.14.27/目录下输入“make uImage”编译出新的内核,如下:
linux-3.14.27# make uImage
生成新的内核;
3.2将新的内核烧写到开发板
将新的内核(uImage)通过烧写工具烧写到开发板;
3.3重启开发板
重启开发板,就会看到LCD左上角的小企鹅启动界面。
更多推荐
所有评论(0)