基于am3358的lcd输出

时间:2021-02-17 00:44:00
/*#include<stdio.h>

*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>   

//14byteÎÄŒþÍ·
typedef struct
{
    char cfType[2];//ÎÄŒþÀàÐÍ£¬"BM"(0x4D42)
    long cfSize;//ÎÄŒþŽóС£š×֜ڣ©
    long cfReserved;//±£Áô£¬ÖµÎª0
    long cfoffBits;//ÊýŸÝÇøÏà¶ÔÓÚÎÄŒþÍ·µÄÆ«ÒÆÁ¿£š×֜ڣ©
}__attribute__((packed)) BITMAPFILEHEADER;
//__attribute__((packed))µÄ×÷ÓÃÊÇžæËß±àÒëÆ÷È¡Ïûœá¹¹ÔÚ±àÒë¹ý³ÌÖеÄÓÅ»¯¶ÔÆë   

//40byteÐÅϢͷ
typedef struct
{
    char ciSize[4];//BITMAPFILEHEADERËùÕŒµÄ×ÖœÚÊý
    long ciWidth;//¿í¶È
    long ciHeight;//žß¶È
    char ciPlanes[2];//Ä¿±êÉ豞µÄλƜÃæÊý£¬ÖµÎª1
    int ciBitCount;//ÿžöÏñËصÄλÊý
    char ciCompress[4];//ѹËõ˵Ã÷
    char ciSizeImage[4];//ÓÃ×֜ڱíÊŸµÄÍŒÏñŽóС£¬žÃÊýŸÝ±ØÐëÊÇ4µÄ±¶Êý
    char ciXPelsPerMeter[4];//Ä¿±êÉ豞µÄˮƜÏñËØÊý/Ã×
    char ciYPelsPerMeter[4];//Ä¿±êÉ豞µÄŽ¹Ö±ÏñËØÊý/Ã×
    char ciClrUsed[4]; //λ͌ʹÓõ÷É«°åµÄÑÕÉ«Êý
    char ciClrImportant[4]; //Öž¶šÖØÒªµÄÑÕÉ«Êý£¬µ±žÃÓòµÄÖµµÈÓÚÑÕÉ«Êýʱ£š»òÕßµÈÓÚ0ʱ£©£¬±íÊŸËùÓÐÑÕÉ«¶ŒÒ»ÑùÖØÒª
}__attribute__((packed)) BITMAPINFOHEADER;  

typedef struct
{
    unsigned short blue;
    unsigned short green;
    unsigned short red;
    unsigned short reserved;
}__attribute__((packed)) PIXEL;//ÑÕɫģʜRGB   

BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;  

static char *fbp = 0;
static int xres = 0;
static int yres = 0;
static int bits_per_pixel = 0;  

int  showbmp2();

int main ( int argc, char *argv[] )
{
    int fbfd = 0;
    int index=0;
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    long int screensize = 0;
    struct fb_bitfield red;
    struct fb_bitfield green;
    struct fb_bitfield blue;  

    //open the showdeviece
    fbfd = open("/dev/fb0", O_RDWR);
    if (!fbfd)
    {
        printf("Error: cannot open framebuffer device.\n");
        exit(1);
    }  

    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo))
    {
        printf("Error£ºreading fixed information.\n");
        exit(2);
    }  

    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
    {
        printf("Error: reading variable information.\n");
        exit(3);
    }  

    printf("R:%d,G:%d,B:%d \n", vinfo.red, vinfo.green, vinfo.blue );  

    printf("%dx%d, %dbpp,%d clock\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel,vinfo.pixclock );
    xres = vinfo.xres;
    yres = vinfo.yres;
    bits_per_pixel = vinfo.bits_per_pixel;  

    //ŒÆËãÆÁÄ»µÄ×ÜŽóС£š×֜ڣ©
    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
    printf("screensize=%d byte\n",screensize);  

    //¶ÔÏóÓ³Éä
    fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0);
    if ((int)fbp == -1)
    {
        printf("Error: failed to map framebuffer device to memory.\n");
        exit(4);
    }  

    printf("sizeof file header=%d\n", sizeof(BITMAPFILEHEADER));  

    printf("into show_bmp function\n");  

    showbmp2();

    //ÉŸ³ý¶ÔÏóÓ³Éä
    munmap(fbp, screensize);  

//
    close(fbfd);  

    return 0;
}
///*
  unsigned char buf[3][1680*1050*4];
  unsigned char data[640*480*3];
int  showbmp2()
{
    int x,y;

    int index=0;
    unsigned char *p;
    FILE *fp[3];

        fp[0] = fopen("./000.bmp","rb+");
        fp[1] = fopen("./111.bmp","rb+");
        fp[2] = fopen("./222.bmp","rb+");

    fread(data,54,1,fp[0]);
    fread(data,640*480*3,1,fp[0]);
    for(y=0;y<480;y++)
    {
	for(x=0;x<800;x++)
	{
            if(x<640)
            {
            	buf[0][((479-y)*800+x)*4 + 0] = data[((y*640) + x)*3 + 0];
                buf[0][((479-y)*800+x)*4 + 1] = data[((y*640) + x)*3 + 1];
                buf[0][((479-y)*800+x)*4 + 2] = data[((y*640) + x)*3 + 2];
                //buf[1][(479-y)*1680+x)*4 + 3] = data[((y*640) + x)*3 + 0];
            }
	}
    }
//
    fread(data,54,1,fp[1]);
    fread(data,640*480*3,1,fp[1]);
    for(y=0;y<480;y++)
    {
	for(x=0;x<1680;x++)
	{
            if(x<640)
            {
            	buf[1][((479-y)*800+x)*4 + 0] = data[((y*640) + x)*3 + 0];
                buf[1][((479-y)*800+x)*4 + 1] = data[((y*640) + x)*3 + 1];
                buf[1][((479-y)*800+x)*4 + 2] = data[((y*640) + x)*3 + 2];
                //buf[1][(479-y)*1680+x)*4 + 3] = data[((y*640) + x)*3 + 0];
            }
	}
    }
//
    fread(data,54,1,fp[2]);
    fread(data,640*480*3,1,fp[2]);
    for(y=0;y<480;y++)
    {
	for(x=0;x<1680;x++)
	{
            if(x<640)
             {
            	buf[2][((479-y)*800+x)*4 + 0] = data[((y*640) + x)*3 + 0];
                buf[2][((479-y)*800+x)*4 + 1] = data[((y*640) + x)*3 + 1];
                buf[2][((479-y)*800+x)*4 + 2] = data[((y*640) + x)*3 + 2];
                //buf[1][(479-y)*1680+x)*4 + 3] = data[((y*640) + x)*3 + 0];
            }
	}
    }
    fclose(fp[0]); fclose(fp[1]); fclose(fp[2]);
    //
    while(1)
    { 

            memcpy(fbp,buf[index%3],800*480*4);
	    sleep(1);
           if(index++>100)
               break;
    }
    printf("/nover!/n");
    return 0;
}

基于am3358的lcd输出的更多相关文章

  1. &lbrack;zz&rsqb; 基于国家标准的 EndNote 输出样式模板

    基于国家标准的 EndNote 输出样式模板 https://cnzhx.net/blog/endnote-output-style-cnzhx/ 发表于 2013-05-26 作者 Haoxian ...

  2. 基于FPGA的LCD&plus;CMOS视频采集显示使用小结

    基于FPGA的LCD+CMOS视频采集显示 液晶显示器采用扫描模式,RGB888 电源采用:+5V供电 usb供电有时候会出现供电不足的问题 显示器接口有两种选择:16bit或24bit  分别对应 ...

  3. &lbrack;转&rsqb;基于国家标准的 EndNote 输出样式模板 ----直接用endnote导入到word,不用自己一个个改参考文献了

    EndNote 相当于一个数据库,将添加/导入的文献存档.需要引用文献的时候就从中选择一个插入到文档中,EndNote 会自动给你编号.在文档末尾建立相应的参考文献列表.但是各种杂志.单位要求的文献著 ...

  4. AM3358--Uboot支持LCD输出1024&ast;768

    1. uboot/include/lcd/tq3358_fb.h #define TFT240320 1 #define TFT320240 2 #define TFT480272 3//T43(天嵌 ...

  5. 基于am3358的蜂鸣器测试

    #include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...

  6. 基于am3358的led跑马灯测试

    #include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...

  7. 基于am3358的led跑马灯測试

    #include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...

  8. u-boot支持LCD显示(基于TQ2440)【转】

    本文转载自:http://www.cnblogs.com/pengdonglin137/p/4633877.html u-boot支持LCD显示(基于TQ2440)   阅读目录(Content) 平 ...

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

    平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB  NandFlash:256MB) 作者:彭东林 邮箱:pengdo ...

随机推荐

  1. hiho一下第一周 最长回文子串

    题目链接:http://hihocoder.com/contest/hiho1/problem/1 #include <iostream> #include <cstdio> ...

  2. WIN10环境下搭建与连接VPN服务器

    搭建VPN服务器 0.前言 1.WIN+E打开此电脑 2.勾选始终显示菜单,并应用,确定 3.新建传入连接,可以添加用户,也可以直接选取已有用户 连接VPN服务器 1.打开vpn设置 2.添加vpn连 ...

  3. WINDOWS下,中文JSON格式读取报错处理:ValueError&colon; No JSON object could be decoded

    File "C:\Python27\lib\json\__init__.py", line 290, in load **kw) File "C:\Python27\li ...

  4. C&plus;&plus; type&lowbar;traits 原理

    一.简单介绍 (1).type_traits 类型萃取,C++11中已结成为了一个核心模块. (2).标准库包括helper classes .type traits.type transformat ...

  5. iOS学习——UIAlertController详解

    在开发中,弹出提示框是必不可少的.这两天项目中统一对已经被iOS API废弃的UIAlertView和UIActionSheet进行替换,我们知道,UIAlertView和UIActionSheet都 ...

  6. Dubbo注册Zookepper服务的虚拟IP

    使用dubbo在zookepper上注册服务,使用dubbo的服务器IP为192.168.70.105 而在zookepper上显示服务提供者为 dubbo://202.102.110.203:808 ...

  7. Base64原理与实现

    Base64编码说明 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式. 如果剩下的字符不足3个字节,则用0填充 ...

  8. Java编程的逻辑 &lpar;73&rpar; - 并发容器 - 写时拷贝的List和Set

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  9. 1 web应用-http协议-web框架

    web 应用 Web 应用程序是一种可以通过 Web 访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式 C/S.B/S.C/S ...

  10. 【转】代码混淆和apk反编译

    代码混淆 http://blog.csdn.net/vipzjyno1/article/details/21042823 apk反编译 http://blog.csdn.net/vipzjyno1/a ...

相关文章