Linux lcd驱动分析

合集下载

内核中lcd驱动分析

内核中lcd驱动分析
[ 0.366648] [DISP WRN] file:drivers/video/sun7i/disp/OSAL/OSAL_Clock.c,line:347: NULL hdle
[ 0.366667] [DISP WRN] file:drivers/video/sun7i/disp/OSAL/OSAL_Clock.c,line:347: NULL hdle
de_bsp/de/disp_event.o de_bsp/de/disp_hdmi.o de_bsp/de/disp_hwc.o de_bsp/de/disp_layer.o\
de_bsp/de/disp_lcd.o de_bsp/de/disp_scaler.o de_bsp/de/disp_sprite.o de_bsp/de/disp_tv.o\
{
int ret = 0, err;
printk("hyh in lcd_module_init\n");
__inf("lcd_module_init\n");
alloc_chrdev_region(&devid, 0, 1, "lcd");
==============================内核中LCD驱动分析
20151008 aw LCD
===========driver/video/sun7i
--disp/
--Hdmi/
--lcd/ lcd_init
obj-$(CONFIG_LYCHEE_FB_SUN7I) += disp.o
LCD_get_panel_funs_0(&lcd0_cfg);

LinuxLCD驱动源码分析研究及移植

LinuxLCD驱动源码分析研究及移植

Linux地LCD驱动源码分析及移植(三部曲)第一部分:基于ARM9处理器地linux-2.6.32.2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device)b5E2R。

1.与LCD控制器硬件相关地寄存器内容请参照三星S3C2440A技术手册中地第15章.2. LCD Controller地平台设备定义如下(文件位于linux/arch/arm/plat-s3c24xx/devs.c):p1Ean。

1./* LCD Controller */2.3.static struct resource s3c_lcd_resource[] = {4. [0] = {5. .start = S3C24XX_PA_LCD,6. .end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,7. .flags = IORESOURCE_MEM,8. },9. [1] = {10. .start = IRQ_LCD,11. .end = IRQ_LCD,12. .flags = IORESOURCE_IRQ,13. }14.15.};16.17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL;18.19.struct platform_device s3c_device_lcd = {20. .name = "s3c2410-lcd",21. .id = -1,22. .num_resources = ARRAY_SIZE(s3c_lcd_resource),23. .resource = s3c_lcd_resource,24. .dev = {25. .dma_mask = &s3c_device_lcd_dmamask,26. .coherent_dma_mask = 0xffffffffUL27. }28.};29.30.EXPORT_SYMBOL(s3c_device_lcd);平台设备地结构体定义为s3c_device_lcd,该设备在平台总线中地名字取为s3c2410-lcd,该平台设备申请地两个板级资源为以S3C24XX_PA_LCD为起始地IORESOURCE_MEM资源和一个定义为IRQ_LCD地IORESOURCE_IRQ资源.DXDiT。

linux的lcd驱动详细讲解

linux的lcd驱动详细讲解

linux的lcd驱动详细讲解嵌入式驱动程序Day12Top1.LCD驱动设计开发1 LCD驱动设计开发1.1 问题通过lcd驱动开发掌握linux内核framebuffer驱动开发通用方法。

1.2 方案一、帧缓冲(Framebuffer)。

帧缓冲(Framebuffer)是Linux为显示设备提供的一个接口,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。

Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过 Framebuffer的读写直接对显存进行操作。

用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。

这种操作是抽象的,统一的。

用户不必关心物理显存的位置、换页机制等等具体细节。

这些都是由 Framebuffer设备驱动来完成的。

Framebuffer本身不具备任何运算数据的能力,就只好比是一个暂时存放水的水池。

CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理。

应用程序也可以直接读写这个水池的内容。

在应用程序中,一般通过将FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就打开/dev/fb0 设备,并通过mmap 系统调用进行地址映射。

FrameBuffer 设备还提供了若干 ioctl 命令,通过这些命令,可以获得显示设备的一些固定信息(比如显示内存大小)、与显示模式相关的可变信息(比如分辨率、象素结构、每扫描线的字节宽度),以及伪彩色模式下的调色板信息等等。

二、FrameBuffer在Linux中的实现和机制。

Framebuffer对应的源文件在linux/drivers/video/目录下。

总的抽象设备文件为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。

1.分析Framebuffer设备驱动。

基于Linux的液晶显示屏驱动技术的研究与应用

基于Linux的液晶显示屏驱动技术的研究与应用

基于Linux的液晶显示屏驱动技术的研究与应用随着信息技术的快速发展,液晶显示屏已经成为我们日常生活中不可或缺的一部分。

而Linux作为一个开源操作系统,其稳定性和可定制性使其成为液晶显示屏驱动技术的理想选择。

本文将探讨基于Linux的液晶显示屏驱动技术的研究与应用。

首先,我们来了解一下液晶显示屏的基本原理。

液晶显示屏通过电场控制液晶分子的排列来实现图像的显示。

传统的驱动技术包括行列驱动和点阵驱动。

而基于Linux的液晶显示屏驱动技术主要涉及到软件层面的驱动程序和内核模块。

在软件层面,液晶显示屏驱动程序的开发需要考虑到图像传输、显示模式切换、颜色管理等方面的问题。

Linux提供了丰富的图形库和驱动接口,开发人员可以根据具体的需求来选择合适的工具和接口。

例如,通过使用X Window系统和Qt框架,开发人员可以更方便地实现图像传输和显示模式切换的功能。

此外,Linux还支持多种颜色管理方案,开发人员可以根据不同的需求选择合适的颜色管理方案。

在内核层面,液晶显示屏驱动技术的关键是对硬件设备的驱动程序的开发和调试。

Linux内核提供了丰富的设备驱动接口和框架,开发人员可以根据具体的设备特性来选择合适的驱动接口和框架。

例如,液晶显示屏驱动程序可以通过使用Framebuffer驱动接口或者Direct Rendering Manager框架来与硬件设备进行通信。

此外,Linux内核还支持动态电源管理和硬件加速等功能,开发人员可以通过调整相关参数来提高液晶显示屏的性能和功耗。

基于Linux的液晶显示屏驱动技术不仅在个人电脑和智能手机等消费电子产品中得到广泛应用,还在工业自动化、医疗设备和交通工具等领域发挥着重要作用。

例如,在工业自动化领域,液晶显示屏可以用来显示生产过程中的参数和状态信息,帮助操作员进行实时监控和控制。

在医疗设备领域,液晶显示屏可以用来显示医学图像和病人信息,帮助医生进行诊断和治疗。

总之,基于Linux的液晶显示屏驱动技术在信息技术领域中具有重要的意义。

ARM Linux平台下LCD控制器的配置及驱动分析

ARM Linux平台下LCD控制器的配置及驱动分析

ARM Linux平台下LCD控制器的配置及驱动分析韩金利【摘要】The importance of LCD drive in Linux platform is introduced. The Samsung's 32-bit embed-ded microprocessor S3C2440A and LR043JC211 are presented for reference. By analyzing the interface circuit design of LCD display module and S3C2440 processor, this paper makes a detailed description of method and software configuration based on S3C-2440A the LCD controller. The LCD driver in the Linux is analyzed, and a verification method and the environment of experimental results are given as well.%介绍了linux平台下进行LCD驱动开发的重要性,以Samsung公司的32位嵌入式微处理器S3C2440A和LR043JC211为例,结合LCD显示模块与S3C2440处理器的接口电路设计,详细说明了基于S3C2440A处理器的LCD控制器的功能和软件配置方法,对Linux环境下LCD驱动进行分析,并给出了一种实验结果的验证环境与方法。

【期刊名称】《安徽电子信息职业技术学院学报》【年(卷),期】2013(000)004【总页数】4页(P34-36,39)【关键词】S3C2440A;LR043JC211;Linux;LCD驱动【作者】韩金利【作者单位】山西机电职业技术学院数控工程系,山西长治,046000【正文语种】中文【中图分类】TP368随着嵌入式处理器硬件成本的不断降低,嵌入式系统的应用更加广泛,对于大部分嵌入式系统开发者而言,显示系统的硬件和软件开发是不可回避的关键性技术 [1]。

MicrosoftWord-Linux的LCD驱动分析(四)

MicrosoftWord-Linux的LCD驱动分析(四)

MicrosoftWord-Linux的LCD驱动分析(四)Linux 的 LCD 驱动分析(四)四、s3c2410fb_ops 变量详解在上面的文字中,较为详细的解释了platform device 相关的代码,通过上面的代码的执行,一个 platform 设备(framebuffer 被当作了 platform 设备)就加载到内核中去了。

就像一个 PCI 的网卡被加入到内核一样,不同的是 PCI 的网卡占用的是 PCI 总线,内核会直接支同 PCI 而对于 platform 设备需要用上面软件的方法加载到内核,持它。

网卡一样,设备需要驱动程序,刚才只是将 platform 设备注册到内核中,现在它还需要驱动程序,本节中就来看看这些驱动。

4.1 static struct fb_ops s3c2410fb_ops对于 s3c2410 的 framebuffer 驱动支持的操作主要有s3c2410fb_ops 变量中定义,该变量类型为 struct fb_ops,该类型的定义在 include/linux/fb.h 文件中。

下面看看对于 s3c2410 的驱动为该 framebuffer 提供了哪些操作。

static struct fb_ops s3c2410fb_ops = {.owner = THIS_MODULE,.fb_check_var = s3c2410fb_check_var,.fb_set_par = s3c2410fb_set_par,.fb_blank = s3c2410fb_blank,.fb_setcolreg = s3c2410fb_setcolreg,.fb_fillrect = cfb_fillrect,.fb_copyarea = cfb_copyarea,.fb_imageblit = cfb_imageblit,};上面的代码描述了支持的相关操作,下面主要会解释s3c2410****的函数,从.fb_fillrect 开始的三个函数将不会被提及,当然也可以去看看它们的行为是什么。

lcd驱动分析文档

lcd驱动分析文档

嵌入式linux中的lcd驅動分析作者:傑洲村的木棉學校:廣東工業大學QQ:568109894在嵌入式linux中,lcd和觸控式螢幕驅動都是字元驅動,採用“檔層-驅動層”的介面方式,本文檔中分析的lcd驅動是針對linux2.6.13內核的,本人用的開發板是qq2440,lcd是三星的LTV3500V(帶觸控式螢幕的),具體分析的文件:是"include/linux/fb.h","drivers/video/s3c2410fb.h","drivers/video/s3c2410fb.c","drivers/video/fbmem.c","/include/asm/arch- s3c2410.fb.h(些標頭檔是針對s3c2440或s3c2410晶片的)",“/home/linux/5/kernel-2.6.13/arch/arm/mach-s3c2410/mach-smdk2410.c"(驅動移植主要就是要修改這個檔,配置一些參數)。

詳細看一下LCD的驅動,實際上,幾乎lcd設備驅動所要做的所有事情就是填充fb_info結構然後向系統註冊或登出它(1)fb.h包含了framebuffer所用到的結構(2)fbmem.c處於Framebuffer設備驅動技術的中心位置.它為上層應用程式提供系統調用也為下一層的特定硬體驅動提供介面;那些底層硬體驅動需要用到這兒的介面來向系統內核註冊它們自己. fbmem.c 為所有支援FrameBuffer的設備驅動提供了通用的介面,避免重復工作.(3)s3c2410fb.c就是特定硬體驅動(針對s3c2410晶片的),fbmem.c就是溝通應用層跟s3c2410fb.c的橋樑FrameBuffer設備驅動基於如下幾個檔:1)include/linux/fb.h2)drivers/video/fbmem.c3)drivers/video/s3c2410fb.c4)drivers/video/s3c2410fb.h5)include/asm/arch-s3c2410/fb.h現在先來分析這兩個檔:1.fb.h 包含了framebuffer 所用到的結構1)fb_fix_screeninfo 描述顯示卡的屬性,並且系統運行時不能被修改 structfb_fix_screeninfo {char id[16];unsigned long smem_start;/* identification string eg "TT Builtin" */ /* Start of frame buffer mem *//* (physical address) */__u32 smem_len;/* Length of frame buffer mem */__u32 type;__u32 type_aux;/* see FB_TYPE_* *//* Interleave for interleaved Planes */__u32 visual;/* see FB_VISUAL_* */ __u16 xpanstep;/* zero if no hardware panning */__u16 ypanstep;__u16 ywrapstep; __u32 line_length;/* zero if no hardware panning */ /* zero if no hardware ywrap */ /* length of a line in bytes */unsigned long mmio_start;/* Start of Memory Mapped I/O *//* (physical address) */__u32 mmio_len; __u32 accel;/* Length of Memory Mapped I/O *//* Indicate to driver which */ /* specific chip/card we have */};__u16 reserved[3];/* Reserved for future compatibility */2)fb_var_screeninfo 這個結構描述了顯示卡的特性struct fb_var_screeninfo {__u32 xres;__u32 yres;__u32 xres_virtual;/* visible resolution/* virtual resolution*/*/__u32 yres_virtual;__u32 xoffset; /* offset from virtual to visible */ __u32 yoffset;/* resolution*/__u32 bits_per_pixel; __u32 grayscale;/* guess what/* != 0 Graylevels instead of colors */*/struct fb_bitfield red; /* bitfield in fb mem if true color, */struct fb_bitfield green; /* else only length is significant */struct fb_bitfield blue;struct fb_bitfield transp; /* transparency */__u32 nonstd; /* != 0 Non standard pixel format */ __u32 activate;/* see FB_ACTIVATE_**/__u32 height; __u32 width;/* height of picture in mm/* width of picture in mm*/*/__u32 accel_flags; /* (OBSOLETE) see fb_info.flags *//* 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 reserved[5]; /* Reserved for future compatibility */};3)fb_cmap描述設備無關的顏色映射資訊。

嵌入式Linux的LCD驱动的设计与实现 精品

嵌入式Linux的LCD驱动的设计与实现 精品

嵌入式Linux的LCD驱动的设计与实现LCD Driver based on Linux第一章概述Linux操作系统有许多优点,最重要的就是它的内部实行细节对所有人都是公开的。

以前,操作系统的代码仅仅掌握在少数程序员手里,但是Linux使我们只要具备必要的技术能力,就可以方便的验证、理解、修改、移植操作系统,或者其中的某一部分。

驱动程序在Linux内核中扮演着特殊的角色。

它们使某个特定硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。

用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。

将这些调用映射到作用于实际硬件的设备特有操作上,是驱动程序的主要任务。

这些接口可以使驱动程序独立于内核的其他部分而建立,以模块的形式,在需要时动态的插入到内核中,在不需要时可以移出内核。

显示出了其良好的特性。

由于液晶显示器的大量需求,以及Linux操作系统众多的优点,因此,本题目的设计选择了以Linux作为嵌入式设备的操作系统,对于基于Linux的嵌入式LCD驱动,将会有很好的应用前景。

1.1本课题的研究意义LCD(液晶显示)模块满足了嵌入式系统日益提高的要求,它可以显示汉字、字符和图形,同时还具有低压、低功耗、体积小、重量轻和超薄等很多优点。

随着嵌入式系统的应用越来越广泛,功能也越来越强大,对系统中的人机界面的要求也越来越高,在应用需求的驱使下,许多工作在Linux下的图形界面软件包的开发和移植工作中都涉及到底层LCD驱动的开发问题。

因此在嵌入式系统中开发LCD驱动得以广泛运用随着高性能嵌入式处理器的普及和硬件成本的不断降低,尤其是Arm系列处理器的推出,嵌入式系统的功能也越来越强。

在多媒体应用的推动下,彩色LCD也越来越多地应用到了嵌入式系统中,如新一代掌上电脑(PDA)多采用TFT显示器件,支持彩色图形界面,图片显示和视频媒体播放。

掌上电脑(PDA)的操作系统有微软Window CE, PalmOS等。

基于linux的嵌入式lcd驱动的设计毕业设计

基于linux的嵌入式lcd驱动的设计毕业设计

哈尔滨工程大学毕业设计(论文)题目基于Linux的嵌入式LCD驱动设计学院通信与电子工程学院毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:摘要嵌入式设备因其种类多,复杂多样的特点决定嵌入式设备必须研发自己的设备驱动程序,而设备驱动程序在嵌入式系统中占有很重要的地位。

为此,本文深入研究与设计了基于嵌入式Linux的LCD驱动程序。

以ARM9开发板作为目标机,采用VMware虚拟平台以及Windows和Linux操作系统相结合的软件开发平台,搭建了研究和设计所需的交叉编译环境。

深入研究了内存与I/O访问、并发控制等关键技术。

进而采用帧缓冲技术,研发了LCD驱动程序,实现了对LCD的显示控制以及与内核的烧写。

以显示5个不同的颜色的应用程序对其测试,结果表明,所设计开发的LCD驱动程序运行稳定颜色鲜艳饱满,满足用户色彩界面开发的需求,达到设计目标。

关键词:嵌入式;Linux;设备驱动;帧缓冲;LCDAbstractAbstractEmbedded devices because of its variety of complex and diverse characteristics of the decision to embedded devices must develop their own device drivers, device driver plays an important role in embedded systems. In this paper, in-depth study and design of embedded Linux-based LCD driver. ARM9 development board as the target machine, using a combination of VMware virtualization platform, as well as Windows and Linux operating systems software development platform to build a research and design the required cross-compiler environment. In-depth study of the key technologies of memory and I/O access, concurrency control and so on. And then using the frame buffer technology, research and development of the LCD driver,LCD display control, and kernel programming. To show the application of five different colors of their test results show that the design and development of LCD driver stable full of bright colors, to meet the needs of the user color interface development, and meet the design goals.Keyword s: Embedded; Linux; device driver; frame buffer; the LCD目录摘要 (II)Abstract ................................................................................................................................... I V第一章绪论 (1)1.1 概述 (1)1.2 目前的发展现状及前景 (1)1.3 本文主要的研究意义 (2)1.4 本文的研究内容 (2)第2章系统设计综述 (4)2.1 操作系统的选择 (4)2.1.1 嵌入式系统的发展过程 (4)2.1.2 嵌入式的特点 (4)2.1.3 嵌入式程序的开发 (5)2.2 系统硬件的选择 (5)2.2.1 LCD液晶屏 (6)2.2.2 ARM9处理器 (7)2.2.3 S3C2440 处理器 (7)第3章创建嵌入式linux软件开发平台 (9)3.1 Linux系统 (9)3.2 Linux的发展过程 (9)3.3 Linux系统的优点 (10)3.4 基于ARM的嵌入式Linux交叉开发环境 (11)3.4.1 开发主机linux操作系统的安装 (11)3.4.2 开发主机基本服务及程序的安装、配置与使用 (11)3.4.3 Linux下模块操作命令简介 (11)3.4.4 建立交叉编译环境 (12)3.4.5 Makefile (13)第4章设备驱动程序关键技术介绍 (15)4.1 嵌入式Linux驱动程序 (15)4.1.1 设备驱动程序的作用 (15)4.2 Linux驱动程序关键技术 (15)4.2.1 内存与I/O端口 (15)4.2.2 并发控制 (17)第5章LCD驱动分析与实现 (19)5.1 LCD硬件原理 (19)5.1.1 LCD硬件需求与驱动控制分析 (19)5.1.2 S3C2440 CPU相关的GPIO介绍 (22)5.2 帧缓冲framebuffer (24)5.2.1 帧缓冲设备驱动结构 (24)5.2.3 Linux帧缓冲的关键数据结构 (25)5.3 LCD的关键数据结构 (28)5.4 LCD驱动程序设计 (29)5.4.1 创建设备 (29)5.4.2 注册设备驱动 (30)5.5 LCD驱动的测试程序 (31)结论 (33)参考文献 (34)附录1 (36)致谢 (64)第一章绪论1.1 概述现在的嵌入式开发始于微机时代的嵌入式应用的。

linux_lcd

linux_lcd

Linux-2.6.20的LCD驱动分析(二).1 驱动的入口点摆在面前的第一个问题相信应该是,这个函数是从那里开始运行的。

这里就应该从long long ago 开始了,打开drivers/video/s3c2410fb.c文件,然后找到s3c2410fb_init函数,先不管它里面是怎么回事,再把目光下移就会看到这样一串字符串module_init(s3c2410fb_init),郁闷,这和S3C2410fb_probe有啥关系嘛?这个问题问的好!不要着急慢慢往下面走。

先摸摸module_init是何方神圣再说,于是乎我就登陆了http://lxr.linux.no/linux+v2.6.20/网站,在上面一搜,原来module_init老家在include/linux/init.h,原来它居然还有两重身份,其原型如下:#ifndef MODULE……#define module_init(x) __initcall(x); ①……#else……#define module_init(initfn) \ ②static inline initcall_t __inittest(void) \{ return initfn; } \int init_module(void) __attribute__((alias(#c)));……#endif从上面可以看出,module_init到底用哪个,就取决于MODULE了,那么MODULE的作用是什么呢?我们知道Linux可以将设备当作模块动态加进内核,也可以直接编译进内核,说到这里大概有点明白MODULE的作用了,不错!它就是要控制一个驱动加入内核的方式。

定义了MODULE就表示将设备当作模块动态加入。

所以上面的①表示将设备加进内核。

在②中的__attribute__((alias(#initfn)))很有意思,这代表什么呢?主要alias就是属性的意思,它的英文意思是别名,可以在/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ ref/fn_attrib_alias.htm找到它的详细说明,这里简单的说int init_module(void)__attribute__((alias(#initfn)));的意思为init_module是initfn的别名,或者init_module是initfn的一个连接,再简单一点说这个时候module_init宏基因突变成了init_module()了。

在Linux下驱动STN彩色LCD

在Linux下驱动STN彩色LCD

在Linux下驱动STN彩色LCD伴随着高性能嵌入式处理器的飞速发展与普及,特别是ARM 处理器系列的出现,嵌入式系统的功能也变得越来越强大。

以前的单色LCD已不能满足现今的各种多媒体应用,彩色LCD被越来越多地应用到嵌入式系统中。

同时,在应用需求的促使下,许多工作在Linux下的图形界面软件包的开发和移植工作中都涉及到底层LCD驱动的开发问题。

在硬件采用Intel ASSABET开发板,软件采用Linux 2.4.19平台,编译器为arm-linux-gcc的交叉编译器作为开发的前提下,因为ASSABET开发板上使用的是Sharp 3.9英寸320×240 TFT彩色LCD,现改用Kyocera 7.7英寸640×480 STN型彩色LCD,所以通过对其Linux驱动程序进行改写和调试,成功地实现了对该种屏的驱动和显示。

LCD控制器LCD控制器的功能是显示驱动信号,进而驱动LCD显示器。

在驱动LCD设计的过程中首要的是配置LCD控制器。

在配置LCD控制器中最重要的一步则是帧缓冲区的指定。

用户所要显示的内容皆是从缓冲区中读出,从而显示到屏幕上。

帧缓冲区的大小由屏幕的分辨率和显示色彩数决定。

驱动帧缓冲的实现是整个驱动开发过程的重点。

ASSABET开发板采用SA1110作为处理器。

SA1110微处理器是Intel公司生产的一种基于StrongARM环境的微处理器。

该处理器内部有一LCD驱动控制器,可支持单、双屏显示和最大1024×1024dpi。

每个像素数据以4、8、12或16位编码后存储于外部存储器内,通过LCD的专用DAM控制器,被装入至532位的FIFO中。

在双屏显示时,两个DMA通道分别负责上下屏幕的显示,但只有第一个DMA通道有调色板缓冲器。

帧缓冲器中的已编码像素数据是作为指针指向256×12位的调色板。

调色板的色调数据控制着抖动逻辑,以产生各种灰度和彩色信号并从LCD数据引脚输出。

基于linux的嵌入式lcd驱动的设计毕业设计

基于linux的嵌入式lcd驱动的设计毕业设计

哈尔滨工程大学毕业设计(论文)题目基于Linux的嵌入式LCD驱动设计学院通信与电子工程学院毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:摘要嵌入式设备因其种类多,复杂多样的特点决定嵌入式设备必须研发自己的设备驱动程序,而设备驱动程序在嵌入式系统中占有很重要的地位。

为此,本文深入研究与设计了基于嵌入式Linux的LCD驱动程序。

以ARM9开发板作为目标机,采用VMware虚拟平台以及Windows和Linux操作系统相结合的软件开发平台,搭建了研究和设计所需的交叉编译环境。

深入研究了内存与I/O访问、并发控制等关键技术。

进而采用帧缓冲技术,研发了LCD驱动程序,实现了对LCD的显示控制以及与内核的烧写。

以显示5个不同的颜色的应用程序对其测试,结果表明,所设计开发的LCD驱动程序运行稳定颜色鲜艳饱满,满足用户色彩界面开发的需求,达到设计目标。

关键词:嵌入式;Linux;设备驱动;帧缓冲;LCDAbstractAbstractEmbedded devices because of its variety of complex and diverse characteristics of the decision to embedded devices must develop their own device drivers, device driver plays an important role in embedded systems. In this paper, in-depth study and design of embedded Linux-based LCD driver. ARM9 development board as the target machine, using a combination of VMware virtualization platform, as well as Windows and Linux operating systems software development platform to build a research and design the required cross-compiler environment. In-depth study of the key technologies of memory and I/O access, concurrency control and so on. And then using the frame buffer technology, research and development of the LCD driver,LCD display control, and kernel programming. To show the application of five different colors of their test results show that the design and development of LCD driver stable full of bright colors, to meet the needs of the user color interface development, and meet the design goals.Keyword s: Embedded; Linux; device driver; frame buffer; the LCD目录摘要 (II)Abstract ................................................................................................................................... I V第一章绪论 (1)1.1 概述 (1)1.2 目前的发展现状及前景 (1)1.3 本文主要的研究意义 (2)1.4 本文的研究内容 (2)第2章系统设计综述 (4)2.1 操作系统的选择 (4)2.1.1 嵌入式系统的发展过程 (4)2.1.2 嵌入式的特点 (4)2.1.3 嵌入式程序的开发 (5)2.2 系统硬件的选择 (5)2.2.1 LCD液晶屏 (6)2.2.2 ARM9处理器 (7)2.2.3 S3C2440 处理器 (7)第3章创建嵌入式linux软件开发平台 (9)3.1 Linux系统 (9)3.2 Linux的发展过程 (9)3.3 Linux系统的优点 (10)3.4 基于ARM的嵌入式Linux交叉开发环境 (11)3.4.1 开发主机linux操作系统的安装 (11)3.4.2 开发主机基本服务及程序的安装、配置与使用 (11)3.4.3 Linux下模块操作命令简介 (11)3.4.4 建立交叉编译环境 (12)3.4.5 Makefile (13)第4章设备驱动程序关键技术介绍 (15)4.1 嵌入式Linux驱动程序 (15)4.1.1 设备驱动程序的作用 (15)4.2 Linux驱动程序关键技术 (15)4.2.1 内存与I/O端口 (15)4.2.2 并发控制 (17)第5章LCD驱动分析与实现 (19)5.1 LCD硬件原理 (19)5.1.1 LCD硬件需求与驱动控制分析 (19)5.1.2 S3C2440 CPU相关的GPIO介绍 (22)5.2 帧缓冲framebuffer (24)5.2.1 帧缓冲设备驱动结构 (24)5.2.3 Linux帧缓冲的关键数据结构 (25)5.3 LCD的关键数据结构 (28)5.4 LCD驱动程序设计 (29)5.4.1 创建设备 (29)5.4.2 注册设备驱动 (30)5.5 LCD驱动的测试程序 (31)结论 (33)参考文献 (34)附录1 (36)致谢 (64)第一章绪论1.1 概述现在的嵌入式开发始于微机时代的嵌入式应用的。

lcd设备驱动之全解析

lcd设备驱动之全解析

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)映射后就可以直接读/写屏幕缓冲区,进行绘图和图片显示了。

uClinux下的LCD显示

uClinux下的LCD显示

实验八uClinux下的LCD显示一、实验目的了解LCD显示原理,学习S3C44B0的LCD控制器特性,熟悉LCD控制器与LCD驱动器的连接接口,了解uClinux下framebuffer显示驱动的使用。

二、实验内容LCD工作原理:LCD 的横截面很像是很多层三明治叠在一起。

每面最外一层是透明的玻璃基体,玻璃基体中间就是薄膜电晶体。

颜色过滤器和液晶层可以给显示出红、蓝和绿三种最基本的颜色。

通常,LCD后面都有照明灯以显示画面。

一般只要电流不变动,液晶都在非结晶状态。

这时液晶允许任何光线通过。

液晶层受到电压变化的影响后,液晶只允许一定数量的光线通过。

光线的反射角度按照液晶控制。

当液晶的供应电压变动时,液晶就会产生变形,因而光线的折射角度就会不同,从而产生色彩的变化。

一个完整的TFT 显示屏由很多像素构成,每个像素象一个可以开关的晶体管。

这样就可以控制TFT 显示屏的分辨率。

如果一台LCD的分辨率可以达到1024 x 768 像素(SVGA),它就有那么多像素可以显示。

S3C44B0提供LCD控制器,将系统内存中的显示数据传送到LCD驱动器。

该控制器支持单色、4灰度、16灰度单色LCD,256色的彩色LCD。

它可以通过修改寄存器配置来适应不同的横纵向点数、不同的数据线宽度、不同的接口时序,以及不同的刷新频率。

它的主要特点如下:> 支持单色、多灰度、彩色LCD。

> 支持4比特双扫描、4比特单扫描、8比特单扫描LCD.> 支持虚拟屏幕显示,支持水平和垂直滚动。

> 使用系统内存作为显示内存。

> 专用的DMA通道,将数据传送到接口。

> 支持多种分辨率,如640×480,320×640,160×160。

> 支持节点模式。

其内部结构框图如下:图1 LCD控制器内部结构图外部总线定义:VFRAME:LCD控制器和LCD驱动器之间的帧同步信号,它用来通知LCD 数据帧的开始。

Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型

Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型

Linux下的帧缓冲lcd应用编程及Framebuffer驱动程序模型一、Linux的帧缓冲设备帧缓冲(framebuffer)是Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作。

这种操作是抽象的,统一的。

用户不必关心物理显存的位置、换页机制等等具体细节。

这些都是由Framebuffer 设备驱动来完成的。

帧缓冲驱动的应用广泛,在linux 的桌面系统中,Xwindow 服务器就是利用帧缓冲进行窗口的绘制。

尤其是通过帧缓冲可显示汉字点阵,成为Linux汉化的唯一可行方案。

帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux 下还可支持多个帧缓冲设备,最多可达32 个,分别为/dev/fb0 到/dev/fb31,而/dev/fb 则为当前缺省的帧缓冲设备,通常指向/dev/fb0。

当然在嵌入式系统中支持一个显示设备就够了。

帧缓冲设备为标准字符设备,主设备号为29,次设备号则从0到31。

分别对应/dev/fb0-/dev/fb31。

通过/dev/fb,应用程序的操作主要有这几种:1.读/写(read/write)/dev/fb:相当于读/写屏幕缓冲区。

例如用cp /dev/fb0 tmp 命令可将当前屏幕的内容拷贝到一个文件中,而命令cp tmp > /dev/fb0 则将图形文件tmp直接显示在屏幕上。

2.映射(map)操作:由于Linux 工作在保护模式,每个应用程序都有自己的虚拟地址空间,在应用程序中是不能直接访问物理缓冲区地址的。

为此,Linux 在文件操作file_operations 结构中提供了 mmap 函数,可将文件的内容映射到用户空间。

对于帧缓冲设备,则可通过映射操作,可将屏幕缓冲区的物理地址映射到用户空间的一段虚拟地址中,之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图了。

Linux驱动之LCD驱动编写

Linux驱动之LCD驱动编写

Linux驱动之LCD驱动编写在这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动。

⽤的LCD屏幕为tft 屏,每个像素点为16bit。

对应与红绿蓝分别为565。

1、分配⼀个fb_info结构2、设置fb_info结构3、硬件相关的操作,配置LCD时钟、配置IO端⼝、配置LCD寄存器。

4、最终注册fbinfo结构到registered_fb数组要理解LCD的⼯作原理,需要了解LCD的时钟,在TFT的LCD中有如下的时钟。

这个⼏个时钟数据在配置LCD寄存器时都说需要设置的。

1、VCLK:两个像素之间的时钟,即两个像素隔多长时间才能显⽰下⼀个像素2、HSYNC:⽔平同步时钟,即第⼀⾏像素点显⽰完成之后隔多长时间才能开始下⼀⾏的显⽰3、VSYNC:垂直⽅向的同步时钟,也叫帧同步信号,即⼀帧数据显⽰完成之后(⼀帧数据表⽰⼀个屏幕显⽰完成,即⼀个显存的数据全部取完),过多长下⼀帧数据才开始显⽰本节需要⽤到的函数:void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp); //分配DMA缓存区给显存//返回值为:申请到的DMA缓冲区的虚拟地址,若为NULL,表⽰分配失败,则需要使⽤dma_free_writecombine()释放内存,避免内存泄漏//参数如下://*dev:指针,这⾥填0,表⽰这个申请的缓冲区⾥没有内容//size:分配的地址⼤⼩(字节单位)//*handle:申请到的物理起始地址//gfp:分配出来的内存参数,标志定义在<linux/gfp.h>,常⽤标志如下://GFP_ATOMIC ⽤来从中断处理和进程上下⽂之外的其他代码中分配内存. 从不睡眠.//GFP_KERNEL 内核内存的正常分配. 可能睡眠.//GFP_USER ⽤来为⽤户空间页来分配内存; 它可能睡眠.分配⼀段DMA缓存区,分配出来的内存会禁⽌cache缓存(因为DMA传输不需要CPU)它和 dma_alloc_coherent ()函数相似,不过 dma_alloc_coherent ()函数是分配出来的内存会禁⽌cache缓存以及禁⽌写⼊缓冲区dma_free_writecombine(dev,size,cpu_addr,handle); //释放缓存//cpu_addr:虚拟地址,//handle:物理地址释放DMA缓冲区, dev和size参数和上⾯的⼀样struct fb_info *framebuffer_alloc(size_t size, struct device *dev); //申请⼀个fb_info结构体,//size:额外的内存,//*dev:指针, 这⾥填0,表⽰这个申请的结构体⾥没有内容int register_framebuffer(struct fb_info *fb_info);//向内核中注册fb_info结构体,若内存不够,注册失败会返回负数int unregister_framebuffer(struct fb_info *fb_info) ;//注销内核中fb_info结构体本节需要⽤到的结构体:fb_info结构体如下:struct fb_info {... ...struct fb_var_screeninfo var; //可变的参数struct fb_fix_screeninfo fix; //固定的参数... ...struct fb_ops *fbops; //操作函数... ...char __iomem *screen_base; //显存虚拟起始地址unsigned long screen_size; //显存虚拟地址长度void *pseudo_palette;//假的16⾊调⾊板,⾥⾯存放了16⾊的数据,可以通过8bpp数据来找到调⾊板⾥⾯的16⾊颜⾊索引值,模拟出16⾊颜⾊来,节省内存,不需要的话就指向⼀个不⽤的数组即可 ... ...};其中操作函数fb_info-> fbops 结构体写法如下:static struct fb_ops s3c_lcdfb_ops = {.owner = THIS_MODULE,.fb_setcolreg = my_lcdfb_setcolreg,//设置调⾊板fb_info-> pseudo_palette,⾃⼰构造该函数.fb_fillrect = cfb_fillrect, //填充矩形,⽤/drivers/video/ cfbfillrect.c⾥的函数即可.fb_copyarea = cfb_copyarea, //复制数据, ⽤/drivers/video/cfbcopyarea.c⾥的函数即可.fb_imageblit = cfb_imageblit, //绘画图形, ⽤/drivers/video/imageblit.c⾥的函数即可};固定的参数fb_info-> fix 结构体如下:struct fb_fix_screeninfo {char id[16]; //id名字unsigned long smem_start; //framebuffer物理起始地址__u32 smem_len; //framebuffer长度,字节为单位__u32 type; //lcd类型,默认值0即可__u32 type_aux; //附加类型,为0__u32 visual; //画⾯设置,常⽤参数如下// FB_VISUAL_MONO01 0 单⾊,0:⽩⾊,1:⿊⾊// FB_VISUAL_MONO10 1 单⾊,1:⽩⾊,0:⿊⾊// FB_VISUAL_TRUECOLOR 2 真彩(TFT:真彩)// FB_VISUAL_PSEUDOCOLOR 3 伪彩// FB_VISUAL_DIRECTCOLOR 4 直彩 __u16 xpanstep; /*如果没有硬件panning就赋值为0 */ __u16 ypanstep; /*如果没有硬件panning就赋值为0 */ __u16 ywrapstep; /*如果没有硬件ywrap就赋值为0 */ __u32 line_length; /*⼀⾏的字节数 ,例:(RGB565)240*320,那么这⾥就等于240*16/8 */ /*以下成员都可以不需要*/ unsigned long mmio_start; /*内存映射IO的起始地址,⽤于应⽤层直接访问寄存器,可以不需要*/__u32 mmio_len; /* 内存映射IO的长度,可以不需要*/__u32 accel;__u16 reserved[3];};可变的参数fb_info-> var 结构体如下:structfb_var_screeninfo{ __u32xres; /*可见屏幕⼀⾏有多少个像素点*/__u32 yres; /*可见屏幕⼀列有多少个像素点*/__u32 xres_virtual; /*虚拟屏幕⼀⾏有多少个像素点 */__u32 yres_virtual; /*虚拟屏幕⼀列有多少个像素点*/__u32 xoffset; /*虚拟到可见屏幕之间的⾏偏移,若可见和虚拟的分辨率⼀样,就直接设为0*/ __u32 yoffset; /*虚拟到可见屏幕之间的列偏移*/__u32 bits_per_pixel; /*每个像素的位数即BPP,⽐如:RGB565则填⼊16*/__u32 grayscale; /*⾮0时,指的是灰度,真彩直接填0即可*/struct fb_bitfield red; //fb缓存的R位域, fb_bitfield结构体成员如下://__u32 offset; 区域偏移值,⽐如RGB565中的R,就在第11位//__u32 length; 区域长度,⽐如RGB565的R,共有5位//__u32 msb_right; msb_right ==0,表⽰数据左边最⼤, msb_right!=0,表⽰数据右边最⼤struct fb_bitfield green; /*fb缓存的G位域*/struct fb_bitfield blue; /*fb缓存的B位域*/ /*以下参数都可以不填,默认为0*/struct fb_bitfield transp; /*透明度,不需要填0即可*/__u32nonstd; /* != 0表⽰⾮标准像素格式*/__u32 activate; /*设为0即可*/__u32height; /*外设⾼度(单位mm),⼀般不需要填*/__u32width; /*外设宽度(单位mm),⼀般不需要填*/__u32 accel_flags; /*过时的参数,不需要填*//* 除了pixclock本⾝外,其他的都以像素时钟为单位*/__u32pixclock; /*像素时钟(⽪秒)*/__u32 left_margin; /*⾏切换,从同步到绘图之间的延迟*/__u32right_margin; /*⾏切换,从绘图到同步之间的延迟*/__u32upper_margin; /*帧切换,从同步到绘图之间的延迟*/__u32lower_margin; /*帧切换,从绘图到同步之间的延迟*/__u32hsync_len; /*⽔平同步的长度*/__u32 vsync_len; /*垂直同步的长度*/__u32 sync;__u32 vmode;__u32 rotate;__u32reserved[5]; /*保留*/}1.写驱动程序:(驱动设置:参考⾃带的LCD平台驱动drivers/video/s3c2410fb.c )1.1 步骤如下:在驱动init⼊⼝函数中:1)分配⼀个fb_info结构体2)设置fb_info 2.1)设置固定的参数fb_info-> fix 2.2) 设置可变的参数fb_info-> var 2.3) 设置操作函数fb_info-> fbops 2.4) 设置fb_info 其它的成员3)设置硬件相关的操作 3.1)配置LCD引脚 3.2)根据LCD⼿册设置LCD控制器 3.3)分配显存(framebuffer),把地址告诉LCD控制器和fb_info4)开启LCD,并注册fb_info: register_framebuffer() 4.1) 直接在init函数中开启LCD(后⾯讲到电源管理,再来优化) 控制LCDCON5允许PWREN信号, 然后控制LCDCON1输出PWREN信号, 输出GPB0⾼电平来开背光, 4.2) 注册fb_info在驱动exit出⼝函数中:1)卸载内核中的fb_info2) 控制LCDCON1关闭PWREN信号,关背光,iounmap注销地址3)释放DMA缓存地址dma_free_writecombine()4)释放注册的fb_info1.2 具体代码如下:#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/init.h>#include <asm/io.h> //含有iomap函数iounmap函数#include <asm/uaccess.h>//含有copy_from_user函数#include <linux/device.h>//含有类相关的处理函数#include <linux/fb.h> //含有fb_info结构体定义//#include <asm/dma-mapping.h> //含有dma_free_writecombine宏定义#include <linux/dma-mapping.h> //含有dma_free_writecombine宏定义#include <linux/platform_device.h>//含有平台设备总线模型相关变量#include <linux/mm.h>#include <linux/slab.h>//#include <linux/module.h>//#include <linux/kernel.h>//#include <linux/errno.h>//#include <linux/string.h>//#include <linux/mm.h>//#include <linux/slab.h>//#include <linux/delay.h>//#include <linux/fb.h>//#include <linux/init.h>//#include <linux/dma-mapping.h>//#include <linux/interrupt.h>//#include <linux/workqueue.h>//#include <linux/wait.h>//#include <linux/platform_device.h>//#include <linux/clk.h>//#include <asm/io.h>//#include <asm/uaccess.h>//#include <asm/div64.h>//#include <asm/mach/map.h>//#include <asm/arch/regs-lcd.h>//#include <asm/arch/regs-gpio.h>//#include <asm/arch/fb.h>/*lcd控制寄存器放在⼀个结构体⾥⾯*/struct lcd_regs {unsigned long lcdcon1;unsigned long lcdcon2;unsigned long lcdcon3;unsigned long lcdcon4;unsigned long lcdcon5;unsigned long lcdsaddr1;unsigned long lcdsaddr2;unsigned long lcdsaddr3;unsigned long redlut;unsigned long greenlut;unsigned long bluelut;unsigned long reserved[9];unsigned long dithmode;unsigned long tpal;unsigned long lcdintpnd;unsigned long lcdsrcpnd;unsigned long lcdintmsk;unsigned long lpcsel;};static struct fb_info *s3c_mylcdfb_info;//fb_info结构体static volatile unsigned long *gpbcon;//GPB0⽤于lcd背光的控制static volatile unsigned long *gpbdat;//GPB0⽤于lcd背光的控制static volatile unsigned long *gpccon;static volatile unsigned long *gpdcon;static volatile unsigned long *gpgcon;//GPG4⽤于lcd电源static volatile struct lcd_regs* lcd_regs;//lcd寄存器static u32 pseudo_palette[16]; //调⾊板内存/* from pxafb.c */static inline unsigned int chan_to_field(unsigned int chan, struct fb_bitfield *bf){chan &= 0xffff; //取出16bit的数据chan >>= 16 - bf->length; //return chan << bf->offset;}static int s3c_mylcdfb_setcolreg(unsigned int regno, unsigned int red,unsigned int green, unsigned int blue,unsigned int transp, struct fb_info *info){unsigned int val;if (regno > 16)return1;/* ⽤red,green,blue三原⾊构造出val */val = chan_to_field(red, &info->var.red);val |= chan_to_field(green, &info->var.green);val |= chan_to_field(blue, &info->var.blue);//((u32 *)(info->pseudo_palette))[regno] = val;pseudo_palette[regno] = val;return0;}static struct fb_ops s3c_mylcdfb_ops = { //操作函数结构体.owner = THIS_MODULE,.fb_setcolreg = s3c_mylcdfb_setcolreg,//待会设置,这个是调⾊板,如果使⽤⼩于16bit的像素需要⽤到 .fb_fillrect = cfb_fillrect,.fb_copyarea = cfb_copyarea,.fb_imageblit = cfb_imageblit,};static int lcd_drv_init(void){/*1、分配⼀个fb_info*/s3c_mylcdfb_info = framebuffer_alloc(0,NULL);//size为额外分配的⼤⼩,这⾥不需要,所以设为0if(s3c_mylcdfb_info==NULL){printk("unframebuffer_alloc\n");return1;}/*2、设置*//*2.1 设置固定的参数*/strcpy(s3c_mylcdfb_info->fix.id, "mylcd");//名字//s3c_mylcdfb_info->fix.smem_start = ;//显存的物理起始地址,后⾯设置s3c_mylcdfb_info->fix.smem_len = 480*272*16/8;//单位为字节,每个像素点占⽤16bit :565,显存的⼤⼩ s3c_mylcdfb_info->fix.type = FB_TYPE_PACKED_PIXELS;//LCD类型,填充像素的类型 tft//s3c_mylcdfb_info->fix.type_aux= //附加的LCD类型,不需要设置s3c_mylcdfb_info->fix.visual = FB_VISUAL_TRUECOLOR;//视觉类型,选择真彩⾊s3c_mylcdfb_info->fix.line_length = 480*16/8; //⼀⾏的长度,单位为字节// s3c_mylcdfb_info->fix.mmio_start = //控制lcd的寄存器的物理地址// s3c_mylcdfb_info->fix.mmio_len = //控制lcd的寄存器的⼤⼩/*2.2 设置可变的参数*/s3c_mylcdfb_info->var.xres = 480;//x⽅向的分辨率s3c_mylcdfb_info->var.yres = 272;//y⽅向的分辨率s3c_mylcdfb_info->var.xres_virtual = 480;//x⽅向的虚拟分辨率s3c_mylcdfb_info->var.yres_virtual = 272;//y⽅向的虚拟分辨率s3c_mylcdfb_info->var.bits_per_pixel = 16;//每个像素的⼤⼩,单位为bits3c_mylcdfb_info->var.grayscale = 0;//灰度值s3c_mylcdfb_info->var.red.length = 5;//红⾊像素占⽤的长度,单位bits3c_mylcdfb_info->var.green.length = 6;//绿⾊像素占⽤的长度,单位bits3c_mylcdfb_info->var.blue.length = 5;//蓝⾊像素占⽤的长度,单位bits3c_mylcdfb_info->var.red.offset= 11;//红⾊像素在16bit中的偏移值s3c_mylcdfb_info->var.green.offset= 6;//绿⾊像素在16bit中的偏移值s3c_mylcdfb_info->var.blue.offset=0;//蓝⾊像素在16bit中的偏移值s3c_mylcdfb_info->var.red.msb_right= 0;//低位在前还是⾼位在前,⼀般⾼位在前,也就是⼩端模式s3c_mylcdfb_info->var.green.msb_right= 0;s3c_mylcdfb_info->var.blue.msb_right=0;s3c_mylcdfb_info->var.activate = FB_ACTIVATE_NOW;//使⽤默认参数,显存⽴刻⽣效/*2.3 设置操作函数*/s3c_mylcdfb_info->fbops = &s3c_mylcdfb_ops;/*2.4 其它的⼀些设置 */s3c_mylcdfb_info->pseudo_palette = pseudo_palette;//调⾊板的地址//s3c_mylcdfb_info->screen_base = ;//显存的虚拟基地址s3c_mylcdfb_info->screen_size = 480*272*16/8;//单位为字节,每个像素点占⽤16bit :565,显存的⼤⼩/*3、硬件相关的操作 *//*3.1、配置GPIO⽤于LCD*/gpbcon = ioremap(0x56000010, 8);//将实际的寄存器地址转换为虚拟地址gpccon = ioremap(0x56000020 , 4);gpdcon = ioremap(0x56000030 , 4);gpgcon = ioremap(0x56000060 , 4);gpbdat = gpbcon + 1;*gpccon = 0xaaaaaaaa; /* GPIO管脚⽤于VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND */*gpdcon = 0xaaaaaaaa; /* GPIO管脚⽤于VD[23:8] */*gpbcon &= ~(3); /* GPB0设置为输出引脚 */*gpbcon |= 1;*gpbdat &= ~1; /* 输出低电平关闭LCD背光 */*gpgcon |= (3<<8); /* GPG4⽤作LCD_PWREN 电源*//*3.2、根据LCD⼿册设置LCD控制器,⽐如VCLK的频率等 */lcd_regs = ioremap(0X4D000000 , sizeof(struct lcd_regs));/** bit[17:8] : VCLK = HCLK / [(CLKVAL+1) x 2]* 10M = 100M/[(CLKVAL+1) x 2]* CLKVAL = 4** bit[6:5] :PNRMODE = 11显⽰模式,选择TFT模式** bit[4:1] :BPPMODE = 1100;像素=16bit 565** bit[0] :ENVID = 0;先关闭LCD控制器*/lcd_regs->lcdcon1 = (4<<8) | (3<<5) | (0x0c<<1);///** [31:24] : VBPD = 帧同步信号发出后,过多长时间开始显⽰数据,单位为⾏,理解为1⾏的时间* 看LCD⼿册tvb = VBPD + 1 = 2;所以VBPD = 1** [23:14]:LINEVAL + 1= 272;,所以LINEVAL = 271;垂直⽅向尺⼨,多少⾏** [13:6]:VFPD = ⼀帧的数据传输完成之后,过多长时间开始下⼀帧数据的帧同步信号,单位为⾏,理解为1⾏的时间 * 看LCD⼿册tvf = VFPD + 1 = 2;所以VFPD = 1** [5:0]:VSPW = 帧同步信号的脉冲宽度,单位为⾏* 看LCD⼿册tvp = VSPW + 1 =10;所以VSPW = 9*/lcd_regs->lcdcon2 = (1<<24) | (271<<14) | (1<<6) | (9<<0);/** [25:19]:HBPD = ⾏同步信号发出后,经过多少个VCLK,才发送像素的数据,单位为VCLK* 看LCD⼿册thb = HBPD + 1 = 2;所以HBPD=1** [18:8]:HOZVAL + 1 = 480,所以 HOZVAL = 479;⽔平⽅向尺⼨,多少列**[7:0]:HFPD = ⼀⾏的像素数据传输完成之后,经过多长时间,才能发送下⼀个⾏同步信号,单位为VCLK*看LCD⼿册thf = HFPD + 1 = 2;所以HFPD = 1;*/lcd_regs->lcdcon3 = (1<<19) | (479<<8) | (1<<0);/** [7:0]:HSPW = ⾏同步信号的脉冲宽度,单位为VCLK* 看LCD⼿册thp = HSPW + 1 = 41;所以HSPW = 40**/lcd_regs->lcdcon4 = (40<<0);/** [11] :FRM565 = 1;16位模式的格式 R:G:B = 5:6:5* [10] :INVVCLK = 0;VCLK在哪个边沿取数据 = 0表⽰下降沿取数据* [9] :INVVLINE = 1;⾏同步信号是否需要反转= 1需要反转* [8] :INVVFRAME = 1;帧同步信号是否需要反转= 1需要反转* [7] :INVVD = 0; 数据是否需要反转* [6] :INVVDEN = 0; 数据使能信号是否需要反转* [5] :INVPWREN = 0;电源使能信号是否需要反转* [4] :INVLEND = 0;⾏结束信号是否需要反转* [3] :PWREN = 0;电源使能信号,先不使能* [2] :ENLEND = 1;//⾏结束信号先使能* [1:0] :BSWP 、HWSWP = 0 1;字节内部不需要交换,字节间需要交换*/lcd_regs->lcdcon5= (1<<11) | (3<<8) | (1<<2) | (1<<0);/*3.3、显存和调⾊板设置 *//**利⽤dma_alloc_writecombine分配⼀块连续的显存*/s3c_mylcdfb_info->screen_base = dma_alloc_writecombine(NULL,s3c_mylcdfb_info->screen_size,(&(s3c_mylcdfb_info->fix.smem_start)),GFP_KERNEL);//返回虚拟地址if(s3c_mylcdfb_info->screen_base==NULL) //如果显存分配失败,直接返回{printk("undma_alloc_writecombine\n");return1;}/**将显存的地址告诉LCD控制器(物理地址)*/lcd_regs->lcdsaddr1 = (s3c_mylcdfb_info->fix.smem_start >> 1) & (~(3<<30));//起始地址lcd_regs->lcdsaddr2 = ((s3c_mylcdfb_info->fix.smem_start + s3c_mylcdfb_info->screen_size) >> 1) & 0x1fffff;//结束地址lcd_regs->lcdsaddr3 = (480*16/16); /* ⼀⾏的长度(单位: 2字节) *///s3c_lcd->fix.smem_start = xxx; /* 显存的物理地址 *//* 启动LCD */lcd_regs->lcdcon1 |= (1<<0); /* 使能LCD控制器 */lcd_regs->lcdcon5 |= (1<<3); /* 使能LCD本⾝电源 */*gpbdat |= 1; /* 输出⾼电平, 使能背光 *//*4、注册LCD*/register_framebuffer(s3c_mylcdfb_info);printk("register_framebuffer\n");return0;}static void lcd_drv_exit(void){unregister_framebuffer(s3c_mylcdfb_info);lcd_regs->lcdcon1 &= ~(1<<0); /* 关闭LCD本⾝ */*gpbdat &= ~1; /* 关闭背光 */dma_free_writecombine(NULL, s3c_mylcdfb_info->fix.smem_len, s3c_mylcdfb_info->screen_base, s3c_mylcdfb_info->fix.smem_start);iounmap(lcd_regs);iounmap(gpbcon);iounmap(gpccon);iounmap(gpdcon);iounmap(gpgcon);framebuffer_release(s3c_mylcdfb_info);}module_init(lcd_drv_init);module_exit(lcd_drv_exit);MODULE_LICENSE("GPL");2.重新编译内核,去掉默认的LCDmake menuconfig ,进⼊menu菜单重新设置内核参数:进⼊Device Drivers-> Graphics support:<M> S3C2410 LCD framebuffer support //将⾃带的LCD驱动设为模块, 不编进内核中然后make uImage 编译内核make modules 编译模块为什么要编译模块?因为LCD驱动相关的⽂件也没有编进内核,⽽fb_ops⾥的成员fb_fillrect(), fb_copyarea(), fb_imageblit()⽤的都是drivers/video下⾯的3个⽂件,所以需要这3个的.ko模块,如下图所⽰:3.挂载驱动将编译好的LCD驱动模块和drivers/video⾥的3个.ko模块放⼊nfs⽂件系统⽬录中然后烧写内核, 先装载3个/drivers/video下编译好的模块,再来装载LCD驱动模块挂载LCD驱动后, 如下图,可以通过 ls -l /dev/fb* 命令查看已挂载的LCD设备节点:4.测试运⾏测试有两种:echo hello> /dev/tty1 // LCD上便显⽰hello字段cat Makefile>/dev/tty1 // LCD上便显⽰Makeflie⽂件的内容4.1使⽤上节的键盘驱动在LCD终端打印命令⾏vi /etc/inittab //修改inittab, inittab:配置⽂件,⽤于启动init进程时,读取inittab添加->tty1::askfirst:-/bin/sh //将sh进程(命令⾏)输出到tty1⾥,也就是使LCD输出信息然后重启,insmod装载3个/drivers/video下编译好的模块,再来insmod装载LCD驱动模块,tty1设备便有了,就能看到提⽰信息:如下图,我们insmod上⼀节的键盘驱动后,按下enter键,便能在LCD终端上操作linux了从上图可以看到按下enter键,它就启动了⼀个进程号772的-sh进程,如下图发现这个-sh的描述符都指向了tty1:以上内容转载⾃。

基于ARMLinux的LCD驱动设计设计说明

基于ARMLinux的LCD驱动设计设计说明

基于ARMLinux的LCD驱动设计设计说明学号:毕业设计说明书题目基于ARM+Linux的LCD驱动设计英文并列题目LCD driver design on ARM + Linux广东石油化工学院本科毕业设计(论文)诚信承诺保证书本人郑重承诺:《基于ARM+Linux的LCD驱动设计》毕业设计(论文)的内容真实、可靠,是本人在指导教师的指导下,独立进行研究所完成。

毕业设计(论文)中引用他人已经发表或未发表的成果、数据、观点等,均已明确注明出处,如果存在弄虚作假、抄袭、剽窃的情况,本人愿承担全部责任。

学生签名:年月日系主任批准日期毕业设计(论文)任务书计算机科学与技术系计算机科学与技术专业计算机班学生一、毕业设计(论文)课题基于ARM+Linux的LCD驱动设计二、毕业设计(论文)工作自2012 年 3 月11 日起至2012 年 6 月15 日止三、毕业设计(论文)进行地点广东石油化工学院四、毕业设计(论文)的内容要求1、基于ARM+Linux的LCD驱动设计是在ARM9平台上移植Linux系统,然后基于Linux系统内核进行LCD驱动实现的设计,最终在LCD液晶显示器上显示图片。

该设计可以分为三个部分,即LCD驱动层实现、图片解码实现和LCD应用程序实现。

其中在LCD驱动层的实现中,必须对ARM9 s3c2410的硬件结构进行分析,虽然在Linux内核中已经对该芯片提供的支持,但要设置芯片的相应输出引脚为LCD 引脚;其次要对LCD液晶显示器进行分析,参考该LCD的手册进行时序的分析,并进行相应的硬件编程;最后也是最为重要的就是要了解在Linux内核中LCD驱动是如何实现的,当然可以参考内核中其他类型LCD的实现,对在Linux内核中是如何进行LCD驱动实现的层次化结构必须要了解清楚。

在图片解码中,对于要显示到LCD液晶显示器上的图片,首先必须对图片进行解码分析,然后得到图片的像素值,将这些像素值存储到LCD的缓存中,然后LCD控制器就会将这些像素值打印到LCD液晶显示器上,从而实现了对图片的显示,其中对于图片解码,用到了图片的解码库。

Linux的LCD驱动源码分析及移植

Linux的LCD驱动源码分析及移植

Linux的LCD驱动源码分析及移植————————————————————————————————作者:————————————————————————————————日期:Linux的LCD驱动源码分析及移植(三部曲)第一部分:基于ARM9处理器的linux-2.6.32。

2操作系统内核移植手记part5.1(LCD驱动源码分析及移植之platform device)1.与LCD控制器硬件相关的寄存器内容请参照三星S3C2440A技术手册中的第15章。

2. LCD Controller的平台设备定义如下(文件位于linux/arch/arm/plat—s3c24xx/devs。

c):1./* LCD Controller */2.3.static struct resource s3c_lcd_resource[] = {4. [0] = {5.。

start = S3C24XX_PA_LCD,6.。

end = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,7.。

flags = IORESOURCE_MEM,8.},9.[1] = {10. .start = IRQ_LCD,11. .end = IRQ_LCD,12. .flags = IORESOURCE_IRQ,13. }14.15.};16.17.static u64 s3c_device_lcd_dmamask = 0xffffffffUL;18.19.struct platform_device s3c_device_lcd = {20.。

name = "s3c2410-lcd”,21. .id = —1,22.。

num_resources = ARRAY_SIZE(s3c_lcd_resource),23. .resource = s3c_lcd_resource,24. .dev = {25.。

linux下LCD(framebuffer)驱动分析

linux下LCD(framebuffer)驱动分析

struct work_struct queue; /* Framebuffer event queue */
struct fb_pixmap pixmap; /* Image hardware mapper */
struct fb_pixmap sprite; /* Cursor hardware mapper */
.resume = s3c2410fb_resume,
.driver = {
.name = "s3c2410-lcd",
.owner = THIS_MODULE,
},
};
ቤተ መጻሕፍቲ ባይዱ
当注册平台驱动成功时,最终会调用 s3c2410fb_probe 函数.而这个函数根据具体的芯片
类型,将不同参数传入 s3c24xxfb_probe 函数中,后者主要完成硬件资源的探测初始化,中断
工程师的任务是什么呢?获取平台设备的相关信息,并初始化相关的硬件设备,注册中断,开辟
帧缓冲内存,注册帧缓冲设备,这就是 s3c2440fb.c 中的主要内容了.里面有一个重要的数据
结构:
static struct fb_ops s3c2410fb_ops = {
.owner
= THIS_MODULE,
/* Backlight level curve */ struct mutex bl_curve_mutex; u8 bl_curve[FB_BACKLIGHT_LEVELS]; #endif #ifdef CONFIG_FB_DEFERRED_IO struct delayed_work deferred_work; struct fb_deferred_io *fbdefio; #endif
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CPU
zh e
lcd GPIO
n
Fa
rs
ig
ht
In
1
c.
LCD
core GPC8-GPC15 GPD0-GPD15
__________________________________________________________________________ 1001
1001
VD[0:23] GPDX
rs
ig
HSYNC
ht
239
(VSPW+1)
VSPW+1+VBPD+1
In
9
c.
HSYNC HSPW HSYNC HSYNC+1 VCLK
__________________________________________________________________________ 1001
1001
__________________________________________________________________________ 1001
1001
TFT HSYNC VCLK
VSYNC HSYNC VDEN
VSYNC
1
Sh
VSYNC VSPW+1 VBPD+1 CRT TFT WXCAT35-TG3#001F 3.5 TFT VFPD +1 CRT LCD HSYNC
1001
Sh
en
fbmem.c FrameBuffer
zh e
fbmem.c FrameBuffer
3.1
FrameBuffer
n
fb_info
fb_info struct fb_info { int node; struct fb_var_screeninfo var; /* Current var */ struct fb_fix_screeninfo fix; /* Current fix */ struct fb_videomode *mode; /* current mode */
ht
ux Framebuffer
In
BIOS fbmem.c
10
c.
Framebuffer Linux Framebuffer
Linux FrameBuffer
FrameBuffer
__________________________________________________________________________ 1001
1001
LCD_PWREN : LCD LCDVF0 : SEC TFT LCDVF1 : SEC TFT LCDVF2 : SEC TFT OE REV REVB
Sh
VFRAME LCD
LCD LCD
LCD VFRAME
en
VCLK VM
VLINE LCD
LCD VCLK LCD
zh e
AC VLINE 24 5 LCD 5V 3.3V
LCDCONX
LCD
LCd LCDCON1-LCDCON5( LCDSADDR1-LCDSADDR3
LCd LCd
n
S3c2410
Fa
LCD
S3C2410 LCDSADDR1-LCDSADDR3
rs
ig
DOS
lcd
view poit
linux
3.1 FrameBuffer Linux Lin FrameBuffer Framebuffer Framebuffer
ht
STN / STN/TFT STN (TFT)/SEC TFT / / SEC TFT
TFT / SEC TFT
In
4
c.
(STN/TFT/SEC TFT) TFT / SEC TFT
__________________________________________________________________________ 1001
STN
/
TFT
/ SEC TFT
(TFT)/SEC TFT SEC
LCDVF0 : SEC TFT LCDVF1 : SEC TFT LCDVF2 : SEC TFT
Fa
Samsung Electronics Company
rs
LCD
LCD
S3C2410 74LVCH162245
dev
74LVCH162245 LCD_CON
CLKVAL
zh e
VSYNC VSPW+1 VSYNC
VCLK
LCDCON1
n
VSYNC
Fa
Frame Rate = 1/ [ { (VSPW+1) + (VBPD+1) + (LIINEVAL + 1) + (VFPD+1) } * {(HSPW+1) + (HBPD +1) + (HFPD+1) + (HOZVAL + 1) }*{ 2 *( CLKVAL+1 ) / ( HCLK ) } ] VSPW VBPD VBPD+1 VSYNC LINEVAL VFBD: VFBD+1 LINEVAL+1 VSPW+1 HSYNC VBPD+1 VBPD+1
en
240*320
zh e
n
Fa
rs
ig
ht
In
6
c.
2.1
__________________________________________________________________________ 1001
1001
Sh
en
zh e
n
Fa
rs
ig
ht
In
7
c.
2.2
__________________________________________________________________________ 1001
1001
Sh
en
zh e
n
Fa
rs
ig
ht
In
8
2.3
c.
VSPW+1=tvp=3 -> VSPW=2 VBPD+1=15 -> VBPD=14 LINVAL+1=240-> LINVAL=239
__________________________________________________________________________ 1001
1001
Linux lcd
1001 2010-5-10
----------------------------------------------------------------------------------------------------------------------
Sh
en
----------------------------------------------------------------------------------------------------------------------
lcd GPCCON )
24
GPC0-7 GPCCON GPDCON = 0xaaaaaaaa
LCD GPC GPD
GPG4 GPCX
LCD_PWEREN LCD
= 0xaaaaaaaa;GPDCON
GPIO
Sh
GPIO
en
VFRAME/VSYNC/STV : VLINE/HSYNC/CPV :
STN
240
ig
65536
,bpp:bit per pixel
ht
320 LCD
)
S3C2410 1 LCD
S3C2410X LCD VFRAME VLINE
LCD
In
130
3
c.
LCD LCD VCLK VM
__________________________________________________________________________ 1001
LCD LCD LCD VLINE LCD
LCD
LCD
n
LCD
VM
Fa
VCLK VM 5V
LCD
LCD
RGB 16 5 LCD 3.3V
rs
S3C2410
16
TFT
ig
5V
S3C2410 S3C2410
LCD LCD
ht
5V
3.3V
In
STN
5
CON/COG
LCD
c.
LCD TFT
MCU
LCD
3
TFT LCD
VFRAME, VLINE,VCLK, VM,
en
17
VIDPRCS, TIMEGEN, and LPC3600
LCDCDMA
4/8
LCD
zh e
4 3.5 : TFT LCD
DMA CPU
VCLK, VM
n
: 130
LCD
:WX3500F-M15#04
Fa
=3.5cm
rs
64K
320*240( 24bpp 16BPP
/
TFT
/ SEC TFT
VCLK/LCD_HCLK : VD[23:0] : LCD
相关文档
最新文档