欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    lcd设备驱动之全解析.docx

    • 资源ID:1937856       资源大小:418.62KB        全文页数:61页
    • 资源格式: DOCX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    lcd设备驱动之全解析.docx

    linux中LCD设备驱动(1)framebuffer(帧缓冲)1、framebuffer 帧缓冲    帧缓冲(framebuffer)是Linux 系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。用户不必关心物理显示缓冲区的具体位置及存放方式,这些都由帧缓冲设备驱动本身来完成。    framebuffer机制模仿显卡的功能,将显卡硬件结构抽象为一系列的数据结构,可以通过framebuffer的读写直接对显存进行操作。用户可以将framebuffer看成是显存的一个映像,将其映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕上。    framebuffer是个字符设备,主设备号为29,对应于/dev/fb%d 设备文件。通常,使用如下方式(前面的数字表示次设备号)  0 = /dev/fb0 第一个fb 设备  1 = /dev/fb1 第二个fb 设备    fb 也是一种普通的内存设备,可以读写其内容。例如,屏幕抓屏:cp /dev/fb0 myfilefb 虽然可以像内存设备(/dev/mem)一样,对其read,write,seek 以及mmap。但区别在于fb 使用的不是整个内存区,而是显存部分。2、fb与应用程序的交互对于用户程序而言,它和其他的设备并没有什么区别,用户可以把fb看成是一块内存,既可以向内存中写数据,也可以读数据。fb的显示缓冲区位于内核空间,应用程序可以把此空间映射到自己的用户空间,在进行操作。在应用程序中,操作/dev/fbn的一般步骤如下:(1)打开/dev/fbn设备文件。(2)用ioctl()操作取得当前显示屏幕的参数,如屏幕分辨率、每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。(3)用mmap()函数,将屏幕缓冲区映射到用户空间。(4)映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。3、fb的结构及其相关结构体在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28includelinux)和Fbmem.c (linux2.6.28driversvideo)两个文件中,它们是fb设备驱动的中间层,为上层提供系统调用,为底层驱动提供接口。在fb.h文件中有fb驱动需要使用的很多结构,我们先对这些结构体进行说明:本章共介绍5个结构体:(1)、struct fb_info结构体(2)、struct fb_ops结构体(3)、struct fb_fix_screeninfo结构体(4)、struct fb_var_screeninfo结构体(5)、struct fb_cmap结构体(1)、struct fb_info结构体介绍一个帧缓冲区对应一个struct fb_info结构,它包括了帧缓冲设备的属性和操作的完整集合,每个帧设备都有一个fb_info结构体。源码如下:struct fb_info int node;int flags;struct mutex lock;/* Lock for open/release/ioctl funcs */互斥锁struct fb_var_screeninfo var;/* Current var */当前缓冲区的可变参数struct fb_fix_screeninfo fix;/* Current fix */固定参数struct fb_monspecs monspecs;/* Current Monitor specs */当前显示器标志struct work_struct queue;/* Framebuffer event queue */帧缓冲事件队列struct fb_pixmap pixmap;/* Image hardware mapper */图像硬件mapperstruct fb_pixmap sprite;/* Cursor hardware mapper */光标硬件mapperstruct fb_cmap cmap;/* Current cmap */当前的调色板struct list_head modelist;      /* mode list */struct fb_videomode *mode;/* current mode */当前的视频模式#ifdef CONFIG_FB_BACKLIGHT如果配置了LCD支持背光灯/* assigned backlight device */* set before framebuffer registration,   remove after unregister */背光调整struct backlight_device *bl_dev;/* Backlight level curve */struct mutex bl_curve_mutex;u8 bl_curveFB_BACKLIGHT_LEVELS;#endif#ifdef CONFIG_FB_DEFERRED_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;#endifstruct fb_ops *fbops;帧缓冲操作函数集struct device *device;/* This is the parent */父设备struct device *dev;/* This is this fb device */fb设备int class_flag;                    /* private sysfs flags */私有的sysfs标志#ifdef CONFIG_FB_TILEBLITTINGstruct fb_tile_ops *tileops;    /* Tile Blitting */图块blitting#endifchar _iomem *screen_base;/* Virtual address */虚拟基地址unsigned long screen_size;/* Amount of ioremapped VRAM or 0 */ ioremap的虚拟内存大小void *pseudo_palette;/* Fake palette of 16 colors */ 伪16位调色板#define FBINFO_STATE_RUNNING 0#define FBINFO_STATE_SUSPENDED 1u32 state;  /* Hardware state i.e suspend */硬件的状态void *fbcon_par;                /* fbcon use-only private area */* From here on everything is device dependent */void *par;  (2)、struct fb_ops结构体介绍/* * Frame buffer operations * * LOCKING NOTE: those functions must _ALL_ be called with the console * semaphore held, this is the only suitable locking mechanism we have * in 2.6. Some may be called at interrupt time at this point though. */fb_ops结构体用来实现对帧缓冲设备的操作,这些函数需要驱动开发人员编写,struct fb_ops /* open/release and usage marking */struct module *owner;打开和释放int (*fb_open)(struct fb_info *info, int user);int (*fb_release)(struct fb_info *info, int user);这两个函数对于非线性布局的/常规内存映射无法工作的帧缓冲设备需要/* For framebuffers with strange non linear layouts or that do not* work with normal memory mapped access*/ssize_t (*fb_read)(struct fb_info *info, char _user *buf,  size_t count, loff_t *ppos);ssize_t (*fb_write)(struct fb_info *info, const char _user *buf,   size_t count, loff_t *ppos);检测可变参数,并调整到支持的值/* checks var and eventually tweaks it to something supported,* DO NOT MODIFY PAR */int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info); 设置视频模式/* set the video mode according to info->var */int (*fb_set_par)(struct fb_info *info);设置color寄存器的值/* set color register */int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,   unsigned blue, unsigned transp, struct fb_info *info);批量设置color寄存器,设置颜色表/* set color registers in batch */int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);显示空白/* blank display */int (*fb_blank)(int blank, struct fb_info *info); pan显示/* pan display */int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);填充矩形/* Draws a rectangle */void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect); 数据复制/* Copy data from area to another */void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);图形填充/* Draws a image to the display */void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image); 绘制光标/* Draws cursor */int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor); 旋转显示/* Rotates the display */void (*fb_rotate)(struct fb_info *info, int angle); 等待blit空闲/* wait for blit idle, optional */int (*fb_sync)(struct fb_info *info); fb特定的ioctl操作/* perform fb specific ioctl (optional) */int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,unsigned long arg);处理32兼容的ioctl操作/* Handle 32bit compat ioctl (optional) */int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,unsigned long arg); fb特定的mmap操作/* perform fb specific mmap */int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);保存目前的硬件状态/* save current hardware state */void (*fb_save_state)(struct fb_info *info); 恢复被保存的硬件状态/* restore saved state */void (*fb_restore_state)(struct fb_info *info);通过fb_info获得framebuffer的能力/* get capability given var */void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,   struct fb_var_screeninfo *var);(3)、struct fb_fix_screeninfo结构体接收fb_fix_screeninfo结构体中,记录了用户不能修改的固定显示控制器参数。这些固定的参数如缓冲区的物理地址、缓冲区的长度等等。struct fb_fix_screeninfo char id16;  /* identification string eg "TT Builtin" */字符串形式的标识符unsigned long smem_start;/* Start of frame buffer mem */* (physical address) */fb缓存的开始位置_u32 smem_len;/* Length of frame buffer mem */ fb缓存的长度_u32 type;  /* see FB_TYPE_* */FB_TYPE_*类型_u32 type_aux;/* Interleave for interleaved Planes */分界_u32 visual;  /* see FB_VISUAL_* */ 屏幕使用的色彩模式 _u16 xpanstep;/* zero if no hardware panning  */如果没有硬件panning ,赋0_u16 ypanstep;/* zero if no hardware panning  */_u16 ywrapstep;/* zero if no hardware ywrap    */1行的字节数_u32 line_length;/* length of a line in bytes    */内存映射I/O的开始位置unsigned long mmio_start;/* Start of Memory Mapped I/O   */* (physical address) */内存映射I/O的长度_u32 mmio_len;/* Length of Memory Mapped I/O  */_u32 accel;  /* Indicate to driver which */*  specific chip/card we have*/_u16 reserved3;/* Reserved for future compatibility */;(4)、struct fb_var_screeninfo结构体介绍fb_var_screeninfo结构体中存储了用户可以修改的显示器控制参数,例如屏幕分辨率、透明度等等。struct fb_var_screeninfo _u32 xres;  /* visible resolution */_u32 yres;可见解析度,即分辨率_u32 xres_virtual;/* virtual resolution*/_u32 yres_virtual; 虚拟解析度_u32 xoffset;/* offset from virtual to visible */_u32 yoffset;/* resolution*/虚拟到可见之间的偏移_u32 bits_per_pixel;/* guess what*/ 每像素位数,BPP_u32 grayscale;/* != 0 Graylevels instead of colors */ 非0时指灰度struct fb_bitfield red;/* bitfield in fb mem if true color, */struct fb_bitfield green;/* else only length is significant */struct fb_bitfield blue;fb缓存的RGB位域struct fb_bitfield transp;/* transparency*/透明度_u32 nonstd;  /* != 0 Non standard pixel format */!= 0 非标准像素格式_u32 activate;/* see FB_ACTIVATE_*/       _u32 height;  /* height of picture in mm    */ 屏幕的高度_u32 width;  /* width of picture in mm     */屏幕的宽度_u32 accel_flags;/* (OBSOLETE) see fb_info.flags */fb_info的标志/* Timing: All values in pixclocks, except pixclock (of course) */_u32 pixclock;/* pixel clock in ps (pico seconds) */* 像素时钟(皮秒) */_u32 left_margin;/* time from sync to picture*/ 行切换:从同步到绘图之间的延迟_u32 right_margin;/* time from picture to sync*/        行切换:从绘图到同步之间的延迟_u32 upper_margin;/* time from sync to picture*/        帧切换:从同步到绘图之间的延迟_u32 lower_margin;         帧切换:从绘图到同步之间的延迟_u32 hsync_len;/* length of horizontal sync*/         水平同步的长度_u32 vsync_len;/* length of vertical sync*/         垂直同步的长度_u32 sync;  /* see FB_SYNC_* */_u32 vmode;  /* see FB_VMODE_* */_u32 rotate;  /* angle we rotate counter clockwise */        顺时钟旋转的角度_u32 reserved5;/* Reserved for future compatibility */;(5)、struct fb_cmap结构体介绍fb_cmap结构体中记录了颜色板信息,即调色板信息。,用户空间可以通过ioctl()的FBIOGETCMAP和 FBIOPUTCMAP命令读取或设定颜色表。struct fb_cmap _u32 start;  /* First entry */第一个元素的入口_u32 len;  /* Number of entries */元素个数_u16 *red;  /* Red values */红色、绿色、蓝色_u16 *green;  _u16 *blue;_u16 *transp;/* transparency, can be NULL */透明度;上面这些结构体之间有什么关系呢?看下图:(6)、fb_bitfield 结构体描述每一像素显示缓冲区的组织方式,包含位域偏移、位域长度和MSB 指示,struct fb_bitfield _u32 offset;  /* beginning of bitfield */         位域偏移_u32 length;  /* length of bitfield */        位域长度_u32 msb_right;/* != 0 : Most significant bit is */ /* right */        MSB;上一篇说了framebuffer帧缓冲的有关知识,这一篇具体的说下LCD驱动的实现。1、LCD设备驱动在linux内核中是作为平台设备存在,所以又要说那些已经说过很多遍的东西。int _devinit s3cfb_init(void)return platform_driver_register(&s3cfb_driver);static void _exit s3cfb_cleanup(void)platform_driver_unregister(&s3cfb_driver);module_init(s3cfb_init);module_exit(s3cfb_cleanup);对应的platform_driver结构体为:static struct platform_driver s3cfb_driver = .probe  = s3cfb_probe,.remove  = s3cfb_remove,.suspend  = s3cfb_suspend,.resume  = s3cfb_resume,        .driver = .name = "s3c-lcd",.owner  = THIS_MODULE,;那么平台设备的资源呢?/* LCD Controller */static u64 s3c_device_lcd_dmamask = 0xffffffffUL;struct platform_device s3c_device_lcd = .name  = "s3c-lcd",.id  = -1,设备编号,-1表示只有这样一个设备.num_resources = ARRAY_SIZE(s3c_lcd_resource),.resource   = s3c_lcd_resource,.dev              = .dma_mask  = &s3c_device_lcd_dmamask,.coherent_dma_mask= 0xffffffffUL;static struct resource s3c_lcd_resource = 0 = .start = S3C64XX_PA_LCD,  /LCD的I/O内存的开始位置.end   = S3C64XX_PA_LCD + SZ_1M - 1,.flags = IORESOURCE_MEM,1 = .start = IRQ_LCD_VSYNC,    /LCD的开始中断号.end   = IRQ_LCD_SYSTEM,  /LCD的结束中断号.flags = IORESOURCE_IRQ,;2、分析其probe函数,源码如下:/* *  Probe */static int _init s3cfb_probe(struct platform_device *pdev)struct resource *res;struct fb_info *fbinfo;s3cfb_info_t *info;char driver_name = "s3cfb"int index = 0, ret, size;fbinfo = framebuffer_alloc(sizeof(s3cfb_info_t), &pdev->dev);申请一个s3cfb_info_t结构体的空间if (!fbinfo)return -ENOMEM;platform_set_drvdata(pdev, fbinfo);info = fbinfo->par;info->dev = &pdev->dev;  填充info结构体变量的相应信息res = platform_get_resource(pdev, IORESOURCE_MEM, 0);获取LCD平台设备所使用的I/O端口资源。if (res = NULL) dev_err(&pdev->dev, "failed to get memory registersn");ret = -ENXIO;goto dealloc_fb;size = (res->end - res->start) + 1;info->mem = request_mem_region(res->start, size, pdev->name);申请LCD设备所占的I/O空间if (info->mem = NULL) dev_err(&pdev->dev, "failed to get memory regionn");ret = -ENOENT;goto dealloc_fb;info->io = ioremap(res->start, size);将LCD的I/O端口所占用的这段I/O空间映射到内存的虚拟地址。if (info->io = NULL) dev_err(&pdev->dev, "ioremap() of registers failedn");ret = -ENXIO;goto release_mem;s3cfb_pre_init();这个函数的源码在S3cfb_fimd4x.c (linux2.6.28driversvideosamsung)文件中,如下所示:void s3cfb_pre_init(void)/* initialize the fimd specific */s3cfb_fimd.vidintcon0 &= S3C_VIDINTCON0_FRAMESEL0_MASK;s3cfb_fimd.vidintcon0 |= S3C_VIDINTCON0_FRAMESEL0_VSYNC;s3cfb_fimd.vidintcon0 |= S3C_VIDINTCON0_INTFRMEN_ENABLE;writel(s3cfb_fimd.vidintcon0, S3C_VIDINTCON0);这个函数中涉及到一个结构体s3cfb_fimd_info_t s3cfb_fimd,和这个函数在同一个文件中定义,列出部分源码:s3cfb_fimd_info_t s3cfb_fimd = .vidcon0 = S3C_VIDCON0_INTERLACE_F_PROGRESSIVE | S3C_VIDCON0_VIDOUT_RGB_IF | S3C_VIDCON0_L1_DATA16_SUB_16_MODE | S3C_VIDCON0_L0_DATA16_MAIN_16_MODE | S3C_VIDCON0_PNRMODE_RGB_P | S3C_VIDCON0_CLKVALUP_ALWAYS | S3C_VIDCON0_CLKDIR_DIVIDED | S3C_VIDCON0_CLKSEL_F_HCLK | S3C_VIDCON0_ENVID_DISABLE | S3C_VIDCON0_ENVID_F_DISABLE,.dithmode = (S3C_DITHMODE_RDITHPOS_5BIT | S3C_DITHMODE_GDITHPOS_6BIT | S3C_DITHMODE_BDITHPOS_5BIT ) & S3C_DITHMODE_DITHERING_DISABLE,#if defined (CONFIG_FB_S3C_BPP_8).wincon0 =  S3C_WINCONx_BYTSWP_ENABLE | S3C_WINCONx_BURSTLEN_4WORD | S3C_WINCONx_BPPMODE_F_8BPP_PAL,.wincon1 =  S3C_WINCONx_HAWSWP_ENABLE | S3C_WINCONx_BURSTLEN_4WORD | S3C_WINCONx_BPPMODE_F_16BPP_565 | S3C_WINCONx_BLD_PIX_PLANE | S3C_WINCONx_ALPHA_SEL_1,.bpp = S3CFB_PIXEL_BPP_8,.bytes_per_pixel = 1,.wpalcon = S3C_WPALCON_W0PAL_16BIT,.vidosd1c = S3C_VIDOSDxC_ALPHA1_B(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_G(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_R(S3CFB_MAX_ALPHA_LEVEL),.vidosd2c = S3C_VIDOSDxC_ALPHA1_B(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_G(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_R(S3CFB_MAX_ALPHA_LEVEL),.vidosd3c = S3C_VIDOSDxC_ALPHA1_B(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_G(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_R(S3CFB_MAX_ALPHA_LEVEL),.vidosd4c = S3C_VIDOSDxC_ALPHA1_B(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_G(S3CFB_MAX_ALPHA_LEVEL) | S3C_VIDOSDxC_ALPHA1_R(S3CFB_MAX_ALPHA_LEVEL),.vidintcon0 = S3C_VIDINTCON0_FRAMESEL0_VSYNC | S3C_VIDINTCON0_FRAMESEL1_NONE | S3C_VIDINTCON0_INTFRMEN_DISABLE | S3C_VIDINTCON0_FIFOSEL_WIN0 | S3C_VIDINTCON0_FIFOLEVEL_25 | S3C_VIDINTCON0_INTFIFOEN_DISABLE | S3C_VIDINTCON0_INTEN_ENABLE,.vidintcon1 = 0,.xoffset = 0,.yoffset = 0,.w1keycon0 = S3C_WxKEYCON0_KEYBLEN_DISABLE | S3C_WxKEYCON0_KEYEN_F_DISABLE | S3C_WxKEYCON0_DIRCON_MATCH_FG_IMAGE | S3C_WxKEYCON0_COMPKEY(0x0),.w4keycon1 = S3C_WxKEYCON1_COLVAL(0xffffff),.sync = 0,.cmap_static = 1,.vs_offset = S3CFB_DEFAULT_DISPLAY_OFFSET,.brightness = S3CFB_DEFAULT_BRIGHTNESS,.backlight_level = S3CFB_DEFAULT_BACKLIGHT_LEVEL,.backlight_power = 1,.lcd_power = 1,;那么对应的结构体原型在哪呢?在S3cfb.h (linux2.6.28driversvideosamsung)文件中,如下所示:看那些对应的注释,也应该大致明白这个结构体的作用,存储与显示控制器有关的信息,还有显示屏幕的信息。不知道大家对s3cfb_fimd_info_t这个结构体的命名有何看法?名字往往代表了这个结构体的作用。其实这个结构体的名字给我们的信息是:fimd      FIMD:                 Fully Interactive Mobile Display (完全交互式移动显示设备)这是第一个概念,另一个概念是 OSD,我查了下资料,有这样的含义:OSD是on-screen display的简称,即屏幕菜单式调节方式。一般是按Menu键后屏幕弹出的显示器各项调节项目信息的矩形菜单,可通过该菜单对显示器各项工作指标包括色彩、模式、几何形状等进行调整,从而达到最佳的使用状态。现在对这个结构体的认识是不是深刻多了?typedef struct /* Screen size *

    注意事项

    本文(lcd设备驱动之全解析.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开