导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. RiceChen
    R
    • 资料
    • 关注 0
    • 粉丝 0
    • 我的积分 850
    • 主题 6
    • 帖子 8
    • 最佳 5
    • 群组 0

    RiceChenLV 4

    @RiceChen

    850
    积分
    15
    声望
    21
    资料浏览
    8
    帖子
    0
    粉丝
    0
    关注
    注册时间 最后登录

    RiceChen 取消关注 关注

    RiceChen 发布的最佳帖子

    • 【入门必看】全志V853开发板——构建编译与固件烧篇

      全志V853-高性能边缘AI视觉处理芯片

      V853 是一颗面向智能视觉领域推出的新一代高性能、低功耗的处理器SOC,可广泛用于智能门锁、智能考勤门禁、网络摄像头、行车记录仪、智能台灯等智能化升级相关行业。
      V853 集成Arm Cortex-A7和RISC-V E907 双CPU,内置最大 1T 算力 NPU,使用全志自研 Smart 视频引擎,最大支持5M@25fps H.265编码和5M@25fps H.264编解码,同时集成高性能 ISP 图像处理器,可为客户提供专业级图像质量。V853 还支持 16-bit DDR3/DDR3L,满足各类产品高带宽需求;支持 4lane MIPI-CSI/DVP/MIPI-DSI/RGB 等丰富的专用视频输入输出接口,满足各类AI视觉产品需求;采用先进的22nm工艺,具有更优的功耗和更小的芯片面积。

      全志V853开发板介绍

      1. 很荣幸能第一手拿到全志V853的开发板。接下来开始介绍介绍这款开发板。
      2. 全志V853开发板规格参数:
      类型 说明
      主控 全志V853 (Arm A7 1GHz + RISC-V E907 600MHz + 1T NPU)
      DDR 512MB DDR3
      Memory 8GB eMMC
      无线网络 2.4G WiFi/BT(型号:全志XR829模组)
      有线网络 100Mbps以太网
      摄像头 1080P双目摄像头
      屏幕 7寸 LCD屏幕
      麦克风 模拟麦克风 *2
      DEBUG 支持uart串口调试,支持ADB USB调试
      USB Type-C USB * 1, 同时支持供电和数据传输
      PMU 全志AXP2101
      1. 全志V853系统配置:官方支持Tina Linux 5.0系统,基于Linux4.9内核和uboot-2018。其中:
      • Tina Linux 是全志科技基于Linux内核开发的针对智能硬件类产品的嵌入式软件系统。
      • Tina Linux v5.0 中包含 Linux 系统开发用到的 boot 源码、内核源码、驱动、工具、系统中间件与应用程序包。可以方便的定制、编译、打包生成Linux固件镜像。
      • Tina Linux v5.0 可以支持构建 openWrt 和 buildroot 不同构建系统;也支持单独编译 BSP(Board Support Package,板级支持包);能够打包生成固件包,烧录到相应设备中并运行。
      1. 全志V853开发板的硬件外设

      全志V853开发板初体验

      1. 拿到开发板,我没有立马去编译构建代码,而是进入板子内部的默认系统,看看外设适配的怎么样。V853的开发板提供了两个调试串口(分别为:A7调试串口(UART0),E907 RV调试串口(UART3))。我分别连接了对应的串口,A7调试串口的接口可以输出启动信息,但是无法输入命令。E907 RV调试串口的接口没有任何任何日志,怀疑里面没有任何代码。

      2. 虽然A7调试串口的接口无法输入命令行,但是A7的调试提供了ADB Shell调试。

      • 全志ADB工具下载:https://www.aw-ol.com/downloads?cat=5。
      • 下载解压后,把ADB工作目录添加到环境变量中:右键 ”此电脑“,属性,找到高级系统设置,点击环境变量,xxx用户的环境变量,Path,新增一个环境变量。

      1. 环境设置完毕,既可以在CMD终端中输入adb shell

      GPIO点灯测试

      • 学习一门编程语言,首先要学会在终端输出“Hello world”。学习一个开发板,首先要学会如何点亮一颗LED灯。开发板的指示灯接在PH11引脚上。所以GPIO编号为:7 * 32 + 11 = 235。所以我们可以直接操作GPIO235。实际板子的GPIO编号已经被导出了。
      root@TinaLinux:/# cd /sys/class/gpio/gpio235
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235# ls
      active_low  direction   power       uevent
      device      edge        subsystem   value
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235# echo 0 > value
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235# echo 1 > value
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235#
      

      WIFI测试

      • V853开发板使用WIFI模组是自家的--XR829,它是Wi-Fi & BT。WIFI部分采用SDIO总线与V853通信。
      • Tina提供一套简易方便的WIFI测试套件,通过wifi命令可以设置WIFI的工作模式,扫描网络,连接网络等等。以WIFI的STA模式测试:
      root@TinaLinux:/# wifi -o sta
      root@TinaLinux:/# wifi -c Rice 12345678
      root@TinaLinux:/# ifconfig
      lo        Link encap:Local Loopback
                inet addr:127.0.0.1  Mask:255.0.0.0
                inet6 addr: ::1/128 Scope:Host
                UP LOOPBACK RUNNING  MTU:65536  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      
      wlan0     Link encap:Ethernet  HWaddr 4C:34:1E:9A:F1:B0
                inet addr:192.168.137.37  Bcast:192.168.137.255  Mask:255.255.255.0
                inet6 addr: fe80::4e34:1eff:fe9a:f1b0/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:4 errors:0 dropped:0 overruns:0 frame:0
                TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:970 (970.0 B)  TX bytes:1730 (1.6 KiB)
      
      root@TinaLinux:/# ping baidu.com
      PING baidu.com (220.181.38.148): 56 data bytes
      64 bytes from 220.181.38.148: seq=0 ttl=50 time=48.033 ms
      64 bytes from 220.181.38.148: seq=1 ttl=50 time=55.773 ms
      64 bytes from 220.181.38.148: seq=2 ttl=50 time=55.524 ms
      64 bytes from 220.181.38.148: seq=3 ttl=50 time=50.839 ms
      ^C
      --- baidu.com ping statistics ---
      4 packets transmitted, 4 packets received, 0% packet loss
      round-trip min/avg/max = 48.033/52.542/55.773 ms
      root@TinaLinux:/#
      

      LCD测试

      • V853开发板配套7寸LCD屏幕,并配备电容式触摸。
      • 花屏测试:
      root@TinaLinux:/# cat /dev/urandom > /dev/fb0
      

      • 彩色条纹测试:
      root@TinaLinux:/# echo 1 > /sys/class/disp/disp/attr/colorbar
      

      编译环境搭建

      1. 使用的开发环境是:VMware + ubuntu18.04
      2. ubuntu安装完毕,只需要几条命令就可以把编译环境搭建完成。
      // 更新软件列表
      
      v853@v853:~/v853$ sudo apt-get update
      
      // 安装各种工具及软件包
      v853@v853:~/v853$ sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc++6 libstdc++6 -y
      
      // 设置git用户信息
      v853@v853:~/v853$ git config --global user.email "980307037@qq.com"
      v853@v853:~/v853$ git config --global user.name "RiceChen"
      

      V853工程构建

      1. 首先源码下载需要在全志客户服务平台。如果没有注册需要先注册在登陆。链接:https://open.allwinnertech.com/#/login?cas=true
      2. 将开发环境的钥匙对添加到全志客户服务平台。
      • 生成钥匙对:
      v853@v853:~/v853$ ssh-keygen -t rsa
      
      • 导出公钥, 将导出公钥进行复制:
      v853@v853:~/v853$ cat ~/.ssh/id_rsa.pub
      
      • 公钥粘贴到全志客户服务平台:

      1. 安装repo引导脚本
      • 下载repo引导脚本:
      v853@v853:~/v853$ git clone ssh://RiceChen@sdk.allwinnertech.com/git_repo/repo.git
      
      • 修改repo脚本的username:
      REPO_URL='ssh://username@sdk.allwinnertech.com/git_repo/repo.git'
      改为
      REPO_URL='ssh://RiceChen@sdk.allwinnertech.com/git_repo/repo.git'
      
      • 添加repo引导脚本到环境中:
      v853@v853:~/v853$ sudo cp repo/repo /usr/bin/repo
      v853@v853:~/v853$ sudo chmod 777 /usr/bin/repo
      // 测试是否添加成功
      v853@v853:~/v853$ repo help
      
      1. 下载SDK
      • 创建SDK存放文件夹,并进入文件夹
      v853@v853:~/v853$ mkdir tina-v853
      v853@v853:~/v853$ cd tina-v853
      
      • 初始化repo仓库:
      v853@v853:~/v853/tina-v853$ repo init -u ssh://RiceChen@sdk.allwinnertech.com/git_repo/V853Tina_Open/manifest.git -b master -m tina-v853-open.xml
      
      • 同步仓库代码,并创建分支:
      v853@v853:~/v853/tina-v853$ repo sync
      v853@v853:~/v853/tina-v853$ repo start product-v853 --all
      
      1. 构建v853工程
      • 构建工程前,需要安装mkimage:
      sudo apt-get install u-boot-tools
      
      • 配置编译模式:
      v853@v853:~/v853/tina-v853$ ./build.sh config
      ========ACTION List: mk_config ;========
      options :
      All available platform:
         0. android
         1. linux
      Choice [linux]: 1
      All available linux_dev:
         0. bsp
         1. buildroot
         2. tinyos
         3. openwrt
      Choice [openwrt]: 1
      All available ic:
         0. v853
      Choice [t113]: 0
      All available board:
         0. vision
      Choice [vision]: 0
      All available flash:
         0. default
         1. nor
      Choice [default]: 0
      
      • 编译固件,然后
      v853@v853:~/v853/tina-v853$ ./build.sh
      
      ...
      [GPU]: No GPU type is configured in /home/v853/v853/tina-v853/kernel/linux-4.9/.config.
      regenerate rootfs cpio
      16149 blocks
      16150 blocks
      build_ramfs
      Copy boot.img to output directory ...
      Copy modules to target ...
      ./scripts/build.sh
      
      sun8iw21p1 compile Kernel successful
      
      
      INFO: ----------------------------------------
      INFO: build Tina OK.
      INFO: ----------------------------------------
      v853@v853:~/v853/tina-v853$ 
      
      • 打包固件:
      v853@v853:~/v853/tina-v853$ ./build.sh pack
      
      ...
      FileLength=7d7000Add partion rootfs.fex ROOTFS_FEX000000
      Add partion very rootfs.fex ROOTFS_FEX000000
      FilePath: rootfs.fex
      FileLength=338ac00BuildImg 0
      Dragon execute image.cfg SUCCESS !
      ----------image is at----------
      
      72M	/home/v853/v853/tina-v853/out/v853/vision/buildroot/v853_linux_vision_uart0.img
      
      pack finish
      v853@v853:~/v853/tina-v853$ 
      

      烧录验证

      1. 下载全志USB驱动,链接:https://www.aw-ol.com/downloads/resources/15。解压并点击batch脚本安装即可。

      1. 下载固件烧写工具PhoenixSuit,链接:https://www.aw-ol.com/downloads/resources/13。
      • 解压并打开可执行程序:PhoenixSuit.exe。

      • 选择固件,并选择立即升级。然后按住开发的uboot和reset按键,先松开reset按键。就可以看到进度条的变化。

      1. 下载完成。串口终端便可以输出:

      <br/>关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

      发布在 V Series
      R
      RiceChen
    • 【XR806开发板试用】XR806与鸿蒙,简化构建环境流程

      前言

      • 很荣幸再次获得评测开发板的机会,这次活动依旧是ARM中国举办的活动。
      • 这次评测的开发板--全志XR806开发板+搭载Open鸿蒙1.0操作系统。这是完美的国产化。中国牛逼。。。。
      • 第一次接触鸿蒙是一年前,最开始接触是适配了RT-Thread内核进Open鸿蒙1.0中作为第三方内核。不过这个没有公布,只是玩玩。
      • 第二次接触是在5个月前,参与小熊派社区适配Open鸿蒙的Lite-A到STM32MP157,当时主要负责构建系统部分,以及1~2个驱动的适配。
      • 评测XR806算是我第三次接触Open鸿蒙, XR608内核采用Lite-M。在XR608的交流群中,我发现大家已久吐槽最多的就是整个构建流程,环境搭建TM的痛苦。所以写这篇文章的目的就是简化整个环境搭建流程。

      环境搭建

      安装ubuntu

      1. 建议采用ubuntu 18.04版本,这样子掉坑会比较少。
      2. 新安装的ubuntu可能存在与windows电脑之间无法复制粘贴问题,解决方案,如下命令:
      rice@rice:~$ sudo apt-get autoremove open-vm-tools
      rice@rice:~$ sudo apt-get install open-vm-tools-desktop
      

      安装git

      1. 在调试终端输出如下命令:
      rice@rice:~$ sudo apt-get install git
      ...
      rice@rice:~$ git config --global user.email "you@example.com"
      rice@rice:~$ git config --global user.name "Your Name"
      

      安装python3.8

      1. 在调试终端输出如下命令:
      rice@rice:~$ sudo apt-get install python3.8
      rice@rice:~$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
      rice@rice:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
      
      1. 在接下来的操作如果出现如下错误,请执行下面命令:
      • 错误码如下:
      Traceback (most recent call last):
        File "/usr/lib/command-not-found", line 28, in <module>
          from CommandNotFound import CommandNotFound
        File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 19, in <module>
          from CommandNotFound.db.db import SqliteDatabase
        File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
          import apt_pkg
      ModuleNotFoundError: No module named 'apt_pkg'
      
      • 错误纠正命令:
      sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
      

      安装docker

      1. 在调试终端输出如下命令:
      rice@rice:~/xr806$ sudo apt install docker.io
      

      环境搭建完成

      xr806工程搭建

      创建xr806

      1. 在调试终端输出如下命令:
      rice@rice:~$ mkdir xr806
      rice@rice:~$ cd xr806
      

      下载的repo文件

      1. 下载的repo文件,在调试终端输出如下命令:
      rice@rice:~/xr806$ git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
      
      1. 修改git-repo下载到的repo文件REPO_URL地址(https://mirrors.ustc.edu.cn/aosp/git-repo),操作如下所示:
      • 在调试终端输出如下命令:
      rice@rice:~/xr806$ vim git-repo/repo
      
      • 修改位置如下图:

      1. 拷贝repo文件到/usr/bin/,便可以执行repo命令,在调试终端输出如下命令:
      rice@rice:~/xr806/$ sudo cp git-repo/repo /usr/bin/
      

      下载系统源码

      1. 创建目录,在调试终端输出如下命令:
      rice@rice:~/xr806$ mkdir code
      rice@rice:~/xr806$ cd code
      
      1. 通过repo,从gitee仓库中获取鸿蒙系统分支源码,在调试终端输出如下命令:
      rice@rice:~/xr806/code$ repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify
      rice@rice:~/xr806/code$ repo sync -c
      rice@rice:~/xr806/code$ repo forall -c 'git lfs pull'
      

      下载xr806源码

      1. 下载device源码,在调试终端输出如下命令:
      rice@rice:~/xr806/code$ cd device/
      rice@rice:~/xr806/code/device$ git clone https://gitee.com/moldy-potato-chips/devboard_device_allwinner_xr806.git
      rice@rice:~/xr806/code/device$ mv devboard_device_allwinner_xr806/ xradio
      
      1. 下载vendor源码,在调试终端输出如下命令:
      rice@rice:~/xr806/code/device$ cd ../
      rice@rice:~/xr806/code$ cd vendor/
      rice@rice:~/xr806/code/vendor$ git clone https://gitee.com/moldy-potato-chips/devboard_vendor_allwinner_xr806.git
      rice@rice:~/xr806/code/vendor$ mv devboard_vendor_allwinner_xr806/ xradio
      

      交叉编译工具

      1. 下载交叉编译工具,在调试终端输出如下命令:
      rice@rice:~/xr806$ mkdir tool
      rice@rice:~/xr806$ cd tool
      rice@rice:~/xr806/tool$ wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
      rice@rice:~/xr806/tool$ tar -jxvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
      

      下载Open鸿蒙的适配好的docker

      1. 下载docker,在调试终端输出如下命令:
      rice@rice:~/xr806$ docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5
      
      1. 进入docker,在调试终端输出如下命令:
      rice@rice:~/xr806$ sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5
      

      修改交叉编译工具

      1. 修改device/xradio/xr806/liteos_m/config.gni中的board_toolchain_prefix为实际环境下的gcc路径(/home/openharmony/tool/gcc-arm-none-eabi-10-2020-q4-major/bin)。操作如下:
      root@c2aa13139a52:/home/openharmony# cd code/device/xradio/xr806/liteos_m
      root@c2aa13139a52:/home/openharmony/code/device/xradio/xr806/liteos_m# vim config.gni
      

      1. 修改device/xradio/xr806/xr_skylark/gcc.mk,操作如下:
      root@c2aa13139a52:/home/openharmony# cd code/device/xradio/xr806/xr_skylark
      

      SDK配置

      1. 在修改完交叉编译工具路径后 ,在xr_skylark目录下执行,复制配置文件:
      root@c2aa13139a52:/home/openharmony/code/device/xradio/xr806/xr_skylark# make menuconfig
      
      1. 如果出现如下错误,输入如下命令:
      • 错误码:

      • 错误解决, 然后重新输入上面命令:
      root@c2aa13139a52:/home/openharmony/code/device/xradio/xr806/xr_skylark# apt-get install libncurses5-dev
      
      • 结果:

      1. 清除过程文件
      make build_clean
      
      1. 生成静态库已经自动生成头文件
      make lib -j
      
      1. 成功结果如图:

      系统源码编译

      1. 回到xr806系统源码目录:
      root@c2aa13139a52:/home/openharmony/code#  
      
      1. 输入hb set 选择skylark:

      1. 输入hb build -f 编译:

      1. 生成的镜像文件xr_system.img

      烧录代码

      1. 生成的镜像位于device/xradio/xr806/xr_skylark/out。将整个out的镜像拷贝到windows下。
      2. 拷贝烧录工具(phoenixMC)到windows,位置:device\xradio\xr806\xr_skylark\tools,并打开工具:
      • 第一步:选择镜像。
      • 第二部:选择对应的串口

      1. 修改烧录配置项,勾选“硬件复位烧写模式”:

      1. 点击升级固件,然后等待烧录到100%,便完成整个流程。

      运行效果

      1. 将板子接上串口软件,波特率选择115200,然后可以到对应的启动打印:

      <br/>关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

      发布在 Wireless & Analog Series
      R
      RiceChen
    • LVGL案例分享--手把手教你移植到T113-i国产工业开发板

      市面上有许多嵌入式GUI库可供选择,包括开源GUI库和闭源GUI库,开源GUI库:LVGL,EmWin等;闭源GUI库:TouchGFX,柿饼GUI等。

      本篇文章主要描述如何将LVGL8.1移植到创龙科技的T113-i的开发板上。

      LVGL

      1. LVGL,全名“Littlev Graphics Library”,是一个开源的图形库,主要用于在嵌入式系统上创建图形用户界面(GUI)。它是用C语言编写的,旨在高效和可定制,因此在各种微控制器平台和显示硬件上开发用户界面时备受欢迎。

      2. LVGL的特性

      • 轻量级:LVGL旨在轻量且高效,适用于资源受限的嵌入式系统,这些系统具有有限的内存和处理能力。
      • 高度可定制:LVGL允许开发人员根据项目要求定制GUI元素的外观和行为。
      • 小部件库:它提供了各种预设计的图形小部件,如按钮、标签、滑块、列表等,以简化交互式用户界面的创建。
      • 事件驱动:LVGL是事件驱动的,这意味着它会响应用户输入和其他事件以触发操作或状态更改。
      • 硬件支持:LVGL支持各种显示和输入硬件,包括不同类型的显示器(TFT、OLED等)和输入设备(触摸屏、按钮等)。
      • 积极的社区:LVGL有一个积极而支持性的社区,为其开发提供了资源并提供开发人员帮助。
      • 跨平台:LVGL可以在各种微控制器平台上使用,适用于各种嵌入式系统。
      1. LVGL的开源链接:https://github.com/lvgl

      LVGL移植

      下载源码仓库

      1. lvgl代码下载链接:https://github.com/lvgl/lvgl/archive/refs/tags/v8.1.0.tar.gz
      2. lv_demos代码下载链接:https://github.com/lvgl/lv_demos/archive/refs/tags/v8.1.0.tar.gz
      3. lv_drivers代码卸载链接:https://github.com/lvgl/lv_drivers/archive/refs/tags/v8.1.0.tar.gz
      4. lv_port_linux_frame_buffer代码卸载链接:https://github.com/lvgl/lv_port_linux_frame_buffer.git,通过git clone下载,然后切换到v8.2分支

      将所有代码写在下来之后,代码目录如下:

      源码文件移植

      1. 创建目录:lvgl,用于存放我们工程源码
      2. 将lvgl源码复制进lvgl目录下
      3. 将lv_drivers源码复制进lvgl目录下
      4. 将lv_demos源码复制进lvgl目录下
      5. 从lvgl中复制lv_conf_template.h到lvgl,并重命名为lv_conf.h
      6. 从lv_drivers中复制lv_drv_conf_template.h到lvgl,并重命名为lv_drv_conf.h
      7. 从lv_demo中复制lv_demo_conf_template.h到lvgl,并重命名为lv_demo_conf.h
      8. 从lv_port_linux_frame_buffer中复制main.c和Makefile到lvgl下

      将文件移植完之后,代码目录如下:

      修改配置文件

      • 修改lv_conf.h,此文件为lvgl的配置文件
      1. 使能lv_conf.h头文件,将#if 0修改为#if 1

      1. 根据驱动(可在设备树中查看)选择像素点对应像素格式的大小,否则显示可能乱码

      1. 修改显存大小

      1. 设置Tick定时器配置函数

      1. 查看log,使能LV_USE_LOG,设置打印的log等级并选择打印Log的接口

      1. 测试的样例中用到不同字号的字体,需要使能用到的字体

      • 修改lv_drv_conf.h,此文件为驱动配置文件
      1. 使能修改lv_drv_conf.h头文件,将#if 0修改为#if 1

      1. 使能LCD显示:使能USE_FBDEV,路径设置成/dev/fb0,根据板子LCD的实际情况设置

      1. 使能鼠标或者触摸屏

      • 修改lv_demo_conf.h,此文件为测试用例配置文件
      1. 使能修改lv_demo_conf.h头文件,将#if 0修改为#if 1

      1. 使能LV_USE_DEMO_WIDGETS测试用例

      • 修改main.c文件,此文件为lvgl程序的主程序
      1. 修改lvgl的demos头文件

      1. 修改lvgl显示的分比率,我是采用HDMI屏幕,分辨率为:1920 * 1080

      1. 修改鼠标的配置,我的鼠标的设备节点为:/dev/input/event5

      • 修改Makefile文件,此文件为构建工程脚本
      1. 修改构建工具链路径,需要选择T113-i的交叉工具链,工具链路径为:xxx/T113-i_v1.0/out/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc

      1. 由于工具链不支持编译选项-Wshift-negative-value,直接伤处对应编译选项。

      1. 因为没有鼠标的图标文件,所以把鼠标图标的配置注释掉

      1. 增加测试样例的编译,包含其构建脚本

      LVGL编译验证

      1. 编译,在lvgl工程目录下进行构建,执行make命令

      1. 编译完之后,会在当前目录下生成demo可执行文件

      1. 验证,我们将可执行文件demo拷贝到板子上

      1. 在板子运行LVGL实例

      1. 运行结果:

      总结

      • lvgl在Linux上的移植是比较简单快捷的;只需要修改几个配置文件,即可在目标上运行,对我们部署UI非常方便。
      • lvgl在T113-i上运行整体效果还可以,流畅度整体满意,适合做一些项目的落地。
      • lvgl的是跨平台的,所以写一个应用可以多端部署,避免了重复开发的过程。
      发布在 创龙科技专区
      R
      RiceChen
    • Qt应用开发--国产工业开发板T113-i的部署教程

      Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用,因其跨平台性和丰富的功能而备受青睐。

      Qt能够为工业领域带来什么好处:
      - Qt提供了强大的图形引擎,使开发人员能够创建具有吸引力和高性能的用户界面
      - Qt允许开发人员根据具体需求定制用户界面和功能。这对于满足不同行业和项目的独特需求至关重要,使工业应用能够实现个性化的解决方案
      - Qt提供了丰富的库和工具,涵盖了各种应用程序开发需求,包括图形、网络通信、多媒体处理、数据存储等。这简化了工业应用程序的开发流程
      - Qt可以轻松与各种硬件设备和通信协议集成,这对于工业自动化和控制系统来说非常重要,因为它们需要与各种传感器、执行器和其他工业设备进行通信

      创龙科技基于全志双核Cortex-A7@1.2GHz处理器T113-i,精心设计的全国产工业开发板,它提供了Qt的运行环境,可以让我们快速的部署工业领域的用户交互界面,控制系统等。

      接下来我们来聊聊如何在创龙科技T113-i工业开发板上部署Qt应用。

      开发板Qt运行环境

      开发板SDK准备

      • 创龙科技的资料中提供了开发板的SDK-T113-i_v1.0.tar.gz,需要解压ubuntu中解压出来:
      rice@rice:~$ mkdir t113             //创建t113工作目录,然后将压缩包拷贝到此目录
      rice@rice:~$ cd t113
      ....
      
      rice@rice:~/t113$ tar -zxvf SDK-T113-i_v1.0.tar.gz
      rice@rice:~/t113$ cd T113-i_v1.0/
      rice@rice:~/t113/T113-i_v1.0$ ls
      brandy  buildroot  device  install_tools.sh  out       rtos-dsp  tools
      build   build.sh   kernel  platform          test
      
      • 安装依赖软件,创龙科技提供了安装脚本:install_tools.sh,我们执行该脚本即可完成依赖工具的安装:
      rice@rice:~/t113/T113-i_v1.0$ ./install_tools.sh
      [sudo] password for rice: 
      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      texinfo is already the newest version (6.5.0.dfsg.1-2).
      0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      pkg-config is already the newest version (0.29.1-0ubuntu2).
      0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
      Reading package lists... Done
      
      ......
      
      
      • 解压Buildroot dl--dl.tar.gz,其为 Buildroot dl 目录压缩包,用于存放从官网下载的开源软件包:
      rice@rice:~/t113$ tar -xvf dl.tar.gz -C ~/t113/buildroot/buildroot-201902/
      

      构建Qt固件

      • 在编译固件前,先清理一下SDK的编译和配置生成文件:
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh distclean
      
      • 配置linux内核,处理器型号,显示方式,编译器等信息
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh config
      Welcome to mkscript setup progress
      All available platform:
       0. linux
      Choice [linux]: 0
      All available linux_dev:
       0. bsp
       1. dragonboard
       2. longan
       3. tinyos
      Choice [longan]: 2
      All available kern_ver:
       0. linux-5.4
      Choice [linux-5.4]: 0
      All available ic:
       0. t113
       1. t113_i
      Choice [t113_i]: 1
      All available board:
       0. evb1
       1. evb1_auto
       2. evb1_auto_nand
       3. evb1_auto_nor
       4. tlt113-evm-emmc
       5. tlt113-evm-nand
       6. tlt113-minievm-emmc
       7. tlt113-minievm-nand
      Choice [tlt113-evm-nand]: 5
      All available output_configs:
       0. hdmi
       1. lvds-lcd
       2. mipi-lcd
       3. tft-lcd
       4. cvbs
      Choice [hdmi]: 0
      All available flash:
       0. default
       1. nor
      Choice [default]: 0
      All available build_root:
       0. buildroot-201902
       1. ubuntu
      Choice [buildroot-201902]: 0
      All available gnueabi:
       0. gnueabi
       1. gnueabihf
      Choice [gnueabi]: 0
      
      
      • 设置编译的环境变量:
      rice@rice:~/t113/T113-i_v1.0$ source ./build/envsetup.sh
      
      • 我们采用一键编译 SPL、U-Boot、Linux 内核和 buildroot文件系统。
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh
      ACTION List: mklichee;========
      Execute command: mklichee 
      INFO: ----------------------------------------
      INFO: build lichee ...
      INFO: chip: sun8iw20p1
      INFO: platform: linux
      INFO: kernel: linux-5.4
      INFO: board: tlt113-evm-nand
      INFO: output: /home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan
      INFO: ----------------------------------------
      INFO: build buildroot ...
      Prepare br toolchain gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz...
      make: Entering directory '/home/rice/t113/T113-i_v1.0/buildroot/buildroot-201902'
      
      ...
      
      
      • 编译Qt库,使其开发板固件支持Qt应用运行环境:
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh qt
      ACTION List: mkqt;========
      Execute command: mkqt 
      INFO: build Qt ...
      INFO: build arm-linux-gnueabi version's Qt
      /home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5
      Using built-in specs.
      COLLECT_GCC=gcc
      COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
      OFFLOAD_TARGET_NAMES=nvptx-none
      OFFLOAD_TARGET_DEFAULT=1
      Target: x86_64-linux-gnu
      Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
      Thread model: posix
      
      .....
      
      
      • 打包系统镜像文件,执行之后,可以看到生成的固件文件,它默认生成两个版本的固件,分别是:nand固件和SD卡固件,我们是采用SD卡启动,所以使用SD卡固件。
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh pack
      ACTION List: mkpack ;========
      Execute command: mkpack  
      INFO: packing firmware ...
      INFO: Use BIN_PATH: /home/rice/t113/T113-i_v1.0/device/config/chips/t113_i/bin
      copying tools file
      copying configs file
      copying product configs file
      /home/rice/t113/T113-i_v1.0/out/pack_out/aultls32.fex
      /home/rice/t113/T113-i_v1.0/out/pack_out/aultools.fex
      /home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.cfg
      /home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.fex
      
      ...... 
      
      dsp0.fex Len: 0x3fc78
      Vdsp0.fex Len: 0x4
      BuildImg 0
      Dragon execute image.cfg SUCCESS !
      ----------image is at----------
      
      size:613M  /home/rice/t113/T113-i_v1.0/out/t113_i_linux_tlt113-evm-nand-sdboot_uart0.img
      
      pack finish
      

      运行环境验证

      下载运行实例

      • 将编译打包后的固件(t113_i_linux_tlt113-evm-nand-sdboot_uart0.img)放到windows上,通过工具PhoenixCard.exe烧录到SD卡上。将SD卡插到读卡器上,然后插进电脑:

      • 创龙科技提供了qt的demo,我们将led_control的实例拷贝到板子上:
      rice@rice:~/t113/qt-demos/led_control/bin$ scp led_control root@ip:~/
      

      创龙T113-i上运行实例

      • 关闭默认的Qt运行程序,设置qt的环境变量
      root@T113-Tronlong:~# killall Launcher
      root@T113-Tronlong:~# source /etc/qtenv.sh 
      add /dev/input/event1 to Qt Application.
      find qt5 installed done
      
      • 运行实例验证Qt功能,运行效果如图:
      root@T113-Tronlong:~# ./led_control
      
      

      Qt开发环境

      开发环境下载

      • Qt开发环境下载,作者是使用Qt 5.12.0,下载链接:https://download.qt.io/archive/qt/5.12/5.12.0/,Ubuntu需要下载:qt-opensource-linux-x64-5.12.0.run

      开发环境交叉编译环境配置

      • 配置Debuggers
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Debuggers -> Add -> Browse…"
        • 选择目标平台的GDB,路径:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-gdb

      • 配置交叉工具链
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Compilers -> Add -> GCC -> C++ -> Browse…"
        • 选择目标平台的交叉工具链,路径:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-g++

      • 配置Qt Versions
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Qt Versions -> Add -> GCC -> C++ -> Browse…"
        • 选择目标平台的Qt Versions,路径:/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5/Qt_5.12.5/bin/qmake

      • 配置Kits
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Kits"
        • 将 Name 修改为"T113",Device type 选择"Generic Linux Device",Compiler 的 C++选择"T113-GCC",Debugger 选择"T113-Debugger",Qt version 选择"T113-qt5",点击 Apply,然后点击 OK 完成配置

      开发Qt应用

      • 作者开发了一个快速验证硬件功能的,主要功能包含:
      1. 板载LED灯控制,代码实现:
      static QString ledPath = "/sys/class/leds/user-led0";
      
      void rice::ledInit()
      {
          setLedStatus(0);
      
          ui->ledPushButton->setText("LED OFF");
          ui->ledPushButton->setStyleSheet("border-width:1px;"
                                           "border-style:solid; "
                                           "border-color:white;"
                                           "background-color:rgba(88, 88, 88, 200)");
      }
      
      void rice::ledDeinit()
      {
      
      }
      
      bool rice::setLedStatus(int status)
      {
          QString cmd = "echo " + QString::number(status) + " > " + ledPath + "/brightness";
          if (system(cmd.toStdString().c_str()) == -1) {
              printf("set led status failed!\n");
              return false;
          }
          return true;
      }
      
      int rice::getLedStatus(void)
      {
          QString cmd = "cat " + ledPath + "/brightness";
          FILE *fp = popen(cmd.toStdString().c_str(), "r");
          if (fp == nullptr) {
              return -1;
          }
      
          char led_status[32];
          if (fgets(led_status, sizeof(led_status), fp) == nullptr) {
              printf("fgets error: %s\n", cmd.toStdString().c_str());
              pclose(fp);
              return -1;
          }
      
          pclose(fp);
          return atoi(led_status);
      }
      
      void rice::on_ledPushButton_clicked()
      {
          int ledStatus = getLedStatus();
          if (ledStatus == 0) {
              setLedStatus(1);
              ui->ledPushButton->setText("LED ON");
              ui->ledPushButton->setStyleSheet("border-width:1px;"
                                               "border-style:solid; "
                                               "border-color:white;"
                                               "background-color:rgba(00, 205, 00, 255)");
          }
          else {
              setLedStatus(0);
              ui->ledPushButton->setText("LED OFF");
              ui->ledPushButton->setStyleSheet("border-width:1px;"
                                               "border-style:solid; "
                                               "border-color:white;"
                                               "background-color:rgba(88, 88, 88, 200)");
          }
      }
      
      1. 板载按键检测,代码实现:
      void rice::keyInit()
      {
          keyFd = open(keyPath.toUtf8().data(), O_RDONLY);
          if(keyFd == -1)
          {
              printf("Can not open file(%s)", keyPath.toUtf8().data());
              return;
          }
          ui->keyTextEdit->append("Key Monitor!\n");
          ui->keyTextEdit->append("Key user0 pressed!");
      
          keyNotify = new QSocketNotifier(this->keyFd, QSocketNotifier::Read, this);
          connect(this->keyNotify, SIGNAL(activated(int)), this, SLOT(keyHandler()));
      }
      
      void rice::keyDeinit()
      {
      
      }
      
      void rice::keyHandler()
      {
          struct input_event buf;
      
          if(read(keyFd, &buf, sizeof(struct input_event)) > 0)
          {
              if(buf.code == KEY_PROG1 && buf.value == 1)
              {
                  ui->keyTextEdit->append("Key user0 pressed!");
              }
          }
      }
      
      1. RTC时钟获取并显示,代码实现:
      void rice::dateInit()
      {
          struct rtc_time rtc_tm_temp;
          dateFd = open(datePath.toUtf8().data(), O_RDONLY);
          if(dateFd == -1)
          {
              printf("Can not open file(%s)", keyPath.toUtf8().data());
              return;
          }
          if(ioctl(dateFd, RTC_RD_TIME, &rtc_tm_temp) < 0)
          {
              printf("Get date failed");
              return;
          }
          ui->yearLineEdit->setText(QString::number(rtc_tm_temp.tm_year + 1900));
          ui->monthLineEdit->setText(QString::number(rtc_tm_temp.tm_mon + 1));
          ui->dayLineEdit->setText(QString::number(rtc_tm_temp.tm_mday));
      }
      
      void rice::dateDeint()
      {
      
      }
      
      1. 网络调试助手,代码实现:
      void rice::netInit()
      {
          server = new QTcpServer();
          socket = new QTcpSocket();
      }
      
      void rice::netDeint()
      {
      
      }
      
      void rice::netNewClientConnect()
      {
          socket = server->nextPendingConnection();
          connect(socket, &QTcpSocket::readyRead, this, &rice::netNewRcve);
      }
      
      void rice::on_netPushButton_clicked()
      {
          int port = ui->portLineEdit->text().toInt();
          if(ui->netPushButton->text() == tr("Open"))
          {
              if(ui->typeComboBox->currentText() == tr("Server"))
              {
                  connect(server, &QTcpServer::newConnection, this, &rice::netNewClientConnect);
                  if(!server->listen(QHostAddress::Any, port))
                  {
                      printf("Listen failed\n");
                      return;
                  }
              }
              else if(ui->typeComboBox->currentText() == tr("Client"))
              {
                  QString ip = ui->ipComboBox->currentText();
                  socket->abort();
                  socket->connectToHost(ip, port);
      
                  if(!socket->waitForConnected(3000))
                  {
                      printf("Connect server failed");
                      return;
                  }
                  connect(socket, &QTcpSocket::readyRead, this, &rice::netNewRcve);
              }
              ui->netPushButton->setText("Close");
          }
          else if(ui->netPushButton->text() == tr("Close"))
          {
              if(ui->typeComboBox->currentText() == tr("Server"))
              {
                  socket->abort();
                  server->close();
              }
              else if(ui->typeComboBox->currentText() == tr("Client"))
              {
                  socket->disconnectFromHost();
              }
              ui->netPushButton->setText("Open");
          }
      }
      
      void rice::on_sendPushButton_clicked()
      {
          if(socket->isOpen())
          {
              socket->write(ui->sendLineEdit->text().toUtf8().data());
          }
      }
      
      void rice::netNewRcve()
      {
          ui->recvTextEdit->append(socket->readAll());
      }
      
      void rice::on_typeComboBox_currentIndexChanged(const QString &arg1)
      {
          if(arg1 == tr("Server"))
          {
              ui->ipComboBox->setEditable(false);
          }
          else
          {
              ui->ipComboBox->setEditable(true);
          }
      }
      
      

      Qt应用验证

      1. 板载LED灯控制验证,当点击开关LED按钮时,LED灯会根据状态亮灭:

      1. 当应用运行起来时,会获取RTC时间,并显示:

      1. 当板载按键按下时,窗口会显示按键按下:

      1. 网络调试助手支持TCP客户端和TCP服务器两种类型,下面演示服务器验证。开发板上设置板子的IP,和端口号,然后通过PC上网络调试助手连接上板子,并克实现数据的收发:
      • 客户端往服务器发送数据

      • 服务器往客户端发送数据

      发布在 创龙科技专区
      R
      RiceChen
    • 多核异构工业开发板:创龙科技T113-i

      概述

      本次评测开发板--创龙T113-i工业开发板,这是一款基于全志科技处T113-i理器, 采用双Cortex-A7 + Xuantie C906 RISC-V + HiFi4 DSP,可运行Linux操作系统,外设驱动丰富,网络功能强大,支持1080P@60fps JPEG/MJPEG视频硬件编码,以及4K@30fps H.265、4K@24fps H.264视频硬件解码。

      创龙T113-i开发板开箱

      • 创龙T113-i的包装非常精致,包装盒上醒目的印有创龙科技的LOGO,内部缓冲棉结构设计很充足,充分保护了内部设备免受运输途中的损害。

      • T113-i开发板和LVDS显示屏都是用静电袋进行包装,可以防止人体静电导致设备损坏。

      • 创龙T113-i提供了丰富配件,多种总线线材
        • 12V 2A的电源适配器,用于T113-i主板供电 x1
        • USB-A公口转TYPE-C公口,用于链接板子的Debug串口 x1
        • 天线,用于WIFI模块的信号接收与发送 x1
        • USB读卡,用于刷SD卡固件 x1
        • DB9公对公,USB-A转DB9,用于连接主板的232接口 x1
        • 1根6类千兆直连网线,长度约1米,用来连接有线网口 x1

      创龙T113-i开发板主体

      创龙T113-i工业开发板采用核心板+底板的组合方式,核心板采用邮票孔封装, 背面使用了4个橡胶柱支撑,可有效的防止主板和桌面触碰,以防静电导致主板损坏。

      创龙T113-i工业开发板提供了一个10.4村的LVDS触摸显示屏,显示器它有三组线,分别为:LVDS LCD线材,显示器触摸线材,显示器背光线材

      创龙T113-i开发板硬件资源

      创龙T113-i提供了丰富的硬件资源,地板硬件资源清单如下:

      创龙T113-i开发板配套资料

      开发板配套的资料非常齐全,主要包括:开箱必读、技术服务、用户手册、软硬件资料、开发参考资料等。

      • 开箱必读:核心板的规格书,底板的规格书,扩展模块的规格书等。
      • 技术服务:技术服务说明,售后服务手册,产品返修单。
      • 用户手册:Linux开发环境搭建、评估板测试手册、开发实例等
      • 软件资料:开发板demo,linux系统资料(设备树、文件系统、FSBL、内核、U-boot源码),烧录工具等。
      • 硬件资料:评估底板原理图和PCB源文件、评估板的硬件说明书、芯片的数据手册、Xilinx官方手册等
      • 参考资料:视频教程,数据手册,全志官方参考文档等。
      发布在 创龙科技专区
      R
      RiceChen

    RiceChen 发布的最新帖子

    • LVGL案例分享--手把手教你移植到T113-i国产工业开发板

      市面上有许多嵌入式GUI库可供选择,包括开源GUI库和闭源GUI库,开源GUI库:LVGL,EmWin等;闭源GUI库:TouchGFX,柿饼GUI等。

      本篇文章主要描述如何将LVGL8.1移植到创龙科技的T113-i的开发板上。

      LVGL

      1. LVGL,全名“Littlev Graphics Library”,是一个开源的图形库,主要用于在嵌入式系统上创建图形用户界面(GUI)。它是用C语言编写的,旨在高效和可定制,因此在各种微控制器平台和显示硬件上开发用户界面时备受欢迎。

      2. LVGL的特性

      • 轻量级:LVGL旨在轻量且高效,适用于资源受限的嵌入式系统,这些系统具有有限的内存和处理能力。
      • 高度可定制:LVGL允许开发人员根据项目要求定制GUI元素的外观和行为。
      • 小部件库:它提供了各种预设计的图形小部件,如按钮、标签、滑块、列表等,以简化交互式用户界面的创建。
      • 事件驱动:LVGL是事件驱动的,这意味着它会响应用户输入和其他事件以触发操作或状态更改。
      • 硬件支持:LVGL支持各种显示和输入硬件,包括不同类型的显示器(TFT、OLED等)和输入设备(触摸屏、按钮等)。
      • 积极的社区:LVGL有一个积极而支持性的社区,为其开发提供了资源并提供开发人员帮助。
      • 跨平台:LVGL可以在各种微控制器平台上使用,适用于各种嵌入式系统。
      1. LVGL的开源链接:https://github.com/lvgl

      LVGL移植

      下载源码仓库

      1. lvgl代码下载链接:https://github.com/lvgl/lvgl/archive/refs/tags/v8.1.0.tar.gz
      2. lv_demos代码下载链接:https://github.com/lvgl/lv_demos/archive/refs/tags/v8.1.0.tar.gz
      3. lv_drivers代码卸载链接:https://github.com/lvgl/lv_drivers/archive/refs/tags/v8.1.0.tar.gz
      4. lv_port_linux_frame_buffer代码卸载链接:https://github.com/lvgl/lv_port_linux_frame_buffer.git,通过git clone下载,然后切换到v8.2分支

      将所有代码写在下来之后,代码目录如下:

      源码文件移植

      1. 创建目录:lvgl,用于存放我们工程源码
      2. 将lvgl源码复制进lvgl目录下
      3. 将lv_drivers源码复制进lvgl目录下
      4. 将lv_demos源码复制进lvgl目录下
      5. 从lvgl中复制lv_conf_template.h到lvgl,并重命名为lv_conf.h
      6. 从lv_drivers中复制lv_drv_conf_template.h到lvgl,并重命名为lv_drv_conf.h
      7. 从lv_demo中复制lv_demo_conf_template.h到lvgl,并重命名为lv_demo_conf.h
      8. 从lv_port_linux_frame_buffer中复制main.c和Makefile到lvgl下

      将文件移植完之后,代码目录如下:

      修改配置文件

      • 修改lv_conf.h,此文件为lvgl的配置文件
      1. 使能lv_conf.h头文件,将#if 0修改为#if 1

      1. 根据驱动(可在设备树中查看)选择像素点对应像素格式的大小,否则显示可能乱码

      1. 修改显存大小

      1. 设置Tick定时器配置函数

      1. 查看log,使能LV_USE_LOG,设置打印的log等级并选择打印Log的接口

      1. 测试的样例中用到不同字号的字体,需要使能用到的字体

      • 修改lv_drv_conf.h,此文件为驱动配置文件
      1. 使能修改lv_drv_conf.h头文件,将#if 0修改为#if 1

      1. 使能LCD显示:使能USE_FBDEV,路径设置成/dev/fb0,根据板子LCD的实际情况设置

      1. 使能鼠标或者触摸屏

      • 修改lv_demo_conf.h,此文件为测试用例配置文件
      1. 使能修改lv_demo_conf.h头文件,将#if 0修改为#if 1

      1. 使能LV_USE_DEMO_WIDGETS测试用例

      • 修改main.c文件,此文件为lvgl程序的主程序
      1. 修改lvgl的demos头文件

      1. 修改lvgl显示的分比率,我是采用HDMI屏幕,分辨率为:1920 * 1080

      1. 修改鼠标的配置,我的鼠标的设备节点为:/dev/input/event5

      • 修改Makefile文件,此文件为构建工程脚本
      1. 修改构建工具链路径,需要选择T113-i的交叉工具链,工具链路径为:xxx/T113-i_v1.0/out/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc

      1. 由于工具链不支持编译选项-Wshift-negative-value,直接伤处对应编译选项。

      1. 因为没有鼠标的图标文件,所以把鼠标图标的配置注释掉

      1. 增加测试样例的编译,包含其构建脚本

      LVGL编译验证

      1. 编译,在lvgl工程目录下进行构建,执行make命令

      1. 编译完之后,会在当前目录下生成demo可执行文件

      1. 验证,我们将可执行文件demo拷贝到板子上

      1. 在板子运行LVGL实例

      1. 运行结果:

      总结

      • lvgl在Linux上的移植是比较简单快捷的;只需要修改几个配置文件,即可在目标上运行,对我们部署UI非常方便。
      • lvgl在T113-i上运行整体效果还可以,流畅度整体满意,适合做一些项目的落地。
      • lvgl的是跨平台的,所以写一个应用可以多端部署,避免了重复开发的过程。
      发布在 创龙科技专区
      R
      RiceChen
    • Qt应用开发--国产工业开发板T113-i的部署教程

      Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用,因其跨平台性和丰富的功能而备受青睐。

      Qt能够为工业领域带来什么好处:
      - Qt提供了强大的图形引擎,使开发人员能够创建具有吸引力和高性能的用户界面
      - Qt允许开发人员根据具体需求定制用户界面和功能。这对于满足不同行业和项目的独特需求至关重要,使工业应用能够实现个性化的解决方案
      - Qt提供了丰富的库和工具,涵盖了各种应用程序开发需求,包括图形、网络通信、多媒体处理、数据存储等。这简化了工业应用程序的开发流程
      - Qt可以轻松与各种硬件设备和通信协议集成,这对于工业自动化和控制系统来说非常重要,因为它们需要与各种传感器、执行器和其他工业设备进行通信

      创龙科技基于全志双核Cortex-A7@1.2GHz处理器T113-i,精心设计的全国产工业开发板,它提供了Qt的运行环境,可以让我们快速的部署工业领域的用户交互界面,控制系统等。

      接下来我们来聊聊如何在创龙科技T113-i工业开发板上部署Qt应用。

      开发板Qt运行环境

      开发板SDK准备

      • 创龙科技的资料中提供了开发板的SDK-T113-i_v1.0.tar.gz,需要解压ubuntu中解压出来:
      rice@rice:~$ mkdir t113             //创建t113工作目录,然后将压缩包拷贝到此目录
      rice@rice:~$ cd t113
      ....
      
      rice@rice:~/t113$ tar -zxvf SDK-T113-i_v1.0.tar.gz
      rice@rice:~/t113$ cd T113-i_v1.0/
      rice@rice:~/t113/T113-i_v1.0$ ls
      brandy  buildroot  device  install_tools.sh  out       rtos-dsp  tools
      build   build.sh   kernel  platform          test
      
      • 安装依赖软件,创龙科技提供了安装脚本:install_tools.sh,我们执行该脚本即可完成依赖工具的安装:
      rice@rice:~/t113/T113-i_v1.0$ ./install_tools.sh
      [sudo] password for rice: 
      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      texinfo is already the newest version (6.5.0.dfsg.1-2).
      0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
      Reading package lists... Done
      Building dependency tree       
      Reading state information... Done
      pkg-config is already the newest version (0.29.1-0ubuntu2).
      0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
      Reading package lists... Done
      
      ......
      
      
      • 解压Buildroot dl--dl.tar.gz,其为 Buildroot dl 目录压缩包,用于存放从官网下载的开源软件包:
      rice@rice:~/t113$ tar -xvf dl.tar.gz -C ~/t113/buildroot/buildroot-201902/
      

      构建Qt固件

      • 在编译固件前,先清理一下SDK的编译和配置生成文件:
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh distclean
      
      • 配置linux内核,处理器型号,显示方式,编译器等信息
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh config
      Welcome to mkscript setup progress
      All available platform:
       0. linux
      Choice [linux]: 0
      All available linux_dev:
       0. bsp
       1. dragonboard
       2. longan
       3. tinyos
      Choice [longan]: 2
      All available kern_ver:
       0. linux-5.4
      Choice [linux-5.4]: 0
      All available ic:
       0. t113
       1. t113_i
      Choice [t113_i]: 1
      All available board:
       0. evb1
       1. evb1_auto
       2. evb1_auto_nand
       3. evb1_auto_nor
       4. tlt113-evm-emmc
       5. tlt113-evm-nand
       6. tlt113-minievm-emmc
       7. tlt113-minievm-nand
      Choice [tlt113-evm-nand]: 5
      All available output_configs:
       0. hdmi
       1. lvds-lcd
       2. mipi-lcd
       3. tft-lcd
       4. cvbs
      Choice [hdmi]: 0
      All available flash:
       0. default
       1. nor
      Choice [default]: 0
      All available build_root:
       0. buildroot-201902
       1. ubuntu
      Choice [buildroot-201902]: 0
      All available gnueabi:
       0. gnueabi
       1. gnueabihf
      Choice [gnueabi]: 0
      
      
      • 设置编译的环境变量:
      rice@rice:~/t113/T113-i_v1.0$ source ./build/envsetup.sh
      
      • 我们采用一键编译 SPL、U-Boot、Linux 内核和 buildroot文件系统。
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh
      ACTION List: mklichee;========
      Execute command: mklichee 
      INFO: ----------------------------------------
      INFO: build lichee ...
      INFO: chip: sun8iw20p1
      INFO: platform: linux
      INFO: kernel: linux-5.4
      INFO: board: tlt113-evm-nand
      INFO: output: /home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan
      INFO: ----------------------------------------
      INFO: build buildroot ...
      Prepare br toolchain gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz...
      make: Entering directory '/home/rice/t113/T113-i_v1.0/buildroot/buildroot-201902'
      
      ...
      
      
      • 编译Qt库,使其开发板固件支持Qt应用运行环境:
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh qt
      ACTION List: mkqt;========
      Execute command: mkqt 
      INFO: build Qt ...
      INFO: build arm-linux-gnueabi version's Qt
      /home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5
      Using built-in specs.
      COLLECT_GCC=gcc
      COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
      OFFLOAD_TARGET_NAMES=nvptx-none
      OFFLOAD_TARGET_DEFAULT=1
      Target: x86_64-linux-gnu
      Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
      Thread model: posix
      
      .....
      
      
      • 打包系统镜像文件,执行之后,可以看到生成的固件文件,它默认生成两个版本的固件,分别是:nand固件和SD卡固件,我们是采用SD卡启动,所以使用SD卡固件。
      rice@rice:~/t113/T113-i_v1.0$ ./build.sh pack
      ACTION List: mkpack ;========
      Execute command: mkpack  
      INFO: packing firmware ...
      INFO: Use BIN_PATH: /home/rice/t113/T113-i_v1.0/device/config/chips/t113_i/bin
      copying tools file
      copying configs file
      copying product configs file
      /home/rice/t113/T113-i_v1.0/out/pack_out/aultls32.fex
      /home/rice/t113/T113-i_v1.0/out/pack_out/aultools.fex
      /home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.cfg
      /home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.fex
      
      ...... 
      
      dsp0.fex Len: 0x3fc78
      Vdsp0.fex Len: 0x4
      BuildImg 0
      Dragon execute image.cfg SUCCESS !
      ----------image is at----------
      
      size:613M  /home/rice/t113/T113-i_v1.0/out/t113_i_linux_tlt113-evm-nand-sdboot_uart0.img
      
      pack finish
      

      运行环境验证

      下载运行实例

      • 将编译打包后的固件(t113_i_linux_tlt113-evm-nand-sdboot_uart0.img)放到windows上,通过工具PhoenixCard.exe烧录到SD卡上。将SD卡插到读卡器上,然后插进电脑:

      • 创龙科技提供了qt的demo,我们将led_control的实例拷贝到板子上:
      rice@rice:~/t113/qt-demos/led_control/bin$ scp led_control root@ip:~/
      

      创龙T113-i上运行实例

      • 关闭默认的Qt运行程序,设置qt的环境变量
      root@T113-Tronlong:~# killall Launcher
      root@T113-Tronlong:~# source /etc/qtenv.sh 
      add /dev/input/event1 to Qt Application.
      find qt5 installed done
      
      • 运行实例验证Qt功能,运行效果如图:
      root@T113-Tronlong:~# ./led_control
      
      

      Qt开发环境

      开发环境下载

      • Qt开发环境下载,作者是使用Qt 5.12.0,下载链接:https://download.qt.io/archive/qt/5.12/5.12.0/,Ubuntu需要下载:qt-opensource-linux-x64-5.12.0.run

      开发环境交叉编译环境配置

      • 配置Debuggers
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Debuggers -> Add -> Browse…"
        • 选择目标平台的GDB,路径:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-gdb

      • 配置交叉工具链
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Compilers -> Add -> GCC -> C++ -> Browse…"
        • 选择目标平台的交叉工具链,路径:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-g++

      • 配置Qt Versions
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Qt Versions -> Add -> GCC -> C++ -> Browse…"
        • 选择目标平台的Qt Versions,路径:/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5/Qt_5.12.5/bin/qmake

      • 配置Kits
        • 点击菜单栏"Tools -> Options"
        • 击"Kits -> Kits"
        • 将 Name 修改为"T113",Device type 选择"Generic Linux Device",Compiler 的 C++选择"T113-GCC",Debugger 选择"T113-Debugger",Qt version 选择"T113-qt5",点击 Apply,然后点击 OK 完成配置

      开发Qt应用

      • 作者开发了一个快速验证硬件功能的,主要功能包含:
      1. 板载LED灯控制,代码实现:
      static QString ledPath = "/sys/class/leds/user-led0";
      
      void rice::ledInit()
      {
          setLedStatus(0);
      
          ui->ledPushButton->setText("LED OFF");
          ui->ledPushButton->setStyleSheet("border-width:1px;"
                                           "border-style:solid; "
                                           "border-color:white;"
                                           "background-color:rgba(88, 88, 88, 200)");
      }
      
      void rice::ledDeinit()
      {
      
      }
      
      bool rice::setLedStatus(int status)
      {
          QString cmd = "echo " + QString::number(status) + " > " + ledPath + "/brightness";
          if (system(cmd.toStdString().c_str()) == -1) {
              printf("set led status failed!\n");
              return false;
          }
          return true;
      }
      
      int rice::getLedStatus(void)
      {
          QString cmd = "cat " + ledPath + "/brightness";
          FILE *fp = popen(cmd.toStdString().c_str(), "r");
          if (fp == nullptr) {
              return -1;
          }
      
          char led_status[32];
          if (fgets(led_status, sizeof(led_status), fp) == nullptr) {
              printf("fgets error: %s\n", cmd.toStdString().c_str());
              pclose(fp);
              return -1;
          }
      
          pclose(fp);
          return atoi(led_status);
      }
      
      void rice::on_ledPushButton_clicked()
      {
          int ledStatus = getLedStatus();
          if (ledStatus == 0) {
              setLedStatus(1);
              ui->ledPushButton->setText("LED ON");
              ui->ledPushButton->setStyleSheet("border-width:1px;"
                                               "border-style:solid; "
                                               "border-color:white;"
                                               "background-color:rgba(00, 205, 00, 255)");
          }
          else {
              setLedStatus(0);
              ui->ledPushButton->setText("LED OFF");
              ui->ledPushButton->setStyleSheet("border-width:1px;"
                                               "border-style:solid; "
                                               "border-color:white;"
                                               "background-color:rgba(88, 88, 88, 200)");
          }
      }
      
      1. 板载按键检测,代码实现:
      void rice::keyInit()
      {
          keyFd = open(keyPath.toUtf8().data(), O_RDONLY);
          if(keyFd == -1)
          {
              printf("Can not open file(%s)", keyPath.toUtf8().data());
              return;
          }
          ui->keyTextEdit->append("Key Monitor!\n");
          ui->keyTextEdit->append("Key user0 pressed!");
      
          keyNotify = new QSocketNotifier(this->keyFd, QSocketNotifier::Read, this);
          connect(this->keyNotify, SIGNAL(activated(int)), this, SLOT(keyHandler()));
      }
      
      void rice::keyDeinit()
      {
      
      }
      
      void rice::keyHandler()
      {
          struct input_event buf;
      
          if(read(keyFd, &buf, sizeof(struct input_event)) > 0)
          {
              if(buf.code == KEY_PROG1 && buf.value == 1)
              {
                  ui->keyTextEdit->append("Key user0 pressed!");
              }
          }
      }
      
      1. RTC时钟获取并显示,代码实现:
      void rice::dateInit()
      {
          struct rtc_time rtc_tm_temp;
          dateFd = open(datePath.toUtf8().data(), O_RDONLY);
          if(dateFd == -1)
          {
              printf("Can not open file(%s)", keyPath.toUtf8().data());
              return;
          }
          if(ioctl(dateFd, RTC_RD_TIME, &rtc_tm_temp) < 0)
          {
              printf("Get date failed");
              return;
          }
          ui->yearLineEdit->setText(QString::number(rtc_tm_temp.tm_year + 1900));
          ui->monthLineEdit->setText(QString::number(rtc_tm_temp.tm_mon + 1));
          ui->dayLineEdit->setText(QString::number(rtc_tm_temp.tm_mday));
      }
      
      void rice::dateDeint()
      {
      
      }
      
      1. 网络调试助手,代码实现:
      void rice::netInit()
      {
          server = new QTcpServer();
          socket = new QTcpSocket();
      }
      
      void rice::netDeint()
      {
      
      }
      
      void rice::netNewClientConnect()
      {
          socket = server->nextPendingConnection();
          connect(socket, &QTcpSocket::readyRead, this, &rice::netNewRcve);
      }
      
      void rice::on_netPushButton_clicked()
      {
          int port = ui->portLineEdit->text().toInt();
          if(ui->netPushButton->text() == tr("Open"))
          {
              if(ui->typeComboBox->currentText() == tr("Server"))
              {
                  connect(server, &QTcpServer::newConnection, this, &rice::netNewClientConnect);
                  if(!server->listen(QHostAddress::Any, port))
                  {
                      printf("Listen failed\n");
                      return;
                  }
              }
              else if(ui->typeComboBox->currentText() == tr("Client"))
              {
                  QString ip = ui->ipComboBox->currentText();
                  socket->abort();
                  socket->connectToHost(ip, port);
      
                  if(!socket->waitForConnected(3000))
                  {
                      printf("Connect server failed");
                      return;
                  }
                  connect(socket, &QTcpSocket::readyRead, this, &rice::netNewRcve);
              }
              ui->netPushButton->setText("Close");
          }
          else if(ui->netPushButton->text() == tr("Close"))
          {
              if(ui->typeComboBox->currentText() == tr("Server"))
              {
                  socket->abort();
                  server->close();
              }
              else if(ui->typeComboBox->currentText() == tr("Client"))
              {
                  socket->disconnectFromHost();
              }
              ui->netPushButton->setText("Open");
          }
      }
      
      void rice::on_sendPushButton_clicked()
      {
          if(socket->isOpen())
          {
              socket->write(ui->sendLineEdit->text().toUtf8().data());
          }
      }
      
      void rice::netNewRcve()
      {
          ui->recvTextEdit->append(socket->readAll());
      }
      
      void rice::on_typeComboBox_currentIndexChanged(const QString &arg1)
      {
          if(arg1 == tr("Server"))
          {
              ui->ipComboBox->setEditable(false);
          }
          else
          {
              ui->ipComboBox->setEditable(true);
          }
      }
      
      

      Qt应用验证

      1. 板载LED灯控制验证,当点击开关LED按钮时,LED灯会根据状态亮灭:

      1. 当应用运行起来时,会获取RTC时间,并显示:

      1. 当板载按键按下时,窗口会显示按键按下:

      1. 网络调试助手支持TCP客户端和TCP服务器两种类型,下面演示服务器验证。开发板上设置板子的IP,和端口号,然后通过PC上网络调试助手连接上板子,并克实现数据的收发:
      • 客户端往服务器发送数据

      • 服务器往客户端发送数据

      发布在 创龙科技专区
      R
      RiceChen
    • 多核异构工业开发板:创龙科技T113-i

      概述

      本次评测开发板--创龙T113-i工业开发板,这是一款基于全志科技处T113-i理器, 采用双Cortex-A7 + Xuantie C906 RISC-V + HiFi4 DSP,可运行Linux操作系统,外设驱动丰富,网络功能强大,支持1080P@60fps JPEG/MJPEG视频硬件编码,以及4K@30fps H.265、4K@24fps H.264视频硬件解码。

      创龙T113-i开发板开箱

      • 创龙T113-i的包装非常精致,包装盒上醒目的印有创龙科技的LOGO,内部缓冲棉结构设计很充足,充分保护了内部设备免受运输途中的损害。

      • T113-i开发板和LVDS显示屏都是用静电袋进行包装,可以防止人体静电导致设备损坏。

      • 创龙T113-i提供了丰富配件,多种总线线材
        • 12V 2A的电源适配器,用于T113-i主板供电 x1
        • USB-A公口转TYPE-C公口,用于链接板子的Debug串口 x1
        • 天线,用于WIFI模块的信号接收与发送 x1
        • USB读卡,用于刷SD卡固件 x1
        • DB9公对公,USB-A转DB9,用于连接主板的232接口 x1
        • 1根6类千兆直连网线,长度约1米,用来连接有线网口 x1

      创龙T113-i开发板主体

      创龙T113-i工业开发板采用核心板+底板的组合方式,核心板采用邮票孔封装, 背面使用了4个橡胶柱支撑,可有效的防止主板和桌面触碰,以防静电导致主板损坏。

      创龙T113-i工业开发板提供了一个10.4村的LVDS触摸显示屏,显示器它有三组线,分别为:LVDS LCD线材,显示器触摸线材,显示器背光线材

      创龙T113-i开发板硬件资源

      创龙T113-i提供了丰富的硬件资源,地板硬件资源清单如下:

      创龙T113-i开发板配套资料

      开发板配套的资料非常齐全,主要包括:开箱必读、技术服务、用户手册、软硬件资料、开发参考资料等。

      • 开箱必读:核心板的规格书,底板的规格书,扩展模块的规格书等。
      • 技术服务:技术服务说明,售后服务手册,产品返修单。
      • 用户手册:Linux开发环境搭建、评估板测试手册、开发实例等
      • 软件资料:开发板demo,linux系统资料(设备树、文件系统、FSBL、内核、U-boot源码),烧录工具等。
      • 硬件资料:评估底板原理图和PCB源文件、评估板的硬件说明书、芯片的数据手册、Xilinx官方手册等
      • 参考资料:视频教程,数据手册,全志官方参考文档等。
      发布在 创龙科技专区
      R
      RiceChen
    • glibc工具链构建应用

      buildroot构建,应用交叉编译

      1. 为啥要写交叉编译呢?是因为全志提供的文档中描述的OpenWRT的构建方式,而我采用的buildroot进行构建。他们两者采用的交叉工具链是不一样的。其中:OpenWRT采用musl工具链,而buildroot采用的glibc工具链。

      2. 为了避免其他人采用buildroot也按照文档进行操作,导致应用编译完无法运行起来。所以我补充一下buildroot构建中,应用的交叉编译。

      3. 编写HelloWorld:

      #include <stdio.h>
      
      int main(void)
      {
         printf("Hello World!");
         return 0;
      }
      
      
      1. V853的编译工具链的路径:prebuilt/rootfsbuilt/arm/。里面包含了两个工具链:musl和glibc,而buildroot采用了glic。
      2. 所以gcc编译器的路径:prebuilt/rootfsbuilt/arm/toolchain-sunxi-glibc-gcc-830/toolchain/bin/。而编译是需要用到的库文件和头文件路径:prebuilt/rootfsbuilt/arm/toolchain-sunxi-glibc-gcc-830/toolchain/arm-openwrt-linux-gnueabi/
      3. 指定存放交叉编译需要使用的库文件头文件的文件夹
      v853@v853:~/$ export STAGING_DIR=~/v853/tina-v853/prebuilt/rootfsbuilt/arm/toolchain-sunxi-glibc-gcc-830/toolchain/arm-openwrt-linux-gnueabi/
      
      1. 编译应用程序:
      v853@v853:~/$ export STAGING_DIR=~/v853/tina-v853/prebuilt/rootfsbuilt/arm/toolchain-sunxi-glibc-gcc-830/toolchain/bin/arm-openwrt-linux-gcc -o helloworld main.c
      v853@v853:~/$ ls
      helloworld main.c
      v853@v853:~/$
      
      1. 我是采用挂载SD卡的形式将应用程序拷贝到板子的。所以将编译好的应用程序helloworld拷贝到SD卡。
      2. 板子上验证结果:
      // 挂载SD卡到test目录上
      # mount /dev/mmcblk1 /mnt/test/
      // 运行应用
      # ./helloworld
      Hello World!# 
      
      发布在 V Series
      R
      RiceChen
    • 回复: 【入门必看】全志V853开发板——构建编译与固件烧篇

      @dream 好的构建方式提供出来,没有为什么

      发布在 V Series
      R
      RiceChen
    • 回复: 【入门必看】全志V853开发板——构建编译与固件烧篇

      @aozima 在研究中RV第一次弄

      发布在 V Series
      R
      RiceChen
    • 【入门必看】全志V853开发板——构建编译与固件烧篇

      全志V853-高性能边缘AI视觉处理芯片

      V853 是一颗面向智能视觉领域推出的新一代高性能、低功耗的处理器SOC,可广泛用于智能门锁、智能考勤门禁、网络摄像头、行车记录仪、智能台灯等智能化升级相关行业。
      V853 集成Arm Cortex-A7和RISC-V E907 双CPU,内置最大 1T 算力 NPU,使用全志自研 Smart 视频引擎,最大支持5M@25fps H.265编码和5M@25fps H.264编解码,同时集成高性能 ISP 图像处理器,可为客户提供专业级图像质量。V853 还支持 16-bit DDR3/DDR3L,满足各类产品高带宽需求;支持 4lane MIPI-CSI/DVP/MIPI-DSI/RGB 等丰富的专用视频输入输出接口,满足各类AI视觉产品需求;采用先进的22nm工艺,具有更优的功耗和更小的芯片面积。

      全志V853开发板介绍

      1. 很荣幸能第一手拿到全志V853的开发板。接下来开始介绍介绍这款开发板。
      2. 全志V853开发板规格参数:
      类型 说明
      主控 全志V853 (Arm A7 1GHz + RISC-V E907 600MHz + 1T NPU)
      DDR 512MB DDR3
      Memory 8GB eMMC
      无线网络 2.4G WiFi/BT(型号:全志XR829模组)
      有线网络 100Mbps以太网
      摄像头 1080P双目摄像头
      屏幕 7寸 LCD屏幕
      麦克风 模拟麦克风 *2
      DEBUG 支持uart串口调试,支持ADB USB调试
      USB Type-C USB * 1, 同时支持供电和数据传输
      PMU 全志AXP2101
      1. 全志V853系统配置:官方支持Tina Linux 5.0系统,基于Linux4.9内核和uboot-2018。其中:
      • Tina Linux 是全志科技基于Linux内核开发的针对智能硬件类产品的嵌入式软件系统。
      • Tina Linux v5.0 中包含 Linux 系统开发用到的 boot 源码、内核源码、驱动、工具、系统中间件与应用程序包。可以方便的定制、编译、打包生成Linux固件镜像。
      • Tina Linux v5.0 可以支持构建 openWrt 和 buildroot 不同构建系统;也支持单独编译 BSP(Board Support Package,板级支持包);能够打包生成固件包,烧录到相应设备中并运行。
      1. 全志V853开发板的硬件外设

      全志V853开发板初体验

      1. 拿到开发板,我没有立马去编译构建代码,而是进入板子内部的默认系统,看看外设适配的怎么样。V853的开发板提供了两个调试串口(分别为:A7调试串口(UART0),E907 RV调试串口(UART3))。我分别连接了对应的串口,A7调试串口的接口可以输出启动信息,但是无法输入命令。E907 RV调试串口的接口没有任何任何日志,怀疑里面没有任何代码。

      2. 虽然A7调试串口的接口无法输入命令行,但是A7的调试提供了ADB Shell调试。

      • 全志ADB工具下载:https://www.aw-ol.com/downloads?cat=5。
      • 下载解压后,把ADB工作目录添加到环境变量中:右键 ”此电脑“,属性,找到高级系统设置,点击环境变量,xxx用户的环境变量,Path,新增一个环境变量。

      1. 环境设置完毕,既可以在CMD终端中输入adb shell

      GPIO点灯测试

      • 学习一门编程语言,首先要学会在终端输出“Hello world”。学习一个开发板,首先要学会如何点亮一颗LED灯。开发板的指示灯接在PH11引脚上。所以GPIO编号为:7 * 32 + 11 = 235。所以我们可以直接操作GPIO235。实际板子的GPIO编号已经被导出了。
      root@TinaLinux:/# cd /sys/class/gpio/gpio235
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235# ls
      active_low  direction   power       uevent
      device      edge        subsystem   value
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235# echo 0 > value
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235# echo 1 > value
      root@TinaLinux:/sys/devices/platform/soc/pio/gpiochip0/gpio/gpio235#
      

      WIFI测试

      • V853开发板使用WIFI模组是自家的--XR829,它是Wi-Fi & BT。WIFI部分采用SDIO总线与V853通信。
      • Tina提供一套简易方便的WIFI测试套件,通过wifi命令可以设置WIFI的工作模式,扫描网络,连接网络等等。以WIFI的STA模式测试:
      root@TinaLinux:/# wifi -o sta
      root@TinaLinux:/# wifi -c Rice 12345678
      root@TinaLinux:/# ifconfig
      lo        Link encap:Local Loopback
                inet addr:127.0.0.1  Mask:255.0.0.0
                inet6 addr: ::1/128 Scope:Host
                UP LOOPBACK RUNNING  MTU:65536  Metric:1
                RX packets:0 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      
      wlan0     Link encap:Ethernet  HWaddr 4C:34:1E:9A:F1:B0
                inet addr:192.168.137.37  Bcast:192.168.137.255  Mask:255.255.255.0
                inet6 addr: fe80::4e34:1eff:fe9a:f1b0/64 Scope:Link
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:4 errors:0 dropped:0 overruns:0 frame:0
                TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:970 (970.0 B)  TX bytes:1730 (1.6 KiB)
      
      root@TinaLinux:/# ping baidu.com
      PING baidu.com (220.181.38.148): 56 data bytes
      64 bytes from 220.181.38.148: seq=0 ttl=50 time=48.033 ms
      64 bytes from 220.181.38.148: seq=1 ttl=50 time=55.773 ms
      64 bytes from 220.181.38.148: seq=2 ttl=50 time=55.524 ms
      64 bytes from 220.181.38.148: seq=3 ttl=50 time=50.839 ms
      ^C
      --- baidu.com ping statistics ---
      4 packets transmitted, 4 packets received, 0% packet loss
      round-trip min/avg/max = 48.033/52.542/55.773 ms
      root@TinaLinux:/#
      

      LCD测试

      • V853开发板配套7寸LCD屏幕,并配备电容式触摸。
      • 花屏测试:
      root@TinaLinux:/# cat /dev/urandom > /dev/fb0
      

      • 彩色条纹测试:
      root@TinaLinux:/# echo 1 > /sys/class/disp/disp/attr/colorbar
      

      编译环境搭建

      1. 使用的开发环境是:VMware + ubuntu18.04
      2. ubuntu安装完毕,只需要几条命令就可以把编译环境搭建完成。
      // 更新软件列表
      
      v853@v853:~/v853$ sudo apt-get update
      
      // 安装各种工具及软件包
      v853@v853:~/v853$ sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc++6 libstdc++6 -y
      
      // 设置git用户信息
      v853@v853:~/v853$ git config --global user.email "980307037@qq.com"
      v853@v853:~/v853$ git config --global user.name "RiceChen"
      

      V853工程构建

      1. 首先源码下载需要在全志客户服务平台。如果没有注册需要先注册在登陆。链接:https://open.allwinnertech.com/#/login?cas=true
      2. 将开发环境的钥匙对添加到全志客户服务平台。
      • 生成钥匙对:
      v853@v853:~/v853$ ssh-keygen -t rsa
      
      • 导出公钥, 将导出公钥进行复制:
      v853@v853:~/v853$ cat ~/.ssh/id_rsa.pub
      
      • 公钥粘贴到全志客户服务平台:

      1. 安装repo引导脚本
      • 下载repo引导脚本:
      v853@v853:~/v853$ git clone ssh://RiceChen@sdk.allwinnertech.com/git_repo/repo.git
      
      • 修改repo脚本的username:
      REPO_URL='ssh://username@sdk.allwinnertech.com/git_repo/repo.git'
      改为
      REPO_URL='ssh://RiceChen@sdk.allwinnertech.com/git_repo/repo.git'
      
      • 添加repo引导脚本到环境中:
      v853@v853:~/v853$ sudo cp repo/repo /usr/bin/repo
      v853@v853:~/v853$ sudo chmod 777 /usr/bin/repo
      // 测试是否添加成功
      v853@v853:~/v853$ repo help
      
      1. 下载SDK
      • 创建SDK存放文件夹,并进入文件夹
      v853@v853:~/v853$ mkdir tina-v853
      v853@v853:~/v853$ cd tina-v853
      
      • 初始化repo仓库:
      v853@v853:~/v853/tina-v853$ repo init -u ssh://RiceChen@sdk.allwinnertech.com/git_repo/V853Tina_Open/manifest.git -b master -m tina-v853-open.xml
      
      • 同步仓库代码,并创建分支:
      v853@v853:~/v853/tina-v853$ repo sync
      v853@v853:~/v853/tina-v853$ repo start product-v853 --all
      
      1. 构建v853工程
      • 构建工程前,需要安装mkimage:
      sudo apt-get install u-boot-tools
      
      • 配置编译模式:
      v853@v853:~/v853/tina-v853$ ./build.sh config
      ========ACTION List: mk_config ;========
      options :
      All available platform:
         0. android
         1. linux
      Choice [linux]: 1
      All available linux_dev:
         0. bsp
         1. buildroot
         2. tinyos
         3. openwrt
      Choice [openwrt]: 1
      All available ic:
         0. v853
      Choice [t113]: 0
      All available board:
         0. vision
      Choice [vision]: 0
      All available flash:
         0. default
         1. nor
      Choice [default]: 0
      
      • 编译固件,然后
      v853@v853:~/v853/tina-v853$ ./build.sh
      
      ...
      [GPU]: No GPU type is configured in /home/v853/v853/tina-v853/kernel/linux-4.9/.config.
      regenerate rootfs cpio
      16149 blocks
      16150 blocks
      build_ramfs
      Copy boot.img to output directory ...
      Copy modules to target ...
      ./scripts/build.sh
      
      sun8iw21p1 compile Kernel successful
      
      
      INFO: ----------------------------------------
      INFO: build Tina OK.
      INFO: ----------------------------------------
      v853@v853:~/v853/tina-v853$ 
      
      • 打包固件:
      v853@v853:~/v853/tina-v853$ ./build.sh pack
      
      ...
      FileLength=7d7000Add partion rootfs.fex ROOTFS_FEX000000
      Add partion very rootfs.fex ROOTFS_FEX000000
      FilePath: rootfs.fex
      FileLength=338ac00BuildImg 0
      Dragon execute image.cfg SUCCESS !
      ----------image is at----------
      
      72M	/home/v853/v853/tina-v853/out/v853/vision/buildroot/v853_linux_vision_uart0.img
      
      pack finish
      v853@v853:~/v853/tina-v853$ 
      

      烧录验证

      1. 下载全志USB驱动,链接:https://www.aw-ol.com/downloads/resources/15。解压并点击batch脚本安装即可。

      1. 下载固件烧写工具PhoenixSuit,链接:https://www.aw-ol.com/downloads/resources/13。
      • 解压并打开可执行程序:PhoenixSuit.exe。

      • 选择固件,并选择立即升级。然后按住开发的uboot和reset按键,先松开reset按键。就可以看到进度条的变化。

      1. 下载完成。串口终端便可以输出:

      <br/>关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

      发布在 V Series
      R
      RiceChen
    • 【XR806开发板试用】XR806与鸿蒙,简化构建环境流程

      前言

      • 很荣幸再次获得评测开发板的机会,这次活动依旧是ARM中国举办的活动。
      • 这次评测的开发板--全志XR806开发板+搭载Open鸿蒙1.0操作系统。这是完美的国产化。中国牛逼。。。。
      • 第一次接触鸿蒙是一年前,最开始接触是适配了RT-Thread内核进Open鸿蒙1.0中作为第三方内核。不过这个没有公布,只是玩玩。
      • 第二次接触是在5个月前,参与小熊派社区适配Open鸿蒙的Lite-A到STM32MP157,当时主要负责构建系统部分,以及1~2个驱动的适配。
      • 评测XR806算是我第三次接触Open鸿蒙, XR608内核采用Lite-M。在XR608的交流群中,我发现大家已久吐槽最多的就是整个构建流程,环境搭建TM的痛苦。所以写这篇文章的目的就是简化整个环境搭建流程。

      环境搭建

      安装ubuntu

      1. 建议采用ubuntu 18.04版本,这样子掉坑会比较少。
      2. 新安装的ubuntu可能存在与windows电脑之间无法复制粘贴问题,解决方案,如下命令:
      rice@rice:~$ sudo apt-get autoremove open-vm-tools
      rice@rice:~$ sudo apt-get install open-vm-tools-desktop
      

      安装git

      1. 在调试终端输出如下命令:
      rice@rice:~$ sudo apt-get install git
      ...
      rice@rice:~$ git config --global user.email "you@example.com"
      rice@rice:~$ git config --global user.name "Your Name"
      

      安装python3.8

      1. 在调试终端输出如下命令:
      rice@rice:~$ sudo apt-get install python3.8
      rice@rice:~$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
      rice@rice:~$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
      
      1. 在接下来的操作如果出现如下错误,请执行下面命令:
      • 错误码如下:
      Traceback (most recent call last):
        File "/usr/lib/command-not-found", line 28, in <module>
          from CommandNotFound import CommandNotFound
        File "/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py", line 19, in <module>
          from CommandNotFound.db.db import SqliteDatabase
        File "/usr/lib/python3/dist-packages/CommandNotFound/db/db.py", line 5, in <module>
          import apt_pkg
      ModuleNotFoundError: No module named 'apt_pkg'
      
      • 错误纠正命令:
      sudo cp apt_pkg.cpython-36m-x86_64-linux-gnu.so apt_pkg.so
      

      安装docker

      1. 在调试终端输出如下命令:
      rice@rice:~/xr806$ sudo apt install docker.io
      

      环境搭建完成

      xr806工程搭建

      创建xr806

      1. 在调试终端输出如下命令:
      rice@rice:~$ mkdir xr806
      rice@rice:~$ cd xr806
      

      下载的repo文件

      1. 下载的repo文件,在调试终端输出如下命令:
      rice@rice:~/xr806$ git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
      
      1. 修改git-repo下载到的repo文件REPO_URL地址(https://mirrors.ustc.edu.cn/aosp/git-repo),操作如下所示:
      • 在调试终端输出如下命令:
      rice@rice:~/xr806$ vim git-repo/repo
      
      • 修改位置如下图:

      1. 拷贝repo文件到/usr/bin/,便可以执行repo命令,在调试终端输出如下命令:
      rice@rice:~/xr806/$ sudo cp git-repo/repo /usr/bin/
      

      下载系统源码

      1. 创建目录,在调试终端输出如下命令:
      rice@rice:~/xr806$ mkdir code
      rice@rice:~/xr806$ cd code
      
      1. 通过repo,从gitee仓库中获取鸿蒙系统分支源码,在调试终端输出如下命令:
      rice@rice:~/xr806/code$ repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify
      rice@rice:~/xr806/code$ repo sync -c
      rice@rice:~/xr806/code$ repo forall -c 'git lfs pull'
      

      下载xr806源码

      1. 下载device源码,在调试终端输出如下命令:
      rice@rice:~/xr806/code$ cd device/
      rice@rice:~/xr806/code/device$ git clone https://gitee.com/moldy-potato-chips/devboard_device_allwinner_xr806.git
      rice@rice:~/xr806/code/device$ mv devboard_device_allwinner_xr806/ xradio
      
      1. 下载vendor源码,在调试终端输出如下命令:
      rice@rice:~/xr806/code/device$ cd ../
      rice@rice:~/xr806/code$ cd vendor/
      rice@rice:~/xr806/code/vendor$ git clone https://gitee.com/moldy-potato-chips/devboard_vendor_allwinner_xr806.git
      rice@rice:~/xr806/code/vendor$ mv devboard_vendor_allwinner_xr806/ xradio
      

      交叉编译工具

      1. 下载交叉编译工具,在调试终端输出如下命令:
      rice@rice:~/xr806$ mkdir tool
      rice@rice:~/xr806$ cd tool
      rice@rice:~/xr806/tool$ wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/10-2020q4/gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
      rice@rice:~/xr806/tool$ tar -jxvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2
      

      下载Open鸿蒙的适配好的docker

      1. 下载docker,在调试终端输出如下命令:
      rice@rice:~/xr806$ docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5
      
      1. 进入docker,在调试终端输出如下命令:
      rice@rice:~/xr806$ sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:0.0.5
      

      修改交叉编译工具

      1. 修改device/xradio/xr806/liteos_m/config.gni中的board_toolchain_prefix为实际环境下的gcc路径(/home/openharmony/tool/gcc-arm-none-eabi-10-2020-q4-major/bin)。操作如下:
      root@c2aa13139a52:/home/openharmony# cd code/device/xradio/xr806/liteos_m
      root@c2aa13139a52:/home/openharmony/code/device/xradio/xr806/liteos_m# vim config.gni
      

      1. 修改device/xradio/xr806/xr_skylark/gcc.mk,操作如下:
      root@c2aa13139a52:/home/openharmony# cd code/device/xradio/xr806/xr_skylark
      

      SDK配置

      1. 在修改完交叉编译工具路径后 ,在xr_skylark目录下执行,复制配置文件:
      root@c2aa13139a52:/home/openharmony/code/device/xradio/xr806/xr_skylark# make menuconfig
      
      1. 如果出现如下错误,输入如下命令:
      • 错误码:

      • 错误解决, 然后重新输入上面命令:
      root@c2aa13139a52:/home/openharmony/code/device/xradio/xr806/xr_skylark# apt-get install libncurses5-dev
      
      • 结果:

      1. 清除过程文件
      make build_clean
      
      1. 生成静态库已经自动生成头文件
      make lib -j
      
      1. 成功结果如图:

      系统源码编译

      1. 回到xr806系统源码目录:
      root@c2aa13139a52:/home/openharmony/code#  
      
      1. 输入hb set 选择skylark:

      1. 输入hb build -f 编译:

      1. 生成的镜像文件xr_system.img

      烧录代码

      1. 生成的镜像位于device/xradio/xr806/xr_skylark/out。将整个out的镜像拷贝到windows下。
      2. 拷贝烧录工具(phoenixMC)到windows,位置:device\xradio\xr806\xr_skylark\tools,并打开工具:
      • 第一步:选择镜像。
      • 第二部:选择对应的串口

      1. 修改烧录配置项,勾选“硬件复位烧写模式”:

      1. 点击升级固件,然后等待烧录到100%,便完成整个流程。

      运行效果

      1. 将板子接上串口软件,波特率选择115200,然后可以到对应的启动打印:

      <br/>关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

      发布在 Wireless & Analog Series
      R
      RiceChen