frambuffer lcd.c


  1 /**
2 *lcd.c
3 */
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <fcntl.h>
8 #include <string.h>
9 #include <linux/fb.h>
10 #include <sys/mman.h>
11 #include <sys/ioctl.h>
12 #include <arpa/inet.h>
13 #include "type.h"
14 #include "lcd.h"
15
16
17 lcd_t lcd;
18
19 s32 lcd_fb_init(void)
20 {
21 //打开显示设备
22 lcd.fd = open("/dev/fb0", O_RDWR);
23 if (!lcd.fd)
24 {
25 printf("Error: open /dev/fb0\n");
26 return -1;
27 }
28
29 //get fix information
30 if (ioctl(lcd.fd, FBIOGET_FSCREENINFO, &lcd.finfo))
31 {
32 printf("Error: get fix info");
33 return -1;
34 }
35
36 //get variable information
37 if (ioctl(lcd.fd, FBIOGET_VSCREENINFO, &lcd.vinfo))
38 {
39 printf("Error: get var info");
40 return -1;
41 }
42
43 lcd.vinfo.bits_per_pixel = 16;
44 //lcd screen byte size
45 lcd.screensize = lcd.vinfo.xres * lcd.vinfo.bits_per_pixel / 8 +
46 lcd.vinfo.yres *lcd.vinfo.xres;
47
48 //对象映射
49 lcd.fbp = (u8 *)mmap(0, lcd.screensize, PROT_READ | PROT_WRITE, MAP_SHARED, lcd.fd, 0);
50 if ((int)lcd.fbp == -1)
51 {
52 printf("Error: mmap\n");
53 return -1;
54 }
55 }
56 void lcd_fb_release(void)
57 {
58 /*释放缓冲区,关闭设备*/
59 munmap(lcd.fbp, lcd.screensize);
60 close(lcd.fd);
61 return ;
62 }
63
64 void lcd_fb_clear(void)
65 {
66 memset(lcd.fbp, 0, lcd.screensize);
67 return ;
68 }
69
70 void lcd_fb_info(void)
71 {
72 printf("xres: %d\n", lcd.vinfo.xres);
73 printf("yres: %d\n", lcd.vinfo.yres);
74 printf("screensize: %d\n", lcd.screensize);
75 printf("bits_per_pixel: %d\n", lcd.vinfo.bits_per_pixel);
76 return;
77 }
78
79
80 void lcd_fb_put_pixel(u16 x, u16 y, color_t color)
81 {
82 u32 location;
83 if (x > lcd.vinfo.xres - 1) x = lcd.vinfo.xres - 1;
84 if (y > lcd.vinfo.yres - 1) y = lcd.vinfo.yres - 1;
85 location = x * lcd.vinfo.bits_per_pixel / 8 + y * lcd.vinfo.xres;
86 if (y%2) location -= (lcd.vinfo.yres + 80);/*if you know why? please tell me*/
87
88 if (32 == lcd.vinfo.bits_per_pixel)
89 {
90 *((u8*) (lcd.fbp + location)) = color.r;
91 *((u8*) (lcd.fbp + location + 1)) = color.g;
92 *((u8*) (lcd.fbp + location + 2)) = color.b;
93 *((u8*) (lcd.fbp + location + 3)) = 0;/*transplite, unused*/
94 }
95 else if (16 == lcd.vinfo.bits_per_pixel)
96 {
97 *((u16*)(lcd.fbp + location)) = (u16)(color.r << 11 | color.g << 5 |color.b );
98 }
99 else
100 {
101 ;//
102 }

103 }
104
105 void lcd_fb_draw_line(u16 x1, u16 y1, u16 x2, u16 y2, color_t color)
106 {
107 int i = 0;
108 int d = 0;
109 if (abs(y2 - y1) > abs(x2 - x1))
110 {
111 d = (y2 > y1) ? 1 : -1;
112 for (i = y1; i != y2; i +=d)
113 {
114 lcd_fb_put_pixel(x1 + (i - y1) * (x2 - x1) / (y2 - y1), i, color);
115 }
116 }
117 else
118 {
119 d = (x2 > x1) ? 1 : -1;
120 for (i = x1; i != x2; i+=d)
121 {
122 lcd_fb_put_pixel(i, y1 + (i - x1) * (y2 - y1) / (x2 - x1), color);
123 }
124 }
125 }

frambuffer lcd.c,码迷,mamicode.com

时间: 2024-12-09 23:02:38

frambuffer lcd.c的相关文章

LCD底层驱动分析

根据分析的框架,自己写一个LCD驱动程序 1分析LCD硬件原理图 Von和Voff接的是一个电源电路,通过LCD_POWER接的是GPG4来控制LCD电源,高电平表示开启LCD电源 VM接的是CPU的VM:VDEN /GPC4为数据使能信号, VLINE接的CPU:HSYNC/GPC2,HSYNC信号有效时,表示一行数据的开始: VFRAME接的CPU:VSYNC/GPC3,VSYNC信号有效时,表示一帧数据的开始 VCLK接的CPU:VCLK/GPC1 表示像素时钟信号,每个VCLK信号表示正

LCD设备驱动程序

LCD是Liquid  Crystal  Display的简称,也就是经常所说的液晶显示器 LCD能够支持彩色图像的显示和视频的播放,是一种非常重要的输出设备 Framebuffer 是Linux系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行操作 Framebuffer又叫帧缓冲,是Linux为操作显示设备提供的一个用户接口.用户应用程序可以通过Framebuffer透明地访问不同类型的显示设备. 从这个方面来说,Fra

LCD参数解释及计算【转】

转自:http://blog.csdn.net/longxiaowu/article/details/24319933 Linux内核的amba lcd控制器使用clcd_panel结构体表示一个LCD屏的硬件参数: [cpp] view plain copy /* include/linux/fb.h */ struct fb_videomode { const char *name; /* optional */ u32 refresh; /* optional */ u32 xres; u

u-boot支持LCD显示(基于TQ2440)

平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB  NandFlash:256MB) 作者:彭东林 邮箱:[email protected] 摘要 这个版本的u-boot支持LCD很容易,期间,参考了tq2440官方u-boot中的LCD驱动.我们只需要在配置文件中配置相应的宏,实现LCD的初始化和使能函数即可. 代码我已经上传到CSDN上了,[email protected]:pengdonglin137/u-b

LCD设备驱动

一.LCD硬件原理 利用液晶制成的显示器LCD,依据驱动方式可分为静态驱动.简单矩阵驱动以及主动矩阵驱动3中.其中,简单矩阵型又可再区分扭转向列型(TN)和超扭转式向列型(STN)两种,而主动矩阵型则以薄膜式晶体管型(TFT)为主流. 一块LCD屏显示图像不但需要LCD驱动器,还需要有相应的LCD控制器.通常LCD驱动器会议COF/COG与LCD玻璃基板制作在一起,而LCD控制则由外部电路来实现.许多MCU北部直接集成了LCD控制,通过LCD控制器可以方便地控制STN和TFT屏. 下图给出了LC

LCD驱动分析【转】

转自:http://blog.csdn.net/hanmengaidudu/article/details/21559153 1.S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 其中的代码也可直接参考:drivers/video/s3c2410fb.c 以下为转载文章,文章原地址:http://blog.csdn.net/jianyun123/archive/2010/04/24/5524427.aspx S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 一

10. LCD驱动程序 ——框架分析

引言: 由LCD的硬件原理及操作(可参看韦哥博客:第017课 LCD原理详解及裸机程序分析) 我们知道只要LCD控制器的相关寄存器正确配置好,就可以在LCD面板上显示framebuffer中的内容. 若应用程序需要在LCD屏幕上显示文字或图像时,只需要把相应的显示内容以正确的格式写到Framebuffer中即可. (Framebuffer,中文名字是帧缓冲,这个帧也就是一副图像所需要的数据.因此,帧缓冲其实就是LCD设备的驱动程序) 一.LCD驱动程序框架 根据上述思路,Linux LCD 驱动

重学STM32---(七) FSMC+LCD

关于FSMC+LCD第一次学习完时候,自己也还是对这个不清不白,时而清楚,时而糊涂.这一次再次学习的话,不能在这样了,仔仔细细把STM32参考手册,原子的LCD实验看了一遍,又在网上找了好些关于FSMC+LCD的资料,终于彻底明白了,,,当然,叫我完全一个人独立的把这个LCD显示实验程序写出来还是不可能的,C语言还是有待提高,实战还是太少,看到别人写的代码,有些细节根本一点都想不到,更何况让自己去写.... 收集的资料: LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS

单片机第14课:LCD使用

下面是LCD的电路,其中RD接P2^6;LCDE接P2^7,WR接P2^5. #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit lcd_E = P2^7; sbit lcd_RS = P2^6; sbit lcd_WR = P2^5; uchar code table_show1[] = "Hello!"; uchar code table_show2[] = "