导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. TrueDei
    T
    • 资料
    • 关注 0
    • 粉丝 0
    • 我的积分 218
    • 主题 3
    • 帖子 3
    • 最佳 1
    • 群组 0

    TrueDeiLV 3

    @TrueDei

    218
    积分
    1
    声望
    1
    资料浏览
    3
    帖子
    0
    粉丝
    0
    关注
    注册时间 最后登录

    TrueDei 取消关注 关注

    TrueDei 发布的最佳帖子

    • OK536N-C开箱以及在Linux下如何管理开发板

      前言

      OK536N-C终于到我手上了,因为我的主要领域是做嵌入式音视频。例如相机类产品,录像类产品,直播类产品都是我所涉及到的。本片文章一起来开箱见证下OK536N-C有哪些魅力,在音视频领域如何,据说很强。

      对于一个嵌入式领域的开发者来说,强不代表一切,还要关注软硬件的资料是否全,各种文档是否详细,技术售后支持是否到位。等一系列因素,如果有一个不太好,就会在整体开发过程中耽搁大事。
      对于学生而言,更是如此,没有详细的资料,怎么能够快速开发出来作品,拿什么去打比赛!

      我个人PC就是Ubuntu,一起看看在Ubuntu下能否一路畅通的玩耍。

      truedei@truedei-code:truedei$ uname -a
      Linux truedei-code 6.11.0-25-generic #25~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 15 17:20:50 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
      truedei@truedei-code:truedei$ 
      

      一、开箱(bu)美照

      因为事先去了解过某宝上OK536N-C的套餐,其中就有LVDS 10存屏幕和MIPI 7寸屏幕。10寸的大屏幕, 谁看谁心动呀,特意借到了一个10寸的LVDS的屏幕。

      8455b13f-79d4-4fa3-bda4-77910cdc3ddd-image.png

      上电后:
      0256ab3b-5563-4c3a-8306-3c533238e21f-image.png

      这是我改了fbinit_test代码之后的效果:

      二、研究如何启动

      一开始不要着急插电源开机,先看手册。

      手册是真的太详细了,而且手册是在线的,不用翻来翻去打开一个一个的pdf了,太赞了。之前开发全志的芯片,看手册全是一个一个的加密的pdf,很不爽。飞凌的团队把文档做的很细,并且几乎都在线文档化了。而且还是语雀来写的,我真是太高兴了,我是比较喜欢写博客的,平时记录一些东西,也都是在语雀上,使用语雀已经至少6年了,算是重度患者。

      2b3d2610-2f35-4fd5-98cd-636b8c0ce1cd-image.png

      找到DC12V电源插口,找到开关,找到串口位置基本上就搞定了,如果有屏幕的话,再找到你对应屏幕的接线位置。

      说到屏幕,做的很细心,可以看到,基本上闭眼就可以安装:(给你贴着怎么安装,我就直接安装的,很顺利!)

      9149daee-5433-4355-a08c-1f42d75dba65-image.png

      按照要求接好线

      ba2d41d7-0410-41a0-b304-b47d129f8474-image.png

      都接好线就可以准备开机了。

      三、Ubuntu下连接串口到OK536N-C

      因为的我的PC是Ubuntu系统的,所以没有Windows这么多的GUI图形工具可以用.OK536N-C的手册里也并没有提到PC机器是Ubuntu时怎么搭建环境,这个很遗憾.

      首先确定USB-A----USB-C的线插到电脑上之后的串口是什么:

      插上前执行一次lsusb:

      truedei@truedei-code:truedei$ lsusb 
      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 001 Device 002: ID 046d:c548 Logitech, Inc. Logi Bolt Receiver
      Bus 001 Device 003: ID 0b05:1939 ASUSTek Computer, Inc. AURA LED Controller
      Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. Hub
      Bus 001 Device 006: ID 3554:fa09 Compx 2.4G Wireless Receiver
      Bus 001 Device 007: ID 8087:0029 Intel Corp. AX200 Bluetooth
      Bus 001 Device 008: ID 04e2:1414 Exar Corp. XR21V1414 4-channel UART
      Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 003 Device 002: ID 1d6b:0102 Linux Foundation EEM Gadget
      Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      truedei@truedei-code:truedei$ 
      truedei@truedei-code:truedei$ 
      

      拔掉后执行一次:

      truedei@truedei-code:truedei$ lsusb 
      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 001 Device 002: ID 046d:c548 Logitech, Inc. Logi Bolt Receiver
      Bus 001 Device 003: ID 0b05:1939 ASUSTek Computer, Inc. AURA LED Controller
      Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. Hub
      Bus 001 Device 006: ID 3554:fa09 Compx 2.4G Wireless Receiver
      Bus 001 Device 007: ID 8087:0029 Intel Corp. AX200 Bluetooth
      Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 003 Device 002: ID 1d6b:0102 Linux Foundation EEM Gadget
      Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      truedei@truedei-code:truedei$ 
      

      经过对比即可看出:"XR21V1414 4-channel UART"就是我们想找的.

      Bus 001 Device 008: ID 04e2:1414 Exar Corp. XR21V1414 4-channel UART
      

      其实如果先看过文档的话也可以参考:

      4967a5f2-2db7-431a-82ad-b431c3469d25-image.png

      查看是否生成了/dev/ttyUSB*

      truedei@truedei-code:truedei$ ls /dev/ttyUSB*
      /dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3
      truedei@truedei-code:truedei$
      

      接下来我们要用到一些ubuntu下的串口工具,例如putty

      如果你没有putty的话,可以安装下:

      sudo apt install putty
      

      启动putty时记得使用sudo,否则操作串口可能没有权限:

      sudo putty
      

      使用ttyUSB0,波特率115200进入:
      a0ddf3d6-1f41-48e4-84be-8b3e2090f455-image.png

      一路回车,出现OK536 Login就是串口连接成功了:

      c8191089-a25e-44cd-be59-7460ca214a2f-image.png

      账号:root
      密码:无,直接回车

      成功后的界面:

      dea368b7-d8d4-43c6-a104-66abace14b33-image.png

      四、使用ssh远程

      首先连上网,不喜欢wifi的话,就用有线,接上LAN后,在串口里执行udhcpc,就会获取到ip:
      ce23e02e-4795-4803-86b5-c28c362796b1-image.png

      然后就可以使用ssh远程了:(没有密码)

      truedei@truedei-code:truedei$ ssh root@192.168.2.105
      root@OK536:~# 
      root@OK536:~#
      

      我个人调试比较喜欢用scp命令,能使用ssh,基本上就能使用scp。

      可以看到/mnt/UDISK有14G的存储空间:

      root@OK536:~# df -h
      Filesystem          Size  Used Avail Use% Mounted on
      /dev/root           991M  385M  591M  40% /
      tmpfs               962M  300K  961M   1% /tmp
      tmpfs               962M  460K  961M   1% /run
      devtmpfs            959M     0  959M   0% /dev
      /dev/mmcblk0p1      128M  5.3M  123M   5% /run/media/mmcblk0p1
      /dev/by-name/UDISK   14G  107M   14G   1% /mnt/UDISK
      root@OK536:~#
      

      之后可以把测试的程序和相关的东西都远程拷贝到/mnt/UDISK即可。

      例如:编译了fdinit程序,然后远程拷贝到设备里:

      truedei@truedei-code:fbinit_test$ make -j10
      -e 
       cp -f fbinit /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/sdk_demo/bin 
      make finish!!!
      truedei@truedei-code:fbinit_test$ 
      truedei@truedei-code:fbinit_test$ 
      truedei@truedei-code:fbinit_test$ scp ./fbinit root@192.168.2.105:/mnt/UDISK/
      fbinit                                                                                                                                                                                                                                                                                                  100%   23KB  10.1MB/s   00:00    
      truedei@truedei-code:fbinit_test$
      

      然后设备里就有了:

      root@OK536:~# ls -l /mnt/UDISK/fbinit 
      -rwxrwx--- 1 root disk 23376 May 18 17:26 /mnt/UDISK/fbinit
      root@OK536:~#
      

      然后就可以运行了:

      root@OK536:~# /mnt/UDISK/fbinit 
      fbinit test version:V2.0.20220506
      ================Usage================
      /fbinit 	  means:clean /dev/fb0
      /fbinit 0	  means:clean /dev/fb0
      /fbinit 1	  means:clean /dev/fb1
      /fbinit 2	  means:clean /dev/fb2
      ================usage================
      cleanning /dev/fb0 ...
      

      这是我改了fbinit_test代码之后的效果,没改的话,只是清空fb:

      修改后的代码:

      #include <stdio.h>
      #include <string.h>
      #include <sys/mman.h>
      #include <linux/fb.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <semaphore.h>
      #include <errno.h>
      #include <stdlib.h>
      #include <time.h>
      #include <sys/ioctl.h>
      #include <unistd.h>
      #include <linux/videodev2.h>
      
      int main(int argc, char *argv[])
      {
          printf("fbinit test version:%s\n", MODULE_VERSION);
          char dev_name[20];
          memset(dev_name, 0, sizeof(dev_name));
          if (argc == 1) {
              printf("================Usage================\n");
              printf("/fbinit 	  means:clean /dev/fb0\n");
              printf("/fbinit 0	  means:clean /dev/fb0\n");
              printf("/fbinit 1	  means:clean /dev/fb1\n");
              printf("/fbinit 2	  means:clean /dev/fb2\n");
              printf("================usage================\n");
              sprintf(dev_name, "/dev/fb0");
          } else if (argc == 2) {
              sprintf(dev_name, "/dev/fb%d", atoi(argv[1]));
          }
          printf("cleanning %s ...\n", dev_name);
      
          int fd;
          struct fb_var_screeninfo var;
          struct fb_fix_screeninfo finfo;
          // 打开帧缓冲设备
          if ((fd = open(dev_name, O_RDWR)) == -1) {
              printf("open file %s fail. \n", dev_name);
              return 0;
          }
      
          // 获取固定屏幕信息
          if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) {
              printf("get fixed screen information failure\n");
              close(fd);
              return -1;
          }
          int screensize = finfo.smem_len;
      
          // 获取可变屏幕信息
          if (ioctl(fd, FBIOGET_VSCREENINFO, &var) == -1) {
              printf("get variable screen information failure\n");
              close(fd);
              return -1;
          }
      
          // 将帧缓冲区映射到用户空间
          char *frameBuffer = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
          if (frameBuffer == MAP_FAILED) {
              printf("mmap framebuffer failed\n");
              close(fd);
              return -1;
          }
      
          // 动态生成彩条图像(简单动画:每次运行条纹颜色偏移)
          int width = var.xres;
          int height = var.yres;
          int bpp = var.bits_per_pixel / 8;
          int offset = time(NULL) % width; // 随时间变化的偏移
      
          float PI = 3.14159265358979323846;
          int fl_num = 100;
          int t = 0;
          while (1) {
              t++;
              float time = t * 0.05f;
              for (int y = 0; y < height; y++) {
                  for (int x = 0; x < width; x++) {
                      // 多重正弦波叠加,制造动态波浪感
                      float fx = (float)x / width;
                      float fy = (float)y / height;
                      float wave = sinf(2 * PI * fx * 2 + time) +
                                   0.5f * sinf(2 * PI * fx * 4 + time * 1.5f) +
                                   0.25f * sinf(2 * PI * fx * 8 + time * 2.5f);
      
                      // 波浪影响亮度
                      float center = height / 2.0f + wave * 50.0f;
                      float dist = fabsf(y - center);
      
                      // 距离中心波浪越近越亮
                      float brightness = expf(-dist * 0.03f);
      
                      // 色彩渐变(可根据需要修改)
                      unsigned char r = (unsigned char)(brightness * 80 + fx * 175);
                      unsigned char g = (unsigned char)(brightness * 180 + fy * 75);
                      unsigned char b = (unsigned char)(brightness * 255);
      
                      int pos = (y * finfo.line_length) + (x * bpp);
      
                      if (bpp == 4) {
                          frameBuffer[pos + 0] = b;
                          frameBuffer[pos + 1] = g;
                          frameBuffer[pos + 2] = r;
                          frameBuffer[pos + 3] = 0xFF;
                      } else if (bpp == 3) {
                          frameBuffer[pos + 0] = b;
                          frameBuffer[pos + 1] = g;
                          frameBuffer[pos + 2] = r;
                      } else if (bpp == 2) {
                          unsigned short pixel = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
                          *((unsigned short *)(frameBuffer + pos)) = pixel;
                      }
                  }
              }
              // usleep(30 * 1000);
          }
      
      
          // 解除映射
          munmap(frameBuffer, screensize);
      
          close(fd);
          printf("clean %s finish\n", dev_name);
      }
      

      文档很详细,很快就能搭建好开发环境,并且修改自己想要的代码,然后编译出来自己的程序进行调试。

      发布在 飞凌嵌入式专区
      T
      TrueDei

    TrueDei 发布的最新帖子

    • OK536N-C在PC-Ubuntu开发环境搭建及创建自己的项目(含qt_demo编译错误解决方案)

      总结

      在使用OK536N-C的sdk搭建环境时总体是非常顺利的,只是qt_demo折腾了一下。希望飞凌的团队能看到并更新SDK压缩包.

      PC准备开发环境

      先下载到源码

      OKT536-linux-sdk.tar.bz2比较大,被分成了6个子压缩包:

      truedei@truedei-code:1-源码$ ls -l
      总计 10747185
      -rwxrwxrwx 1 root root        372  5月 16 20:48 md5sum.txt
      -rwxrwxrwx 1 root root 2147483648  5月 16 21:04 OKT536-linux-sdk.tar.bz2.00
      -rwxrwxrwx 1 root root 2147483648  5月 16 21:02 OKT536-linux-sdk.tar.bz2.01
      -rwxrwxrwx 1 root root 2147483648  5月 16 21:03 OKT536-linux-sdk.tar.bz2.02
      -rwxrwxrwx 1 root root 2147483648  5月 16 21:03 OKT536-linux-sdk.tar.bz2.03
      -rwxrwxrwx 1 root root 2147483648  5月 16 21:05 OKT536-linux-sdk.tar.bz2.04
      -rwxrwxrwx 1 root root  267695134  5月 16 21:05 OKT536-linux-sdk.tar.bz2.05
      truedei@truedei-code:1-源码$
      

      如果你害怕搞没,不想重新下载的话,可以先备份下:

      truedei@truedei-code:1-源码$ cd ..
      truedei@truedei-code:2-镜像及源码$ cp -arf 1-源码 1-源码_bak
      

      可以使用md5sum校验:

      truedei@truedei-code:1-源码$ cat md5sum.txt 
      81a2f7adbe52c3768eee4096aca3fefa  OKT536-linux-sdk.tar.bz2.00
      0ae30ee64b0fd44b5c8b563b0eff2d59  OKT536-linux-sdk.tar.bz2.01
      9204b1fbfdc347864766fefe574f8b94  OKT536-linux-sdk.tar.bz2.02
      2efca04ab16c43a2efe7c1cd68c85644  OKT536-linux-sdk.tar.bz2.03
      3ebdef7248d268109b8617d5f83717ce  OKT536-linux-sdk.tar.bz2.04
      bc29ad68a624664439d2cea2e1634694  OKT536-linux-sdk.tar.bz2.05
      truedei@truedei-code:1-源码$ 
      truedei@truedei-code:1-源码$ 
      truedei@truedei-code:1-源码$ md5sum OKT536-linux-sdk.tar.bz2.0*
      81a2f7adbe52c3768eee4096aca3fefa  OKT536-linux-sdk.tar.bz2.00
      0ae30ee64b0fd44b5c8b563b0eff2d59  OKT536-linux-sdk.tar.bz2.01
      9204b1fbfdc347864766fefe574f8b94  OKT536-linux-sdk.tar.bz2.02
      2efca04ab16c43a2efe7c1cd68c85644  OKT536-linux-sdk.tar.bz2.03
      3ebdef7248d268109b8617d5f83717ce  OKT536-linux-sdk.tar.bz2.04
      bc29ad68a624664439d2cea2e1634694  OKT536-linux-sdk.tar.bz2.05
      truedei@truedei-code:1-源码$ 
      

      解压多个被分割的压缩包时,需要先合并:

      cat OKT536-linux-sdk.tar.bz2.0* > OKT536-linux-sdk.tar.bz2
      

      然后解压tz2:

      bunzip2 OKT536-linux-sdk.tar.bz2
      
      #得到:
      22G  5月 16 21:40 OKT536-linux-sdk.tar
      

      会得到.tar,再继续解压.tar:

      tar -xvf OKT536-linux-sdk.tar
      

      解压完整个目录22G:

      truedei@truedei-code:1-源码$ du -sh OKT536-linux-sdk
      22G	OKT536-linux-sdk
      truedei@truedei-code:1-源码$ 
      

      然后拷贝不是中文的目录:例如我的:/media/truedei/soft/Ok536N-C

      truedei@truedei-code:1-源码$ cp -arf OKT536-linux-sdk ../../../../
      

      我是觉得解压一次不容易,还是cp过去一份比较好,虽然多占了22GB的空间,但是相对安全,例如某个操作破坏了当前的sdk内容,你还可以节省前面所有的操作。

      初探经验:最好赋予下权限,不然build.sh时会报权限不足:

      truedei@truedei-code:OKT536-linux-sdk$ chmod o+w ./ -R
      truedei@truedei-code:OKT536-linux-sdk$
      

      调用时报:

      /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/build/mkcmd.sh: line 750: python: command not found
      

      原因是我系统中只有python3,没有低版本的python

      ubuntu24.04这样解决:

      sudo apt install python-is-python3
      

      先编译配置:

      sudo ./build.sh config
      

      然后直接执行./build.sh编译

      truedei@truedei-code:OKT536-linux-sdk$ ./build.sh
      05-17 01:15:26.517 31732 D mkcommon  : ========ACTION List: build_linuxdev;========
      05-17 01:15:26.519 31732 D mkcommon  : options : 
      05-17 01:15:26.520 31732 I mkcommon  : ----------------------------------------
      05-17 01:15:26.521 31732 I mkcommon  : build linuxdev ...
      05-17 01:15:26.522 31732 I mkcommon  : chip: sun55iw6p1
      05-17 01:15:26.523 31732 I mkcommon  : platform: linux
      05-17 01:15:26.525 31732 I mkcommon  : kernel: linux-5.10-origin
      05-17 01:15:26.526 31732 I mkcommon  : board: OKT536-C
      05-17 01:15:26.527 31732 I mkcommon  : output: /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot
      05-17 01:15:26.528 31732 I mkcommon  : ----------------------------------------
      05-17 01:15:26.554 31732 I mkcommon  : build rtos ...
      
      

      buildroot编译不过去:

      05-17 01:36:23.072 56507 I mkcommon  : build buildroot ...
      make: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205'
      
      You seem to have the current working directory in your
      LD_LIBRARY_PATH environment variable. This doesn't work.
      make[1]: *** [support/dependencies/dependencies.mk:27: dependencies] Error 1
      make: *** [Makefile:96: _all] Error 2
      make: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205'
      05-17 01:36:28.549 56507 E mkcommon  : build buildroot Failed
      05-17 01:36:28.550 56507 F mkcommon  : build_buildroot_rootfs failed
      truedei@truedei-code:OKT536-linux-sdk$ 
      

      LD_LIBRARY_PATH environment variable. This doesn't work.

      说我的环境中存在LD_LIBRARY_PATH变量。

      先临时解决下:

      truedei@truedei-code:OKT536-linux-sdk$ echo $LD_LIBRARY_PATH 
      /home/truedei/local/lib:
      truedei@truedei-code:OKT536-linux-sdk$ 
      truedei@truedei-code:OKT536-linux-sdk$ export LD_LIBRARY_PATH=""
      truedei@truedei-code:OKT536-linux-sdk$ echo $LD_LIBRARY_PATH 
      
      truedei@truedei-code:OKT536-linux-sdk$ 
      

      为了节省时间,这次可以单独编译rootfs:

      因为我遇到了权限问题,所以加了sudo

      truedei@truedei-code:OKT536-linux-sdk$ sudo ./build.sh buildroot_rootfs
      

      成功之后是这样的:

      media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/buildroot-202205
      build auto finish
      05-17 03:14:42.112 94974 I mkcommon  : copy the config files form device ...
      make: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform'
      Makefile:35: "----------1--------"
      Makefile:36: /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform
      make: Nothing to be done for 'INSTALL_FILES'.
      make: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/platform'
      05-17 03:14:42.139 94974 I mkcommon  : build buildroot OK.
      truedei@truedei-code:OKT536-linux-sdk$ 
      

      如果你执行build.sh成功的话是这样的:

      05-17 07:53:53.660 46608 D mkcommon  : Number of gids 1
      05-17 07:53:53.661 46608 D mkcommon  : root (0)
      05-17 07:53:53.663 46608 I mkcommon  : pack rootfs ok ...
      05-17 07:53:53.664 46608 I mkcommon  : ----------------------------------------
      05-17 07:53:53.666 46608 I mkcommon  : build OK.
      05-17 07:53:53.667 46608 I mkcommon  : ----------------------------------------
      truedei@truedei-code:OKT536-linux-sdk$ 
      truedei@truedei-code:OKT536-linux-sdk$ 
      truedei@truedei-code:OKT536-linux-sdk$ 
      truedei@truedei-code:OKT536-linux-sdk$ 
      truedei@truedei-code:OKT536-linux-sdk$ 
      truedei@truedei-code:OKT536-linux-sdk$ sudo ./build.sh -j10
      
      

      我还发现了一个问题,在编译qt_demo时,Makefile中的qmake路径是写死的:

      cd browser/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/browser/browser.pro ) && make -f Makefile 
      cd backlight/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/backlight/backlight.pro ) && make -f Makefile 
      cd adc/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/adc/adc.pro ) && make -f Makefile 
      make[1]: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/musicplayer'
      /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile musicplayer.pro
      make[1]: /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake: No such file or directory
      make[1]: *** [Makefile:282: Makefile] Error 127
      make[1]: Leaving directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/musicplayer'
      make: *** [Makefile:111: sub-musicplayer-make_first] Error 2
      make: *** Waiting for unfinished jobs....
      make[1]: Entering directory '/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/watchdog'
      /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile watchdog.pro
      make[1]: /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake: No such file or directory
      make[1]: *** [Makefile:276: Makefile] Error 127
      
      

      报错的路径:

      /home/yy/work/T536/.release/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake

      正确的路径:

      /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake
      

      导致该问题的原因:

      现在我在刚解压过的原始sdk中,没做过任何编译:

      truedei@truedei-code:qt_demo$ pwd
      /media/truedei/soft/Ok536N-C/doc/OK536x-C_Linux5.10.198+Qt5.15.8_用户资料_R1/2-镜像及源码/1-源码/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo
      truedei@truedei-code:qt_demo$ 
      

      发现已经生成了.qmake.stash和Makefile:

      truedei@truedei-code:qt_demo$ ls -alh
      总计 177K
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 .
      drwxrwxrwx 1 root root    0  2月 13 17:49 ..
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 4g
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 adc
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 backlight
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 books
      drwxrwxrwx 1 root root  28K  2月 13 19:08 browser
      drwxrwxrwx 1 root root    0  2月 13 19:08 DWKeyboard
      -rwxrwxrwx 1 root root  338  2月 13 17:49 examples.pro
      -rwxrwxrwx 1 root root   34  2月 13 17:49 .gitignore
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 keypad
      -rwxrwxrwx 1 root root  84K  2月 13 19:08 Makefile
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 matrix-browser
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 musicplayer
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 network
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 ping_test
      -rwxrwxrwx 1 root root 2.1K  2月 13 17:49 .qmake.stash
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 rtc
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 spitest
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 terminal
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 watchdog
      drwxrwxrwx 1 root root 4.0K  2月 13 19:08 wifi
      truedei@truedei-code:qt_demo$ 
      truedei@truedei-code:qt_demo$ cat .qmake.stash 
      QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
      QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 10
      QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3
      QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 1
      QMAKE_CXX.COMPILER_MACROS = \
          QT_COMPILER_STDCXX \
          QMAKE_GCC_MAJOR_VERSION \
          QMAKE_GCC_MINOR_VERSION \
          QMAKE_GCC_PATCH_VERSION
      QMAKE_CXX.INCDIRS = \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1 \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1/aarch64-none-linux-gnu \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include/c++/10.3.1/backward \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1/include \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1/include-fixed \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/include \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/include
      QMAKE_CXX.LIBDIRS = \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc/aarch64-none-linux-gnu/10.3.1 \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/lib/gcc \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/lib64 \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/lib64 \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib64 \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/opt/ext-toolchain/aarch64-none-linux-gnu/lib \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/lib \
          /home/yy/work/T536/out/t536/OKT536-C/buildroot/buildroot/host/aarch64-buildroot-linux-gnu/sysroot/usr/lib
      truedei@truedei-code:qt_demo$ 
      truedei@truedei-code:qt_demo$ find ./ -name "Makefile"
      ./4g/Makefile
      ./adc/Makefile
      ./backlight/Makefile
      ./books/Makefile
      ./browser/Makefile
      ./keypad/Makefile
      ./Makefile
      ./matrix-browser/Makefile
      ./musicplayer/Makefile
      ./network/Makefile
      ./ping_test/Makefile
      ./rtc/Makefile
      ./spitest/Makefile
      ./terminal/Makefile
      ./watchdog/Makefile
      ./wifi/Makefile
      truedei@truedei-code:qt_demo$ 
      

      随便打开一个Makefile看下心里就有数了:

      70d4366b-757d-4e42-9eda-0425200ac748-image.png

      排查的最终解决方案:

      清理掉qt_demo的所有Makefile和.qmake.stash。

      truedei@truedei-code:qt_demo$ find ./ -name "Makefile"
      ./4g/Makefile
      ./adc/Makefile
      ./backlight/Makefile
      ./books/Makefile
      ./browser/Makefile
      ./keypad/Makefile
      ./Makefile
      ./matrix-browser/Makefile
      ./musicplayer/Makefile
      ./network/Makefile
      ./ping_test/Makefile
      ./rtc/Makefile
      ./spitest/Makefile
      ./terminal/Makefile
      ./watchdog/Makefile
      ./wifi/Makefile
      truedei@truedei-code:qt_demo$ 
      
      
      ###删除:
      truedei@truedei-code:qt_demo$ find ./ -name "Makefile" -delete
      truedei@truedei-code:qt_demo$ find ./ -name "Makefile"
      truedei@truedei-code:qt_demo$ 
      truedei@truedei-code:qt_demo$ 
      ###删除qmake的缓存
      truedei@truedei-code:qt_demo$ rm -rf .qmake.stash
      truedei@truedei-code:qt_demo$ 
      

      这个问题的关键在与:

      • 1.我认为飞凌的团队在提供原始代码的时候,应该清理掉该项目编译生产的.o,Makefile,qt的stash文件;
      • 2.shell脚本可以优化下:

      现在的:

      cd 4g/ && ( test -e Makefile || /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/qmake -o Makefile /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/forlinx/qt_demo/4g/4g.pro ) && make -f Makefile 
      

      会出现的问题:

      test -e Makefile命令会检测是否存在Makefile,如果存在就不执行后面的语句重新生产了;

      其实去掉test -e Makefile或者把||改成&&(感觉改成&&就起不到什么作用了,和检查不检查没区别)。

      写这个脚本的作者应该是这样想的:

      • 用户初次生产之后,就不让再次生成了,编译时可以节省时间;

      创建自己的项目

      这个牵扯到项目放在哪里,想知道放在哪里合适,就需要熟悉项目的整体架构。

      砍下这个目录:

      truedei@truedei-code:auto$ pwd
      /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto
      truedei@truedei-code:auto$ 
      truedei@truedei-code:auto$ ls -l
      总计 32
      drwxrwxrwx 1 root root    0  2月 13 17:49 allwinner
      -rwxrwxrwx 1 root root 5347  5月 18 19:44 build.sh
      drwxrwxrwx 1 root root    0  2月 13 17:49 forlinx
      -rwxrwxrwx 1 root root 4024  5月 18 15:08 makefile_cfg
      drwxrwxrwx 1 root root    0  2月 13 17:49 qt-demo
      -rwxrwxrwx 1 root root 5797  2月 13 17:49 ReadMe.md
      drwxrwxrwx 1 root root 4096  2月 13 17:49 sdk_demo
      drwxrwxrwx 1 root root 4096  2月 13 19:08 sdk_lib
      truedei@truedei-code:auto$ 
      

      可以打开OKT536-linux-sdk/buildroot/package/auto/build.sh研究下:

      5611811d-3208-4fa3-bec4-7a175d33dd1c-image.png

      看得出来,这各forlinx就是飞凌新增的脚本片段。

      我们可以把OKT536-linux-sdk/buildroot/package/auto目录当项目根目录,继续创建目录

      我完全是把OKT536-linux-sdk/buildroot/package/auto/sdk_demo/usbcam_test拷贝过来了,改了个名字

      d1bc01c8-5d26-4185-bd03-b1f01e22fd1d-image.png

      build.sh脚本新增:

      
      #########truedei#########
      echo "build $1 truedei ..."
      make -C $LICHEE_BUILDROOT_DIR/package/auto/truedei/ $1
      if [ $? -ne 0 ]; then
      	echo  "build truedei fail ..."
      	exit 1
      else
      	cp -rf $LICHEE_BUILDROOT_DIR/package/auto/truedei/bin/*	$LICHEE_BR_OUT/target/usr/bin/
      fi
      

      Makefile需要修改下:

      57c7f6dd-e714-42d0-a25d-e16c3c498f28-image.png

      INSTALL_TRUEDEI_PATH变量是在auto目录下的makefile_cfg中定义的:

      
      # 自定义自己的项目
      INSTALL_TRUEDEI_PATH = $(PACKAGE_PATH)/truedei/bin
      
      

      10557b2f-468a-4c74-85b4-3e94749d123a-image.png

      然后就可以编译了,为了省时间,可以直接到项目中编译即可:

      truedei@truedei-code:truedei$ 
      truedei@truedei-code:truedei$ pwd
      /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/truedei
      truedei@truedei-code:truedei$ 
      truedei@truedei-code:truedei$ 
      truedei@truedei-code:truedei$ 
      truedei@truedei-code:truedei$ make
      -e 
      /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/out/t536/OKT536-C/buildroot/buildroot/host/bin/aarch64-none-linux-gnu-g++ -g  -o truedei  ./usbcam_test.o  -L/media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/sdk_lib
      generate truedei success!!!
       cp -f truedei /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/truedei/bin 
      make finish!!!
      truedei@truedei-code:truedei$ 
      
      发布在 飞凌嵌入式专区
      T
      TrueDei
    • OK536N-C开箱以及在Linux下如何管理开发板

      前言

      OK536N-C终于到我手上了,因为我的主要领域是做嵌入式音视频。例如相机类产品,录像类产品,直播类产品都是我所涉及到的。本片文章一起来开箱见证下OK536N-C有哪些魅力,在音视频领域如何,据说很强。

      对于一个嵌入式领域的开发者来说,强不代表一切,还要关注软硬件的资料是否全,各种文档是否详细,技术售后支持是否到位。等一系列因素,如果有一个不太好,就会在整体开发过程中耽搁大事。
      对于学生而言,更是如此,没有详细的资料,怎么能够快速开发出来作品,拿什么去打比赛!

      我个人PC就是Ubuntu,一起看看在Ubuntu下能否一路畅通的玩耍。

      truedei@truedei-code:truedei$ uname -a
      Linux truedei-code 6.11.0-25-generic #25~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 15 17:20:50 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
      truedei@truedei-code:truedei$ 
      

      一、开箱(bu)美照

      因为事先去了解过某宝上OK536N-C的套餐,其中就有LVDS 10存屏幕和MIPI 7寸屏幕。10寸的大屏幕, 谁看谁心动呀,特意借到了一个10寸的LVDS的屏幕。

      8455b13f-79d4-4fa3-bda4-77910cdc3ddd-image.png

      上电后:
      0256ab3b-5563-4c3a-8306-3c533238e21f-image.png

      这是我改了fbinit_test代码之后的效果:

      二、研究如何启动

      一开始不要着急插电源开机,先看手册。

      手册是真的太详细了,而且手册是在线的,不用翻来翻去打开一个一个的pdf了,太赞了。之前开发全志的芯片,看手册全是一个一个的加密的pdf,很不爽。飞凌的团队把文档做的很细,并且几乎都在线文档化了。而且还是语雀来写的,我真是太高兴了,我是比较喜欢写博客的,平时记录一些东西,也都是在语雀上,使用语雀已经至少6年了,算是重度患者。

      2b3d2610-2f35-4fd5-98cd-636b8c0ce1cd-image.png

      找到DC12V电源插口,找到开关,找到串口位置基本上就搞定了,如果有屏幕的话,再找到你对应屏幕的接线位置。

      说到屏幕,做的很细心,可以看到,基本上闭眼就可以安装:(给你贴着怎么安装,我就直接安装的,很顺利!)

      9149daee-5433-4355-a08c-1f42d75dba65-image.png

      按照要求接好线

      ba2d41d7-0410-41a0-b304-b47d129f8474-image.png

      都接好线就可以准备开机了。

      三、Ubuntu下连接串口到OK536N-C

      因为的我的PC是Ubuntu系统的,所以没有Windows这么多的GUI图形工具可以用.OK536N-C的手册里也并没有提到PC机器是Ubuntu时怎么搭建环境,这个很遗憾.

      首先确定USB-A----USB-C的线插到电脑上之后的串口是什么:

      插上前执行一次lsusb:

      truedei@truedei-code:truedei$ lsusb 
      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 001 Device 002: ID 046d:c548 Logitech, Inc. Logi Bolt Receiver
      Bus 001 Device 003: ID 0b05:1939 ASUSTek Computer, Inc. AURA LED Controller
      Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. Hub
      Bus 001 Device 006: ID 3554:fa09 Compx 2.4G Wireless Receiver
      Bus 001 Device 007: ID 8087:0029 Intel Corp. AX200 Bluetooth
      Bus 001 Device 008: ID 04e2:1414 Exar Corp. XR21V1414 4-channel UART
      Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 003 Device 002: ID 1d6b:0102 Linux Foundation EEM Gadget
      Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      truedei@truedei-code:truedei$ 
      truedei@truedei-code:truedei$ 
      

      拔掉后执行一次:

      truedei@truedei-code:truedei$ lsusb 
      Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 001 Device 002: ID 046d:c548 Logitech, Inc. Logi Bolt Receiver
      Bus 001 Device 003: ID 0b05:1939 ASUSTek Computer, Inc. AURA LED Controller
      Bus 001 Device 004: ID 05e3:0610 Genesys Logic, Inc. Hub
      Bus 001 Device 006: ID 3554:fa09 Compx 2.4G Wireless Receiver
      Bus 001 Device 007: ID 8087:0029 Intel Corp. AX200 Bluetooth
      Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 003 Device 002: ID 1d6b:0102 Linux Foundation EEM Gadget
      Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
      Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
      truedei@truedei-code:truedei$ 
      

      经过对比即可看出:"XR21V1414 4-channel UART"就是我们想找的.

      Bus 001 Device 008: ID 04e2:1414 Exar Corp. XR21V1414 4-channel UART
      

      其实如果先看过文档的话也可以参考:

      4967a5f2-2db7-431a-82ad-b431c3469d25-image.png

      查看是否生成了/dev/ttyUSB*

      truedei@truedei-code:truedei$ ls /dev/ttyUSB*
      /dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3
      truedei@truedei-code:truedei$
      

      接下来我们要用到一些ubuntu下的串口工具,例如putty

      如果你没有putty的话,可以安装下:

      sudo apt install putty
      

      启动putty时记得使用sudo,否则操作串口可能没有权限:

      sudo putty
      

      使用ttyUSB0,波特率115200进入:
      a0ddf3d6-1f41-48e4-84be-8b3e2090f455-image.png

      一路回车,出现OK536 Login就是串口连接成功了:

      c8191089-a25e-44cd-be59-7460ca214a2f-image.png

      账号:root
      密码:无,直接回车

      成功后的界面:

      dea368b7-d8d4-43c6-a104-66abace14b33-image.png

      四、使用ssh远程

      首先连上网,不喜欢wifi的话,就用有线,接上LAN后,在串口里执行udhcpc,就会获取到ip:
      ce23e02e-4795-4803-86b5-c28c362796b1-image.png

      然后就可以使用ssh远程了:(没有密码)

      truedei@truedei-code:truedei$ ssh root@192.168.2.105
      root@OK536:~# 
      root@OK536:~#
      

      我个人调试比较喜欢用scp命令,能使用ssh,基本上就能使用scp。

      可以看到/mnt/UDISK有14G的存储空间:

      root@OK536:~# df -h
      Filesystem          Size  Used Avail Use% Mounted on
      /dev/root           991M  385M  591M  40% /
      tmpfs               962M  300K  961M   1% /tmp
      tmpfs               962M  460K  961M   1% /run
      devtmpfs            959M     0  959M   0% /dev
      /dev/mmcblk0p1      128M  5.3M  123M   5% /run/media/mmcblk0p1
      /dev/by-name/UDISK   14G  107M   14G   1% /mnt/UDISK
      root@OK536:~#
      

      之后可以把测试的程序和相关的东西都远程拷贝到/mnt/UDISK即可。

      例如:编译了fdinit程序,然后远程拷贝到设备里:

      truedei@truedei-code:fbinit_test$ make -j10
      -e 
       cp -f fbinit /media/truedei/soft/Ok536N-C/OKT536-linux-sdk/buildroot/package/auto/sdk_demo/bin 
      make finish!!!
      truedei@truedei-code:fbinit_test$ 
      truedei@truedei-code:fbinit_test$ 
      truedei@truedei-code:fbinit_test$ scp ./fbinit root@192.168.2.105:/mnt/UDISK/
      fbinit                                                                                                                                                                                                                                                                                                  100%   23KB  10.1MB/s   00:00    
      truedei@truedei-code:fbinit_test$
      

      然后设备里就有了:

      root@OK536:~# ls -l /mnt/UDISK/fbinit 
      -rwxrwx--- 1 root disk 23376 May 18 17:26 /mnt/UDISK/fbinit
      root@OK536:~#
      

      然后就可以运行了:

      root@OK536:~# /mnt/UDISK/fbinit 
      fbinit test version:V2.0.20220506
      ================Usage================
      /fbinit 	  means:clean /dev/fb0
      /fbinit 0	  means:clean /dev/fb0
      /fbinit 1	  means:clean /dev/fb1
      /fbinit 2	  means:clean /dev/fb2
      ================usage================
      cleanning /dev/fb0 ...
      

      这是我改了fbinit_test代码之后的效果,没改的话,只是清空fb:

      修改后的代码:

      #include <stdio.h>
      #include <string.h>
      #include <sys/mman.h>
      #include <linux/fb.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <semaphore.h>
      #include <errno.h>
      #include <stdlib.h>
      #include <time.h>
      #include <sys/ioctl.h>
      #include <unistd.h>
      #include <linux/videodev2.h>
      
      int main(int argc, char *argv[])
      {
          printf("fbinit test version:%s\n", MODULE_VERSION);
          char dev_name[20];
          memset(dev_name, 0, sizeof(dev_name));
          if (argc == 1) {
              printf("================Usage================\n");
              printf("/fbinit 	  means:clean /dev/fb0\n");
              printf("/fbinit 0	  means:clean /dev/fb0\n");
              printf("/fbinit 1	  means:clean /dev/fb1\n");
              printf("/fbinit 2	  means:clean /dev/fb2\n");
              printf("================usage================\n");
              sprintf(dev_name, "/dev/fb0");
          } else if (argc == 2) {
              sprintf(dev_name, "/dev/fb%d", atoi(argv[1]));
          }
          printf("cleanning %s ...\n", dev_name);
      
          int fd;
          struct fb_var_screeninfo var;
          struct fb_fix_screeninfo finfo;
          // 打开帧缓冲设备
          if ((fd = open(dev_name, O_RDWR)) == -1) {
              printf("open file %s fail. \n", dev_name);
              return 0;
          }
      
          // 获取固定屏幕信息
          if (ioctl(fd, FBIOGET_FSCREENINFO, &finfo) == -1) {
              printf("get fixed screen information failure\n");
              close(fd);
              return -1;
          }
          int screensize = finfo.smem_len;
      
          // 获取可变屏幕信息
          if (ioctl(fd, FBIOGET_VSCREENINFO, &var) == -1) {
              printf("get variable screen information failure\n");
              close(fd);
              return -1;
          }
      
          // 将帧缓冲区映射到用户空间
          char *frameBuffer = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
          if (frameBuffer == MAP_FAILED) {
              printf("mmap framebuffer failed\n");
              close(fd);
              return -1;
          }
      
          // 动态生成彩条图像(简单动画:每次运行条纹颜色偏移)
          int width = var.xres;
          int height = var.yres;
          int bpp = var.bits_per_pixel / 8;
          int offset = time(NULL) % width; // 随时间变化的偏移
      
          float PI = 3.14159265358979323846;
          int fl_num = 100;
          int t = 0;
          while (1) {
              t++;
              float time = t * 0.05f;
              for (int y = 0; y < height; y++) {
                  for (int x = 0; x < width; x++) {
                      // 多重正弦波叠加,制造动态波浪感
                      float fx = (float)x / width;
                      float fy = (float)y / height;
                      float wave = sinf(2 * PI * fx * 2 + time) +
                                   0.5f * sinf(2 * PI * fx * 4 + time * 1.5f) +
                                   0.25f * sinf(2 * PI * fx * 8 + time * 2.5f);
      
                      // 波浪影响亮度
                      float center = height / 2.0f + wave * 50.0f;
                      float dist = fabsf(y - center);
      
                      // 距离中心波浪越近越亮
                      float brightness = expf(-dist * 0.03f);
      
                      // 色彩渐变(可根据需要修改)
                      unsigned char r = (unsigned char)(brightness * 80 + fx * 175);
                      unsigned char g = (unsigned char)(brightness * 180 + fy * 75);
                      unsigned char b = (unsigned char)(brightness * 255);
      
                      int pos = (y * finfo.line_length) + (x * bpp);
      
                      if (bpp == 4) {
                          frameBuffer[pos + 0] = b;
                          frameBuffer[pos + 1] = g;
                          frameBuffer[pos + 2] = r;
                          frameBuffer[pos + 3] = 0xFF;
                      } else if (bpp == 3) {
                          frameBuffer[pos + 0] = b;
                          frameBuffer[pos + 1] = g;
                          frameBuffer[pos + 2] = r;
                      } else if (bpp == 2) {
                          unsigned short pixel = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
                          *((unsigned short *)(frameBuffer + pos)) = pixel;
                      }
                  }
              }
              // usleep(30 * 1000);
          }
      
      
          // 解除映射
          munmap(frameBuffer, screensize);
      
          close(fd);
          printf("clean %s finish\n", dev_name);
      }
      

      文档很详细,很快就能搭建好开发环境,并且修改自己想要的代码,然后编译出来自己的程序进行调试。

      发布在 飞凌嵌入式专区
      T
      TrueDei