- 論壇徽章:
- 0
|
把內(nèi)核自帶的LCD驅(qū)動(dòng)刪除掉以后,自己寫(xiě)的LCD 驅(qū)動(dòng)每次都在register_framebuffer(info);時(shí)出現(xiàn)段錯(cuò)誤,當(dāng)不刪除內(nèi)核自帶的LCD驅(qū)動(dòng)時(shí),把自己的LCD驅(qū)動(dòng)注冊(cè)為fb1時(shí),可以注冊(cè)成功,并且能夠用tislib成功測(cè)試,代碼如下
static int cnt;
static struct fb_info *info,fbinfo;
struct fb_ops s3cfb_ops = {
.owner = THIS_MODULE,
.fb_fillrect = cfb_fillrect,
.fb_copyarea = cfb_copyarea,
.fb_imageblit = cfb_imageblit,
};
int request_io(void)
{
printk("\nget in the IO\n" ;
/* ss=request_mem_region(0x71200010,0x04,"fb0" ;
if(!ss)
{
printk("\nrequest VIC0INTENABLE failed\n" ;
return -ENXIO;
}
ss=ioremap(0x71200010,0x04);
if(!ss)
{
printk("\nioremap VIC0INTENABLE failed\n" ;
return -ENXIO;
}*/
k=request_mem_region(0x7F008100,0x0c,"fb0" ;
if(!k)
{
printk("\nrequest GPICON_IO failed\n" ;
return -ENXIO;
}
k=ioremap(0x7F008100,0x0c);
if(!k)
{
printk("\nioremap GPICON_IO failed\n" ;
return -ENXIO;
}
zz=request_mem_region(0x7F006000,0x48,"fb0" ;
if(!zz)
{
printk("\nrequest PWMTIMER_BASE failed\n" ;
return -ENXIO;
}
zz=ioremap(0x7F006000,0x4 ;
if(!zz)
{
printk("\nioremap PWMTIMER_BASE failed\n" ;
return -ENXIO;
}
b=request_mem_region(0x7E00F030,0x04,"fb0");
if(!b)
{
printk("\nrequest HCLK_GATE failed\n");
return -ENXIO;
}
b=ioremap(0x7E00F030,0x04);
if(!b)
{
printk("\nioremap HCLK_GATE failed\n");
return -ENXIO;
}
xx=request_mem_region(0x7F008080,0x28,"fb0");
if(!xx)
{
printk("\nrequest GPECON failed\n");
return -ENXIO;
}
xx=ioremap(0x7F008080,0x2 ;
if(!xx)
{
printk("\nioremap GPECON failed\n");
return -ENXIO;
}
x=request_mem_region(0x7F008120,0x0c,"fb0");
if(!x)
{
printk("\nrequest GPJCON_IO failed\n");
return -ENXIO;
}
x=ioremap(0x7F008120,0x0c);
if(!x)
{
printk("\nioremap GPJCON_IO failed\n");
return -ENXIO;
}
y=request_mem_region(0x7F0081A0,0x04,"fb0");
if(!y)
{
printk("\nrequest SPCON failed\n");
return 0;
}
y=ioremap(0x7F0081A0,0x04);
if(!y)
{
printk("\nioremap SPCON failed\n");
return 0;
}
l=request_mem_region(0x7410800C,0x04,"fb0");
if(!l)
{
printk("\nrequest MIFPCON failed\n");
return -ENXIO;
}
l=ioremap(0x7410800C,0x04);
if(!l)
{
printk("\nioremap MIFPCON failed\n");
return -ENXIO;
}
printk("finish the io\n");
}
int __devinit s3cfb_init(void)
{
info= framebuffer_alloc(0, NULL);
if (!info)
return -ENOMEM;
printk(KERN_EMERG"finish the framebuffer");
strcpy(info->fix.id,"s3ccfb");
printk(KERN_EMERG"finish the strcpy");
info->fix.smem_len=480*800*16/8;
info->fix.type=FB_TYPE_PACKED_PIXELS;
info->fix.visual=FB_VISUAL_TRUECOLOR;
info->fix.line_length=800*2;
info->var.xres=800;
info->var.yres=480;
info->var.xres_virtual=800;
info->var.yres_virtual=480;
info->var.bits_per_pixel=16;
info->var.red.offset=11;
info->var.red.length=5;
info->var.green.offset=5;
info->var.green.length=6;
info->var.blue.offset=0;
info->var.blue.length=5;
info->var.activate=FB_ACTIVATE_NOW;
info->fbops=&s3cfb_ops;
//s3c_lcd->screen_base is virtual address
info->screen_size=480*800*2;
//s3c_lcd->fix.smem_start is physical address
request_io();
value=readl(HCLK_GATE);
value=value|1<<3;
writel(value,HCLK_GATE);
mm=ioremap(0x77100000,0x350);
if (mm == NULL) {
printk(KERN_EMERG"ioremap() of registers failed\n");
return -ENOMEM;
}
printk(KERN_EMERG"finish the ioremap");
value=0x00011111;
writel(value,lu_GPECON);
value=0x00000001;
writel(value,lu_GPEDAT);
value=0x8AAAAAAA;
writel(value,lu_GPFCON);
value=0x00000000;
writel(value,lu_GPFDAT);
value=0x80000000;
writel(value,lu_GPFPUD);
value=0xAAAAAAAA;
writel(value,lu_GPICON);
value=0x00AAAAAA;
writel(value,lu_GPJCON);
value=0x15<<16 | 0x16<<8 | 0x02<<0;
writel(value,S3C_VIDTCON0);
value=0x2C<<16 | 0xD2<<8 | 0x02<<0;
writel(value,S3C_VIDTCON1);
value=(480 - 1)<<11|(800 - 1);
writel(value,S3C_VIDTCON2);
value=1<<19|1<<15|1<<12|1;
writel(value,S3C_VIDINTCON0);
value=readl(S3C_VIDINTCON1);
writel(value,S3C_VIDINTCON1);
value=readl(lu_MIFPCON);
value=value&~(1<<3);
writel(value,lu_MIFPCON);
value=readl(lu_SPCON);
value = (value & ~(0x3)) | 1;
writel(value,lu_SPCON);
value=2<<5|1<<3|2<<1|1;
writel(value,S3C_DITHMODE);
value = request_irq(62, s3_irq, 0, "s3ccfb", NULL);
if (value != 0) {
printk("s3c_ts.c: Could not request lcd_irq !\n");
return -EIO;
}
value=(0<<26)|(0<<17)|(0<<16)|(3<<6)|(0<<5)|(1<<4)|(0<<2);
writel(value,S3C_VIDCON0);
value=readl(S3C_VIDCON1);
value |= 1<<5|1<<6;
writel(value,S3C_VIDCON1);
value=0;
writel(value,S3C_VIDOSD0A);
value=(800 - 1)<<11 |(480 - 1);
writel(value,S3C_VIDOSD0B);
value=480*800*2;
writel(value,S3C_VIDOSD0C);
value=readl(S3C_WINCON0);
value |= 1<<0;
value &= ~(0xf << 2);
value |= 0x5<<2;
writel(value,S3C_WINCON0);
info->screen_base = dma_alloc_writecombine(NULL, info->fix.smem_len,&info->fix.smem_start, GFP_KERNEL);
printk(KERN_EMERG"finish the dma_alloc_writecombine");
value=info->fix.smem_start;
writel(value,S3C_VIDW00ADD0B0);
value=(info->fix.smem_start+info->fix.smem_len)&0xFFFFFF;
writel(value,S3C_VIDW00ADD1B0);
/*value= request_irq(55, do_irq, IRQF_DISABLED, "LCD", NULL);
if (value != 0) {
printk("s3c_ts.c: Could not request timer_irq !\n");
return -EIO;
}*/
pwm(50);
printk("register framebuffer\n");
value=readl(S3C_VIDCON0);
value=value|3;
writel(value,S3C_VIDCON0);
value=register_framebuffer(info);
if (value < 0) {
printk(KERN_EMERG"Failed to register framebuffer device");}
printk("finish the insmod\n");
return 0;
}
YA@$QDF8)NQH02NVOX~IC0U.jpg (12.65 KB, 下載次數(shù): 44)
下載附件
2014-09-30 23:01 上傳
WWD5(T1J[RB53P2%_X}[5_B.jpg (30.64 KB, 下載次數(shù): 35)
下載附件
2014-09-30 23:10 上傳
問(wèn)題1:當(dāng)刪除系統(tǒng)自帶驅(qū)動(dòng),注冊(cè)自己的LCD驅(qū)動(dòng)fb0以后,文字出現(xiàn)位移導(dǎo)致不清楚的圖片,這是用tislib測(cè)試時(shí)打印出的代碼,明顯的能看出來(lái)這個(gè)箭頭的光標(biāo)行與行之間有漂移,位置不對(duì),到底是什么原因會(huì)導(dǎo)致這樣的問(wèn)題呀,而且自己的驅(qū)動(dòng)注冊(cè)fb0成功只能把register_framebuffer(info);函數(shù)寫(xiě)在int __devinit s3cfb_init(void)函數(shù)的ioremap()函數(shù)之前,一旦寫(xiě)在ioremap()函數(shù)之后,就無(wú)法注冊(cè)成功了,出現(xiàn)段錯(cuò)誤。
問(wèn)題2:當(dāng)不刪除系統(tǒng)自帶的LCD驅(qū)動(dòng),也就是已經(jīng)有了fb0,注冊(cè)自己的驅(qū)動(dòng)fb1時(shí),不管register_framebuffer(info)函數(shù)寫(xiě)在int __devinit s3cfb_init(void)函數(shù)的什么位置,都能調(diào)用成功,而且當(dāng)用tislib測(cè)試自己的FB1 LCD驅(qū)動(dòng)時(shí)畫(huà)面顯示正常,一點(diǎn)問(wèn)題都沒(méi)有,和上面問(wèn)題1作對(duì)比,感覺(jué)有沒(méi)有去掉系統(tǒng)驅(qū)動(dòng)對(duì)我的驅(qū)動(dòng)影響很大,不知道為什么會(huì)這樣,已經(jīng)糾結(jié)這個(gè)問(wèn)題幾個(gè)月了,求高手指點(diǎn)迷津,不甚感謝!!
|
|