电子书需要通过屏幕显示出来,首先写了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. 基于CefSharp开发(三)浏览器头部优化

    一.上文回顾 上编实现了简单的网页加载功能包括URL输入.打开空标签页.网页链接中新页面处理等 本编将对网页的Title绑定.前进.后退.刷新等事件处理 二.Title绑定处理 当打开网页时Title ...

  2. mySQL入门之多表操作

    外键 初识外键 外键:引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束.(外键用于建立和加强两个表数据之间的连接,保证数据的完整和统一性) 主表:被引用的表 从表:引用外键的表 -- ...

  3. maven私服拉取jar失败(内网)

    解决方案: 1.私服没jar,找私服负责人添加 2.私服有拉不下来,重启nexus服务端(负责人做) 3.本地有jar但是idea中没找到,先执行一下reimport,不行的话,随意修改下pom文件, ...

  4. CTFHub Web题学习笔记(Web前置技能+信息泄露题解writeup)

    今天CTFHub正式上线了,https://www.ctfhub.com/#/index,之前有看到这个平台,不过没在上面做题,技能树还是很新颖的,不足的是有的方向的题目还没有题目,CTF比赛时间显示 ...

  5. 轮廓检测论文解读 | 整体嵌套边缘检测HED | CVPR | 2015

    主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, gr ...

  6. SQL直接生成实体属性,简单粗暴型

    在java开发中,不可避免的要碰到根据表生成对应的实体,这个过程是比较机器且繁琐的,我也用过一些逆向工程的工具,比如IDEA自带的生成实体,还有网上开源的工具,用起来也是可以的. 我现在开发用的持久层 ...

  7. 如何实现OSM地图本地发布并自定义配图

    目录 1.缘起 2.准备环境 2.1.安装linux系统 2.2.安装docker 2.3.安装Docker Compose 2.4.安装git 3.发布地图 3.1.拉取代码 3.2.测试网络 3. ...

  8. CF1439C Greedy Shopping

    题解 尝试做一下,感觉是每次取一段前缀和,这样就相当于让我们证明在 \(a_i\le 10^{12}\) 时,不可能构造出隔一个取一个的情况(\(n=10^5\)). a[i]: 1, 2, 3, 5 ...

  9. P7077 函数调用

    我好蠢啊... 考试的时候不会写,现在看了这么多篇题解还是似懂非懂,所以决定写一下草稿... 草稿 和 题解 就是首先,题目保证了函数不会间接的调用其本身,所以可以直接知道这是一个 \(\text{D ...

  10. C++笔试题续

    第一部分:C++与C语言的差异(1-18)1.C 和 C++ 中 struct 有什么区别? Protection行为 能否定义函数C 无 否,但可以有函数指针C++ 有 可以,默认是public2. ...