E-BOOK-TINY6410-LCD的使用
电子书需要通过屏幕显示出来,首先写了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的使用的更多相关文章
- Tiny6410 LCD设置
1.注意LCD的硬件连接 2.LCD初始化 2.1 初始化步骤 LCD时序设置 LCD芯片 2.2 引脚初始化 2.3 配置 MIFPCON 寄存器及SPCON 寄存器 2.4 配置VIDCONx 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/ 修改 ...
- Tiny6410之重定位代码到SDRAM
在上一章中,将代码重定位到了SRAM中,但是这样的做法作用不大.正确的做法的是将代码重定位到更大的主存中,即DRAM.Tiny6410的DRAM控制寄存器最多只能支持两个同一类型的芯片.每个芯片最多可 ...
- tiny6410 启动参数
baudrate=115200 bootargs=noinitrd root=/dev/nfs nfsroot=192.168.1.116:/home/suxuandong/Documents/com ...
- tiny6410 uboot启动参数的问题
使用uboot来启动tiny6410,需要在启动参数中加入lcd=S70,才能在lcd上显示正确的画面
- 自己写Tiny6410的Bootloader总结!
1.由于Tiny6410 2G版的Nand flash(K9GAG08U0E)的页大小是8K的,但是s3c6410芯片设置为nand flash启动时先从nand flash复制8K代码到片内内存中去 ...
- Tiny6410烧入uboot,linux内核,文件系统
好久没有玩tiny6410了,今天拿出来试试.之前学习一直是跟着视频学习的.今天自己动手来做一下. 首先我将光盘linux目录下的linux-2.6.38-20150708.tgz rootfs_r ...
- STM32F429 LCD程序移植
STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...
- 分页型Memory LCD显存管理与emWin移植
上一篇随笔整理了一下逐行扫描型Memory LCD的显存管理与emWin移植,这篇就整理一下分页型Memory LCD显存管理与emWin移植. //此处以SSD1306作为实例 //OLED的显存/ ...
- 逐行扫描型Memory LCD显存管理与emWin移植
因为Memory LCD 的特性,不能设置像素坐标,只能用缓存整体刷新. 所以对于Memory LCD来说,emWin移植仅与打点函数有关,这里用Sharp Memory LCD(ls013b7dh0 ...
随机推荐
- C和指针课后练习题4
1.下面表达式是否合法?如果合法,他执行什么任务? 3* x * x - 4 * x + 6; 合法;他只是执行了表达式求值,但是他的结果并不存于任何地方. 2.赋值语句的语法? 数据类型 变量名 = ...
- 硬RAID和软RAID
RAID简介: RAID是 Redundant Array of Independent Disks的简写,意为独立磁盘冗余阵列,简称磁盘阵列.基本思想是把多个相对便宜的硬盘结合起来,称为一个磁盘阵列 ...
- Python运算符的优先级是怎样的?
优先级数字越高表示优先级越高,有关运算符的详细介绍请参考<Python运算符大全>
- 如何使用 K8s 两大利器"审计"和"事件"帮你摆脱运维困境?
概述 下面几个问题,相信广大 K8s 用户在日常集群运维中都曾经遇到过: 集群中的某个应用被删除了,谁干的? Apiserver 的负载突然变高,大量访问失败,集群中到底发生了什么? 集群节点 Not ...
- WindowsServerU盘系统盘制作
一.工具及安装包准备: 1.UltraISO软碟通 下载:链接:https://pan.baidu.com/s/1gixSdpEjvh6I31rGeh1-Gg 提取码:9zbx (大学期间无意间找到一 ...
- NET CORE通过NodeService调用js
在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 .NET C ...
- 谈谈 javascript的 call 和 apply用法
定义: ECMAScript规范为所有函数都包含两个方法(这两个方法非继承而来),call和apply,这两个函数都是在特定的作用域中调用函数,能改变函数的作用域,实际上是改变函数体内 this 的值 ...
- CF392B Tower of Hanoi
题目链接. Description 三塔汉诺塔问题,给一个 \(3 \times 3\) 的矩阵 \(t\),\(t_{i, j}\) 表示从 \(i\) 塔移动一个盘子到 \(j\) 塔的花费. 初 ...
- 题解-The Number of Good Intervals
题面 The Number of Good Intervals 给定 \(n\) 和 \(a_i(1\le i\le n)\),\(m\) 和 \(b_j(1\le j\le m)\),求对于每个 \ ...
- 计算机语言与JAVA的发展
计算机语言与JAVA的发展 第一代语言 2进制 第二代语言 汇编语言 解决人类无法读懂的问题 指令替代二进制 目前应用 逆向工程 机器人 病毒 第三代语言 摩尔定律 性能提升愈来愈慢 高级语言 面向过 ...