1.设备的使用
屏幕显示的原理:显示设备一帧的显示是从左上角的第一个像素开始的,依次一行一行的显示,知道右下角的最后一个像素为止。
我们需要关注的参数:
a.像素分别率 一行有多少个像素,一列有多少个像素
b.像素位数
黑白 8位2进制位
彩色 R G B A(灰度值)
16位 5 6 5
24位 8 8 8
32位 8 8 8 8
控制设备的显示内容实际上就是往显存上写入对应的数据,操作做显示设备就简化成了操作显存(即操作内存)。
2.我所使用的开发板对应的显示设备文件是 /dev/fb0,属于帧缓冲设备(不同的设备可能在其他目录),访问设备文件使用文件IO的系统调用。
操作步骤:(1)打开设备文件 open
(2)映射显存到用户空间 mmap函数
参数: addr 映射的目标地址(通常情况下给NULL,让系统选择映射地址)
length 营社区长度(按页映射,一页4096字节)
port 映射区权限
PORT_EXEC | 可执行页面 |
PORT_READ | 可读页 |
PORT_WRITE | 可写页 |
PORT_NONE | 无法访问页 |
flags 映射标志
MAP_SHARED | 共享式映射(对营社区的操作会同步到文件) |
MAP_PRIVATE | 私有式映射(对映射区的操作不会同步到文件) |
MAP_ANONYMOUS | 不映射文件,而是映射物理内存 |
fd 映射文件的文件描述符
offset 映射文件的偏移
函数执行成功后悔返回映射目标的地址,失败则返回MAP_FAILED
(3)操作映射的显存
(4)解除映射 munmap函数
(5)关闭设备文件 close
获取linux系统中帧缓冲设备的参数 ioctl
参数:fd 文件描述符
request 命令,对应要进行的操作
... 不停参数
在帧缓冲设备中可以时使用ioctl,(fd,FBIOGET_VSCREENINFO,&var);var的类型如下:
239 struct fb_var_screeninfo { 240 __u32 xres; /* 行像素个数*/ 241 __u32 yres; //列像素个数 242 __u32 xres_virtual; /* virtual resolution */ 243 __u32 yres_virtual; 244 __u32 xoffset; /* offset from virtual to visible */ 245 __u32 yoffset; /* resolution */ 246 247 __u32 bits_per_pixel; /* 像素位数*/ 248 __u32 grayscale; /* 0 = color, 1 = grayscale, */ 249 /* >1 = FOURCC */ 250 struct fb_bitfield red; /* bitfield in fb mem if true color, */ 251 struct fb_bitfield green; /* else only length is significant */ 252 struct fb_bitfield blue; 253 struct fb_bitfield transp; /* transparency */ 254 255 __u32 nonstd; /* != 0 Non standard pixel format */ 256 257 __u32 activate; /* see FB_ACTIVATE_* */ 258 259 __u32 height; /* height of picture in mm */ 260 __u32 width; /* width of picture in mm */ 261 262 __u32 accel_flags; /* (OBSOLETE) see fb_info.flags */ 263 264 /* Timing: All values in pixclocks, except pixclock (of course) */ 265 __u32 pixclock; /* pixel clock in ps (pico seconds) */ 266 __u32 left_margin; /* time from sync to picture */ 267 __u32 right_margin; /* time from picture to sync */ 268 __u32 upper_margin; /* time from sync to picture */ 269 __u32 lower_margin; 270 __u32 hsync_len; /* length of horizontal sync */ 271 __u32 vsync_len; /* length of vertical sync */ 272 __u32 sync; /* see FB_SYNC_* */ 273 __u32 vmode; /* see FB_VMODE_* */ 274 __u32 rotate; /* angle we rotate counter clockwise */ 275 __u32 colorspace; /* colorspace for FOURCC-based modes */ 276 __u32 reserved[4]; /* Reserved for future compatibility */ 277 };
3.开发板上的图片显示
a.图片格式:
位图(广义) 以像素数据来记录图片,颜色还原度高,缩放会失真。
矢量图 记录图像线条来记录数据,缩放不失真。
b.位图(广义)格式 bmp、jpeg、png、tiff、gif
c.bmp图片格式
bmp图片由一下四部分构成:
文件头:
信息头:
图像数据的RGB顺序:
24位RGB按照BRG的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完之后才存下一个像素,不进行交织存储。
4.图片的缩放
假设要显示的大小为:x,y
实际图片的大小为:x0,y0
那么图片显示的坐标i,j对应图片坐标x0,y0的关系为:
i0 = i*y0 / y;j0 = j* x0/x;
5.触摸屏
触摸屏的作用就是获取用户触摸的坐标,以实现的原理来分可以分为电容屏和电阻屏,在linux系统中,输入设备的驱动通常使用输入(input)子系统框架来实现。
a.输入子系统的特点
对应的设备文件 /dev/event0...1... /dev/inut/event0...1...
我所使用的开发板触摸屏对应上的设备文件是 /dev/input/event0
以下是输入时间input的结构体 struct input_event
struct input_event { 27 #if (__BITS_PER_LONG != 32 || !defined(__USE_TIME_BITS64)) && !defined(__KERNEL__) 28 struct timeval time;//时间戳 29 #define input_event_sec time.tv_sec 30 #define input_event_usec time.tv_usec 31 #else 32 __kernel_ulong_t __sec; 33 #if defined(__sparc__) && defined(__arch64__) 34 unsigned int __usec; 35 #else 36 __kernel_ulong_t __usec; 37 #endif 38 #define input_event_sec __sec 39 #define input_event_usec __usec 40 #endif 41 __u16 type;//事件类型 42 __u16 code;//键值(按键事件) 坐标类型(坐标事件) 43 __s32 value;//按键状态(按键事件) 坐标值(坐标事件) 44 }; //事件类型 38 #define EV_SYN 0x00 //同步事件 39 #define EV_KEY 0x01 //按键事件 40 #define EV_REL 0x02 //相对坐标事件 41 #define EV_ABS 0x03 //绝对坐标事件 //键值 75 #define KEY_RESERVED 0 76 #define KEY_ESC 1 77 #define KEY_1 2 78 #define KEY_2 3 79 #define KEY_3 4 411 #define BTN_TOUCH 0x14a //按键触摸 //坐标类型 728 #define ABS_X 0x00 //X坐标 729 #define ABS_Y 0x01 //Y坐标 730 #define ABS_Z 0x02
我所学到的文件IO相关的知识到这里就差不多了,如果有哪里写错了请指正,大家互相学习。