驱动开发-LCD显示技术_第1页
驱动开发-LCD显示技术_第2页
驱动开发-LCD显示技术_第3页
驱动开发-LCD显示技术_第4页
驱动开发-LCD显示技术_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LCD显示技术一、 确定任务1、 掌握基本的字符设备的驱动程序设计。2、 掌握基本的文件操作。3、 掌握在操作系统下的帧缓冲驱动程序的原理。二、 学习内容 1、 阅读S5PV210数据手册,熟悉LCD控制器的原理。2、 编写操作帧缓冲设备的应用程序。3、 编写makefile文件。4、下载并调试帧缓冲的应用程序。三、基础知识1、 硬件原理:a) 原理图:对TFT的LCD,需要行同步信号(HSYNC)、场同步信号(VSYNC)、点时钟信号(VCLK)、数据使能信号(VDEN)、数据信号(VD23:0)。由以上可知:需要设置的参数包括:VSPW、VBPD、LINEVAL、VFPD,HSPW、HBP

2、D、HOZVAL、HFPD。这些参数需要根据实际的TFT LCD的数据手册来设置。b) 系统框架图:由图可知,S5PV210的显示控制部分最多支持5个窗口的叠加,支持YUV、RGB、I80这三个接口,下面我们仅以窗口0、RGB接口为例来介绍。VIDCON0控制寄存器:设置LCD接口时序(TFT LCD),LCD的数据位数(本实验为32位),分频比及输出使能。VIDCON1时序1控制器:设置VCLK、HSYNC、VSYNC、VDEND等信号的极性。VIDCON2控制器控制RGB的输出格式。VIDCON3控制器设置图片的大小变换属性。VIDTCON0和VIDTCON1控制寄存器设置VSPW、VBP

3、D、VFPD、HSPW、HBPD、HFPD等参数。VIDTCON1控制寄存器设置VSYNCEN的使能。四、基本原理1、 本实验以4.3英寸的AT043TN24的TFTLCD为例。(请读者详细阅读数据手册2、 驱动原理:LCD控制器的功能是显示驱动信号,进而驱动LCD。用户只需要通过读写一系列的寄存器,完成配置和显示驱动。在驱动LCD设计的过程中首要的是配置LCD控制器,而在配置LCD控制器中最重要的一步则是帧缓冲区(FrameBuffer)的指定。用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上的。帧缓冲区的大小由屏幕的分辨率和显示色彩数决定。驱动帧缓冲的实现是整个驱动开发过程的重点。帧

4、缓冲区是出现在及以后版本内核当中的一种驱动程序接口,这种接口将显示设备抽象为帧缓冲区设备区。帧缓冲区为图像硬件设备提供了一种抽象化处理,它代表了一些视频硬件设备,允许应用软件通过定义明确的界面来访问图像硬件设备。这样软件无须了解任何涉及硬件底层驱动的东西(如硬件寄存器)。它允许上层应用程序在图形模式下直接对显示缓冲区进行读写和I/O控制等操作。通过专门的设备节点可对该设备进行访问, 如/dev/fb*。 用户可以将它看成是显示内存的一个映像, 将其映射到进程地址空间之后,就可以进行读写操作,而读写操作可以反映到LCD。帧缓冲设备对应的设备文件是/dev/fb*。如果系统有多个显卡,Linux还

5、支持多个帧缓冲设备,最多可达32个,即/dev/fb0/dev/fb31。而/dev/fb则指向当前的帧缓冲设备,通常情况下,默认的帧缓冲设备为/dev/fb0。帧缓冲设备也属于字符设备,采用“文件层-驱动层”的接口方式。 设备初始化,通过 driver_register()函数注册 FB 设备驱动程序, driver_refister()是 2.6内核中提供的注册驱动程序的方法,其原型在drivers/base/driver.c中定义,它使得系统加载、检测、卸载驱动程序有一个统一的接口,系统会调用 pxafb_driver ->probe 来检测是否存在有效的设备。五、代码设计 与编译

6、1、驱动分析:a) drivers/video/samsung/s3cfb.c 分配帧缓冲空间,初始化寄存器及引脚设置,完成帧缓冲的注册。主要函数:static int _devinit s3cfb_probe(struct platform_device *pdev)struct s3c_platform_fb *pdata;struct s3cfb_global *fbdev;struct resource *res;int i, j, ret = 0;fbdev = kzalloc(sizeof(struct s3cfb_global), GFP_KERNEL); /申请帧缓冲驱动的核心

7、数据结构if (!fbdev) dev_err(&pdev->dev, "failed to allocate for ""global fb structuren");ret = -ENOMEM;goto err_global;fbdev->dev = &pdev->dev;gfbdev = fbdev;fbdev->regulator = regulator_get(&pdev->dev, "pd"); if (!fbdev->regulator) dev_err(fbd

8、ev->dev, "failed to get regulatorn");ret = -EINVAL;goto err_regulator;ret = regulator_enable(fbdev->regulator);if (ret < 0) dev_err(fbdev->dev, "failed to enable regulatorn");ret = -EINVAL;goto err_regulator;pdata = to_fb_plat(&pdev->dev);if (!pdata) dev_err(fb

9、dev->dev, "failed to get platform datan");ret = -EINVAL;goto err_pdata;fbdev->lcd = (struct s3cfb_lcd *)pdata->lcd;if (pdata->cfg_gpio)pdata->cfg_gpio(pdev);if (pdata->clk_on)pdata->clk_on(pdev, &fbdev->clock);res = platform_get_resource(pdev, IORESOURCE_MEM, 0)

10、; /获取平台资源if (!res) dev_err(fbdev->dev, "failed to get io memory regionn");ret = -EINVAL;goto err_io;res = request_mem_region(res->start, res->end - res->start + 1, pdev->name);if (!res) dev_err(fbdev->dev, "failed to request io memory regionn");ret = -EINVAL;got

11、o err_io;fbdev->regs = ioremap(res->start, res->end - res->start + 1);if (!fbdev->regs) dev_err(fbdev->dev, "failed to remap io regionn");ret = -EINVAL;goto err_mem;s3cfb_set_vsync_interrupt(fbdev, 1);s3cfb_set_global_interrupt(fbdev, 1);s3cfb_init_global(fbdev);if (s3cfb

12、_alloc_framebuffer(fbdev) /申请帧缓冲区ret = -ENOMEM;goto err_alloc;if (s3cfb_register_framebuffer(fbdev) /注册帧缓冲区ret = -EINVAL;goto err_register;s3cfb_set_clock(fbdev);s3cfb_set_window(fbdev, pdata->default_win, 1);s3cfb_display_on(fbdev);fbdev->irq = platform_get_irq(pdev, 0);if (request_irq(fbdev-

13、>irq, s3cfb_irq_frame, IRQF_SHARED,pdev->name, fbdev) dev_err(fbdev->dev, "request_irq failedn");ret = -EINVAL;goto err_irq;#ifdef CONFIG_FB_S3C_LCD_INITif (pdata->backlight_on)pdata->backlight_on(pdev);if (!bootloaderfb && pdata->reset_lcd)pdata->reset_lcd(pde

14、v);#endif#ifdef CONFIG_HAS_EARLYSUSPENDfbdev->early_suspend.suspend = s3cfb_early_suspend;fbdev->early_suspend.resume = s3cfb_late_resume;fbdev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB;register_early_suspend(&fbdev->early_suspend);#endifret = device_create_file(&(pde

15、v->dev), &dev_attr_win_power);if (ret < 0)dev_err(fbdev->dev, "failed to add sysfs entriesn");dev_info(fbdev->dev, "registered successfullyn");#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)if (fb_prepare_logo( fbdev->fbpdata->defaul

16、t_win, FB_ROTATE_UR) printk("Start display and show logon");/* Start display and show logo on boot */fb_set_cmap(&fbdev->fbpdata->default_win->cmap, fbdev->fbpdata->default_win);fb_show_logo(fbdev->fbpdata->default_win, FB_ROTATE_UR);#endifreturn 0;int s3cfb_direct

17、_ioctl(int id, unsigned int cmd, unsigned long arg)switch (cmd) case FBIOGET_FSCREENINFO: /获取屏幕信息ret = memcpy(argp, &fb->fix, sizeof(fb->fix) ? 0 : -EFAULT;break;case FBIOGET_VSCREENINFO: /获取缓冲区信息ret = memcpy(argp, &fb->var, sizeof(fb->var) ? 0 : -EFAULT;break;case FBIOPUT_VSCREE

18、NINFO: /设置缓冲区ret = s3cfb_check_var(struct fb_var_screeninfo *)argp, fb);if (ret) dev_err(gfbdev->dev, "invalid vscreeninfon");break;ret = memcpy(&fb->var, (struct fb_var_screeninfo *)argp, sizeof(fb->var) ? 0 : -EFAULT;if (ret) dev_err(gfbdev->dev, "failed to put new v

19、screeninfon");break;fix->line_length = var->xres_virtual * var->bits_per_pixel / 8;fix->smem_len = fix->line_length * var->yres_virtual;s3cfb_set_win_params(gfbdev,id);break;case S3CFB_WIN_POSITION: /获取窗口位置ret = memcpy(&user_win, (struct s3cfb_user_window _user *)arg, size

20、of(user_win) ? 0 : -EFAULT;if (ret) dev_err(gfbdev->dev, "failed to S3CFB_WIN_POSITIONn");break;if (user_win.x < 0)user_win.x = 0;if (user_win.y < 0)user_win.y = 0;if (user_win.x + var->xres > lcd->width)win->x = lcd->width - var->xres;elsewin->x = user_win.x;

21、if (user_win.y + var->yres > lcd->height)win->y = lcd->height - var->yres;elsewin->y = user_win.y;s3cfb_set_window_position(gfbdev, win->id);break;case S3CFB_GET_LCD_WIDTH: /屏幕宽度ret = memcpy(argp, &lcd->width, sizeof(int) ? 0 : -EFAULT;if (ret) dev_err(gfbdev->dev,

22、"failed to S3CFB_GET_LCD_WIDTHn");break;break;case S3CFB_GET_LCD_HEIGHT: /屏幕高度ret = memcpy(argp, &lcd->height, sizeof(int) ? 0 : -EFAULT;if (ret) dev_err(gfbdev->dev, "failed to S3CFB_GET_LCD_HEIGHTn");break;break;b) /drivers/video/samsung/s3cfb_fimd6x.c 和S5PV210的显示控制单元

23、相关的文件,主要用来设置该单元的相关寄存器。s3cfb_set_gpio(void),用于初始化显示单元的引脚。2、驱动程序的编译:全部编译进内核a) 进入内核目录,#make menuconfig -device drivers-graphics support然后按下图进行设置:(按字母“Y”)编译生成内核镜像,将其烧写到实验箱上。3、测试程序(详细请读者查看附件):#define FB_PATH"/dev/fb0"const unsigned short colors = 0x07FF0000, 0xF81F0000, 0xFFE00000, 0x00000000, 0xFFFF0000, 0xF800000, 0x0000001F, 0x07E00000;int main(void) fbfd = open(FB_PATH, O_RDWR); if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)vinfo.bits_per_pixel = 32; /设置32位色if(ioctl(fbfd,FBIOPUT_VSCREENINFO,&vinfo) if (ioctl(fbfd, FBIOGET_FSCREENINFO, &am

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论