LCD液晶屏驱动程序

LCD液晶屏驱动程序

2015年1月28日 晚 20:00

一.帧缓冲FrameBuffxer

帧缓冲FrameBuffer,从本质上讲是图形设备的硬件抽象,是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容,通过不断的向frame buffer中写入数据,显示控制器就自动从frame buffer中取数据并显示出来。

????一般来说是 /dev/fb0. 主设备号为29,次设备号0-31

?

二.实例演示

(1):清除LCD

????????dd if=/dev/zero of=/dev/fb0 bs=240 count=320

(2):运行应用程序,画图

????????./LCD

(3):清除LCD

????????dd if=/dev/zero of=/dev/fb0 bs=240 count=320

(4):显示图片

????????cat 7.bmp > /dev/fb0

?

三.LCD驱动程序设计

?

1.设备描述:

????struct fb_info{????//描述帧缓冲设备

????????struct fb_var_screeninfo var;????????/*可变参数*/

????????struct fb_fix_screeninfo fix;????????/*固定参数*/

????????struct fb_ops *fbops;????????????????/*帧缓冲操作*/

????????……????????};

2. struct fb_var_screeninfo记录了用户可以修改的参数显示,包括分辨率等

3. struct fb_fix_screeninfo 记录用户不能修改的显示控制器参数,如显存物理地址

4. struct fb_ops 包含了对控制器进行操作的函数指针

????例如 fb_open,fb_read,fb_write,等函数指针,如果用户没实现该函数,则内核会自动实现

5.设备注册,注册一个帧缓冲设备:

????int register_framebuffer(struct fb_info *fb_info);

同样:注销一个帧缓冲设备

????int unregister_framebuffer(struct fb_info *fb_info);

?

?

?

?

6.驱动程序分析(平台设备类型)

(1): 初始化

static struct platform_driver fb_driver = {

????.probe = fb_probe,

????.remove = fb_remove,

????.suspend=fb_suspend,

????.driver = {

????????.name = ‘LCD‘,

????????.owner=THIS_MODULE,

},

}

int __init fb_init(void){

????int ret = platform_driver_register(fb_driver);????//平台设备以平台总线的方式来分类, 平台总线是 将根据 设备的名字 和 驱动程序的名字来匹配,匹配后就会调用fb_probe这个函数

????return ret;

}

?

stativ char driver_name[]="fb";

static int __init fb_probe(struct platform_device *pdev,enum s3c_drv_type drv_type)

{

????mach_info = pdev->dev.platform_data;

????irq = platform_get_irq(pdev,0);????????//从平台设备中获取中断号

????fbinfo = framebuffer_alloc(sizeof(struct fb_info),&pdev->dev);

//分配一个fb_info帧结构

????res = platform_get_resource(pdev,IORESOURCE_MEM,0); //获取平台资源

????????????//两种资源:中断,地址(IO)资源

????info->mem = request_mem_region(res->start,size,pdev->name);

????????????//申请上面获取的res 地址,此处为物理地址

????info->io = ioremap(res->start,size);????

//将上面的物理地址转化为虚拟地址????

?

????ret = request_irq(irq,fb_irq,IRQF_DISABLED,pdev->name,info);

????????????//注册中断处理程序

????ret = register_framebuffer(fbinfo);

????????????//注册帧缓冲设备 framebuffer

}

?

7.内核配置

?

Graphics support ----> Support for frame buffer devices ----> LCD framebuffer support

?

?

?

三.LCD驱动程序设计

#include <unistd.h>

#include <stdio.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <sys/mman.h>

?

int main () {

int fp=0;

struct fb_var_screeninfo vinfo;

struct fb_fix_screeninfo finfo;

long screensize=0;

char *fbp = 0;

int x = 0, y = 0;

long location = 0;

fp = open ("/dev/fb0",O_RDWR);

?

if (fp < 0){

printf("Error : Can not open framebuffer device\n");

exit(1);

}

?

if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){

printf("Error reading fixed information\n");

exit(2);

}

if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){

printf("Error reading variable information\n");

exit(3);

}

?

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; //单帧画面空间

/*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/

fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);

if ((int) fbp == -1)

{

printf ("Error: failed to map framebuffer device to memory.\n");

exit (4);

}

/*这是你想画的点的位置坐标,(0,0)点在屏幕左上角*/

for(x=100;x<150;x++)

{

for(y=100;y<150;y++)

{

location = x * (vinfo.bits_per_pixel / 8) + y * finfo.line_length;

?

*(fbp + location) = 255; /* 蓝色的色深 */

/*直接赋值来改变屏幕上某点的颜色*/

*(fbp + location + 1) = 0;/* 绿色的色深*/

/*注明:这几个赋值是针对每像素四字节来设置的,如果针对每像素2字节,*/

*(fbp + location + 2) = 0; /* 红色的色深*/

/*比如RGB565,则需要进行转化*/

*(fbp + location + 3) = 0; /* 是否透明*/

}

}

munmap (fbp, screensize); /*解除映射*/

close (fp); /*关闭文件*/

return 0;

?

}

?

?

?

?

时间: 2024-08-12 23:04:56

LCD液晶屏驱动程序的相关文章

新巴可科技告诉您LED显示屏与LCD液晶屏的根本区别

现在人们都在追求一种享受,无论是精神还是物质上的,电视.电脑等不可缺设备更是为人们所看重,市场上眼花缭乱的产品,往往让人迷惑不已,比如说常见的lcd与led的区别,都让人感到很迷惑,今天笔者就向大家来讲解lcd与led的区别以及他们各自的特点. (左边是LCD显示屏,右边是LED显示屏) LCD与LED的原理 LCD是LiquidCrystalDisplay的简称,其构造主要是在两片平行的玻璃当中放置液态的晶体,在这平行的两片玻璃中间有许多垂直和水平的细小电线,通过通电与否来控制杆状水晶分子改变

LCD液晶屏×××?

LCD液晶屏×××?一个LCD液晶屏的好坏首先要看他的面板,因为LCD液晶屏面板的好坏直接影响到画面的观看效果,并且LCD液晶屏面板占到了整机成本一半以上,是影响LCD液晶屏的造价的主要因素,下面我们来看看关于液晶屏×××的相关内容对于LCD液晶屏×××,我给大家推荐的是"杭州立煌科技有限公司"杭州立煌科技有限公司成立于2009年,主营工业液晶屏.LCD液晶屏.TFT液晶屏,是集代理和销售于一体的高新技术企业,注册资本50万,以诚实守信,永续经营的服务宗旨,遥遥领先于同行业.杭州立煌科

19.液晶屏的原理

19.液晶屏的原理 LCD工作原理解析: 1.LCD硬件体系架构: LCD硬件体系:可以看到LCD控制器是在ARM处理器里的,用排线将LCD液晶屏和处理器连接在一起.中间是通过了LCD驱动芯片. 1.1液晶: 液晶属于一种有机化合物,分子形状为长棒状,在不同的电流作用下,分子会做有规律的旋转,这样对光线(背光灯产生)产生了一定的控制(折射),形成一个像素,而很多像素又可构成完整图像. 1.3 LCD驱动芯片: LCD驱动芯片是控制液晶分子发生变化的模块,它为液晶分子的偏转提供电压.通常情况下,L

51单片机学习笔记【五】——1602液晶屏

一.1602液晶屏基础 1.LCD1602简介 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母.数字.符号的点阵型液晶模块.它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片.本次使用型号为SMC1602A LCM的液晶屏. 2.LCD1602接口信号说明 3.控制接口说明 4.指令说明 二.实验例程 1.电路原理图 2.实验说明 本实验通

Arduino 1602液晶屏实验和程序

在Arduino IDE中, 项目->加载库->管理库中搜索LiquidCrystal,然后安装即可 1.接线图 2.引脚图 3.最简单程序 #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); lcd.print("hello,world!"); } void loop() { } 4.升级版程序 通过串口读取字符串,

s3c2440液晶屏驱动新内核 linux-4.1.24

自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev/s3c2410fb.c 先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息.当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样. 1 #define CONFIG_FB_S3C2410_DEBUG 2 #define d

51单片机实现SMC1602液晶屏显示实例

-------------------------------------------- LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1602的意思是每行显示16个字符,一共可以显示两行.如果是12232液晶(图形型液晶)则表示由1

TN,HTN,STN型液晶屏的差异

TN,HTN,STN型液晶屏的差异! 外观差异 1.1 TN LCD ( Twist Nematic Liquid Crystal Display)扭转向列型液晶一般为浅灰色底, 显示为黑色的字形或图形. 1.2 HTN LCD(High Twist Nematic Liquid Crystal Display)高扭转向列型液晶一般为偏黄绿色底, 显示为深蓝色的字形或图形. 1.3 STN LCD(Super Twist Nematic Liquid Crystal Display )超高扭转向

i.mx6 lvds接口的DE模式液晶屏驱动调试

我这篇文章主要讲述i.mx6 平台下 采用DE模式的lvds液晶屏的驱动调试, 阅读该文章之前请先阅读如下两篇我转载的文章,这两篇文章是理解我这篇文章的基础知识. 1.        lcd fb参数如何计算: http://blog.csdn.net/liuhuahan/article/details/43447657 2.        camera_lcd之DE和HV模式区别 http://blog.csdn.net/liuhuahan/article/details/43489269 详