通过内核打开驱动,编写的应用能通过触摸控制相册上一张下一张

我们实现这个功能就要分为:1,使用 LCD 设备,2链表3,获取触摸操作 这三小部分
直接下载我做好的直接使用

使用LCD

准备LCD

我们使用内核的LCD结构体 fb_var_screeninfo ,构造出我们的LCD
先建立一个空结构体

//   建立一个空结构体 struct fb_var_screeninfo vinfo;bzero(&vinfo, sizeof(vinfo));char *fbmem = init_lcd(&vinfo);

给结构体通过 ioctrl 获得相关参数

char *init_lcd(struct fb_var_screeninfo *vinfo)
{int lcd = open("/dev/fb0", O_RDWR);ioctl(lcd, FBIOGET_VSCREENINFO, vinfo);int bpp = vinfo->bits_per_pixel;int screensize = vinfo->xres * vinfo->yres * bpp/8;char *fbmem = mmap(NULL, screensize, PROT_READ|PROT_WRITE,MAP_SHARED, lcd, 0);if(fbmem == MAP_FAILED){perror("映射显存失败");exit(0);}return fbmem;
}
显示图片
void display(char *jpgfile, char *fbmem,struct fb_var_screeninfo *vinfo,int xoffset, int yoffset)
{// 读取图片文件属性信息// 并根据其大小分配内存缓冲区jpg_bufferstruct stat file_info;Stat(jpgfile, &file_info);//获取图片信息int fd = Open(jpgfile, O_RDONLY);unsigned char *jpg_buffer;jpg_buffer = (unsigned char *)calloc(1, file_info.st_size);read_image_from_file(fd, jpg_buffer, file_info.st_size);// 声明解压缩结构体,以及错误管理结构体struct jpeg_decompress_struct cinfo;struct jpeg_error_mgr jerr;// 使用缺省的出错处理来初始化解压缩结构体cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);// 配置该cinfo,使其从jpg_buffer中读取jpg_size个字节// 这些数据必须是完整的JPEG数据jpeg_mem_src(&cinfo, jpg_buffer, file_info.st_size);// 读取JPEG文件的头,并判断其格式是否合法int ret = jpeg_read_header(&cinfo, true);if(ret != 1){fprintf(stderr, "[%d]: jpeg_read_header failed: ""%s\n", __LINE__, strerror(errno));exit(1);}// 开始解压jpeg_start_decompress(&cinfo);struct image_info imageinfo;imageinfo.width = cinfo.output_width;imageinfo.height = cinfo.output_height;imageinfo.pixel_size = cinfo.output_components;int row_stride = imageinfo.width * imageinfo.pixel_size;// 根据图片的尺寸大小,分配一块相应的内存rgb_buffer// 用来存放从jpg_buffer解压出来的图像数据unsigned long rgb_size;unsigned char *rgb_buffer;rgb_size = imageinfo.width *imageinfo.height * imageinfo.pixel_size;rgb_buffer = (unsigned char *)calloc(1, rgb_size);// 循环地将图片的每一行读出并解压到rgb_buffer中int line = 0;while(cinfo.output_scanline < cinfo.output_height){unsigned char *buffer_array[1];buffer_array[0] = rgb_buffer +(cinfo.output_scanline) * row_stride;jpeg_read_scanlines(&cinfo, buffer_array, 1);}// 解压完了,将jpeg相关的资源释放掉jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);free(jpg_buffer);// 清屏bzero(fbmem, vinfo->xres * vinfo->yres * 4);// 将rgb_buffer中的RGB图像数据,写入LCD的FRAMEBUFFER中char *tmp = fbmem;tmp += (yoffset*vinfo->xres + xoffset) * vinfo->bits_per_pixel/8;int lcd_w = vinfo->xres - xoffset;int lcd_h = vinfo->yres - yoffset;int row, column;for(row=0; row<lcd_h && row<imageinfo.height; row++){for(column=0; column<lcd_w && column<imageinfo.width; column++){unsigned long lcd_offset = (vinfo->xres*row + column) * 4;unsigned long rgb_offset = (imageinfo.width*row+column) *imageinfo.pixel_size;memcpy(tmp + lcd_offset + vinfo->red.offset/8,rgb_buffer + rgb_offset + 0, 1);memcpy(tmp + lcd_offset + vinfo->green.offset/8,rgb_buffer + rgb_offset + 1, 1);memcpy(tmp + lcd_offset + vinfo->blue.offset/8,rgb_buffer + rgb_offset + 2, 1);}}// 释放相关资源free(rgb_buffer);close(fd);
}

使用列表

构造链表

每个链表节点都会有上一个,和下一个,还有自己的名字,所以我们创建一个结构体

typedef struct linklist
{char image_name[100];struct linklist *next;struct linklist *prev;
}listnode,*linklist;

并且先给链表初始化,让上一个和下一个都先指一个空间

linklist init_list(void)
{linklist head = calloc(1,sizeof(listnode));//分配一个长度为listnode的空间head->next = head;head->prev = head;return head;
}
拿取图片信息,放入列表
linklist open_dir(char *argv,linklist head)
{//打开目录DIR *dp = opendir(argv);if(dp == NULL){perror("打开目录失败");exit(1);}//进入目录 chdir(argv);//获取目录项信息struct dirent *ep;//定义数组存放当前目录路径以及jpg名 char path[100] = {0};getcwd(path, 100);//保存jpg信息char imag_buf[200] = {0};//遍历目录内的jpg文件int n , i;while((ep = readdir(dp)) != NULL){  //strstr找到一个包含“.jpg”名字的文件if(strstr(ep->d_name,".jpg")){ //将其当前路径以及文件名存放在img_buf中sprintf(imag_buf , "%s/%s", path , ep->d_name);//创建链表新节点存放图片信息imag_buflinklist new = creat_node(imag_buf);//将新节点插入到链表末尾insert_add_tail(new , head);}}//释放资源closedir(dp);//返回链表头return    head;
}

触摸板

这个比较简单,就是判断连续滑动,和单点触摸的比较

enum motion get_motion(void)
{// 1,打开触摸屏文件int tp = open("/dev/input/event0", O_RDONLY);// 2,读取触摸屏信息  input_event结构体在linux/input.h库中struct input_event buf; // int falg = 0;      //标记第一次按下的状态获取第一组x值//int falgy = 0;      //标记第一次按下的状态获取第一组y值//int touch = 0;     //标记用户屏幕无动作标志位int x1 = 0 , x2 = 0;       //x1为按下屏幕x的起始值 ,x2为松开屏幕x的结束值int y1 = 0 , y2 = 0;      //y1为按下屏幕x的起始值 ,y2为松开屏幕x的结束值int xdone = 0 ;int ydone = 0 ;while(1){bzero(&buf, sizeof(buf));read(tp, &buf, sizeof(buf)); // 读取触摸屏数据,放到 buf 中// 读到按键事件(包括键盘、触摸屏的按压、鼠标的左右键……)if(buf.type == EV_KEY){// 读到触摸屏的按压事件if(buf.code == BTN_TOUCH){// 读到按下触摸屏if(buf.value > 0)xdone = 0;ydone = 0;// 读到松开触摸屏if(buf.value == 0)break;}}// 读到触摸屏的坐标事件if(buf.type == EV_ABS){if(xdone == 0 || ydone == 0){if(buf.code == ABS_X ) {                   x1 = buf.value;//起始xdone = 1;}if(buf.code == ABS_Y){y1 = buf.value;//起始ydone = 1;}} if(xdone == 1 || ydone == 1){if(buf.code == ABS_X )x2 = buf.value;//结束if(buf.code == ABS_Y)y2 = buf.value; //结束  } }}printf("起始x1 = %d 结束x2 = %d\n",x1,x2);printf("起始y1 = %d 结束y2 = %d\n",y1,y2);int dif_x = x1 - x2 > 0 ? x1 - x2 : x2 - x1;int dif_y = y1 - y2 > 0 ? y1 - y2 : y2 - y1;if(x1 == 0 || x2 == 0){return -1;}if (x1 > x2 && dif_x > dif_y){printf("向左滑动\n");return left;}else if(x1 < x2 && dif_x > dif_y){ printf("向右滑动\n");return right;}else if(y1 > y2 && dif_y > dif_x){ printf("向上滑动\n");return up;}else if(y1 < y2 && dif_y > dif_x){ printf("向下滑动\n");return down;}else {return -1;}// 3,释放资源close(tp);
}

程序运行

对我们的程序进行交叉编译,上传自己想要的图片之后,调用动态库就能使用了

编译调用动态库

程序的启动需要 jpeg 库来解码图片,所以我们要交叉编译出 libjpeg.so.9

1,先从官网上下载jpeg的解码库文件
jpegsrc.v9d.tar.gz

2,拖到ubuntu的系统的桌面中

3,打开命令终端,进入到ubuntu的桌面路径
cd 桌面

4,解压jpeg的解码库文件
tar xzvf jpegsrc.v9d.tar.gz

5,解压完成后会变成一个文件夹jpeg-9d,进去这个文件夹里面
cd jpeg-9d

6,根据渣渣的引领,解读了README,install.txt的内容,进行了如下命令操作

./configure --host=arm-linux --prefix=/home/scholar/nfs_share/6818_work/lib上面的话的意思是:./configure:代表运行jpeg的配置程序--host=arm-linux:指定编译的命令前缀为arm-linux--prefix=/home/scenery/桌面/mylib:代表将编译出来的资源文件放到/home/scenery/桌面/mylib路径中
makemake install
然后你就可以在你的桌面上看到生成了一个文件夹mylib,里面放着四个文件夹
bin,include,lib,share
这几个文件就是我们即将引用的文件啦

编译出执行文件

进入我们的源码目录

arm-linux-gcc -o showphtot ./*.c

这时候再更改想显示的图片

上板

用nfs挂载我们的开发板

cd ./c_photo_yueqian/
export LD_LIBRARY_PATH=../lib/  #链接动态库
./showphoto ./jpg

arm板上通过内核实现可滑动的电子相册相关推荐

  1. 将linux内核烧进arm板,ARM开发板上uClinux内核移植

    <ARM开发板上uClinux内核移植>由会员分享,可在线阅读,更多相关<ARM开发板上uClinux内核移植(19页珍藏版)>请在人人文库网上搜索. 1.纷傲掌秀悸篷益哑檀扬 ...

  2. Qt——用在ARM板上的Mplayer(1.3.0,1.0rc4)安装编译步骤!还有,Mplayer背景抖动闪烁问题解答,终于来了!

    注意:若转载,请贴上链接"https://blog.csdn.net/qq_41042595/article/details/112308184",如若发现抄袭或未标明来源现象,都 ...

  3. Qt程序在arm板上运行

    1.Qt中的库需要拷贝到arm板上: 2.配置环境变量,参考该文. 总结: 1.可执行程序在终端中运行前,需要配置好环境变量,我们用export的形式配置的,这种形式只在当前终端中生效(因为,如果我们 ...

  4. 最新版ser2net移植到ARM板上,交叉编译

    这个是ser2net源码http://sourceforge.net/projects/ser2net/files/latest/download ser2net是我在玩openwrt时接触的,当时用 ...

  5. 【教程】制作能在ARM板上直接运行的gcc本地编译器

    编译好的程序的下载链接:百度网盘 请输入提取码(提取码:ocmm) 概述 通常情况下,我们是在电脑里面开一个Linux虚拟机, 在虚拟机里面用交叉编译工具链编译好可执行文件后,将可执行文件拷贝到板子里 ...

  6. 基于I-MX287A的mqtt远程控制ARM板上LED灯小项目总结

    最近在学linux嵌入式技术,自己做了一个在周立功的I-MX287A开发板上实现的,基于MQTT远程控制的小项目,其中用到了一些比较好玩和有趣的技术,在这里自己记录分享一下. 额,让我想想该从和处开始 ...

  7. 手把手教你在ARM板上写一个驱动程序!

    摘要:搞嵌入式有两个方向,一个是嵌入式软件开发(MCU方向),另一个是嵌入式软件开发(Linux方向).其中MCU方向基本是裸机开发和RTOS开发.而Linux开发方向又分为驱动开发和应用开发.其中应 ...

  8. wxX11移植到arm板上

    [原]移植wxX11到开发板上 2012-5-18阅读467 评论0 最近几天由于工作安排,要将wxX11程序移植到arm开发板上.一连工作了好几天,终于可以在板子上显示出一个"X" ...

  9. 在ARM板上的linux系统中查看进程实际使用物理内存

    我的S3C2440板上的linux系统使用的busybox版本为 BusyBox v1.13.3 ,有很多命令在上面都无法使用,我本打算查看我进程所占用的物理内存,所以使用top命令,但是返回如下 ...

最新文章

  1. python数据挖掘是什么_python数据挖掘是什么
  2. 射影几何笔记4:证明的思路
  3. 当你学不进去的时候,试试“普瑞马法则”
  4. Mybatis之占位符与拼接符
  5. C#:委托基础与事件
  6. 微软推出了Cloud Native Application Bundles和开源ONNX Runtime
  7. 《Two Dozen Short Lessons in Haskell》(二十)分数
  8. vue可以直接进行运算么_Vue实现手机计算器
  9. java里面比较重要的东西_Java面向对象程序设计中很重要的一些东西
  10. 《博弈圣经》创业就是文化实践 创业人应具备博弈占优特征
  11. 教你用Appium搭建Android自动化测试框架(详细教程)
  12. apache连接mysql配置_Apache+PHP配置及连接mysql数据库
  13. WBS图表概念及绘制
  14. NFT游戏开发NFT游戏平台模板搭建NFT平台定制开发MOBOX:NFT Farmer游戏开发
  15. 【MISC怼题入门系列】BUU-MISC-page2
  16. 关于android 使用audiorecord 录制pcm文件 音频速度变快的问题求教
  17. vue双花括号的使用
  18. JS奇谋诡计——16 Hacks
  19. Unity 2D角色动画状态切换
  20. excel转word_pdf转word软件永久jpg图片ppt转换excel编辑器压缩合并拆分去水印,加入自律圈即可获得!!!...

热门文章

  1. 完美破解C# DLL
  2. 今晚7:30 | KKD-5 清华、南航空的博士生来啦!
  3. 出现Unrecognized field state (class com.jt.manage.pojo.ItemCat)异常
  4. python-识别验证码
  5. 相宜美妆化妆品销售网站
  6. SD/TF卡测试与比较
  7. 工作流管理系统(WfMS)介绍
  8. C语言不用临时变量交换a,b的值
  9. DELL R720 新增内存条方法
  10. 如何使用 ChatGPT 制作出色的简历?