2025年3月22日 星期六 甲辰(龙)年 月廿一 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 嵌入式系统

Linux交叉编译+粤嵌LCD实现三色图

时间:03-12来源:作者:点击数:48

Linux交叉编译+粤嵌LCD实现三色图

在这里插入图片描述
  • #include <stdio.h>
  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>
  • #include <unistd.h>
  • #include <sys/mman.h>
  • int main()
  • {
  • int fd = open("/dev/fb0",O_RDWR);
  • int *p = mmap(NULL,800*480*4,PROT_READ | PROT_WRITE ,MAP_SHARED , fd , 0);
  • int x,y;
  • for(x=0;x<800;x++)
  • for(y=0;y<480;y++)
  • if(y<160)
  • *(p + 800*y + x) = 0x0000ff00;
  • else if(y<320)
  • *(p + 800*y + x) = 0x000000ff;
  • else
  • *(p + 800*y + x) = 0x00ff0000;
  • close(fd);
  • munmap(p,800*480*4);
  • }

原理

LCD屏幕的显示原理:

  • 显示颜色 我们给os颜色分量的值 他就会显示在屏幕上
  • 我们板子大小 800*480 像素点
  • 一行有800个像素点
  • 一列有480个像素点
  • 像素点: 显示颜色的点
  • 一个像素点的组成: 按照地址从低到高 B G R A 大小 :4个字节
  • B: BLUE 蓝色
  • G:green 绿色
  • R : red 红色
  • A : 透明度 决定你显示颜色的深浅
  • 这个板子规定 我们可以用一个字节的范围大小来表示一中颜色的深浅
  • 一个字节的无符号范围 【0-25500000000 11111111
  • g == 0 没有任何绿色
  • g == 255 绿的你发慌
  • 0x a r g b
  • 0x 00 ff 00 00
  • 这个就是颜色分量的表示方式
  • linux帧缓冲原理:在linux的内核驱动中,开辟了一个缓存区(”显存“),保存了这个屏幕每一个像素点的颜色
  • 多大? 800*480*4
  • 帧缓冲驱动(”显卡“)就会按照一定的刷新频率(60hz) 把帧缓冲区的颜色值 通过排线(电线)的电信号发送到屏幕。
  • 帧缓冲设备位置 /dev/fb0
  • 我们知道了帧缓冲设备的位置 是不是就是可以改变显示的颜色。
  • everything is file in Linux
  • 我们可以通过文件io的操作去操作个设备
  • 练习: 把屏幕全部显示成你喜欢的颜色。
  • 思路: 第一步: 打开帧缓冲设备 open(”/dev/fb0“ , O_RDWR );
  • 第二步: 写进去颜色值 写多大 800*480*4字节
  • int a[480][800]
  • int i j;
  • 我们把颜色的值赋值给这个二维数组
  • for(i=0;i<480;i++)
  • for (j=0;j<800;j++)
  • a[i][j] = 0x00ff0000;
  • write(fd,a,800*480*4);
  • 第三步: 关闭帧缓冲设备
  • clsoe(fd);
  • 注意: 交叉编译 我们需要传到开发板上去运行
  • 怎么传?
  • 跟着来!
  • 首先在linux操作系统上 交叉编译我们的代码 arm-linux-gcc 1.c -o 1
  • 然后去CRT 上面 敲命令 rx + 1
  • 然后点击CRT上方工具栏的 传输 点击 发送Xmodem 等待传输完成
  • 给这个可执行文件 加上执行的权限x chmod +x 1 -》此处+号不是空格
  • 然后就执行文件 ./1
  • 我们把颜色写进去测试板子的好坏。
  • 没有看到杂的细线?刚刚有 现在没了。
  • 这个是什么原因。
  • 效率慢。
  • write 函数 效率慢 为什么?
  • 1.。。。。
  • 是不是有人提出了问题?
  • 那肯定是解决这个问题的。
  • C语言的灵魂 --指针
  • 我说的:这个帧缓冲区域是不是就是一块内存 是内存我们是不是可以通过指针访问它。
  • int * p //假设这个指针p指向了缓冲区的首地址
  • *p = 0x00ff0000 ;//第一个像素点变成了红色
  • 通过指针去改变每一个像素点的颜色
  • *(p+1) = 0x00ff0000 //第二个像素点也变成了红色
  • *(p+2) = 0x00ff0000;
  • ...
  • 我现在建立一个坐标 以最左上角的像素点为(00) 建离向下 向右 都是递增的坐标
  • 向右x 向下y
  • 假设现在有个坐标为(x,y)的像素点 ,怎么通过指针给他赋值(上色)?
  • *(p + 800*y +x ) = 0x00ff0000
  • 又有问题了 怎么找到缓冲区的首地址 。
  • 映射函数
  • mmap 函数
  • NAME
  • mmap, munmap - map or unmap files or devices into memory
  • SYNOPSIS
  • #include <sys/mman.h>
  • void *mmap(void *addr, size_t length, int prot, int flags,
  • int fd, off_t offset);
  • 函数功能: ...
  • 头文件:如上
  • 参数列表:
  • addr : 地址 决定你要映射到哪里去 都不知道谁知道?计算机自己知道 我们就让他自己决定 填NULL ;
  • length: 决定你要映射的内存的大小 800*480*4
  • prot: 映射权限 : 绝对你对映射后的地址能进行什么样的操作
  • PROT_WRITE : 写权限
  • PROT_READ : 读权限
  • PROT_WRITE | PROT_READ : 可读可写 填这个就完事了
  • flags : 标志 映射的方式
  • MAP_SHAREAD : 共享 你对映射的内存的内容的改变 会影响内核中的内存的内容 填这个
  • MAP_PRIVATE : ....
  • fd : 你要映射的内存或者设备的文件描述符 open函数的返回值
  • offset : 偏移量 我们不需要偏移 填0
  • 返回值: 返回映射空间的首地址的指针
  • 失败返回 NAP_FAILED
  • 解映射函数
  • int munmap(void *addr, size_t length);
  • 函数功能: 。。。
  • 头文件: 如上
  • 参数列表:
  • addr : 映射空间的首地址 mmap函数的返回值
  • length: 长度大小 800*480*4
  • 自己百度了解这个函数,实现在屏幕上显示三色旗的功能。
  • 思路:
  • int fd = open("/dev/fb0",o_rdwr);
  • if()
  • {
  • }
  • int * P = mmap (NULL,800*480*4,PROT_WRITE | PROT_READ , MAP_SHAREAD ,fd , 0)
  • if (p == MAP_FAILED)//NULL
  • {
  • }
  • //
  • for(i=0;i<480;i++)
  • for(j=0;j<800;j++)
  • *(p+800*i + j) = 0x00ff0000;
  • close(fd);
  • munmap(p,800*480*4);
  • 有条件的 可以画个圆。
  • 再有条件的 可以画个爱心
  • 再有条件的 可以画个三叶草
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门