新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > S5PV210(TQ210)學(xué)習(xí)筆記——LCD驅(qū)動編寫

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ā)板上試運(yùn)行即可。

    本文引用地址:http://butianyuan.cn/article/201611/322809.htm

    在安裝驅(qū)動程序前執(zhí)行指令:

    1. ls/dev/fb*
    如果有fb0或者其他fb*存在,應(yīng)該修改內(nèi)和配置,取消其他fb的配置,如果看不到fb*設(shè)備,則可以按照如下步驟進(jìn)行測試。
    測試前還需要修改下內(nèi)核配置,有兩個原因:

    (1) 內(nèi)核默認(rèn)配置下不支持Frame buffer

    (2) 我們的驅(qū)動程序中用到了三個函數(shù):

    1. .fb_fillrect=cfb_fillrect,
    2. .fb_copyarea=cfb_copyarea,
    3. .fb_imageblit=cfb_imageblit,
    這三個函數(shù)是引用的內(nèi)核中的函數(shù),不是我們自行實現(xiàn)的。



    關(guān)鍵詞: S5PV210LCD驅(qū)動編

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉