S5PV210(TQ210)學(xué)習(xí)筆記——LCD驅(qū)動編寫
作者:
時間:2016-11-28
來源:網(wǎng)絡(luò)
收藏
lcd_info->screen_size=800*480*4;lcd_info->pseudo_palette=pseudo_palette;lcd_info->fbops=&lcd_fbops;/*配置硬件資源*//*映射內(nèi)存*/display_control=ioremap(0xe0107008,4);gpf0con=ioremap(0xE0200120,4);gpf1con=ioremap(0xE0200140,4);gpf2con=ioremap(0xE0200160,4);gpf3con=ioremap(0xE0200180,4);gpd0con=ioremap(0xE02000A0,4);gpd0dat=ioremap(0xE02000A4,4);vidcon0=ioremap(0xF8000000,4);vidcon1=ioremap(0xF8000004,4);vidtcon0=ioremap(0xF8000010,4);vidtcon1=ioremap(0xF8000014,4);vidtcon2=ioremap(0xF8000018,4);wincon0=ioremap(0xF8000020,4);vidosd0a=ioremap(0xF8000040,4);vidosd0b=ioremap(0xF8000044,4);vidosd0c=ioremap(0xF8000048,4);vidw00add0b0=ioremap(0xF80000A0,4);vidw00add1b0=ioremap(0xF80000D0,4);shodowcon=ioremap(0xF8000034,4);/*配置GPIO*/*gpf0con=0x22222222;*gpf1con=0x22222222;*gpf2con=0x22222222;*gpf3con=0x22222222;*gpd0con&=~0xf;*gpd0con|=0x1;*gpd0dat|=1<<0;*display_control=2<<0;/*使能時鐘*/lcd_clk=clk_get(NULL,"lcd");if(!lcd_clk||IS_ERR(lcd_clk)){printk(KERN_INFO"failedtogetlcdclocksource");}clk_enable(lcd_clk);/*配置LCD控制器*/*vidcon0=(4<<6)|(1<<4);*vidcon1=(1<<6)|(1<<5)|(1<<4);*vidtcon0=(17<<16)|(26<<8)|(4<<0);*vidtcon1=(40<<16)|(214<<8)|(4<<0);*vidtcon2=(479<<11)|(799<<0);*wincon0&=~(0xf<<2);*wincon0|=(0xb<<2);*vidosd0a=(0<<11)|(0<<0);*vidosd0b=(799<<11)|(479<<0);*vidosd0c=480*800;//物理地址lcd_info->screen_base=dma_alloc_writecombine(NULL,lcd_info->fix.smem_len,(dma_addr_t*)&(lcd_info->fix.smem_start),GFP_KERNEL);*vidw00add0b0=lcd_info->fix.smem_start;*vidw00add1b0=lcd_info->fix.smem_start+lcd_info->fix.smem_len;*shodowcon=0x1;//開啟狀態(tài)*wincon0|=1;*vidcon0|=3;/*注冊fb_info*/ret=register_framebuffer(lcd_info);returnret;}staticvoidlcd_exit(void){unregister_framebuffer(lcd_info);dma_free_writecombine(NULL,lcd_info->fix.smem_len,(void*)lcd_info->screen_base,(dma_addr_t)lcd_info->fix.smem_start);iounmap(shodowcon);iounmap(vidw00add1b0);iounmap(vidw00add0b0);iounmap(vidosd0c);iounmap(vidosd0b);iounmap(vidosd0a);iounmap(wincon0);iounmap(vidtcon2);iounmap(vidtcon1);iounmap(vidtcon0);iounmap(vidcon1);iounmap(vidcon0);iounmap(gpd0dat);iounmap(gpd0con);iounmap(gpf3con);iounmap(gpf2con);iounmap(gpf1con);iounmap(gpf0con);framebuffer_release(lcd_info);}module_init(lcd_init);module_exit(lcd_exit);MODULE_LICENSE("GPL"); 將上面的代碼在自己的內(nèi)核環(huán)境下編譯,然后下載到開發(fā)板上試運行即可。
本文引用地址:http://m.butianyuan.cn/article/201611/322809.htm在安裝驅(qū)動程序前執(zhí)行指令:
如果有fb0或者其他fb*存在,應(yīng)該修改內(nèi)和配置,取消其他fb的配置,如果看不到fb*設(shè)備,則可以按照如下步驟進(jìn)行測試。
測試前還需要修改下內(nèi)核配置,有兩個原因:(1) 內(nèi)核默認(rèn)配置下不支持Frame buffer
(2) 我們的驅(qū)動程序中用到了三個函數(shù):
- .fb_fillrect=cfb_fillrect,
- .fb_copyarea=cfb_copyarea,
- .fb_imageblit=cfb_imageblit,
這三個函數(shù)是引用的內(nèi)核中的函數(shù),不是我們自行實現(xiàn)的。
評論