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
时间: 2024-09-30 05:40:29

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

使用Libpng库实现Tiny6410显示PNG图片

Linux内核版本号:linux 2.6.39 交叉编译工具     :arm-linux-gcc 4.5.1 开发板             :友善之臂Tiny6410 LCD                :友善之臂S70 Libpng版本       :libpng-1.5.14 Zlib版本           :zlib-1.2.8 一.交叉编译Zlib Zlib是一个文件压缩库,在Libpng交叉编译的时候需要使用到它的头文件和库,所以先编译它.zlib-1.2.8.tar.gz 下

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

Linux内核版本号:linux 2.6.39 交叉编译工具:arm-linux-gcc 4.5.1 Linux内核下载:www.kernel.org 开发板:友善之臂Tiny6410 LCD:友善之臂S70 一.移植LED驱动 打开arch/arm/mach-s3c64xx/mach-mini6410.c添加下列代码: 1 static struct gpio_led tiny6410_gpio_led[] = { 2 [0] = { 3 .name = "led1", //设备名

通过nfs网络文件系统启动tiny6410开发板时uboot启动参数的设置 &nbsp;

通过nfs网络文件系统启动tiny6410开发时uboot启动参数应该设置为: console=ttySAC0 lcd=S70 root=/dev/nfs nfsroot=192.168.1.30:/opt/tiny6410/fs/rootfs_mini6410 ip=192.168.1.40:192.168.1.30:192.168.1.30:255.255.255.0:tiny6410:eth0:off 注意:这里一定要指明你的lcd的类型,不然通过nfs成功启动tiny6410时,你的lc

重学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[] = "

RT-Thread-v2.0.0移植到STM32及驱动LCD和测温

先简单记录下安装: 1. 安装 sourcery工具链或 keil都行 安装python 和 scons: 配置这些工具路径以及RT-Thread源码路径RTT_ROOT,添加到环境变量 2. 开始编译 bsp\stm32f10x工程,在编译以前需要稍微修改如下几个文件 rtconfig.py 此文件必须修改 rtconfig.h 此文件用于裁剪rt-thread(根据需要修改) 比如使用 keil工具来编译: 修改rtconfig.py, CROSS_TOOL='keil' EXEC_PATH

Linux LCD驱动(三)--图形显示

3.  BMP和JPEG图形显示程序3.1  在LCD上显示BMP或JPEG图片的主流程图首先,在程序开始前.要在nfs/dev目录下创建LCD的设备结点,设备名fb0,设备类型为字符设备,主设备号为29,次设备号为0.命令如下:mknod fb0 c 29 0在LCD上显示图象的主流程图如图3.1所示.程序一开始要调用open函数打开设备,然后调用ioctl获取设备相关信息,接下来就是读取图形文件数据,把图象的RGB值映射到显存中,这部分是图象显示的核心.对于JPEG格式的图片,要先经过JPE

Linux LCD驱动(四)--驱动的实现

目录(?)[-] 基本原理 写 framebuffer 驱动程序要做什么 LCD 模块 驱动程序 控制器 什么是 frame buffer 设备 Linux Frame Buffer 驱动程序层次结构 数据结构 接口 一个 LCD controller 驱动程序 分配系统内存作为显存 实现 fb_ops 结构 基本原理 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来: 驱动程序分配系统内存作为显存:实现

linux 2440 LCD 应用程序编程

一.Linux的帧缓冲设备 帧缓冲(framebuffer)是 Linux 为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.这种操作是抽象的,统一的.用户不必关心物理显存的位置.换页机制等等具体细节.这些都是由Framebuffer 设备驱动来完成的.帧缓冲驱动的应用广泛,在 linux 的桌面系统中,Xwindow 服务器就是利用帧缓冲进行窗口的绘制.尤其是通过帧缓冲可显示汉字点阵,成为 Linux汉化的唯一可行方案. 帧缓冲设备对

u-boot命令行调试LCD简单记录

一般来说,调试uboot最好的方式是使用openjtag,因为uboot说到底就是一段裸机程序,只不过比较复杂.但是受实际环境限制,实际工作中使用较多的调试技巧主要有两种:打印和直接在命令行测试,打印比较常见也比较简单,直接使用printf即可,这里就以最近这段时间调试uboot下面lcd为例,简单说说命令行调试. 平台: am335x,u-boot 2010.09,linux 3.10 问题: 由于此版本u-boot比较旧,没有整套framebuffer子系统框架,所以采取的是移植好官方裸机驱