电子书需要通过屏幕显示出来,首先写了LCD模块。代码上传到了 github https://github.com/qq2216691777/E-book

本次完善了lcd模块的程序。可以适用在其他地方。

代码:fb.c  fb.h

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <stdlib.h> #include "fb.h"
#include "main.h" static int Device_FB_Init(void);
static void lcd_put_pixel(int x, int y, unsigned int color );
static void lcd_clean( unsigned int color );
static void Device_FB_Destory(void); fb_t g_fb={
0,
0,
0,
0,
0,
0,
NULL,
&Device_FB_Init,
&lcd_put_pixel,
&lcd_clean,
&Device_FB_Destory,
}; static void lcd_put_pixel(int x, int y, unsigned int color )
{
unsigned char *pen_8 = g_fb.fbmem + y*g_fb.xres*g_fb.pixel_chars+x*g_fb.pixel_chars;
unsigned short *pen_16 = (unsigned short *)pen_8;
unsigned short *pen_32 = (unsigned short *)pen_8;
unsigned char red,blue,green;
switch(g_fb.pixel_bits)
{
case 8:
*pen_8 = color;
break;
case 16:
/* 565 */
red = (color>>16) & 0xff;
green = (color>>8) & 0xff;
blue = (color>>0) & 0xff;
color = ((red>>3)<<11) | ((green>>2)<<5) |((blue>>3));
*pen_16 = color;
break;
case 32:
*pen_32 = color;
break;
default:
DEBUG_PRINT("ERROR: can't support %ddpp\n",g_fb.pixel_bits);
break;
}
} static void lcd_clean( unsigned int color )
{
unsigned char *pen_8 = g_fb.fbmem;
unsigned short *pen_16 = (unsigned short *)pen_8;
unsigned short *pen_32 = (unsigned short *)pen_8;
unsigned char red,blue,green;
int i = g_fb.screen_size;
switch(g_fb.pixel_bits)
{
case 8:
break;
case 16:
/* 565 */
red = (color>>16) & 0xff;
green = (color>>8) & 0xff;
blue = (color>>0) & 0xff;
color = ((red>>3)<<11) | ((green>>2)<<5) |((blue>>3));
break;
case 32:
break;
default:
DEBUG_PRINT("ERROR: can't support %ddpp\n",g_fb.pixel_bits);
return;
}
while(i)
{
switch(g_fb.pixel_bits)
{
case 8:
*pen_8 = color;
pen_8++;
i--;
break;
case 16:
*pen_16 = color;
pen_16++;
i-=2;
break;
case 32:
*pen_32 = color;
pen_32++;
i-=4;
break; } } } static int Device_FB_Init(void)
{
int fb_fd;
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var; fb_fd = open(DEVICE_NAME, O_RDWR);
if (fb_fd<0)
{
DEBUG_PRINT("open device fb failed\n");
return -1;
}
if( ioctl( fb_fd, FBIOGET_VSCREENINFO, &var ) )
{
DEBUG_PRINT("can't get var\n");
return -1;
} if( ioctl( fb_fd, FBIOGET_FSCREENINFO, &fix ) )
{
DEBUG_PRINT("can't get fix\n");
return -1;
} g_fb.fd = fb_fd;
g_fb.xres = var.xres;
g_fb.yres = var.yres;
g_fb.pixel_bits = var.bits_per_pixel;
g_fb.pixel_chars = var.bits_per_pixel/8;
g_fb.screen_size = var.xres*var.yres*var.bits_per_pixel/8;
g_fb.fbmem = (unsigned char *)mmap( NULL, g_fb.screen_size, PROT_READ | PROT_WRITE, MAP_SHARED,fb_fd,0 ); printf("xres:%d\n", g_fb.xres);
printf("yres:%d\n", g_fb.yres);
printf("pixel bit:%d\n", g_fb.pixel_bits);
printf("pixel char:%d\n", g_fb.pixel_chars);
return 0; } static void Device_FB_Destory(void)
{
free(g_fb.fbmem);
}
#ifndef _FB_H__
#define _FB_H__ #define DEVICE_NAME "/dev/fb0" typedef struct
{
int fd;
int xres;
int yres;
int pixel_bits;
int pixel_chars;
int screen_size;
unsigned char *fbmem;
void (*Devie_Init)(void);
void (*put_pixel)(int x, int y, unsigned int color );
void (*cleanscreen)( unsigned int color );
void (*Devie_Destory)(void); }fb_t; extern fb_t g_fb; #endif

E-BOOK-TINY6410-LCD的使用的更多相关文章

  1. Tiny6410 LCD设置

    1.注意LCD的硬件连接 2.LCD初始化 2.1 初始化步骤 LCD时序设置 LCD芯片 2.2 引脚初始化 2.3 配置 MIFPCON 寄存器及SPCON 寄存器 2.4 配置VIDCONx 2 ...

  2. 向tiny6410中移植中移植linux-4.5.1内核(最新)

    下载linux-4.5.1.tar.gz 解压在任意目录下.我解压在/home/tiny6410/ # tar xvzf linux-4.5.1.tar.gz # cd linux-4.5.1/ 修改 ...

  3. Tiny6410之重定位代码到SDRAM

    在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...

  4. tiny6410 启动参数

    baudrate=115200 bootargs=noinitrd root=/dev/nfs nfsroot=192.168.1.116:/home/suxuandong/Documents/com ...

  5. tiny6410 uboot启动参数的问题

    使用uboot来启动tiny6410,需要在启动参数中加入lcd=S70,才能在lcd上显示正确的画面

  6. 自己写Tiny6410的Bootloader总结!

    1.由于Tiny6410 2G版的Nand flash(K9GAG08U0E)的页大小是8K的,但是s3c6410芯片设置为nand flash启动时先从nand flash复制8K代码到片内内存中去 ...

  7. Tiny6410烧入uboot,linux内核,文件系统

    好久没有玩tiny6410了,今天拿出来试试.之前学习一直是跟着视频学习的.今天自己动手来做一下. 首先我将光盘linux目录下的linux-2.6.38-20150708.tgz  rootfs_r ...

  8. STM32F429 LCD程序移植

    STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...

  9. 分页型Memory LCD显存管理与emWin移植

    上一篇随笔整理了一下逐行扫描型Memory LCD的显存管理与emWin移植,这篇就整理一下分页型Memory LCD显存管理与emWin移植. //此处以SSD1306作为实例 //OLED的显存/ ...

  10. 逐行扫描型Memory LCD显存管理与emWin移植

    因为Memory LCD 的特性,不能设置像素坐标,只能用缓存整体刷新. 所以对于Memory LCD来说,emWin移植仅与打点函数有关,这里用Sharp Memory LCD(ls013b7dh0 ...

随机推荐

  1. pom文件中<dependencies>和<dependencyManagement>的区别

    在父pom中,如果使用了<dependencies>标签,那么在该标签体中的所有jar包,即使子工程中没有写这些依赖,依旧会引用. 如果使用了<dependencyManagemen ...

  2. moviepy音视频开发:音频剪辑基类AudioClip详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识介绍 1.1.声音三要素: 音调:人耳对声音高低的感觉称为音调(也叫音频).音调主要与声波的频率有关.声波的频率高,则音调也高. 音量:也就是响度 ...

  3. 转:浅谈HTTP中Get、Post、Put与Delete的区别

    1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...

  4. PyQt(Python+Qt)学习随笔:QScrollArea滚动区域layout布局的作用及设置方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域可以设置布局,布局的作用其实与其他布局一样,就是在滚动区域大小调整时,滚动区域内的子部件跟随 ...

  5. Python学习随笔:PyCharm的错误检测使用及调整配置减少错误数量

    老猿使用PyCharm有将近一个月了,发现PyCharm并不能很好的完成语法检查,有时运行时突然终止,仔细核查却发现是基本的语法错误,不过有次无意中移动鼠标到代码最右边的边框时发现其实PyCharm有 ...

  6. PyQt学习随笔:Qt事件QEvent.type类型常量及其含义资料汇总详细内容速查

    下表是Qt5.11提供的所有已经定义的事件类型常量及其含义说明(其中标蓝色的是老猿认为价值比较大的事件),事件的事件类型通过QEvent.type()来获取.由于老猿没有找到直接粘贴Excel表格的方 ...

  7. Oracle表操作-创建及增删改查

    数据类型: 1.CHAR:定长字符类型,默认长度是1,最长不超过2000字节. 2.CARCHAR2(length):可变字符类型,默认长度是1,最长不超过4000字符. 3.NUMBER(P,S): ...

  8. VMware 虚拟机网卡设置与外网访问

    1 查看虚拟机网卡设置,查看虚拟机网关. 2 然后,设置本地机器VMnet8网卡的IP地址和子网掩码.切记,IP地址不能与虚拟机网卡IP地址相同. 3 配置虚拟机Centos的ens33网卡 TYPE ...

  9. C++异常之三 异常处理接口声明

    异常处理接口声明 1 一般为了方便程序员阅读代码,提高程序的可读性,会将函数中的异常类型声明至函数头后方,不用一行一行的找抛出内容: 2 这里要注意一点,这属于C++的标准语法,但在VS中这个操作不被 ...

  10. 十、TestNG分组测试

    使用 groups 属性 package com.lc.tesgFenZu; import org.testng.annotations.AfterGroups; import org.testng. ...