一.GEC6818开发板的LCD
1.LCD
(1)原理
LCD屏幕是由一个个像素组成的,横向像素个数和纵向像素个数是LCD的一个重要指标,称为像素分辨率,当前举例开发板的分辨率是 800X480
LCD显示从屏幕左上角的像素开始,直到右下角一帧结束
像素位数指的是存储一个像素数据所需要的空间长度,当前举例LCD的像素位数是32位(bpp)
(2)屏幕显示的控制
LCD的像素显示数据来自于显存,显存一般使用内存,使用一段内存空间来存储显示数据,将显存和LCD建立映射关系之后,我们往显存上写什么数据,LCD就会显示什么内容
显存在用户空间不能直接访问,需要将显存映射到用户空间之后才能访问,使用mmap函数来实现映射
LCD硬件对应的设备文件 /dev/fb0
2.mmap函数
mmap函数用来映射文件,将文件映射到内存,建立映射关系,修改映射的内存就会影响对应的文件
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
int munmap(void *addr, size_t length);
参数:
addr:映射内存的首地址,给NULL表示由系统选择映射地址
length:映射区的长度(映射长度是页的倍数)
prot:映射区权限
PROT_EXEC Pages may be executed.
PROT_READ Pages may be read.
PROT_WRITE Pages may be written.
PROT_NONE Pages may not be accessed.
flags:映射标志
MAP_SHARED ----- 对映射区的修改要同步到文件
MAP_PRIVATE ----- 对映射区的修改不同步到文件
fd:映射的文件描述符
offset:映射位置相对于文件开头的偏移
成功返回映射区首地址,失败MAP_FAILED((void *)-1)
映射区使用完成之后要解除映射,使用munmap函数解除,传入映射区首地址和映射区的长度
3.LCD的显存映射
使用mmap映射显存和映射普通文件的流程一样,唯一的区别是映射的文件要改成LCD的设备文件 (/dev/fb0)
对于LCD的显示来说,往先存上写什么数据,LCD就会显示什么内容,LCD显示简化成了显存操作,也就是内存操作
4.图片的显示
图片分为位图和矢量图,位图存储的是图像的像素信息,矢量图保存的是图像的轮廓信息。
位图主要用于图像显示和存储,矢量图主要用于工程制图
(1)位图的参数
位图文件存储的图像信息,图像信息就有几个重要参数 --------- 像素分辨率 像素位数
对于一个位图文件来说,我们需要找到它的 图像数据 像素分辨率 像素位数
(2)位图格式
bmp:图像数据不压缩,直接保存
jpeg:压缩的图片
png:压缩的图片
tiff:压缩的图片
gif:动态图片
5.bmp图片格式
(1)bmp图片数据组成
文件头:
信息头:
图像数据:
图像数据一个像素中颜色分量的顺序如下
24位 -------- B G R
32位 -------- B G R A
二.触摸屏
1.概念和原理
触摸屏是一个输入设备,在Linux内核中使用输入子系统的框架来实现的,使用输入子系统实现的设备驱动对应的设备文件 /dev/event0…1…2…或/dev/input/event0…1…2…
我们触摸屏对应的设备文件是 /dev/input/event0
输入子系统上报的信息(读到的信息)都是一个个的事件(struct input_event)
在/usr/include/linux/input.h 中定义
struct input_event
{
struct timeval time;//时间戳
__u16 type;//事件类型
__u16 code;// 按键事件---键值 坐标事件---坐标类型
__s32 value;//按键事件---按键状态 坐标事件---坐标值
};
事件类型:
#define EV_SYN 0x00 //同步事件
#define EV_KEY 0x01 //按键事件
#define EV_REL 0x02 //相对坐标事件
#define EV_ABS 0x03 //绝对坐标事件
#define EV_MSC 0x04
#define EV_SW 0x05
#define EV_LED 0x11
#define EV_SND 0x12
#define EV_REP 0x14
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
键值:
#define KEY_ESC 1
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_0 11
#define BTN_TOUCH 0x14a
坐标类型:
#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_Z 0x02
2.测试
(1)使用hexdump命令
hexdump /dev/input/event0
编号 | 时间戳 | 事件类型 | 坐标类型/键值 | 坐标值/按键状态 |
---|---|---|---|---|
0000000 | 1dcc 7ff8 4e50 000e | 0003 | 0000 | 01b1 0000 |
0000010 | 1dcc 7ff8 4e56 000e | 0003 | 0001 | 013b 0000 |
0000020 | 1dcc 7ff8 4e5a 000e | 0001 | 014a | 0001 0000 |
0000030 | 1dcc 7ff8 4e5e 000e | 0000 | 0000 | 0000 0000 |
0000040 | 1dcc 7ff8 1923 000f | 0001 | 014a | 0000 0000 |
0000050 | 1dcc 7ff8 1928 000f | 0000 | 0000 | 0000 0000 |
(2)编写代码
编写输入子系统的代码需要包含 linux/input.h 头文件
三.音乐播放
6818开发板上的音频驱动,麦克风,耳机接口都已经实现,我们只需要使用。借助开源音乐播放器软件madplay来播放音乐
1.使用madplay直接用命令
madplay mp3音乐文件路径
2.使用system函数来执行音乐控制播放命令
(1)开始播放
system("madplay mp3音乐文件路径 &");
(2)停止播放
system("killall -KILL madplay &");
(3)暂停播放
system("killall -STOP madplay &");
(4)继续播放
system("killall -CONT madplay &");
四.图片缩放
线性差值算法是一种简易经典的图片缩放算法,就是按照比例去寻找所需要的像素点
假设图片原始的长和宽(像素)为a,b
缩放后的图片大小为a0,b0
那么缩放后图片上任意一像素点(x0,y0)对应原图片的像素坐标(x,y)为
x = x0*a/a0;
y = y0*b/b0;
注:图片的宽度必须是4的倍数
五.maplyer播放视频
1.安装mplayer
mplayer是一个开源的视频播放工具,可以用来播放各种格式的视频
mplayer已经编译好了,将下载好的mplayer文件传送到开发板文件系统,修改权限777,将文件移动到/usr/bin
2.使用mplayer播放视频
基本用法:
mplayer avi视频文件的路径
-quiet:不要显示推流文章来源:https://www.toymoban.com/news/detail-408517.html
-zoom -x 800 -y 480:指定视频播放大小文章来源地址https://www.toymoban.com/news/detail-408517.html
到了这里,关于LCD图片显示、触摸屏、音乐播放、缩放图片和播放视频的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!