新闻中心

EEPW首页>嵌入式系统>设计应用> S5PV210(TQ210)学习笔记——LCD驱动编写

S5PV210(TQ210)学习笔记——LCD驱动编写

作者: 时间:2016-11-28 来源:网络 收藏
  • lcd_info->screen_size=800*480*4;
  • lcd_info->pseudo_palette=pseudo_palette;
  • lcd_info->fbops=&lcd_fbops;
  • /*配置硬件资源*/
  • /*映射内存*/
  • 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;
  • //开启状态
  • *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");
  • 将上面的代码在自己的内核环境下编译,然后下载到开发板上试运行即可。

    本文引用地址: //m.amcfsurvey.com/article/201611/322809.htm

    在安装驱动程序前执行指令:

    1. ls/dev/fb*
    如果有fb0或者其他fb*存在,应该修改内和配置,取消其他fb的配置,如果看不到fb*设备,则可以按照如下步骤进行测试。
    测试前还需要修改下内核配置,有两个原因:

    (1) 内核默认配置下不支持Frame buffer

    (2) 我们的驱动程序中用到了三个函数:

    1. .fb_fillrect=cfb_fillrect,
    2. .fb_copyarea=cfb_copyarea,
    3. .fb_imageblit=cfb_imageblit,
    这三个函数是引用的内核中的函数,不是我们自行实现的。



    关键词:S5PV210LCD驱动编

    评论


    相关推荐

    技术专区

    关闭