Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页
    1. Home
    2. yanmingjian
    Y
    • Profile
    • Following 0
    • Followers 0
    • my integral 1187
    • Topics 13
    • Posts 19
    • Best 1
    • Groups 0

    giaoLV 5

    @yanmingjian

    1187
    integral
    1
    Reputation
    24
    Profile views
    19
    Posts
    0
    Followers
    0
    Following
    Joined Last Online
    Location 直布罗陀

    yanmingjian Unfollow Follow

    Best posts made by yanmingjian

    • 2022年7月版——在“哪吒”上跑AI 全志D1 ncnn框架移植笔记

      ncnn框架是当前边缘计算的主流框架,关于全志D1运行ncnn框架的笔记,nihui大佬曾经于2021年发表了相关的帖子。但是目前工具链和ncnn版本有所变化,因此在大佬的基础上将,完整过程记录如下。

      相关链接:
      1.https://bbs.aw-ol.com/topic/705/
      2.https://zhuanlan.zhihu.com/p/386312071?utm_source=qq&utm_medium=social&utm_oi=872955404320141312

      1 准备交叉编译工具链

      目前使用的交叉工具链是v2.2.6版本,具体下载链接见:https://occ.t-head.cn/community/download?id=4046947553902661632

      下载这个文件:Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz

      tar -xf Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz
      export RISCV_ROOT_PATH=/home/{你的用户名}/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6
      

      2 下载和编译ncnn

      这边的toolchain file选用c906-v226.toolchain.cmake,其余的不用修改,在toolchain file里面都已经改好了。其中可能有路径问题,根据ncnn文件夹,实际所在的路径修改即可。

      git clone https://github.com/Tencent/ncnn.git
      cd ncnn
      mkdir build-c906
      cd build-c906
      cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906-v226.toolchain.cmake -DCMAKE_BUILD_TYPE=release -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON ..
      make -j4
      

      3 测试benchncnn

      目前2.0版本的TinaLinux 执行 ncnn 程序已经不会有问题

      将 ncnn/build-c906/benchmark/benchncnn 和 ncnn/benchmark/*.param 拷贝到 d1开发板上,路径结构如下:

      80abd156fc86ba2c318912d87e220577.png

      chmod 0777 benchncnn 
      ./benchncnn 4 1 0 -1 0
      
      oot@TinaLinux:~/ncnn# ./benchncnn 4 1 0 -1 0
      syscall error -1
      loop_count = 4
      num_threads = 1
      powersave = 0
      gpu_device = -1
      cooling_down = 0
      fopen squeezenet.param failed
      network graph not ready
      Segmentation fault
      root@TinaLinux:~/ncnn# ./benchncnn 4 1 0 -1 0
      syscall error -1
      loop_count = 4
      num_threads = 1
      powersave = 0
      gpu_device = -1
      cooling_down = 0
                squeezenet  min =  382.77  max =  385.92  avg =  384.66
           squeezenet_int8  min = 8975.18  max = 8979.84  avg = 8977.72
                 mobilenet  min =  702.76  max =  704.76  avg =  703.74
            mobilenet_int8  min = 29501.19  max = 29546.07  avg = 29514.59
              mobilenet_v2  min =  451.34  max =  452.27  avg =  451.78
              mobilenet_v3  min =  358.12  max =  359.24  avg =  358.42
                shufflenet  min =  527.04  max =  528.48  avg =  527.69
             shufflenet_v2  min =  310.96  max =  312.30  avg =  311.59
                   mnasnet  min =  435.13  max =  437.02  avg =  435.94
           proxylessnasnet  min =  473.05  max =  476.37  avg =  475.19
           efficientnet_b0  min =  601.75  max =  610.41  avg =  606.18
         efficientnetv2_b0  min =  859.37  max =  861.75  avg =  860.67
              regnety_400m  min =  653.71  max =  654.24  avg =  653.88
                 blazeface  min =  154.08  max =  154.67  avg =  154.38
                 googlenet  min = 1404.80  max = 1409.50  avg = 1407.33
            googlenet_int8  min = 42586.56  max = 42608.04  avg = 42597.36
                  resnet18  min = 1047.81  max = 1050.59  avg = 1049.40
             resnet18_int8  min = 45011.41  max = 45185.10  avg = 45098.12
                   alexnet  min =  955.34  max =  956.98  avg =  956.06
                     vgg16  min = 5355.40  max = 5356.05  avg = 5355.75
      

      如果一切运行正常,则会出现上述信息。

      4 测试example

      将 ncnn/build-c906/examples/nanodet 和测试图片拷贝到 d1开发板上

      从这里下载 nanodet 模型文件并拷贝到 d1开发板上

      nihui/ncnn-assets​github.com/nihui/ncnn-assets/tree/master/models

      目录结构如下:

      35b2dd1eb5e8a25b37f92325da1c0b16.png

      注意,进过测试,jpg格式的图像读取时会报错,png格式没有问题

      ./nanodet test.png
      

      bd0e8ab3ee50032c1a82e873a5aa8576.png
      177b58a5b1e4b24788974154c648b8b8.png

      posted in D1-H/D1s
      Y
      giao

    Latest posts made by yanmingjian

    • 【全志T113-S3_100ask】2-编写第一个驱动

      (1)开发环境

      windows开发环境:VsCode
      linux 开发环境:Ubuntu 18.04 环境参考

      1、指定交叉编译

      在buildroot 目录下发现两个 arm-linux-gnueabi-gcc

      root@znh-ubuntu:/disk/buildroot-100ask_t113-pro/buildroot# find ./* -name "*gnueabi-gcc"
      ./output/host/opt/ext-toolchain/bin/arm-linux-gnueabi-gcc
      ./output/host/bin/arm-linux-gnueabi-gcc
      

      但 ./output/host/bin/arm-linux-gnueabi-gcc 是链接过去的

      c7a46f0a61d24d149466e43da584b784.png

      ./output/host/opt/ext-toolchain/bin/arm-linux-gnueabi-gcc 是原始的

      f577b95a46d9419dbbb2dc632ba6c0f1.png

      在这里我使用链接后的gcc
      加载环境变量:

      export PATH=$PATH:/disk/buildroot-100ask_t113-pro/buildroot/output/host/bin
      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnueabi-
      
      root@znh-ubuntu:~# export PATH=$PATH:/disk/buildroot-100ask_t113-pro/buildroot/output/host/bin
      root@znh-ubuntu:~# export ARCH=arm
      root@znh-ubuntu:~# export CROSS_COMPILE=arm-linux-gnueabi-
      root@znh-ubuntu:~#
      root@znh-ubuntu:~# arm-linux-gnueabi-gcc -v
      使用内建 specs。
      COLLECT_GCC=arm-linux-gnueabi-gcc
      COLLECT_LTO_WRAPPER=/disk/t113GitHub/eLinuxCore_100ask-t113-pro/toolchain/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin/../libexec/gcc/arm-linux-gnueabi/7.2.1/lto-wrapper
      目标:arm-linux-gnueabi
      配置为:'/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/snapshots/gcc.git~linaro-7.2-2017.11/configure' SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=soft --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --enable-gnu-indirect-function --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/_build/sysroots/arm-linux-gnueabi --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabi/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabi --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/builder_arch/amd64/label/tcwg-x86_64-build/target/arm-linux-gnueabi/_build/builds/destdir/x86_64-unknown-linux-gnu
      线程模型:posix
      gcc 版本 7.2.1 20171011 (Linaro GCC 7.2-2017.11)
      

      不想每次否加载可以写在自启动脚本

      vim ~/.bashrc
      

      f71d9f87bd1542bdb05759c4ee985910.png

      ##(2)编写驱动

      1、编写 helloword驱动 hello_drv.c

      #include <linux/module.h>
      
      #include <linux/fs.h>
      #include <linux/errno.h>
      #include <linux/miscdevice.h>
      #include <linux/kernel.h>
      #include <linux/major.h>
      #include <linux/mutex.h>
      #include <linux/proc_fs.h>
      #include <linux/seq_file.h>
      #include <linux/stat.h>
      #include <linux/init.h>
      #include <linux/device.h>
      #include <linux/tty.h>
      #include <linux/kmod.h>
      #include <linux/gfp.h>
      
      /* 1. 确定主设备号                                                                 */
      static int major = 0;
      static char kernel_buf[1024];
      static struct class *hello_class;
      
      
      #define MIN(a, b) (a < b ? a : b)
      
      /* 3. 实现对应的open/read/write等函数,填入file_operations结构体                   */
      static ssize_t hello_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset)
      {
      	int err;
      	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      	err = copy_to_user(buf, kernel_buf, MIN(1024, size));
      	return MIN(1024, size);
      }
      
      static ssize_t hello_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset)
      {
      	int err;
      	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      	err = copy_from_user(kernel_buf, buf, MIN(1024, size));
      	return MIN(1024, size);
      }
      
      static int hello_drv_open (struct inode *node, struct file *file)
      {
      	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      	return 0;
      }
      
      static int hello_drv_close (struct inode *node, struct file *file)
      {
      	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      	return 0;
      }
      
      /* 2. 定义自己的file_operations结构体                                              */
      static struct file_operations hello_drv = {
      	.owner	 = THIS_MODULE,
      	.open    = hello_drv_open,
      	.read    = hello_drv_read,
      	.write   = hello_drv_write,
      	.release = hello_drv_close,
      };
      
      /* 4. 把file_operations结构体告诉内核:注册驱动程序                                */
      /* 5. 谁来注册驱动程序啊?得有一个入口函数:安装驱动程序时,就会去调用这个入口函数 */
      static int __init hello_init(void)
      {
      	int err;
      	
      	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      	major = register_chrdev(0, "hello", &hello_drv);  /* /dev/hello */
      
      
      	hello_class = class_create(THIS_MODULE, "hello_class");
      	err = PTR_ERR(hello_class);
      	if (IS_ERR(hello_class)) {
      		printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      		unregister_chrdev(major, "hello");
      		return -1;
      	}
      	
      	device_create(hello_class, NULL, MKDEV(major, 0), NULL, "hello"); /* /dev/hello */
      	
      	return 0;
      }
      
      /* 6. 有入口函数就应该有出口函数:卸载驱动程序时,就会去调用这个出口函数           */
      static void __exit hello_exit(void)
      {
      	printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
      	device_destroy(hello_class, MKDEV(major, 0));
      	class_destroy(hello_class);
      	unregister_chrdev(major, "hello");
      }
      
      
      /* 7. 其他完善:提供设备信息,自动创建设备节点                                     */
      
      module_init(hello_init);
      module_exit(hello_exit);
      
      MODULE_LICENSE("GPL");
      

      2、编写测试驱动文件 hello_drv_test.c

      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <unistd.h>
      #include <stdio.h>
      #include <string.h>
      
      /*
       * ./hello_drv_test -w abc
       * ./hello_drv_test -r
       */
      int main(int argc, char **argv)
      {
      	int fd;
      	char buf[1024];
      	int len;
      	
      	/* 1. 判断参数 */
      	if (argc < 2) 
      	{
      		printf("Usage: %s -w <string>\n", argv[0]);
      		printf("       %s -r\n", argv[0]);
      		return -1;
      	}
      
      	/* 2. 打开文件 */
      	fd = open("/dev/hello", O_RDWR);
      	if (fd == -1)
      	{
      		printf("can not open file /dev/hello\n");
      		return -1;
      	}
      
      	/* 3. 写文件或读文件 */
      	if ((0 == strcmp(argv[1], "-w")) && (argc == 3))
      	{
      		len = strlen(argv[2]) + 1;
      		len = len < 1024 ? len : 1024;
      		write(fd, argv[2], len);
      	}
      	else
      	{
      		len = read(fd, buf, 1024);		
      		buf[1023] = '\0';
      		printf("APP read : %s\n", buf);
      	}
      	
      	close(fd);
      	
      	return 0;
      }
      

      3、编写Makefile

      # 1. 使用不同的开发板内核时, 一定要修改KERN_DIR
      # 2. KERN_DIR中的内核要事先配置、编译, 为了能编译内核, 要先设置下列环境变量:
      # 2.1 ARCH,          比如: export ARCH=arm64
      # 2.2 CROSS_COMPILE, 比如: export CROSS_COMPILE=aarch64-linux-gnu-
      # 2.3 PATH,          比如: export PATH=$PATH:/home/book/100ask_roc-rk3399-pc/ToolChain-6.3.1/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin 
      # 注意: 不同的开发板不同的编译器上述3个环境变量不一定相同,
      #       请参考各开发板的高级用户使用手册
      
      KERN_DIR = /disk/buildroot-100ask_t113-pro/buildroot/output/build/linux-d96275805a67d54998123d36e59108cb1ed52ad5
      
      all:
      	make -C $(KERN_DIR) M=`pwd` modules 
      	$(CROSS_COMPILE)gcc -o hello_drv_test hello_drv_test.c 
      
      clean:
      	make -C $(KERN_DIR) M=`pwd` modules clean
      	rm -rf modules.order
      	rm -f hello_drv_test
      
      obj-m	+= hello_drv.o
      

      关于 KERN_DIR ,本环境使用的是 buildroot ,通过GitHub把kernel下载下来的,源码在./buildroot-100ask_t113-pro/buildroot/dl/linux/git 下,但是该源码未经过编译,而上一节已经编译过 buildroot 生成镜像img了,那就是已经编译过了,但是指定该目录编译不了

      82c44d9bc6af4be29e232d1fe8f53cd3.png

      真正的编译目录在
      ./buildroot-100ask_t113-pro/buildroot/output/build/linux-d96275805a67d54998123d36e59108cb1ed52ad5
      (我不确实后面的字母数字是不是每个人一样)

      f98a38e3af8544d090c968382aa25756.png

      (3)测试

      将生成的 hello_drv.ko、hello_drv_test 放到开发板上
      在这里使用 tftp 下载。(TFTP的搭建参考:链接)
      但第一次使用系统没有连接网络(现在已经插入网线)

      # 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:6 errors:0 dropped:0 overruns:0 frame:0
                TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:603 (603.0 B)  TX bytes:603 (603.0 B)
      

      1、使用udhcpc 自动联网

      # udhcpc
      udhcpc: started, v1.35.0
      [ 3538.458305] libphy: 4500000.eth: probed
      [ 3538.462913] sunxi-gmac 4500000.eth eth0: eth0: Type(7) PHY ID 001cc816 at 0 IRQ poll (4500000.eth-0:00)
      udhcpc: broadcasting discover
      [ 3541.673890] sunxi-gmac 4500000.eth eth0: Link is Up - 100Mbps/Full - flow control off
      [ 3541.682714] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
      udhcpc: broadcasting discover
      udhcpc: broadcasting select for 192.168.3.45, server 192.168.3.1
      udhcpc: lease of 192.168.3.45 obtained from 192.168.3.1, lease time 604800
      deleting routers
      adding dns 192.168.3.1
      

      2、通过 tftp 下载资源

      # tftp -g -r hello_drv.ko 192.168.3.44
      # tftp -g -r hello_drv_test 192.168.3.44
      #
      # ls
      hello_drv.ko    hello_drv_test
      

      3、测试驱动

      (1)加载驱动

      #  insmod hello_drv.ko
      [ 3860.564181] hello_drv: loading out-of-tree module taints kernel.
      [ 3860.571552] /disk/vsCode/01_hello/hello_drv.c hello_init line 70
      
      
      
      (2)查看驱动是否加载
      # ls /dev/hello*
      /dev/hello
      # lsmod
      Module                  Size  Used by    Tainted: G
      hello_drv              16384  0
      
      (3)添加权限
      # chmod 777 ./hello_drv_test
      
      
      (4)向驱动写入数据
      # ./hello_drv_test  -w abc
      [ 3906.061995] /disk/vsCode/01_hello/hello_drv.c hello_drv_open line 45
      [ 3906.069274] /disk/vsCode/01_hello/hello_drv.c hello_drv_write line 38
      [ 3906.076579] /disk/vsCode/01_hello/hello_drv.c hello_drv_close line 51
      
      (5)读取驱动数据
      # ./hello_drv_test  -r
      [ 3913.268282] /disk/vsCode/01_hello/hello_drv.c hello_drv_open line 45
      [ 3913.275535] /disk/vsCode/01_hello/hello_drv.c hello_drv_read line 30
      APP read : abc
      [ 3913.283024] /disk/vsCode/01_hello/hello_drv.c hello_drv_close line 51
      
      (6)卸载驱动
      # rmmod hello_drv
      [ 4304.419170] /disk/vsCode/01_hello/hello_drv.c hello_exit line 90
      # lsmod
      Module                  Size  Used by    Tainted: G
      sunxi_ce               57344  0
      
      

      原文链接:https://blog.csdn.net/qq_46079439/article/details/125897482

      posted in 全志方案讨论区
      Y
      giao
    • 【全志T113-S3_100ask】1-编译buildroot初体验

      (1)100ask_T113-PRO 简介

      接触了一块新的开发板:

      硬件资源配置如下:

      cd21cf0fd30140fda46960e847e4b3d8.png DFA578CD-CDD9-4869-88D3-B9BF65BF3EF3.png

      GitHub地址:
      https://github.com/DongshanPI/buildroot_100ask_t113-pro

      (2)开发环境

      • 开发板 :淘宝
      • 镜像:Ubuntu 18.04 (官方推荐)
      • SD卡:8G以上 (烧写工具:Win32DiskImager.exe)
      • 为更好地开发,建议安装以下linux环境:

      sudo apt-get install -y sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc wget python cvs git mercurial rsync subversion android-tools-mkbootimg vim libssl-dev android-tools-fastboot

      sudo apt-get -y 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 libncurses-dev u-boot-tools

      root@znh-ubuntu:~# sudo apt-get install -y  sed make binutils build-essential  gcc g++ bash patch gzip bzip2 perl  tar cpio unzip rsync file  bc wget python  cvs git mercurial rsync  subversion android-tools-mkbootimg vim  libssl-dev  android-tools-fastboot
      正在读取软件包列表... 完成
      正在分析软件包的依赖关系树
      正在读取状态信息... 完成
      bc 已经是最新版 (1.07.1-2)。
      build-essential 已经是最新版 (12.4ubuntu1)。
      make 已经是最新版 (4.1-9.1ubuntu1)。
      python 已经是最新版 (2.7.15~rc1-1)。
      sed 已经是最新版 (4.4-2)。
      cvs 已经是最新版 (2:1.12.13+real-26)。
      bash 已经是最新版 (4.4.18-2ubuntu1.3)。
      binutils 已经是最新版 (2.30-21ubuntu1~18.04.7)。
      bzip2 已经是最新版 (1.0.6-8.1ubuntu0.2)。
      cpio 已经是最新版 (2.12+dfsg-6ubuntu0.18.04.4)。
      file 已经是最新版 (1:5.32-2ubuntu0.4)。
      g++ 已经是最新版 (4:7.4.0-1ubuntu2.3)。
      gcc 已经是最新版 (4:7.4.0-1ubuntu2.3)。
      git 已经是最新版 (1:2.17.1-1ubuntu0.12)。
      gzip 已经是最新版 (1.6-5ubuntu1.2)。
      libssl-dev 已经是最新版 (1.1.1-1ubuntu2.1~18.04.20)。
      patch 已经是最新版 (2.7.6-2ubuntu1.1)。
      perl 已经是最新版 (5.26.1-6ubuntu0.5)。
      rsync 已经是最新版 (3.1.2-2.1ubuntu1.4)。
      tar 已经是最新版 (1.29b-2ubuntu0.3)。
      unzip 已经是最新版 (6.0-21ubuntu1.1)。
      vim 已经是最新版 (2:8.0.1453-1ubuntu1.8)。
      wget 已经是最新版 (1.19.4-1ubuntu2.2)。
      android-tools-fastboot 已经是最新版 (1:8.1.0+r23-5~18.04)。
      android-tools-mkbootimg 已经是最新版 (1:8.1.0+r23-5~18.04)。
      mercurial 已经是最新版 (4.5.3-1ubuntu2.2)。
      subversion 已经是最新版 (1.9.7-4ubuntu1.1)。
      升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 6 个软件包未被升级。
      
      root@znh-ubuntu:~# sudo apt-get -y 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 libncurses-dev   u-boot-tools
      正在读取软件包列表... 完成
      正在分析软件包的依赖关系树
      正在读取状态信息... 完成
      注意,选中 'git' 而非 'git-core'
      注意,选中 'libncurses5-dev' 而非 'libncurses-dev'
      build-essential 已经是最新版 (12.4ubuntu1)。
      bzr 已经是最新版 (2.7.0+bzr6622-10)。
      flex 已经是最新版 (2.6.4-6)。
      gawk 已经是最新版 (1:4.1.4+dfsg-1build1)。
      libxml-parser-perl 已经是最新版 (2.44-2build3)。
      cvs 已经是最新版 (2:1.12.13+real-26)。
      quilt 已经是最新版 (0.63-8.2)。
      git 已经是最新版 (1:2.17.1-1ubuntu0.12)。
      lib32stdc++6 已经是最新版 (8.4.0-1ubuntu1~18.04)。
      lib32z1 已经是最新版 (1:1.2.11.dfsg-0ubuntu2.1)。
      lib32z1-dev 已经是最新版 (1:1.2.11.dfsg-0ubuntu2.1)。
      libncurses5-dev 已经是最新版 (6.1-1ubuntu1.18.04)。
      libssl-dev 已经是最新版 (1.1.1-1ubuntu2.1~18.04.20)。
      libstdc++6 已经是最新版 (8.4.0-1ubuntu1~18.04)。
      u-boot-tools 已经是最新版 (2020.10+dfsg-1ubuntu0~18.04.2)。
      unzip 已经是最新版 (6.0-21ubuntu1.1)。
      xsltproc 已经是最新版 (1.1.29-5ubuntu0.2)。
      zlib1g-dev 已经是最新版 (1:1.2.11.dfsg-0ubuntu2.1)。
      ecj 已经是最新版 (3.16.0-1~18.04)。
      mercurial 已经是最新版 (4.5.3-1ubuntu2.2)。
      subversion 已经是最新版 (1.9.7-4ubuntu1.1)。
      升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 6 个软件包未被升级。
      root@znh-ubuntu:~#
      
      • SDK源码(以下为官方教程)2022-7-20:
        默认源码都存放在github仓库内,请使用如下命令获取
      book@100ask:~$ git clone  https://github.com/DongshanPI/buildroot-100ask_t113-pro
      book@100ask:~$ cd buildroot-100ask_t113-pro/
      book@100ask:~/buildroot-100ask_t113-pro$ git submodule update --init --recursive
      book@100ask:~/buildroot-100ask_t113-pro$ git submodule update --recursive --remote
      book@100ask:~/buildroot-100ask_t113-pro$ cd  buildroot/
      book@100ask:~/buildroot-100ask_t113-pro/buildroot$ git submodule update --init --recursive
      

      对于国内无法访问github的同学,可以使用国内备用gitee站点, 如下命令。

      book@100ask:~$ git clone  https://gitee.com/weidongshan/buildroot-100ask_t113-pro
      book@100ask:~$ cd buildroot-100ask_t113-pro/
      book@100ask:~/buildroot-100ask_t113-pro$ git submodule update --init --recursive
      book@100ask:~/buildroot-100ask_t113-pro$ git submodule update --recursive --remote
      book@100ask:~/buildroot-100ask_t113-pro$ cd  buildroot/
      book@100ask:~/buildroot-100ask_t113-pro/buildroot$ git submodule update --init --recursive
      

      (3)最小系统编译烧写

      1、sdcard

      1.1 编译sdcard 最小系统镜像

      book@100ask:~/buildroot-100ask_t113-pro/buildroot$ make  BR2_EXTERNAL="../br2t113pro ../br2lvgl "  100ask_t113-pro_sdcard_core_defconfig
      book@100ask:~/buildroot-100ask_t113-pro/buildroot$ make  V=1
      

      编译完成:

      Creating regular file /disk/buildroot-100ask_t113-pro/buildroot/output/images/rootfs.ext2
      64-bit filesystem support is not enabled.  The larger fields afforded by this feature enable full-strength checksumming.  Pass -O 64bit to rectify.
      Creating filesystem with 262144 1k blocks and 65536 inodes
      Filesystem UUID: 2227dcad-9607-4996-8d36-e5870d09c83f
      Superblock backups stored on blocks:
              8193, 24577, 40961, 57345, 73729, 204801, 221185
      
      Allocating group tables: done
      Writing inode tables: done
      Creating journal (8192 blocks): done
      Copying files into the device: done
      Writing superblocks and filesystem accounting information: done
      
      rm -rf /disk/buildroot-100ask_t113-pro/buildroot/output/build/buildroot-fs/ext2/target
      ln -sf rootfs.ext2 /disk/buildroot-100ask_t113-pro/buildroot/output/images/rootfs.ext4
      ln -snf /disk/buildroot-100ask_t113-pro/buildroot/output/host/arm-buildroot-linux-gnueabi/sysroot /disk/buildroot-100ask_t113-pro/buildroot/output/staging
      mkdir -p /disk/buildroot-100ask_t113-pro/buildroot/output/images
      >>>   Executing post-image script support/scripts/genimage.sh
      INFO: cmd: "mkdir -p "/disk/buildroot-100ask_t113-pro/buildroot/output/build/genimage.tmp"" (stderr):
      INFO: cmd: "rm -rf "/disk/buildroot-100ask_t113-pro/buildroot/output/build/genimage.tmp"/*" (stderr):
      INFO: cmd: "mkdir -p "/disk/buildroot-100ask_t113-pro/buildroot/output/build/genimage.tmp"" (stderr):
      INFO: cmd: "cp -a "/tmp/tmp.TzeMUTGJbs" "/disk/buildroot-100ask_t113-pro/buildroot/output/build/genimage.tmp/root"" (stderr):
      INFO: cmd: "find '/disk/buildroot-100ask_t113-pro/buildroot/output/build/genimage.tmp/root' -depth -type d -printf '%P\0' | xargs -0 -I {} touch -r '/tmp/tmp.                      TzeMUTGJbs/{}' '/disk/buildroot-100ask_t113-pro/buildroot/output/build/genimage.tmp/root/{}'" (stderr):
      INFO: cmd: "mkdir -p "/disk/buildroot-100ask_t113-pro/buildroot/output/images"" (stderr):
      INFO: vfat(boot.vfat): cmd: "dd if=/dev/zero of="/disk/buildroot-100ask_t113-pro/buildroot/output/images/boot.vfat" seek=33554432 count=0 bs=1 2>/dev/null" (s                      tderr):
      INFO: vfat(boot.vfat): cmd: "mkdosfs   '/disk/buildroot-100ask_t113-pro/buildroot/output/images/boot.vfat'" (stderr):
      INFO: vfat(boot.vfat): adding file 'boot.img' as 'boot.img' ...
      INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -sp -i '/disk/buildroot-100ask_t113-pro/buildroot/output/images/boot.vfat' '/disk/buildroot-100ask_t113                      -pro/buildroot/output/images/boot.img' '::'" (stderr):
      INFO: vfat(boot.vfat): adding file 'zImage' as 'zImage' ...
      INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -sp -i '/disk/buildroot-100ask_t113-pro/buildroot/output/images/boot.vfat' '/disk/buildroot-100ask_t113                      -pro/buildroot/output/images/zImage' '::'" (stderr):
      INFO: vfat(boot.vfat): adding file 'sun8iw20p1-t113-100ask-t113-pro.dtb' as 'sun8iw20p1-t113-100ask-t113-pro.dtb' ...
      INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -sp -i '/disk/buildroot-100ask_t113-pro/buildroot/output/images/boot.vfat' '/disk/buildroot-100ask_t113                      -pro/buildroot/output/images/sun8iw20p1-t113-100ask-t113-pro.dtb' '::'" (stderr):
      INFO: vfat(boot.vfat): adding file 'dsp0.fex' as 'dsp0.fex' ...
      INFO: vfat(boot.vfat): cmd: "MTOOLS_SKIP_CHECK=1 mcopy -sp -i '/disk/buildroot-100ask_t113-pro/buildroot/output/images/boot.vfat' '/disk/buildroot-100ask_t113                      -pro/buildroot/output/images/dsp0.fex' '::'" (stderr):
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'boot0' from 'boot0_sdcard.fex' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'boot-packages' from 'boot_package.fex' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'boot-resource' (in MBR) from 'boot-resource.fex' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'env' (in MBR) from 'env.fex' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'env-redund' (in MBR) from 'env.fex' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'boot' (in MBR) from 'boot.vfat' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'rootfs' (in MBR) from 'rootfs.ext4' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition 'share' (in MBR) ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition '[MBR]' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition '[GPT header]' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition '[GPT array]' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): adding partition '[GPT backup]' ...
      INFO: hdimage(100ask-t113-pro_sdcard.img): writing GPT
      INFO: hdimage(100ask-t113-pro_sdcard.img): writing hybrid MBR
      root@znh-ubuntu:/disk/buildroot-100ask_t113-pro/buildroot#
      

      1.2 烧写sdcard 最小系统镜像
      编译完成后会在 output/images目录下输出 sdcard.img(100ask-t113-pro_sdcard.img) 文件,将文件拷贝到Windows系统下使用 wind32diskimage烧写,或者使用dd if 烧录到tf卡内, 之后插到开发板上,即可启动。

      2、spi nand

      2.1 编译 spi nand最小系统镜像

      book@100ask:~/buildroot-100ask_t113-pro/buildroot$ make   BR2_EXTERNAL="../br2t113pro  ../br2lvgl"  100ask_t113-pro_spinand_core_defconfig
      book@100ask:~/buildroot-100ask_t113-pro/buildroot$ make  V=1
      

      2.2 烧写spi nand最小系统镜像

      编译完成后会在 output/images目录下输出 buildroot_linux_nand_uart3.img 文件,将文件拷贝到Windows系统下使用 使用 全志官方的 AllwinnertechPhoeniSuit 进行烧写

      (4)启动开发板

      [153]HELLO! BOOT0 is starting!
      [156]BOOT0 commit : 2c94b33
      [159]set pll start
      [165]periph0 has been enabled
      [168]set pll end
      [170][pmu]: bus read error
      [172]board init ok
      
      ......
      
      [245]sdcard 0 line count 4
      [248][mmc]: mmc driver ver 2021-03-22 20:20
      [257][mmc]: Wrong media type 0x0
      [260][mmc]: ***Try SD card 0***
      [279][mmc]: HSSDR52/SDR25 4 bit
      [282][mmc]: 50000000 Hz
      [285][mmc]: 30436 MB
      [286][mmc]: ***SD/MMC 0 init OK!!!***
      [382]Loading boot-pkg Succeed(index=0).
      [385]Entry_name        = u-boot
      [393]Entry_name        = optee
      [397]Entry_name        = logo
      [399]Entry_name        = dtb
      [402]mmc not para
      [404]Jump to second Boot.
      M/TC: OP-TEE version: 6aef7bb2-dirty (gcc version 5.3.1 20160412 (Linaro GCC 5.3-2016.05)) #1 F
      
      
      U-Boot 2018.05 (Jun 30 2022 - 06:55:01 +0000) Allwinner Technology
      
      [00.459]CPU:   Allwinner Family
      [00.462]Model: sun8iw20
      [00.465]DRAM:  128 MiB
      [00.468]Relocation Offset is: 04ebd000
      [00.495]secure enable bit: 0
      [00.498]smc_tee_inform_fdt failed with: -65526[00.502]CPU=1008 MHz,PLL6=600 Mhz,AHB=200 Mhz, AP
      [00.508]gic: sec monitor mode
      
       ......
       
       261240 bytes read in 13 ms (19.2 MiB/s)
      4810752 bytes read in 202 ms (22.7 MiB/s)
      [06.431]no vendor_boot partition is found
      Android's image name: sun8iw20p1
      [06.443]Starting kernel ...
      
      [06.446][mmc]: MMC Device 2 not found
      [06.449][mmc]: mmc 2 not find, so not exit
      
      ......
      

      账号为 root

      如果启动出现(后期可能会修复):

      [   21.044877] configfs-gadget 4100000.udc-controller: failed to start g1: -19
      Initializing random number generator: /etc/init.d/S11adb_server: line 14: echo: write error: No
      FAIL
      Starting network: OK
      Starting swupdate: OK
      
      Welcome to T113 Pro
      t113 login: 
      [   24.163699] configfs-gadget 4100000.udc-controller: failed to start g1: -19
      /etc/init.d/S11adb_server: line 14: echo: write error: No such device
      

      开机后可将adb服务移除:

      rm  /etc/init.d/S11adb_server
      

      或在 config 加上adb配置

      BR2_PACKAGE_ANDROID_TOOLS=y
      BR2_PACKAGE_ANDROID_TOOLS_ADB=y
      BR2_PACKAGE_ANDROID_TOOLS_ADBD=y
      

      转载自:https://blog.csdn.net/qq_46079439/article/details/125896105?spm=1001.2014.3001.5502

      posted in 全志方案讨论区
      Y
      giao
    • H618?Android 12 电视盒?

      目前全志 H618 处理器已陆续在几款运行 Android 12 的电视盒中使用了,例如:T95Z Plus 和 T95 Max 等设备就可以播放 6K/4K VP9 和 H.265 视频。

      全志 H618 配备了四核 Cortex-A53 处理器、Arm Mali-G31 MP2 GPU、支持 6K 视频,全志 H618 看起来与全志 H616 处理器完全相同,比较不同的就是它可以运行更新的 Android 12 操作系统。

      Allwinner-H618-TV-Box-Android-12.webp

      全志 H618 公开信息并不多,看一下 T95Z Plus 的规格

      C7A27786-D800-4a24-B75C-CC8ABA59FB82.png

      除了全志 H618 可以支持 Android 12 之外,全志 H618 和 H616 至少还有一个区别,就像 linux-sunxi wiki 所述的,全志 H616 缺少全志 H6处理器上的 PCIe 和 USB 3.0 接口。 对了,我看过全志 H618 的数据表(抱歉,我不能分享出来),上面显示也没有 USB 3.0 或 PCIe 接口。而且其主要的区别似乎是更大的 1MB L2 缓存。他们的数据表还显示 WiFi+ 蓝牙就像通常一样,连接到了SDIO 3.0、UART 和 I2S。

      搭载全志 H618 处理器的 T95Z Plus Android 12 电视盒目前可以在aliexpress 或 Banggood上购买,价格是 39 至 54 美元不等,具体的价格要取决于用户需要的配置。

      posted in 全志方案讨论区
      Y
      giao
    • Reply: 【V853开发板试用】我做个RTSP推流demo吧

      @tevet https://bbs.aw-ol.com/topic/1844/ MPPPP

      posted in V853
      Y
      giao
    • Reply: 【Sipeed D1 Dock Pro】QT初体验

      @guozhaifa everything ok!😊

      posted in D1-H/D1s
      Y
      giao
    • Reply: 【V853开发板试用】AI生成山水画,每一幅都是世间独一无二

      666🤙 我也去生成一幅玩

      posted in V853
      Y
      giao
    • Reply: 2022年7月版——在“哪吒”上跑AI 全志D1 ncnn框架移植笔记

      @xiaowenge 有提升的;

      2.2.2 的性能数据在这里:https://bbs.aw-ol.com/topic/705

      2.2.6和 2.2.2相比,各模型性能均有一定程度提升

      posted in D1-H/D1s
      Y
      giao
    • 2022年7月版——在“哪吒”上跑AI 全志D1 ncnn框架移植笔记

      ncnn框架是当前边缘计算的主流框架,关于全志D1运行ncnn框架的笔记,nihui大佬曾经于2021年发表了相关的帖子。但是目前工具链和ncnn版本有所变化,因此在大佬的基础上将,完整过程记录如下。

      相关链接:
      1.https://bbs.aw-ol.com/topic/705/
      2.https://zhuanlan.zhihu.com/p/386312071?utm_source=qq&utm_medium=social&utm_oi=872955404320141312

      1 准备交叉编译工具链

      目前使用的交叉工具链是v2.2.6版本,具体下载链接见:https://occ.t-head.cn/community/download?id=4046947553902661632

      下载这个文件:Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz

      tar -xf Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6-20220516.tar.gz
      export RISCV_ROOT_PATH=/home/{你的用户名}/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.2.6
      

      2 下载和编译ncnn

      这边的toolchain file选用c906-v226.toolchain.cmake,其余的不用修改,在toolchain file里面都已经改好了。其中可能有路径问题,根据ncnn文件夹,实际所在的路径修改即可。

      git clone https://github.com/Tencent/ncnn.git
      cd ncnn
      mkdir build-c906
      cd build-c906
      cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/c906-v226.toolchain.cmake -DCMAKE_BUILD_TYPE=release -DNCNN_OPENMP=OFF -DNCNN_THREADS=OFF -DNCNN_RUNTIME_CPU=OFF -DNCNN_RVV=ON -DNCNN_SIMPLEOCV=ON -DNCNN_BUILD_EXAMPLES=ON ..
      make -j4
      

      3 测试benchncnn

      目前2.0版本的TinaLinux 执行 ncnn 程序已经不会有问题

      将 ncnn/build-c906/benchmark/benchncnn 和 ncnn/benchmark/*.param 拷贝到 d1开发板上,路径结构如下:

      80abd156fc86ba2c318912d87e220577.png

      chmod 0777 benchncnn 
      ./benchncnn 4 1 0 -1 0
      
      oot@TinaLinux:~/ncnn# ./benchncnn 4 1 0 -1 0
      syscall error -1
      loop_count = 4
      num_threads = 1
      powersave = 0
      gpu_device = -1
      cooling_down = 0
      fopen squeezenet.param failed
      network graph not ready
      Segmentation fault
      root@TinaLinux:~/ncnn# ./benchncnn 4 1 0 -1 0
      syscall error -1
      loop_count = 4
      num_threads = 1
      powersave = 0
      gpu_device = -1
      cooling_down = 0
                squeezenet  min =  382.77  max =  385.92  avg =  384.66
           squeezenet_int8  min = 8975.18  max = 8979.84  avg = 8977.72
                 mobilenet  min =  702.76  max =  704.76  avg =  703.74
            mobilenet_int8  min = 29501.19  max = 29546.07  avg = 29514.59
              mobilenet_v2  min =  451.34  max =  452.27  avg =  451.78
              mobilenet_v3  min =  358.12  max =  359.24  avg =  358.42
                shufflenet  min =  527.04  max =  528.48  avg =  527.69
             shufflenet_v2  min =  310.96  max =  312.30  avg =  311.59
                   mnasnet  min =  435.13  max =  437.02  avg =  435.94
           proxylessnasnet  min =  473.05  max =  476.37  avg =  475.19
           efficientnet_b0  min =  601.75  max =  610.41  avg =  606.18
         efficientnetv2_b0  min =  859.37  max =  861.75  avg =  860.67
              regnety_400m  min =  653.71  max =  654.24  avg =  653.88
                 blazeface  min =  154.08  max =  154.67  avg =  154.38
                 googlenet  min = 1404.80  max = 1409.50  avg = 1407.33
            googlenet_int8  min = 42586.56  max = 42608.04  avg = 42597.36
                  resnet18  min = 1047.81  max = 1050.59  avg = 1049.40
             resnet18_int8  min = 45011.41  max = 45185.10  avg = 45098.12
                   alexnet  min =  955.34  max =  956.98  avg =  956.06
                     vgg16  min = 5355.40  max = 5356.05  avg = 5355.75
      

      如果一切运行正常,则会出现上述信息。

      4 测试example

      将 ncnn/build-c906/examples/nanodet 和测试图片拷贝到 d1开发板上

      从这里下载 nanodet 模型文件并拷贝到 d1开发板上

      nihui/ncnn-assets​github.com/nihui/ncnn-assets/tree/master/models

      目录结构如下:

      35b2dd1eb5e8a25b37f92325da1c0b16.png

      注意,进过测试,jpg格式的图像读取时会报错,png格式没有问题

      ./nanodet test.png
      

      bd0e8ab3ee50032c1a82e873a5aa8576.png
      177b58a5b1e4b24788974154c648b8b8.png

      posted in D1-H/D1s
      Y
      giao
    • 【Sipeed D1 Dock Pro】QT初体验

      前提

      想要完成qt交叉编译的功能,会涉及到以下几个重要的组件

      • qmake和库文件
        qmake对于QT来讲是一个非常重要的工具,编译qt源码时会生成qmake,它对应的平台为qt程序工作的平台(如Windows),因此configure配置时,-platform选项实际上指的是qmake工作的平台。

      库文件包含了qt内置功能\函数的实现,在程序链接或运行时生效,-xplatform选项指的是库文件对应的平台(如开发板)。

      • 交叉编译工具链
        既用于编译目标程序需要用到的库文件,也编译实际项目中的代码文件。

      主要过程如下:

      • 准备工作

      在windows下编译QT,需要安装active perlhttps://www.perl.org/get.html和python,安装过程不在叙述,安装完成后需要将其可执行文件所在目录(一般为bin目录)加入到环境变量中。

      需要注意的是perl的目录比较绕,我的目录在用户目录下的AppData\Local\ActiveState\cache\bin,而且不是exe文件,而是bat脚本,最终执行perl.exe文件,因此添加脚本目录或者exe目录到环境变量都行。

      d662297074d31a26e0a53aac61aee65e.png

      在第二次编译时,提到需要安装msvc工具链和ruby。

      msvc可以使用visual studio installer安装编译器和Windows sdk,安装完成后使用msvc的环境能执行cl指令即可。

      d32336e58ca888c0f8261ff7ae9bfe36.png

      ruby下载安装即可。

      1a4e241302d4016d0cd0ba54fc5b851c.png

      下载交叉编译工具链,开发板工具链官方整理的非常好,直接在 https://occ.t-head.cn/community/download?id=4032826170687950848 页面下载然后解压即可,为了后续的流程简单一点,也建议将其bin目录加入到环境变量。

      f2427e7a30e8750d1eedc8d416a3b23e.png

      因为是在Windows下编译源码,因此还需要安装g++,这个很多软件都会带有g++工具链(如vs、cygwin64、qt等),这里就不再详述了,g++所在目录页需要加入到环境变量中。这是我用到的g++版本。

      5074df790bf098a7568cf9e353c5fd3c.png

      • QT源码下载
        直接在qt官网( https://www.qt.io/offline-installers ) 下载即可,Windows平台下载zip文件,下载完成之后解压。

      在第二次尝试编译时得知需要将解压后的flex.exe所在目录加入到环境变量,目录为压缩包下gnuwin32\bin。

      修改工具链位置由于我们的目标程序适用于开发板,因此这里的库必须使用开发板对应的交叉编译工具链来编译,qt源码中并没有预设该工具链,因此需要对现有的工具链文件做一定修改,办法如下:

      修改源码目录下qtbase\mkspecs\linux-aarch64-gnu-g++\qmake.conf文件,将其工具链更改为开发板对应的工具链。

      0c3f26ae3f56b493283da5e97b17b5f6.png

      修改这个文件是因为我们等会configure配置会用到-xplatform linux-aarch64-gnu-g++选项,该选项指向了这个文件,你也可以自己创建一个文件夹,按照模板填写qmake.conf文件也可以,只需要保证-xplatform能找到新建的 文件即可。

      • Windows下编译QT源码 - 1
        这部分是在51假日期间做的尝试,实际上方法不对,导致了在编译过程中出现很多问题,不过当时仅记录了一部分内容,在掉进编译的问题旋涡之后,就没有记录了。正确的编译方式请看《Windows下编译QT源码 - 2》章节。

      • 执行编译
        在源码文件夹顶层目录下,执行以下指令:

      configure.bat -release -static -opensource -nomake tests -nomake examples -no-opengl -skip qtvirtualkeyboard -platform win32-g++ -xplatform linux-aarch64-gnu-g++ -prefix D:\Qt\Qt5.12.10\5.12.10\xuantie_900_mingw_v2.2.5
      

      关于配置选项的说明,可以查看qtbase\config_help.txt文件,这里只简单介绍一下:

      C7D25657-6831-48d5-8C77-2724E518B0D9.png

      先尝试了qt 5.15.1版本(因为我本地的qt是该版本),编译过程中遇到的错误如下:

      g++报错,找不到输入文件(g++: fatal error: no input files)

      03b2fc40585b5929ebabfb615e0be54f.png

      原因是g++在处理转义字符\时,截断了后面后面的参数,需要修改qtbase\qmake\Makefile.unix文件(为啥不是qtbase\qmake\Makefile.win32文件?),去掉QT_VERSION_STR后面的转义字符。修改完成之后,不再报这个错误。

      c9b3d10ce662b9eeb497f9a34a47751d.png

      • ::symlink未被申明

      efbe772e0487f1f4c4ded1e8b265ffd1.png

      查看报错的源码,发现这个函数应该是unix下特有的,我在Windows下编译,但是实际上启用了Q_OS_UNIX的宏。从qtbase\src\corelib\global\qsystemdetection.h文件来看,如果未指定平台,则会默认Unix,而定义Q_OS_WIN宏的条件,是要定义Q_OS_WIN32、Q_OS_WIN64、Q_OS_WINRT其中至少一个宏,而这三个宏在定义条件如下:

      #elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__))
      
      #  define Q_OS_WIN32
      
      #  define Q_OS_WIN64
      
      #elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__))
      
      #  if defined(WINAPI_FAMILY)
      
      #    ifndef WINAPI_FAMILY_PC_APP
      
      #      define WINAPI_FAMILY_PC_APP WINAPI_FAMILY_APP
      
      #    endif
      
      #    if defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP
      
      #      define Q_OS_WINRT
      
      #    elif WINAPI_FAMILY==WINAPI_FAMILY_PC_APP
      
      #      define Q_OS_WINRT
      
      #    else
      
      #      define Q_OS_WIN32
      
      #    endif
      
      #  else
      
      #    define Q_OS_WIN32
      
      #  endif
      

      Win32、win64看起来应该是在编译的时候传入的参数,最终找到qtbase\mkspecs\common\g++-win32.conf文件中定义了_WIN32宏,这个文件又被qtbase\mkspecs\win32-g++\qmake.conf文件包含,我的编译选线里面指定了-platform win32-g++,按道理这个宏应该在编译的时候已经定义了才对,为什么实际编译的时候被使能的是Q_OS_UNIX宏呢???


      51期间的记录仅上述两点,实际上后来我尝试了很多办法,包括直接指定Windows的编译宏等,结局非常凄惨,就和一个谎言需要无数个谎言来掩盖类似,绕开一个编译错误的动作导致了后面出现更多的编译报错,直接钻进了牛角尖。后来还尝试过在Linux下编译,configure确实没有报错,但是编译的时候出现了其他错误,尝试解决也是以失败告终,在这里消耗了大约1天多的时间,直接清空了假期余额,因此这件事情也向后拖了很长时间。

      后来在一个周末比较空闲的时间,打算继续研究一下,在查看qtbase\configure.bat文件时,发现以下代码:

      if "%PLATFORM:g++=%" == "%PLATFORM%" (
      
          if "%MAKE%" == "" (
      
              if not "%jom.exe%" == "" (
      
                  set MAKE=jom
      
              ) else (
      
                  set MAKE=nmake
      
              )
      
          )
      
          set tmpl=win32
      
      ) else (
      
          if "%MAKE%" == "" (
      
              set MAKE=mingw32-make
      
          )
      
          set tmpl=unix
      
      )
      

      大意是如果指定的平台已g++结尾,就走else的逻辑,我指定的平台为win32-g++,所以按Unix编译了?看了下还支持win32-msvc平台,我电脑上安装过vs,刚好有msvc的工具链,因此打算切换到msvc,使用-platform win32-msvc参数,依然出现上述错误,在网上收罗解决办法的时候,翻到了下面这篇文章:

      里面提到要使用x64 Native Tools Command Prompt for VS 2022 Current命令行执行编译编译指令,尝试之后果然没有报错了!!(充分说明了查找资料也是初级技术人员的一项必不可少的能力),编译过程在下面的章节记录。

      Windows下编译QT源码 - 2

      • 重新解压qt源码
        修改交叉编译工具链名称。这里要注意库编译为动态还是静态(我还不理解啥意思),摘抄文章如下:
        QT静态库的编译需要注意编译选项/MD 、 /MT要和开发项目中引用的其他库相匹配。如果要修改此编译选项,可以在QT源文件根目录下的 qtbase\mkspecs\common\msvc-desktop.conf 中修改
      QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MD
      
      QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
      
      QMAKE_CFLAGS_DEBUG      = -Zi -MDd
      

      或者

      QMAKE_CFLAGS_RELEASE    = $$QMAKE_CFLAGS_OPTIMIZE -MT
      
      QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
      
      QMAKE_CFLAGS_DEBUG      = -Zi -MTd
      

      打开msvc对应的命令行(x86 Native Tools Command Prompt for VS 2022 Current,编译64位库则打开x64 Native Tools Command Prompt for VS 2022 Current),切换到qt源码解压目录下,注意可能直接cd到解压目录会失败,可以逐级切换目录。
      这次使用的指令为 configure -static -release -mp -opensource -confirm-license -platform win32-msvc -xplatform linux-aarch64-gnu-g++ -prefix D:\Qt\Qt5.12.10\5.12.10\xuantie_900_mingw_v2.2.5 -nomake examples -nomake tests -no-opengl -no-iconv -no-assimp -no-qt3d-profile-jobs -no-qt3d-profile-gl -skip qtvirtualkeyboard -skip qtwebengine -skip qtlocation ,依然需要在qt解压出来的文件夹根目录下执行。

      configure执行的结果如下:

      7459524374276ce319e3abe53fe25600.png
      (上述指令红色部分是后面发现问题之后加的,到后面其实我重新解压编译了一次,用的指令如下 configure -prefix D:\Qt\Qt5.12.10\5.12.10\xuantie_900_mingw_v2.2.5 -opensource -confirm-license -release -strip -shared -xplatform linux-aarch64-gnu-g++ -platform win32-msvc -optimized-qmake -c++std c++11 --rpath=no -pch -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtconnectivity -skip qtdatavis3d -skip qtdoc -skip qtgamepad -skip qtlocation -skip qtmacextras -skip qtnetworkauth -skip qtpurchasing -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtwayland -skip qtwebengine -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -make libs -make examples -nomake tools -nomake tests -gui -widgets -dbus-runtime --glib=no --iconv=no --pcre=qt --zlib=qt -no-openssl --freetype=qt --harfbuzz=qt -no-opengl -linuxfb --xcb=no --libpng=qt --libjpeg=qt --sqlite=qt -plugin-sql-sqlite -recheck-all)

      • 接下来执行nmake

      在编译过程中,遇到的错误以及对应的解决办法如下:

      • 在编译过程中出现如下错误

      6d419f8c5e3b8d9c05ec7e711c2a0bed.png

      看起来是在调用python时,命令行将指令中文件夹名称中的空格截断了。改动现有的文件目录比较麻烦,我直接重装了python,这次安装的目录就比较简单了,确保没有空格。继续执行nmake,不再报该错误。

      • 编译过程中出现如下错误:

      d:/private_toolchain/xuantie-900-gcc-linux-5.10.4-glibc-mingw-v2.2.5/bin/../lib/gcc/riscv64-unknown-linux-gnu/10.2.0/../../../../riscv64-unknown-linux-gnu/bin/ld.exe: E:/qt-everywhere-src-5.15.1/qtdeclarative/lib/libQt5Qml.a(qv4typedarray.obj): in function `unsigned long long atomicExchange<unsigned short>(char*, QV4::Value)':

      qv4typedarray.cpp:(.text._Z14atomicExchangeItEyPcN3QV45ValueE[_Z14atomicExchangeItEyPcN3QV45ValueE]+0x16): undefined reference to `__atomic_exchange_2'

      在网上收罗了一下资料(参考 https://twd2.me/archives/10597)
      ,缺少的这个函数是RV64的对8位整数和16位整数的原子操作,类似的函数还有__atomic_exchange_4(32位)和__atomic_exchange_8(64位),出现这个问题可主动指定lib文件(-latomic)解决,我报错的这个地方在qtdeclarative\tools\qml\目录下(此时已经是使用刚编译出来的qmake在编译了),需要修改该目录下的makefile文件,在LIBS变量中加入 -latomic。继续编译,不再报__atomic_exchange_2等函数的错误。

      在后续的编译中,还需要按这种方式修改如下文件:

      qtdeclarative\tools\qmltestrunner\Makefile

      • 编译过程中出现如下错误:
      d:/private_toolchain/xuantie-900-gcc-linux-5.10.4-glibc-mingw-v2.2.5/bin/../lib/gcc/riscv64-unknown-linux-gnu/10.2.0/../../../../riscv64-unknown-linux-gnu/bin/ld.exe: E:/qt-everywhere-src-5.15.1/qtdeclarative/lib/libQt5Qml.a(YarrInterpreter.obj): in function `.L433':
      
      YarrInterpreter.cpp:(.text._ZN3JSC4Yarr11byteCompileERNS0_11YarrPatternEPN3WTF20BumpPointerAllocatorEPNS_6NoLockE+0x3b8): undefined reference to `JSC::Yarr::wordUnicodeIgnoreCaseCharCreate()'
      

      收罗到如下解决办法( https://forum.qt.io/topic/32634/unresolved-external-symbol-attempting-to-build-5-2/4):

      in "qt\qtdeclarative\src\qml", check the file "RegExpJitTables.h"
      
      if it's empty, delete it (it's autogenerated with python)
      

      上述办法是针对5.2版本的qt,我现在使用的是5.15.1,这个文件的路径在qtdeclarative\src\qml.generated\RegExpJitTables.h。实际上我在删除这个文件之后依然报错,发现创建的还是一个空文件,直接进入到qtdeclarative\src\qml目录,手动执行python E:/qt-everywhere-src-5.15.1/qtdeclarative/src/3rdparty/masm/yarr/create_regex_tables > .generated\RegExpJitTables.h 命令,才成功创建这个文件(创建出来的文件是由一个超大的数组开头 static const char _wordcharData[65536])。

      (文章里面还提到另一个办法是从git下载源码,但是我未尝试)。

      • 在编译过程中遇到如下错误:
      In file included from declarativemaps\qdeclarativepolylinemapitem.cpp:38:
      
      declarativemaps\qdeclarativepolylinemapitem_p_p.h:381:17: error: 'const char* MapPolylineShaderLineStrip::vertexShader() const' marked 'override', but does not override
      
        381 |     const char *vertexShader() const override {
      

      这个问题,后来发现是各个模块之间有依赖导致的,我在configure的时候加了-no opengl,而这里的qtlocation模块对opengl模块有依赖,所以编译报错,重新configure一次,加上 -no qtlocation,然后重新nmake即可。

      在漫长的等待之后,编译终于完成了。

      执行nmake install,将编译的文件安装到 -prefix 指定的目录。

      • 创建测试工程
        在配置完kit(构建套件)之后,使用creator新建一个测试项目,在选择kit时勾选上我们刚刚配置好的套件,然后随便敲点代码,准备编译工程。

      • 编译工程
        直接点击运行或者构建,将会出现失败,对比了正常构建和失败构建的输出如下:

      8239492397e1e24d301fa93aafff4fe2.png

      很明显是因为没有在工具链的目录下找到make程序导致的,但是此时已经通过qmake创建了makefile文件,我们可以直接进入到工程所在目录,然后直接执行make指令,即可完成程序的编译,我这边成功生成test可执行文件。

      (后来不知道为啥就能直接找到make程序了,此时直接点击构建即可创建出test可执行程序,无需手动执行make指令了)

      d28de5808ae4c3899cf2cebf3a8ed0e8.png

      将编译生成的测试程序上传到开发板并执行,得到如下错误提示:

      bfce1c3167f27f00496bf0618970d73e.png

      原因是因为 libstdc++.so.6库的版本不够高,因此需要更新库文件,我直接将下载的工具链中的库文件(位于工具链目录riscv64-unknown-linux-gnu\lib64v_xthead\lp64d目录下)更新到开发板上。

      e0bfb66bf2212a5d8bd60c3abac7f7d9.png

      然后将libstdc++.so.6软连接到这个库文件即可。

      4358c3710a20967f8c87f285d390108c.png

      重新执行测试程序,得到如下错误:

      ./test: error while loading shared libraries: ld-linux-riscv64v_xthead-lp64d.so.1: cannot open shared object file: No such file or directory
      

      这看起来是库文件缺失导致的报错,将工具链中的库文件更新到开发板上

      d3e12faa056af697b3abcd305a455633.png

      重新执行测试程序,得到如下错误:

      d11941c796d84f8d848ac8613a544e1d.png

      前面两行是因为在编译qt源码时,configure没有加-no-iconv,在没加的情况下编译后,qt会使用QIconvCodec类进行编码的转换,而qt本身不再使用该类,所以不要使用该库,因此重新configure一次然后重新编译即可。

      当然也可以下载去这个网址http://ftp.gnu.org/gnu/libiconv/下载libiconv源码,配置(./configure --prefix=E:\libiconv-1.17\libiconv-1.17\build --host=riscv64-unknown-linux-gnu-gcc)编译后安装,将产生的libiconv.so复制到开发板上。

      编译完成后重新构建测试工程,将得到的可执行文件上传并执行,出现找不到qt库的错误,将缺失的库上传到开发板,重新执行,最终出现BUS ERROR的错误。

      7d29f4eb46e941b17e5150c7a45724d3.png

      查询了资料,说error bus基本上可以肯定是板子上运行的qt库和编译器使用的qt库不一致造成的。那么最好的办法就是将交叉编译的qt库文件直接拷贝到开发板上,并设置其路径。

      直接将整个编译出来的文件拷贝到SD卡的目录下

      cb15792c99f89fe9608974ca99d8daca.png

      并设置qt的环境变量如下:

      export QT_ROOT=/mnt/UDISK/qtlib
      
      export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
      
      export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
      
      export QT_PLUGIN_PATH=$QT_ROOT/plugins
      
      export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms
      
      export QML2_IMPORT_PATH=$QT_ROOT/qml
      
      export QT_QPA_FONTDIR=/resources/fonts
      

      这些环境变量的设置可加入到 /etc/profile 文件中,并通过重启或者执行 source /etc/profile 的方式使其生效。

      在配置完成后,重新执行测试程序(测试程序的功能为点击一个按钮,会更新一个文本框)。

      界面得以显示,但是文字都没有显示出来,点击测试按钮,本应该更新文字,但是文本框依然空白,控制台输出如下信息:

      Note that Qt no longer ships fonts. Deploy some (from https://dejavu-fonts.github.io/for example) or switch to fontconfig.
      

      看这意思,是因为缺少字符库导致的,在开发板全局搜索 fonts,找到如下两个路径:

      /resources/fonts
      
      /usr/share/directfb-examples/fonts
      

      将第一个路径加入到环境变量中 ( export QT_QPA_FONTDIR=/resources/fonts/ ),重新执行程序,终于正常显示了,效果如下:

      6f9753b2041e8aea1a2c590d5fd14260.png

      直接上一个官方炫酷一点的例程(官方例程需要编译example模块才会生成),路径在编译安装路径下"examples\widgets\animation\animatedtiles\animatedtiles",执行的效果如视频,还是非常的丝滑的。

      posted in D1-H/D1s
      Y
      giao
    • Sipeed LicheeRV 86 Panel 基于WAFT的家居控制

      采用waft系统完成一个家居参数监视和控制的终端

      基于WAFT的家居控制——测试项目

      项目测试的硬件基于平头哥LicheeRV 86 Panel开发板,采用waft系统完成软件开发,项目采用客户端-服务器模式架构。

      项目以waft示例程序横向列表Demo为基础,开发了两种类型画面,建立了5个场景,分别为天气预报展示画面、厨房监视控制画面、卧室监视控制画面、客厅监视控制画面、门廊监视控制画面。

      项目建立一个基于python的服务器,用来为设备提供数据和服务支持。

      1、服务器建立

      为了便于后面画面的描述,这里首先介绍一下简易服务器。

      服务器采用Python建立了支持CGI的简易服务器,服务器支持提供文件和执行CGI脚本程序。

      c1e1026eb95b8e6e17492e9a1c41cb5e.jpg

      服务器下面包含三个目录和一个服务器启动文件,分别为文件夹cgi-bin、ico、img和pywebserver.py文件。
      
      img文件夹中存放了主画面所需的图片文件。
      

      3e9efcf97e253502f19224897bad6494 (1).jpg

      ico文件夹中存放了开发板中显示的一些图标文件。
      

      ef6568aef285589431fdf54602760cd2 (1).jpg

      cgi-bin文件夹中存放了CGI脚本程序。

      5895fe01e8e6c482bbae0380d48abe95 (1).jpg

      2、画面开发

      项目采用waft开发平台,基于横向列表示例程序为基础,开发了三种类型画面。利用这三种类型画面开发了一个主画面和5个场景实例。

      2.1 第一种画面类型:主画面,横向列表画面

      主画面采用横向列表Demo为基础,横向列表为纯Waft开发的示例,共设计了5个场景实例,分别为天气预报、厨房、客厅、门廊、卧室。屏幕包含标题“WAFT 家居控制”,下面对应5个图标,分别代表5个场景,这5个图标支持通过服务器上传,只需要按照规则修改服务器目录下相关的图标即可,路径为webserver根目录/img。画面支持左右滑动选择不同的场景,用过点击场景图片,进入到相关场景的细节描述。

      24abeae5a192ef448db68b16854f921d (1).jpg 8485efdf0785bd2804ba4e6fa879b2f1 (1).jpg 502daaba7c191a028d18daea33f1e197 (1).jpg

      2.2 第二种画面类型:天气预报画面

      通过在主画面点击“天气预报”场景图片,进入到天气预报显示子画面,画面显示的信息按照20秒间隔(时间可以在程序中调整)刷新显示画面的内容信息。

      画面内容如下图所示,包含标题和显示内容。

      天气预报子画面采用Waft-UI技术设计完成,包含标题“天气预报”,标题采用waft-ui中nav-bar控件实现,具有向上级画面和向下级画面索引的功能。

      天气显示内容包含城市,日期,星期,天气情况图标,温度和湿度显示,风力和风向,紫外线等级,空气质量。数据的刷新来源于建立的服务器,服务器会定时的向数据源请求数据,并记录到数据库或文件中,为了简化,我这里直接存储到文件中。

      8a34fe5441047f30527766053314a7de (1).jpg

      2.3 第三种画面类型:监视控制画面

      其它几个画面,包括厨房、客厅、门廊、卧室,通过在主画面点击相应的场景图片进入。由于这几个画面类型相同,所以这里以“门廊”画面为例说明,通过在主画面点击“门廊”场景图片,进入到门廊显示和控制子画面,画面显示的信息按照20秒间隔(时间可以在程序中调整)刷新显示画面的内容信息。

      画面内容如下图所示,包含标题和显示内容。

      门廊显示和控制子画面采用Waft-UI技术设计完成,包含标题,标题采用waft-ui中nav-bar控件实现,具有向上级画面和向下级画面索引的功能。

      显示和控制内容包括灯光显示状态和控制按钮,温度和湿度数字显示及图标显示。画面采用的waft-ui控件如下所示。

      "x-nav-bar": "waft-ui/assembly/nav-bar/nav-bar",
          "x-toast": "waft-ui/assembly/toast/toast",
          "x-overlay": "waft-ui/assembly/overlay/overlay",
          "x-card": "waft-ui/assembly/card/card",
          "x-dialog": "waft-ui/assembly/dialog/dialog",
          "x-button": "waft-ui/assembly/button/button",
          "x-image": "waft-ui/assembly/image/image"
      

      画面中的灯光控制状态发送到服务器,服务器会将该命令转发给相应的灯光控制模块,并且将灯光控制模块上送的灯光状态和控制状态反馈到画面上来。

      画面按照20秒间隔向服务器请求温湿度数据信息,这些信息是服务器定时获取的相应场景环境参数监视模块上送的信息,并存储到数据库或文件中。

      灯光控制为关闭状态效果图:

      4db9285e60d68c50c8453d84dcae961a (1).jpg

      灯光控制为打开状态效果图:

      eea0c25f7e5ca142459985e2c47d872f (1).jpg

      3、实测效果

      3.1 服务器运行画面

      3.2 演示视频

      4、目前开发中遇到的问题

      现在的waft系统对于json相关特性的支持还有待完善,例如关于UTF-8类型的中文到GBK类型中文字符串的转换,还需要提供合适的接口函数

      posted in D1-H/D1s
      Y
      giao