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

简介: 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-255】        00000000    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;
...

我现在建立一个坐标  以最左上角的像素点为(0,0) 建离向下 向右 都是递增的坐标

向右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);



有条件的 可以画个圆。
再有条件的 可以画个爱心
再有条件的  可以画个三叶草
相关文章
|
6月前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
229 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
6月前
|
存储 算法 编译器
【Linux 应用开发 】交叉编译的浮点数处理问题:从表象到底层原理的探索与解决
【Linux 应用开发 】交叉编译的浮点数处理问题:从表象到底层原理的探索与解决
116 1
|
6月前
|
数据建模 Linux C++
linux交叉编译live555
linux交叉编译live555
135 1
|
6月前
|
Linux
linux 交叉编译libpng,libjpeg库
linux 交叉编译libpng,libjpeg库
108 1
|
6月前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
338 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
6月前
|
存储 Linux 编译器
Linux 交叉编译第三方库需要设置的环境变量
Linux 交叉编译第三方库需要设置的环境变量
228 0
|
6月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
110 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
5月前
|
Rust Linux iOS开发
Rust 交叉编译 macOS 为 Linux 和 Windows
Rust 交叉编译 macOS 为 Linux 和 Windows
250 0
|
5月前
|
Linux 编译器 C语言
编译Linux内核:基础、重要性和交叉编译方法
Linux内核作为操作系统的心脏,负责管理计算机的硬件资源,同时也是运行所有其他程序的基础。理解如何编译Linux内核对于系统管理员、开发者乃至高级用户来说都是一项极其宝贵的技能。本文将介绍编译Linux内核的基本知识、编译的重要性、具体步骤以及交叉编译的概念。
422 0