LTV350QV移植到linux2.6.33内核
来源:互联网 发布:算法推荐书籍python 编辑:程序博客网 时间:2024/06/05 18:41
一、修改/arch/arm/mach-s3c2410/mach-smdk2410.c文件
1、添加头文件
#include <mach/fb.h>
#include <mach/regs-lcd.h>
2、添加初始化s3c2410的LCD控制器时所需的参数(copy from /arch/arm/mach-s3c2410/mach-qt2410.c,稍作修改)。
static struct s3c2410fb_display qt2410_lcd_cfg[] __initdata = {
{
/* Config for 240x320 LCD */
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 320,//略有修改
.height = 240,
.pixclock = 100000, /* HCLK/10 */
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 13,
.right_margin = 8,
.hsync_len = 4,
.upper_margin = 2,
.lower_margin = 7,
.vsync_len = 4,
},
};
static struct s3c2410fb_mach_info qt2410_fb_info __initdata = {
.displays = qt2410_lcd_cfg,
.num_displays = ARRAY_SIZE(qt2410_lcd_cfg),
.default_display = 0,
.lpcsel = ((0xCE6) & ~7) | 1<<4,
};
3、添加LCD控制器的寄存器参数设置函数
static void __init smdk2410_init(void)
{
s3c24xx_fb_set_platdata(&qt2410_fb_info);//加入液晶的配置文件
set_s3c2410ts_info(&MY2410_ts_cfg);//加入触摸屏的配置文件
s3c_i2c0_set_platdata(NULL);
platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
smdk_machine_init();
}
5,修改arch/arm/mach-s3c2410/include/mach/regs-lcd.h文件
root@yuanxh-desktop:/home/yuanxh/s3c2410/linux-2.6.26-9g24x0# vi include/asm-arm/arch-s3c2410/regs-lcd.h
把#define S3C2410_LCDCON1_MMODE (1<<7)修改成:
//#define S3C2410_LCDCON1_MMODE (1<<7)
#define S3C2410_LCDCON1_MMODE (0<<7) // change by yuanxihua@21cn.com
6,修改drivers/video/s3c2410fb.c文件
root@yuanxh-desktop:/home/yuanxh/s3c2410/linux-2.6.26-9g24x0# vi drivers/video/s3c2410fb.c
在第51行的/* useful functions */后添加:
/************************************************/
//LTV350QV_FOE_V0.0
#define LTV350QV_FOE 0x1d //device ID
typedef struct _LTV350qv_spi_data_{
unsigned char Device_ID; //ID of the device
unsigned int Index; //index of register
unsigned long Structure; //structure to be writed
}LTV350QV_SPI_Data;
//micro for LTV350QV_FOE
#define CS_H __raw_writel(__raw_readl(S3C2410_GPCDAT) |(1<< 8), S3C2410_GPCDAT)//MAKE_HIGH(LTV350QV_CS)
#define CS_L __raw_writel(__raw_readl(S3C2410_GPCDAT)&~(1<< 8), S3C2410_GPCDAT)//MAKE_LOW(LTV350QV_CS)
#define SCLK_H __raw_writel(__raw_readl(S3C2410_GPCDAT) |(1<< 9), S3C2410_GPCDAT)//MAKE_HIGH(LTV350QV_SCL)
#define SCLK_L __raw_writel(__raw_readl(S3C2410_GPCDAT)&~(1<< 9), S3C2410_GPCDAT)//MAKE_LOW(LTV350QV_SCL)
#define SDI_H __raw_writel(__raw_readl(S3C2410_GPCDAT) |(1<<10), S3C2410_GPCDAT)//MAKE_HIGH(LTV350QV_SDI)
#define SDI_L __raw_writel(__raw_readl(S3C2410_GPCDAT)&~(1<<10), S3C2410_GPCDAT)//MAKE_LOW(LTV350QV_SDI)
#define RST_H __raw_writel(__raw_readl(S3C2410_GPDDAT) |(1<< 0), S3C2410_GPDDAT)//MAKE_HIGH(LTV350QV_RST)
#define RST_L __raw_writel(__raw_readl(S3C2410_GPDDAT)&~(1<< 0), S3C2410_GPDDAT)//MAKE_LOW(LTV350QV_RST)
//***************************************************************
//**********these functions for SUMSUN LTV350QV TFT LCD****************
//***************************************************************
static void LTV350QV_Short_Delay(u_char time)
{
ndelay(150);
}
/*
static void LTV350QV_Rst(void)
{
RST_L;
mdelay(1);
RST_H;
mdelay(1);
}
*/
static void LTV350QV_Register_Write(LTV350QV_SPI_Data regdata)
{
u_char i,temp1;
u_int temp2;
u_long temp3;
unsigned long flags;
//write index
temp1=regdata.Device_ID<<2 | 0<<1 | 0<<0; //register index
temp2=regdata.Index;
temp3=(temp1<<24) | (temp2<<8);
local_irq_save(flags);
CS_L;
LTV350QV_Short_Delay(1);
for(i=0;i<24;i++)
{
SCLK_L;
if(temp3 & (1<<(31-i)) ) //if is H
SDI_H;
else
SDI_L;
LTV350QV_Short_Delay(1); //setup time
SCLK_H;
LTV350QV_Short_Delay(1); //hold time
}
CS_H;
LTV350QV_Short_Delay(5);
//write instruction
temp1=regdata.Device_ID<<2 | 1<<1 | 0<<0; //instruction
temp2=regdata.Structure;
temp3=(temp1<<24) | (temp2<<8);
CS_L;
LTV350QV_Short_Delay(1);
for(i=0;i<24;i++)
{
SCLK_L;
if(temp3 & (1<<(31-i)) ) //if is H
SDI_H;
else
SDI_L;
LTV350QV_Short_Delay(1);
SCLK_H;
LTV350QV_Short_Delay(1);
}
CS_H;
local_irq_restore(flags);
}
/****************************************
* *
****************************************/
static void LTV350QV_Write(u_int index, u_int regdata)
{
LTV350QV_SPI_Data WriteData;
WriteData.Device_ID = LTV350QV_FOE;
WriteData.Index = index;
WriteData.Structure = regdata;
LTV350QV_Register_Write(WriteData);
}
/****************************************
* *power ON sequence
****************************************/
static void LTV350QV_Power_ON(void)
{
LTV350QV_Write( 9, 0x0000);
mdelay(150);
LTV350QV_Write( 9, 0x4000);
LTV350QV_Write(10, 0x2000);
LTV350QV_Write( 9, 0x4055);
mdelay(550);
LTV350QV_Write( 1, 0x409d);
LTV350QV_Write( 2, 0x0204);
LTV350QV_Write( 3, 0x0100);
LTV350QV_Write( 4, 0x3000);
LTV350QV_Write( 5, 0x4003);
LTV350QV_Write( 6, 0x000a);
LTV350QV_Write( 7, 0x0021);
LTV350QV_Write( 8, 0x0c00);
LTV350QV_Write(10, 0x0103);
LTV350QV_Write(11, 0x0301);
LTV350QV_Write(12, 0x1f0f);
LTV350QV_Write(13, 0x1f0f);
LTV350QV_Write(14, 0x0707);
LTV350QV_Write(15, 0x0307);
LTV350QV_Write(16, 0x0707);
LTV350QV_Write(17, 0x0000);
LTV350QV_Write(18, 0x0004);
LTV350QV_Write(19, 0x0000);
mdelay(200);
LTV350QV_Write( 9, 0x4a55);
LTV350QV_Write( 5, 0x5003);
}
/**********************************
* *power OFF sequence
**********************************/
/*static void LTV350QV_Powen_OFF(void)
{
LTV350QV_Write( 9, 0x4055);// GON -> 0, POC -> 0
LTV350QV_Write( 5, 0x4003);// DSC -> 0
LTV350QV_Write(10, 0x0000);// VCOMG -> 0
mdelay(20);
LTV350QV_Write( 9, 0x4000);// AP[2:0] -> 000
}*/
static void s3c2440fb_init_ltv350qv(void)
{
__raw_writel(0xaa9556a9, S3C2410_GPCCON); //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
//LCDVF[0],[1],[2]---output;VD[0],[1],[2]----output.
__raw_writel(0xffffffff, S3C2410_GPCUP); // Disable Pull-up register
LTV350QV_Power_ON() ; //init LCD model
__raw_writel(0xaaaaaaaa, S3C2410_GPDCON);
__raw_writel(0xffffffff, S3C2410_GPDUP);
// __raw_writel(3, S3C2410_LCDINTMSK); // MASK LCD Sub Interrupt
// __raw_writel(0, S3C2410_TPAL); // Disable Temp Palette
// __raw_writel(0, S3C2410_LPCSEL); // Disable LPC3600
}
在static int s3c2410fb_init_registers(struct fb_info *info)的 return 0;前添加:
s3c2440fb_init_ltv350qv();
5、去除10分钟左右自动关闭显示的程序(实验时可以这么做,我猜应该是节能作用,并未深究。)。
copy from《2410 lcd(ltv350)驱动在2.6.14下的移植经历》:
“按seigpao大侠的做法,注释掉drivers/char/vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则,lcd会在10分钟左右关掉显示。“
6、二、配置内核
Device Drivers --->
Graphics support --->
Display device support --->
<*> Display panel/monitor support
<*> Support for frame buffer devices
<*> S3C2410 LCD framebuffer 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
7、开机画面的选择
(1)用 GIMP 图像编辑器打开你想要的图像文件,依次选择图像->模式->索引颜色,将颜色改为 224
色;至于图片大小,不要大于你的显示器分辨率就好(我只试过 80*80 和 320*240 的大小),最后将
文件保存为 ppm 格式(ASCii 码),文件名为:logo_linux_clut224.ppm。
(2)将 logo_linux_clut224.ppm 拷贝到/drivers/video/logo 文件夹下,替换原有的文件(记得备份啊,
以防万一)。
- LTV350QV移植到linux2.6.33内核
- linux2.6.14内核移植到2410
- 移植linux2.6.25内核到s3c2440详解
- 移植linux2.6.29内核到mini2440
- yaffs2移植到内核linux2.6.38
- 移植linux2.6.38内核到TQ2440
- 移植linux2.6.38内核到TQ2440
- [S3C6410]Linux2.6.28到Linux2.6.32的内核移植
- linux内核移植 移植linux2.6.25内核到s3c2440详解
- FL2440移植linux2.6.33内核(备忘)
- Linux2.6.24内核移植
- 移植linux2.6.38.8内核到Mini2440 ---- 记录
- 成功移植linux2.6.38内核到TQ2440(转)
- 成功移植linux2.6.38内核到TQ2440(转)
- 成功移植linux2.6.38内核到TQ2440 …
- 成功移植linux2.6.38内核到TQ2440 …
- 成功移植linux2.6.38内核到TQ2440(转)
- 2410 移植LCD 驱动LTV350QV
- hdu 1166 && PKU 3264
- 毕业后路怎么走
- 简单的命令控制同一局域网内的电脑
- C++跨平台开发心得小结
- sql存储过程分页
- LTV350QV移植到linux2.6.33内核
- Web 3G设想
- 利用临时表汇总多表的数据
- Xbtqz gucci shoes vadz Solo10.com Expired Domains 26 ...
- 数据库名,实例名,数据库域名,全局数据库名,服务名
- 无刷新修改数据库列值
- Coding Convention for C
- C/C++程序内存分配详解
- Static 作用详述