文件IO项目:
在开发板屏幕上循环显示目录里的图片
a.按照一定的间隔循环显示目录里的bmp图片
b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张

d1:
1.能操控屏幕(查询开发板屏幕分辨率,以及每个像素点占几个字节)
命令:FBIOGET_VSCREENINFO
查询结果保存在些结构中:
struct fb_var_screeninfo fbinfo;
__u32 xres; 屏幕分辨率
__u32 yres;
__u32 bits_per_pixel; 每个像素点占多少位 /* guess what */

ioctl(fd,FBIOGET_VSCREENINFO,&fbinfo);
1.control device
控制设备

int ioctl(int fd, int request, ...);
fd:文件描述符,表示要操作的设备
request:一般表示一个命令号,该命令由驱动开发者提供
...:其它参数,不同的命令参数是不一样的,也由驱动程序员提供

返回值:返回0
失败-1
------------------------------------------------
2.功能:映射一个文件或设备到内存,实现像操作普通内存一样去操作文件或设备
void *mmap(
void *addr, 把文件内容映射到内存哪个地址,给NULL,让操作系统自动分配
size_t length,要映射的文件内容的长度
int prot, 映射的内存区域的权限
PROT_EXEC 可执行
PROT_READ 可读
PROT_WRITE 可写
int flags,映射标志,决定对映射部分的操作是否对其它进程可见
MAP_SHARED:共享的,对其它进程可见,内存操作直接应用到文件中去
MAP_PRIVATE:私有的,对其它进程不可见,内存操作不应用到文件中去

int fd,文件描述符,要映射的文件
off_t offset 偏移量,表示文件从哪个位置开始映射
);

返回值:成功返回映射内存区域的首地址
失败返回 MAP_FAILED(-1),同时errno被设置

int munmap(void *addr, size_t length);
功能:解除映射
addr:mmap的返回值
length:映射内存的长度

返回值:成功返回0
失败返回-1

void *memset(void *s, int c, size_t n);
s:要设置的内存首地址
c:要设置的内容
n:长度

//struct student s;
//memset(&s,0,sizeof(s));
//void *memcpy(void *dest, const void *src, size_t n);

memcpy(addr,gImage_cat2,800*480*4);

2.显示图片

-----------------------------------------
Linux Frame Buffer:
帧缓冲设备:
是对具体图像硬件的一个抽像,它让上层图像应用程序不必关心具体的硬件实现细节。
在内存(显存)中开辟一段空间,用来保存在屏幕上像素点的颜色值,然后操作屏幕就直接操作这段内存就可以了,这就是说的帧缓冲。

LCD显示原理:
屏幕是由y行且每行x个像素点的矩阵组成
在屏幕上显示图像就是给每个像素点显示一个颜色。

帧缓冲设备操作流程:
1.open打开设备
2.ioctl获取屏幕信息
3.mmap映射设备到内存
4.操作显存
5.munmap解除映射
6.close关闭文件

1.显示jpg图片
libjpeg移植:
1.解压
tar xvf jpegsrc.v8a.tar.gz
2.cd jpeg-8a/
3.配置参数(生成Makefile)
./configure --host=arm-linux --target=arm-linux --prefix=/usr/local/libjpeg-8a CC=arm-linux-gcc
(
注:
如果没有建立交叉编译工具软链接的同学请用这个
CC=arm-none-linux-gnueabi-gcc
)

4.make
5.sudo make install
注:
sudo make install时可能出现以下错误
./libtool: line 950: arm-linux-ranlib: command not found
解决方法:
sudo -s
export PATH=$PATH:/usr/local/arm/arm-2009q3/bin
重新执行以下命令
make install

6.把生成库文件打包下载到开发板
cd /usr/local/libjpeg-8a
tar zcvf libjpeg-8a.tar.gz lib/

7.在开发板上解压刚下载的包
tar xvf libjpeg-8a.tar.gz
cd lib/
cp libjpeg.* /lib/

arm-linux-gcc test_jpeg.c -o test_jpeg2
-ljpeg //指定链接的库名
-I /usr/local/libjpeg-8a/include/ //指定头文件存放路径
-L /usr/local/libjpeg-8a/lib/ //指定库文件存放路径

-------------------------
tftp用法:
1.乌班图下启动服务

sudo service tftpd-hpa restart
[sudo] password for csgec:
tftpd-hpa stop/waiting
tftpd-hpa start/running, process 15716

2.tftp -g -r filename 主机IP
(timeout)
如果超时,请检查网络是否畅通
从主机ping开发板
从开发板ping主机
检查开发板和主机是否在同一网段
如果是笔记本,把无线网卡先断开

--------------------------------------
输入事件:
鼠标事件
键盘事件
触屏事件
...
#include <linux/input.h>
一般触屏分为是否按下,用压力值来区分,当压力值为0时表示没按下
触屏事件使用的是绝对坐标(包括x和y)
struct input_event {
struct timeval time;//该事件发生的时间
__u16 type;//事件类型
EV_KEY 0x01 键盘事件
EV_REL 0x02 鼠标事件
EV_ABS 0x03 触摸事件

__u16 code;//根据事件类型同,含义不同
if type == EV_KEY
code 为键盘的键值
if type = EV_REL
code 为坐标轴 REL_X REL_Y
if type = EV_ABS
code 为坐标轴 ABS_X ABS_Y ABS_PRESSURE(压力)
__s32 value;//根据事件类型同,含义不同
if type == EV_KEY
value 1 / 0 表示按键up/down
if type = EV_REL
value表示相应的坐标轴的偏移
if type = EV_ABS
value表示相应的坐标轴的绝对坐标
X:(1-800)
Y:(1-480)
压力值:200 或 0(表示没按下)

};

#define ABS_PRESSURE 0x18//表示压力值

获取起点和终点
起点:按下去就可获取
终点:当压力值为0时,也就是松开时的那个坐标值
终点-起点 > 50

#include<stdio.h>
#include<linux/input.h>
#include<fcntl.h>

int main(int argc,char **argv)
{

int fd = open("/dev/event0",O_RDONLY);
if(fd < 0)
{
perror("open");
return -1;
}
struct input_event ev;
int r;
while(1)
{
r = read(fd,&ev,sizeof(ev));
if(r == sizeof(ev))
{
printf("type = %x,code = %x,value = %x\n",ev.type,ev.code,ev.value);
}
/*
if(ev.type == EV_ABS && ev.code == ABS_PRESSURE)
{
printf("value = %d\n",ev.value);
}

if(ev.type == EV_ABS && ev.code == ABS_X)
{

printf("value = %d\n",ev.value);

}
*/

}
return 0;
}

/*************************************************************************
> File Name: test_jpeg.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Thu 04 Aug 2016 10:57:30 AM CST
************************************************************************/

#include<stdio.h>
#include<jpeglib.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<stdlib.h>

void lcdDraw_point(int *p,int x,int y,int color)
{
*(p + 800*y + x) = color;
}

int main(int argc,char ** argv)
{
//1
int fb = open("/dev/fb0",O_RDWR);
if(fb < 0)
{
perror("open");
return -1;
}

//2
void *addr = mmap(0,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
if(addr == MAP_FAILED)
{
perror("mmap");
return -1;
}

//-----------利用libjpeg解压jpeg文件的步骤--------------------------------
//1.分配并初始化一个jpeg解压对象
printf("start jpeg\n");
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);

//2.指定要解压的文件
FILE *infile;
infile = fopen(argv[1],"r");
if(infile == NULL)
{
fprintf(stderr, "can't open %s\n", argv[1]);
return -1;
}
jpeg_stdio_src(&cinfo, infile);

//3.获取图片信息
jpeg_read_header(&cinfo, TRUE);

//4.启动解压过程,cinfo中下面几个成员会比较有用
//cinfo.output_width 宽_
//cinfo.output_height 高
//cinfo.output_components 像素分量(一个像素点占几个字节)
//cinfo.
jpeg_start_decompress(&cinfo);

//5.读取一行扫描线数据并处理,通常的代码是这样的
//成功后buffer里保存的就是解压后的行像素点的数据
//R G B 从上到下,从左到右
unsigned char *buffer = malloc(cinfo.output_width * cinfo.output_components);
printf("start scanline\n");
while(cinfo.output_scanline < cinfo.output_height)
{
jpeg_read_scanlines(&cinfo,
&buffer,//保存解压后的数据的二级指针
1//扫描的行数
);
int x,color;
unsigned char r,g,b;
unsigned char *p = buffer;
for(x = 0; x < 800; x++)
{
r = *p++;
g = *p++;
b = *p++;

color = (r << 16) | (g << 8) | b;
lcdDraw_point(addr,x,cinfo.output_scanline-1,color);
// int y = cinfo.output_scanline-1;
// int *pf = (int*)addr;
// *(pf + 800*y + x) = color;
}

}
printf("finish decompress\n");
//6.完成解压过程
jpeg_finish_decompress(&cinfo);
//7.释放资源
jpeg_destroy_decompress(&cinfo);
fclose(infile);
close(fb);

return 0;

}

/*************************************************************************
> File Name: test_jpeg.c
> Author: csgec
> Mail: longer.zhou@gmail.com
> Created Time: Thu 04 Aug 2016 10:57:30 AM CST
************************************************************************/

#include<stdio.h>
#include<jpeglib.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<stdlib.h>

void draw_point(int *p,int x,int y,int color)
{
int *pf = p + (800*y + x);
*pf = color;

}
int main(int argc,char ** argv)
{
//1
int fb = open("/dev/fb0",O_RDWR);
if(fb < 0)
{
perror("open");
return -1;
}

//2
void *addr = mmap(0,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
if(addr == MAP_FAILED)
{
perror("mmap");
return -1;
}

//-----------利用libjpeg解压jpeg文件的步骤--------------------------------
//1.分配并初始化一个jpeg解压对象
printf("start jpeg\n");
struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);

//2.指定要解压的文件
FILE *infile;
infile = fopen(argv[1],"r");
if(infile == NULL)
{
fprintf(stderr, "can't open %s\n", argv[1]);
return -1;
}
jpeg_stdio_src(&cinfo, infile);

//3.获取图片信息
jpeg_read_header(&cinfo, TRUE);

//4.启动解压过程,cinfo中下面几个成员会比较有用
//cinfo.output_width 宽_
//cinfo.output_height 高
//cinfo.output_components 像素分量(一个像素点占几个字节)
//cinfo.
jpeg_start_decompress(&cinfo);

//5.读取一行扫描线数据并处理,通常的代码是这样的
//成功后buffer里保存的就是解压后的行像素点的数据
//R G B 从上到下,从左到右
unsigned char *buffer = malloc(cinfo.output_width * cinfo.output_components);
printf("start scanline\n");
while(cinfo.output_scanline < cinfo.output_height)
{
jpeg_read_scanlines(&cinfo,
&buffer,//保存解压后的数据的二级指针
1//扫描的行数
);
int x,color;
unsigned char r,g,b;
unsigned char *p = buffer;
for(x = 0; x < 800; x++)
{
r = *p++;
g = *p++;
b = *p++;

color = (r << 16) | (g << 8) | b;
draw_point(addr,x,cinfo.output_scanline-1,color);
/*
int y = cinfo.output_scanline-1;
int *pf = (int*)addr;
*(pf + 800*y + x) = color;
*/
}

}
printf("finish decompress\n");
//6.完成解压过程
jpeg_finish_decompress(&cinfo);
//7.释放资源
jpeg_destroy_decompress(&cinfo);
fclose(infile);
close(fb);

return 0;

}

jpg图片在开发板上显示的更多相关文章

  1. 在开发板上显示英文字符和汉字--tiny6410

    程序字符需要改成gb2312.否则无法正常显示中文字符. main.c代码: #include <sys/types.h> #include <sys/stat.h> #inc ...

  2. 交叉编译环境以及开发板上-/bin/sh: ./hello: not found 转载自 http://blankboy.72pines.com

    交叉编译环境以及开发板上-/bin/sh: ./hello: not found 目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的 ...

  3. easycwmp在开发板上的配置

    原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...

  4. FS210开发板上Qt4.7.0移植过程

    作者:冯老师,华清远见嵌入式学院讲师. 1. 搭建Qt开发环境平台 1.开发环境:ubuntu 12.04 2.交叉编译链:arm-cortex_a8-linux-gnueabi 3.开发板:FS21 ...

  5. 开发板上使用core文件调试

    转载:http://www.nginx.cn/1521.html 如果开发板的操作系统也是linux,core调试方法依然适用.如果开发板上不支持gdb,可将开发板的环境(依赖库).可执行文件和cor ...

  6. [转载]在iTOP-4412开发板上调试helloworld应用

    本文转自迅为论坛:http://www.topeetboard.com 1.安装ADB驱动 在开发板上调试 Android 应用,首先要安装 ADB 驱动. 通过“SDK Manager.exe”来安 ...

  7. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  8. 物联网操作系统HelloX已成功移植到MinnowBoard MAX开发板上

    在HelloX开发团队的努力下,以及Winzent Tech公司(总部在瑞典斯德哥尔摩)的支持下,HelloX最新版本V1.78已成功移植到MinnowBoard MAX开发板上.相关源代码已经发布到 ...

  9. ZTE AD3812 3G模块在linux 2.6.34 内核的开发板上的支持方法

    先说段废话,话说在linux 2.6.34 下,好多比较新的3G网卡及3G模块都没有很好的支持.如果想支持的这些3G网卡/3G模块呢,基本上有两种方式: 1.使用该3G模块的 linux 下的驱动,交 ...

随机推荐

  1. String Matching Content Length

    hihocoder #1059 :String Matching Content Length 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 We define the ...

  2. 为图片存储而作——记一次UEditor源码的修改

    本文版权归博客园和作者吴双本人共同所有.  写在前面 这是一个数据爆发的网络时代,大家习惯于浏览图文直观带给我们的快速信息.大图片的存储和浏览经常会成为Web服务器的瓶颈.试想如果你的Web服务器依然 ...

  3. drawRect & layoutSubviews 调用时间

    首先两个方法都是异步执行.layoutSubviews方便数据计算,drawRect方便视图重绘.   layoutSubviews在以下情况下会被调用: 1.init初始化不会触发layoutSub ...

  4. MySQL数据类型:SQL_MODE设置不容忽视

    [IT168 技术]SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插 ...

  5. 多个inline元素、block元素、inline-block元素在父容器中的换行情况

    1.首先看inine元素的换行情况 <style> *{padding:0;margin:0} div.wrap{width:200px;height:200px;border:1px s ...

  6. iOS推送的众多坑

    新来的一家公司,昨天和同事解决推送问题(工程里有集成百度推送和环信即时通讯),信誓旦旦的声称:" app在前台和后台运行时,推送触发的是didReceiveRemoteNotificatio ...

  7. linux 驱动入门1

    世事艰难,人生不易. 夜深人静时候,回顾过去,往事历历在目.创南京,混苏州,下上海.都付出了巨大的努力.多少个不眠的夜晚,在冥思苦想.天生愚钝.又不是学计算机的.一直没较为深刻的理解 编程什么东西,一 ...

  8. linux ssl 双向认证

    一,首先切换到apache目录下,创建一个CA文件夹 sudo mkdir CA sudo chmod 777 CA 二,然后进去CA文件夹 cp CA 三,创建其它文件 mkdir demoCA m ...

  9. SGU 194 Reactor Cooling ——网络流

    [题目分析] 无源汇上下界可行流. 上下界网络流的问题可以参考这里.↓ http://www.cnblogs.com/kane0526/archive/2013/04/05/3001108.html ...

  10. 怎样简单的制作一个CHM格式的帮助文档?

    http://jingyan.baidu.com/article/d8072ac446eb7bec95cefd0e.html 怎么制作CHM格式电子书 http://jingyan.baidu.com ...