导航

    全志在线开发者论坛

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

    bayche 发布的帖子

    • 我用香橙派做了一个Klipper 3D打印控制器

      一个好用的Klipper 3D打印机,一定离不开一个可以稳定进行无线通信,而且性能足够,最重要是价格亲民的上位机。

      ezgif.com-optimize.gif

      3D-ezgif.com-video-to-gif-converter.gif

      所谓Klipper,简单来说就是一套可以通过联动上、下位机来有效提升3D打印精度的固件。它拥有高精度的步进电机控制,并且配置简单,不依赖于3D打印机主板、和上位机的性能,这也为载体开发板的选择提供了很大的空间。

      其实早在三、四年前,功能相仿、性能相近、价格美丽的香橙派Zero系列就已经成为替代树莓派做上位机的不二之选,搭载全志H616/H618的百元开发板,可以很好的满足做为Klipper宿主的所有需求,甚至有点性能过剩。

      82cNfSOwHpWVegZDs7QdhLBPvKy1OWjJ4XeVdzvI.jpeg

      Klipper有诸多独特的功能需要使用到gpio针脚,但香橙派Zero系列的硬件设计使得每次都需要用排母端子去连接,非常的不方便,所以为香橙派Zero3设计一款3D打印扩展板,就显得尤为重要了。

      D47AF37E-B8A4-4ab2-ABE6-BD895BD3A6C8.png

      硬件设计简介

      香橙派Zero3是一款基于全志H618设计的开发板,板载千兆网口以及WiFi&BT通信模块,并在有限的板型内预留了13Pin和26Pin的功能接口。

      本次给香橙派Zero3设计的适用于3D打印机的扩展板,参考了B站@大石头Jerry的香橙派Zero0的设计,与树莓派B板型的大小和螺丝孔位相同,该项目已经实际验证,可以打印50小时以上。

      31673E8D-EEA1-4174-93AA-318CDFEE9BBF.png

      PCB上有支持最大电流3A的24V~12V转5V的DC-DC,两个USB,一个3010风扇,一个24V/5V可选电源输出。

      123333.jpg

      • KF128-5.08-2P的电源输入接口
      • TPS54308 DC-DC降压电路,最大电流3A
      • 3010风扇位和XH2.54接口(PC9引脚控制)
      • 24V/5V可选输出XH2.54接口
      • 两个USB扩展接口带TVS管
      • 香橙派Zero3板型座子

      扩展板默认留出13Pin和20Pin的引脚接口,通过13Pin接口可以扩展耳机、TVout、USB2.0、IR 接收等功能,扩展板上还预留了20Pin扩展功能接口以满足其它功能接口的需求。

      由于板型原因,香橙派针脚接头需要使用加高的7.5mm排母针脚,或者购买长排母配合打印件焊接,才可以保证排母稳定连接到开发板上。

      上下位机Klipper固件配置

      通常,专用于控制3D打印机的MCU只有有限且预配置的引脚数量,用于管理主要打印功能(热敏电阻、挤出机、步进电机……)。给香橙派安装上Klipper,就可以直接在Klipper内部使用香橙派的GPIO和总线接口(TWI、SPI),而无需使用插件或外部程序就能够控制打印机。

      安装rc脚本

      如果想将香橙派用作辅助 MCU来控制3D打印机,则klipper_mcu进程必须在klippy进程之前运行,安装Klipper后,安装脚本。运行:

      cd ~/klipper/
      sudo cp ./scripts/klipper-mcu.service /etc/systemd/system/
      sudo systemctl enable klipper-mcu.service
      

      启用SPI、TWI

      通过在“接口选项”菜单下运行并启用TWI,确保已启用驱动程序。如果计划将TWI用于MPU加速度计,还需要通过以下方式将波特率设置为 400000。

      通过在“接口选项”菜单下运行并启用 SPI,确保 Linux SPI 驱动程序已启用 。

      sudo orangepi-config
      

      识别正确的GPIO

      在使用不同香橙派型号或者在使用端口扩展版的情况下,使用命令访问Linux GPIO 字符设备以验证配置,gpiochip<n>/gpio<o>其中n是命令看到的芯片编号gpiodetect,o是命令看到的行号gpioinfo。

      要检查可用的 gpiochip 运行:

      gpiodetect
      

      要检查引脚编号和引脚可用性,请执行以下操作:

      gpioinfo
      

      PWM接口配置

      由于香橙派内核原因,PWM2和PWM3从系统加电启动到Klipper正式运行前,默认为高电平,即为打开状态,待klipper正式运行后恢复设置状态,PWM配置可根据需求修改,此处仅展示PWM1的默认配置:

      [fan_generic PWM1_Fan]
      pin: opi:gpio10
      max_power: 1
      shutdown_speed: 0
      cycle_time: 0.01
      #hardware_pwm:
      kick_start_time: 0.5
      off_below: 0.1
      #enable_pin:
      #   See the "fan" section for a description of the above parameters.
      

      以上就完成了香橙派上位机端的配置,想要klipper固件可以控制3D打印机,那么与之匹配的,3D打印机主板也要刷写klipper固件下位机端。首先我们要确认自己3D打印机使用的主板型号,根据主板型号不同,固件编译的配置和刷写方法也略有不同。官方支持的3D打印机主板列表可以在klipper固件github的config这个文件夹中找到。

      0CC3477E-2F97-4504-9BC6-6F87CC50282B.png

      开源资料获取

      本文与扩展板硬件相关的所有内容均转载自原作者本人立创开源硬件平台的工程页面,硬件资料均开源,文章内所提到的适配说明来自大石头Jerry的教程,感兴趣的小伙伴可以复制下方链接阅读了解。

      香橙派Zero3 3D打印扩展板开源PCB:

      https://oshwhub.com/yaochi/orangepi-zero3-exp
      

      上位机Klipper移植介绍:

      https://github.com/jeji/orange_juice?tab=readme-ov-file
      

      本文内容均转载自以下链接

      1.https://oshwhub.com/yaochi/orangepi-zero3-exp
      2.https://www.bilibili.com/video/BV12N4y1A7Kf
      3.https://github.com/jeji/orange_juice?tab=readme-ov-file
      4.https://space.bilibili.com/349545902
      5.https://www.bilibili.com/read/cv13886455/

      发布在 爱搞机专区
      bayche
      bayche
    • 回复: R128 SDK 下載連結

      @gharibi R128的SDK暂时未开源,可以向你购买开发板的代理或者商家客服获取

      发布在 A Series
      bayche
      bayche
    • 回复: T113-S3的资料在哪里可以看

      @jamesbo T113 Tina SDK、Longan SDK、开发资料下载 https://bbs.aw-ol.com/topic/1247/

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 在T113-i平台上实现H.265视频解码步骤详解

      T113-i支持多种视频编解码格式,视频编码支持JPEG、MJPEG格式,视频解码支持H.265、H.264、MPEG、JPEG、MJPEG等格式。创龙科技T113-i工业核心板含税仅售79元(1片起),可实现强劲的视频编解码能力,性价比不是一般的高。

      本节内容基于T113-i通过官方xplayerdemo案例演示H.265解码功能,支持最大分辨率为4K@30fps。案例源码位于T113-i产品资料LinuxSDK安装包的"/T113-i_v1.0/platform/framework/cedarx/xplayer/"目录下。

      640 (1).jpg

      首先,将评估板HDMI OUT接口连接至HDMI显示屏。评估板上电启动,将产品资料“4-软件资料\Demo\video-demos\”目录下的video-h265.mkv视频文件拷贝至评估板文件系统,执行如下命令关闭默认运行的Qt GUI显示程序。

      #killall Launcher
      #fbinit
      

      640 (2).jpg

      执行如下命令,运行官方案例xplayerdemo。

      #xplayerdemo
      

      640 (3).jpg

      执行如下命令,设置需要解码播放的视频文件。

      #set url: video-h265.mkv
      

      640 (4).jpg

      输入play命令解码播放视频,可看到HDMI显示屏输出视频。

      #play
      

      640 (5).jpg

      640 (6).jpg

      执行stop命令,停止视频解码。

      #stop
      

      640 (7).jpg

      发布在 创龙科技专区
      bayche
      bayche
    • 已知能用V85x芯片制作的一些小玩意

      V851SE智能小相机

      228D92B9-A0A8-41b3-9226-401972F625F0.png

      ezgif.com-optimize (4).gif

      1421107658-1-192-ezgif.com-optimize.gif

      V851S赛博魔杖

      LEVCx35psWejdBBFMo8IyOREKoq44L2Pgvj8vZlB.jpeg

      640 (6).gif

      640 (8).gif

      V853无人机机载视觉中枢

      1670480165307-resized.jpg

      pcb仿真图.jpg

      V853多功能串口服务器

      微信图片_20230629094657.png

      微信图片_20230629094700.png

      V853得力智能云考勤机

      94591A29-0DDE-46b3-99D1-BFEE8E3A9ADD.png

      创维小湃AI摄像机

      3997EC18-BEDA-402f-A6B4-1647BDA2DD53.png

      V853作业帮智能学习打印机

      206FAD70-6CA0-454f-A67D-143E852EB750.png

      EKEN低功耗智能摄像机

      AECCC91B-60BD-4c55-90F0-1B3A94444D31.png

      发布在 爱搞机专区
      bayche
      bayche
    • T113平台快速启动配置

      哪些应用场景需要快速启动

      很多应用场景对系统启动时间都有严苛的要求,例如在工业组态屏、工业HMI、机器人示教器、工业PLC、物联网网关、通讯管理机等应用场景对系统启动的时间都会有所要求。

      当系统启动时间过长时,用户需要很长时间才能开始使用系统,不仅会对产品的精准度和实时性有所影响,而且过长时间的启动也会导致系统资源浪费,例如电力和硬件资源。而优化启动时间可节省这些资源,从而提高系统的效率和可靠性。另外,在某些嵌入式系统和设备中,启动时间对于系统的稳定性和可靠性至关重要,因此尽可能缩短启动时间,以确保系统能够在最短的时间内启动至关重要。

      T113-i 系统快速启动实测数据

      为了满足客户需求,我司对T113-i原生系统进行剪裁,得到一个可快速启动的程序镜像。经测试,eMMC配置核心板从上电至进入文件系统的时间为4.3秒,从上电至显示Qt界面的时间为7.7秒。详细数据请参考如下表格:

      640 (1).png

      T113-i系统快速启动优化方法

      本节内容对T113-i(其他嵌入式平台亦可参考)Linux系统快速启动优化方法进行说明,主要通过对U-Boot、内核以及rcS启动脚本的修改,实现系统快速启动。下面以NAND FLASH配置TLT113-EVM评估板为例进行方法示例,TLT113-MiniEVM或eMMC配置评估板注意修改的文件路径有所不同。

      (1) U-Boot快速启动优化。

      修改延时bootdelay为0秒,可缩减bootdelay延时。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:

      "device/config/chips/t113_i/configs/tlt113-evm-nand/longan/env.cfg".
      

      640 (2).png

      关闭boot0和U-Boot调试信息打印,启动时间可缩短约1秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:

      "device/config/chips/t113_i/configs/tlt113-evm-nand/uboot-board.dts"
      
      "device/config/chips/t113_i/configs/tlt113-evm-nand/sys_config.fex"
      

      640 (3).png

      640 (4).png

      (2) 内核快速启动优化。

      由于random设备初始化太慢,应用程序调用random的函数时可能被阻塞,导致应用启动慢,因此可通过关闭crng_ready()功能从而缩短启动时间,关闭crng_ready()功能后启动时间可缩短2~3秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:

      "kernel/linux-5.4/drivers/char/random.c"
      

      640 (5).png

      通过修改串口打印优先级,关闭串口内核启动信息打印从而缩短启动时间。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:

      "device/config/chips/t113_i/configs/tlt113-evm-nand/longan/env.cfg"
      

      640 (6).png

      (3) 文件系统快速启动优化。

      通过取消相关服务启动以及自动挂载功能,优先执行Qt程序,并且延时一段时间再执行其他功能。启动时间可缩短约10秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:

      "platform/framework/auto/rootfs/etc/init.d/rcS"
      

      640 (7).png

      如需关闭Qt Launcher,优化上电启动至进入文件系统的时间,需修改rcS脚本。修改内容如下:

      640 (8).png

      修改完成后,请参考我司的T113-i产品资料《Linux系统使用手册》文档,重新编译生成Linux系统镜像,同时参考《Linux系统启动卡制作及系统固化》文档,将Linux系统镜像文件固化至NAND FLASH或eMMC,再从NAND FLASH或eMMC上电启动即可。

      发布在 创龙科技专区
      bayche
      bayche
    • 回复: OKT507 -c在有交互按钮的界面显示AHD摄像头的影像该如何实现

      飞凌提供了一个关于camera的一个qt_demo程序,可以参考forlinx_desktop的源码中/OKT507-desktop-release/platform/framework/auto/qt_demo

      发布在 飞凌嵌入式专区
      bayche
      bayche
    • 回复: T507qt虚拟键盘二次开发

      @nzdzhd
      这是虚拟键盘存放路径,

      Image_20230911085535.png.thumb.jpg

      可以先尝试修改/home/forlinx/work/OKT507-linux-sdk/platform/framework/auto/sdk_lib/DWKeyboard/src路径下的inputview.cpp文件,具体路径根据你的源码解压路径而定。

      /home/forlinx/work/OKT507-linux-sdk/platform/framework/auto/sdk_lib/DWKeyboard这个路径是所调用的虚拟键盘qt工程的存放位置,改完之后需要修改该路径下Makefile里编写的一些路径,推荐用别的代码编辑器批量替换,因为有700多处需要改,改完之后该路径下执行make生成新的可执行文件,然后回到源码路径全编译,打包新镜像烧写即可

      发布在 飞凌嵌入式专区
      bayche
      bayche
    • 回复: 关于T113-i的核心板GPIO号查询和/sys/class/spidev目录下找不到设备

      gpio可以用/sys/class/gpio/export导出对应引脚文件后操作,spidev需要添加驱动到设备文件dts里

      发布在 创龙科技专区
      bayche
      bayche
    • 回复: [SND_ERR][xrun:931]Underrun occure!!! xrun_cnt=1 这是什么意思,偶尔会碰到。欠压吗

      @newcastle wifi的报错,可以暂时无视

      发布在 A Series
      bayche
      bayche
    • 把眼镜困在屏幕里!在米尔T113开发板上做一个简易人体传感器

      1. 下载

      从米尔电子官方下载站:http://down.myir-tech.com/MYD-YT113X/ 下载相关资料

      1695801977-661874-image.png

      2.解压源码包,配置工具链,建议开发使用 Ubuntu 20.04 系统。

      $ unzip 04_Sources.zip
      $ tar -jxf YT113X-buildroot-t1-5.4.61-1.0.0.tar.bz2
      $ mkdir -p arm_gcc_linaro_5.3.1
      $ tar -xvf gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi-qt5.12.5-myir.tar.bz2
      $ mv gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/ ./arm_gcc_linaro_5.3.1
      

      将工具链配置到系统环境变量中:

      $ vim ~/.bashrc
      

      在文件最后加上一行:

      export PATH="$PATH:/home/ubuntu/workspace/arm_gcc_linaro_5.3.1/bin"
      

      保存退出

      使环境变量生效:

      $ source ~/.bashrc
      

      3.进入源码目录进行编译

      $ cd auto-t113-linux/
      $ ./build.sh config
      

      参考米尔官方文档选择即可,都选默认的就行,就是需要注意一下带屏版本的话,板子选择 myir_emmc_full 型号

      配置完成后进行编译:
      $ ./build.sh
      

      对于编译过程中报错,参考米尔官方文档进行修改,主要修改如下两个文件:

      vim out/t113/myir_emmc_full/longan/buildroot/build/host-libglib2-2.56.3/gio/gdbusauth.c
      vim out/t113/myir_emmc_full/longan/buildroot/build/host-libglib2-2.56.3/gio/gdbusmessage.c
      

      然后继续编译

      $ ./build.sh
      

      再次编译报错后,修改如下几个文件。Makefile、Makefile.am、Makefile.in、mkstrtable.awk 里的 namespace 都改为 pkg_namespace,然后重新执行编译命令即可

      vim out/t113/myir_emmc_full/longan/buildroot/build/libgpg-error-1.33/src/Makefile.am
      vim out/t113/myir_emmc_full/longan/buildroot/build/libgpg-error-1.33/src/Makefile.in
      vim out/t113/myir_emmc_full/longan/buildroot/build/libgpg-error-1.33/src/mkstrtable.awk
      

      理论上到这里就可以编译通过了,然后在编译 qt

      4.编译 qt

      $ ./build.sh qt
      $ ./build.sh pack
      

      打包输出镜像
      但是默认输出的镜像没有使能 usb 串口功能,我们需要自己加上 ch340 cp2012 fdti 等常见的 usb 串口驱动。

      5.添加 kernel 串口驱动

      $ cd kernel/linux-5.4/
      $ make ARCH=arm myir_emmc_full_defconfig
      $ make ARCH=arm menuconfig
      

      在 kernel 驱动中找到你需要使能的驱动,保存 menuconfig 即可。
      但是如果还是使用 ./build.sh 脚本编译的话,默认会配置会覆盖调你的配置,建议直接去修改 myir_emmc_full_defconfig 然后在重新编译 kernel 即可,同时也需要重新打包。

      $ vim arch/arm/configs/myir_emmc_full_defconfig
      

      6.参考米尔官方将固件烧写到 sd 中,然后重新上电,系统就会自动加载 sd 镜像到 emmc 中。就相当于重新刷机了,后面就可以把 sd 下了。(已经刷好了,不用在重新刷机了)

      7.首先将毫米波人体传感器接在 usb 串口上,然后在系统上电,上电启动后,将会自动打开 QT应用程序

      8. 注意

      • 在编译 qt 的时候存在一些问题,需要注意,有几个库不存在,用软连接的方式绕过了。

      • 设置 qt 远程调试,因为没有密码,需要改成密钥的方式。

      • 在远程调试 qt 程序时,还需要把 qtenv.sh 的环境变量设置到 /etc/profile 变成全局的才可以。

      发布在 爱搞机专区
      bayche
      bayche
    • 回复: 按照文档的教程用SPI驱动LCD屏幕初始化失败

      你这是用dbi协议来驱动了,去这个位置hal/source/spilcd/lcd/lcd什么什么feature把dbi那个define注释掉,像下面这样应该就可以了

      微信图片_20231017100043.png

      发布在 A Series
      bayche
      bayche
    • 回复: R128 RTOS编译失败

      arm和riscv需要分别进行编译

      发布在 A Series
      bayche
      bayche
    • 回复: R128蓝牙占用内存资源较大,修改menuconfig配置后经常编译不过或无法运行

      CONFIG_BT_VAR_MEM_DYNC_ALLOC配置问题,修改方法如下。,即交换

      _net_buf_pool_list_end = .;
      

      和

      KEEP(*(SORT_BY_NAME("._net_buf_pool.static.*")))
      

      这两行

      diff --git a/include/ble/linker/common-ram.ld b/include/ble/linker/common-ram.ld
      index e97433c91..40744e392 100755
      --- a/include/ble/linker/common-ram.ld
      +++ b/include/ble/linker/common-ram.ld
      @@ -84,8 +84,8 @@
              {
                      _net_buf_pool_list_start = .;
                      _net_buf_pool_list = .;
                      KEEP(*(SORT_BY_NAME("._net_buf_pool.static.*")))
                      _net_buf_pool_list_end = .;
              } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
      
      发布在 A Series
      bayche
      bayche
    • 回复: 如何将R128的lspsram频率提高至200M?

      一、修改频率方法

      首先通过cboot0命令,跳转到boot0的代码中,路径为:
      ${root_dir}/lichee/brandy-2.0/spl/

      找到lspsram的代码,路径为:
      ${root_dir}/lichee/brandy-2.0/spl/drivers/psram

      修改头文件,将200M的宏打开,修改如下:

      vi hal_psramctrl.h
      
      diff --git a/drivers/psram/hal_psramctrl.h b/drivers/psram/hal_psramctrl.h
      index a552a0e..114e330 100644
      --- a/drivers/psram/hal_psramctrl.h
      +++ b/drivers/psram/hal_psramctrl.h
      @@ -39,7 +39,7 @@
        * definition CONFIG_PSRAM_200M.
        */
      
      -// #define CONFIG_PSRAM_200M
      +#define CONFIG_PSRAM_200M
      
       /* CLK CTRL MODULE */
       #define BUS_CLK_GATING_CTRL0  0x4003c004
      

      然后重新编译boot0,就可以让lspsram初始化为200M了。

      mboot0 && pack
      

      ##二、根据log查看频率

      根据boot0的系统log,可以查看到当前lspsram加载的频率,如下图所示:

      downloadFileByUrl (2).png

      psram chip APS64 init ok!, freq 192000000
      

      证明当前加载的是lspsram型号为APS64,频率为192MHz。若将频率切换成200MHz,此处的打印就会改成"freq 200000000"。

      发布在 A Series
      bayche
      bayche
    • 总结几个R128在FreeRTOS + SPINAND 驱动下调试节点信息说明

      在全志提供的 R128等使用 FreeRTOS 系统的 SDK 中,若通过选择 CONFIG_DRIVERS_NAND_FLASH 选项支持 SPINAND 物料,待系统成功启动并识别、挂载 SPINAND 物料后,会在 /dev/ 目录下生成若个 SPINAND 驱动信息节点,可通过 cat 命令获取 SPINAND 驱动的一些信息。节点如下:

      1、/dev/nand_debug_arch 保存物料的配置信息。通过 cat /dev/nand_debug_arch 可获得下列类似信息:

      Model: GD5F1GQ4UBYIG      // 物料名称
      NandID: 0xffffd1c8        // 物料ID
      Size: 128M                // 物料容量
      DieCntPerChip: 1          // Die 数量
      SectCntPerPage: 4         // 每页中的 sector 数量
      PageCntPerBlk: 64         // 每块中的 page 数量
      BlkCntPerDie: 1024        // 每个 die 中的块数量
      OperationOpt: 0x66c
      AccessFreq: 100MHz        // SPI频率,不应该就是真正使用的频率,如果超过 SPI 控制器支持的最大频率,会调整为 SPI 控制器支持的最大频率
      SpiMode: 0                // SPI 模式
      pagewithbadflag: 0        // 坏块标志位置
      MultiPlaneBlockOffset: 1
      MaxEraseTimes: 50000
      MaxEccBits: 8
      EccLimitBits: 4
      Idnumber: 1
      EccType: 0x20008
      EccProtectedType: 0x4
      

      2、/dev/nand_debug_badblock 保存 SPINAND 驱动标志为坏块的数量。通过 cat /dev/nand_debug_badblock 可获得下列类似信息:

      cnt: 1     // 表示存在一个块被标记为坏块
      

      3、/dev/nand_debug_gcinfo 保存垃圾回收相关信息,垃圾回收是指将分散在各个块上的有效数据整合到一起。

      484 8 26 0 0 0/2 0/2    // 第一行内容,484表示剩余超级块数量(2个块表示1个超级块),8 表示当剩余超级块数量为8时启动垃圾回收,26 表示当剩余超级块数量为26时关闭垃圾回收
      
      发布在 A Series
      bayche
      bayche
    • 回复: 请问怎样才能让LVGL跑在R128的M33核呢

      去m33核打开,参考这里https://r128.docs.aw-ol.com/r128/rtos_manual/#_5

      发布在 A Series
      bayche
      bayche
    • 回复: R128触摸一直调不通,TWI接口的信号看逻辑分析仪不对,一直有抖动

      @haaland 不可以,twi是开漏输出内部上拉拉不动的。
      硬件spi发送初始化会出现超频问题,st7701s的spi通讯速率200K,硬件spi整个1M上去他就不认了

      发布在 A Series
      bayche
      bayche
    • 回复: R128触摸一直调不通,TWI接口的信号看逻辑分析仪不对,一直有抖动

      twi上拉了吗 没上拉会抖动

      发布在 A Series
      bayche
      bayche
    • 在Tina下使用LCD几个常见的异常问题调试方法

      该贴主要针对我们在使用LCD时出现的问题提供参考,LCD使用异常例如(缺少中断、fps不正确、屏幕不亮等)

      遇到LCD使用异常情况下的常规分析步骤:

      1、检查LCD驱动、配置是否正确
      2、检查pin脚是否连接正确(根据板子和原理图以及spec文档、屏幕规格书进行检查)
      3、检查LCD硬件通路是否有问题
      4、测量Vsync、Hsync、clk等信号是否正常

      1、屏幕不亮,无背光
      有可能是驱动加载失败,检查开机logo看屏驱动是否加载,驱动没有加载屏驱动,导致背光电源相关函数没有运行到。

      2、pwm 配置和背光电路的问题,pwm 的信息可以看pwm 信息和背光相关参数,另外就是直接测量下硬件测量下相关管脚和电压,再检查屏是否初始化成功。

      查看显示信息:cat /sys/class/disp/disp/attr/sys
      从中可以看出是否有中断,fps是否正确
      fps一般是60,如果不是需要检查dts
      屏时序需要原厂进行提供
      例如:通过询问屏厂获得了屏的时序参数如下:

      Width-200,Height-400,HBP-120,HFP-130,HSW-60,VBP-20,VFP-40,VSW-40。
      lcd_x:屏分辨率中的宽
      lcd_y:屏分辨率中的高
      lcd_hspw:单位为1个dclk的时间,对应屏厂HSW
      lcd_hbp:包含了hspw段,也就是lcd_hbp = 实际的hbp + 实际的hspw。对应屏厂HBP+HSW。
      lcd_ht:lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp。对应屏厂Width+HSW+HBP+HFP。
      lcd_vspw:指场同步信号的宽度,对应屏厂VSW
      lcd_vbp:lcd_vbp = 实际的vbp + 实际的vspw。对应屏厂VBP+VSW
      lcd_vt:lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp。对应屏厂Height+VSW+VBP+VFP。
      lcd_dclk_freq:传输像素传送频率,lcd_dclk_freq = lcd_ht * lcd_vt * fps,fps一般是60。
      

      那么,对board.dts文件中的屏时序相关参数配置如下:

      lcd_x               = <200>;
          lcd_y               = <400>;
          lcd_dclk_freq       = <15>;
      
          lcd_hbp             = <180>;
          lcd_ht              = <510>;
          lcd_hspw            = <60>;
          lcd_vbp             = <60>;
          lcd_vt              = <500>;
          lcd_vspw            = <40>;
      

      3、如果配置对了还是没有显示,需要看uboot显示是否打开了

      查看env中的deconfig是那个,并且在lichee/brandy-2.0/u-boot-2018/configs路径下将文件中的disp也就是uboot显示关了,记得执行muboot

      4、如果上述这些都没有问题,并且屏幕还是出现无法显示的问题

      • 要进行测量波形,进一步通过hsync,vsync、de、clk、数据脚去判断那个没有配置正确。
      • 指令:cd /sys/class/sunxi_dump;echo 0x*****> dump; cat dump; 打印信息.看寄存器是否配置正确
      发布在 V Series
      bayche
      bayche
    • linux的qspi接nor flash 读写

      linux的qspi接nor flash只能1线写嘛?不能4线写。感觉我设备树都配置对了,但是内核传给我的数据还是让我1线发。

      发布在 Linux
      bayche
      bayche
    • 扔掉你的开发板,跟我玩Mcore-h616

      本文转载自WhyCan Forum(哇酷开发者社区):
      扔掉你的开发板,跟我玩Mcore-h616
      https://whycan.com/t_10024.html

      作者@leefei

      这是一个1.69寸触摸小电视。使用全志H616芯片,板上硬件有mpu6050陀螺仪,USB转ttl调试串口,一个USB接口,WIFI&蓝牙,一个喇叭,一个麦克风,当然还有一个1.69寸触摸手表屏。

      QQ截图20230817130617.png

      QQ截图20230817130635.png

      QQ截图20230817130857.png

      下载固件:
      https://pan.baidu.com/s/1Ct4KoG4lZ_wgYZnb8yTmFQ?pwd=26hw

      下载完解压得到Mcore-h616.img

      TF 卡使用SDFormatter格式化一下,然后使用dd命令烧录,不要忘了sync同步一下

      $ sudo dd if=./Mcore-h616.img of=/dev/sdb bs=1M
      $ sync
      

      烧录完成,TF卡插小电视上开机,通过usb串口调试,账号密码都是root

      扩容:

      # cfdisk /dev/mmcblk0
      

      上下键选中 /dev/mmcblk0p2 左右键选中 [ Resize ] 回车,再回车,然后 左右键选中 [ Write ] 回车 输入yes再回车。最后左右键选中 [ Quit ]退出,
      然后

      # resize2fs /dev/mmcblk0p2
      

      QQ截图20230817182444.png
      播放音乐:

      # mplayer /1.mp3
      

      录音:

      按键盘tab键切换到mic音量调节界面,按键盘上键调到最大,按Esc键退出

      # alsamixer
      

      QQ截图20230817183323.png

      开始录音:

      # arecord -f cd -d 20 /1.wav
      

      完成后播放:

      # mplayer /1.wav
      

      触摸测试:

      # hexdump /dev/input/event1
      

      滑动触摸屏,有数据打印,就证明触摸是好的

      陀螺仪测试:

      # cat /sys/bus/iio/devices/iio\:device0/in_accel_x_raw
      

      会打印一个数值,倾斜一下板子的角度,再执行上面这条命令,打印数值会变大或者变小

      WIFI连接:

      # nmtui
      

      这个图形化连接的,输入密码就可以了。就不展示了

      蓝牙:

      # hciconfig -a
      # hciconfig hci0 up
      # hcitool scan
      # l2ping  扫描出来的蓝牙设备地址
      
      发布在 H/F/TV Series
      bayche
      bayche
    • 回复: 开发板上不能运行应用程序提示not found

      我也遇到相同的问题,尝试以下方法

      1. objdump -x 文件 | grep NEEDED
        2.在开发板环境输入env查看环境变量
        3、把你需要的库复制到开发板提示库文件的位置
        4、把你复制的文件全部添加可执行的权限,
        应该可以解决你的问题
      发布在 MR Series
      bayche
      bayche
    • 芒果派MangoPi MQ Pro构建sqlite3并进行性能测试

      HelloeWorld一下

      得益于开发板运行armbian系统,具备了完整的开发环境,可以直接板上开发,避免了交叉编译的麻烦。

      vi helloworld.c
      

      按i 进入输入模式输入以下内容

      wKgZomTn9VaAM3B7AAKO2VOuPTA310.png

      按esc

      输入:进入命令模式

      输入wq保存

      编译

      gcc helloworld.c -o helloworld
      

      运行./helloworld打印如下

      wKgaomTn9VuAUMHlAAHLOPtahTY204.png

      数据库性能测试

      下载代码

      git clone https://github.com/sqlite/sqlite.git
      
      cd sqlite/
      

      配置

      ./configure
      

      构建

      time make
      

      花了56分钟左右,对于这么大大量代码的构建还是可以接受的。

      一般个人项目不会有这么大规模,板上构建完全没问题。

      wKgZomTn9WOALCw2AA32EBxJ6ps717.png

      安装

      sudo make install
      

      wKgaomTn9WeAL2uXAA32ELnSeBs332.png

      编译

      gcc test/speedtest1.c -o speedtest1 -lpthread -ldl -lsqlite3
      
      ./speedtest1
      

      运行测试

      ./speedtest1
      

      wKgaomTn9W-AOb7xAA32EOoZuZ8073.png

      可以看到直接板上进行一般项目开发完全没问题,
      sqlite3数据库性能测试表现也不错。

      发布在 MR Series
      bayche
      bayche
    • 回复: Lichee RV Dock的 type-c 支持网口吗?

      usb可以用 usb千兆网卡试试,理论上可以,实操应该会很多坑

      发布在 MR Series
      bayche
      bayche
    • 芒果派MQ Quad Android10的体验

      芒果派MangoPi MQ Quad SBC比较小巧,若能弄起来看个小视频最好了。

      1、固件下载&烧录

      芒果官方提供Android10固件下载

      Android固件一定要用PhoenixCard烧写到TF卡,而且记得选择“启动卡”模式。

      wKgaomS8nX6APV0MAABQ2UL8M0w101.png

      写完后插入芒果派MangoPi MQ Quad上电。

      2、Android体验

      启动画面有H616的LOGO,强调下四核。

      wKgaomS8nl6AURnDAAFfeekBvVk779.png

      然后全志的动画。

      wKgZomS8nneAdI7OAAQYa1lhvgE623.png

      运行界面,该有的都有,界面看起来色彩斑斓,其他APP需要联网下载install。

      wKgaomS8nrOAWjvbAAW6MeZJVqA983.png

      3、视频体验

      装个bilibili吧。

      选择32位的装好了,不知道为什么64位的装不上,中间有点花屏。好歹装上了…

      wKgaomS8nyWAMwfEAAasMWSwCO4732.png

      打开看看,估计1G ram的缘故,打开速度有点慢。

      wKgZomS8n2eAAjCQAAcNMsQCfWg234.png
      看个小视频,装了个手机版APP,应该上pad版,效果不错,视频流畅无卡顿。

      wKgZomS8n5WAMrXeAAZqyGD0x5I188.png
      总体感受不错,看看在线视频很方便,要是2G RAM就更加好了,反正最近RAM不值钱。

      发布在 H/F/TV Series
      bayche
      bayche
    • 麦当劳的点单系统居然是linux

      微信图片_20230801100430.png

      发布在 灌水区
      bayche
      bayche
    • 回复: 创龙A40i的板子,build pack的时候出错

      @ddrddr apt install busybox

      发布在 创龙科技专区
      bayche
      bayche
    • 最近在考虑Zero3了 H618内核源码上主线没?

      如题,
      还有就是618和616的资源通用吗?

      发布在 H/F/TV Series
      bayche
      bayche
    • 虚拟机里面的中英文输入法怎么切换

      请教一下各位大佬,

      有没有遇到过,虚拟机里面的中文输入法好用,qtCreator写代码时中文输入法就切不过去了?

      发布在 Linux
      bayche
      bayche
    • 全志v853 nspr build错误

      在menuconfig 里将qt-core编译进内核后显示nspr build failed ,在library中选择nspr 后重新编译 依然报nspr build failde ,请问如何解决这个错误

      发布在 V Series
      bayche
      bayche
    • 回复: 请问T113-S3一直运行不稳定,请问可能是有哪些原因啊?

      我也遇到过,之前的情况时usb电压不够导致不稳定,外接个电压试试

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: 米尔T507找不到gpu/dump这个节点

      是不是先要挂载个debugfs,才能用?

      参考这个链接:https://blog.csdn.net/Mculover666/article/details/124455606

      QQ图片20230718092612.jpg

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 芒果派H616开发板开箱与Debian系统体验

      既然是tiny-tiny-tiny SBC,那么卡就很小了,拿到后的确够cute够tiny。

      wKgZomSa_FKALLodAAJTTLJayFw620 (1).jpg

      拿到的芒果派MangoPi MQ Quad是猛男粉,板子自带天线、OTG USB转接头,还有颜色排针(这个很方便)。

      wKgaomSa_NWAHwGEAAVIBSOANoU438.jpg

      芒果派MangoPi MQ Quad搭载全志的H616 SoC,提供1G Byte的内存,WIFI模组为Realtek RTL8723DS。

      H616 SoC功能非常强大,包括四核 Cortex-A53 @ 1.5GHz,带 Mali-G31 MP2 GPU,支持 OpenGL 3.2、Vulkan 1.1、OpenCL 2.0 API。

      wKgZomSa_4GAHEe_AANGf6JOoKQ590.png

      wKgaomSbABqAB4jvAAQ1hTVSBtg306.png

      支持IEEE 802.11b/g/n协议
      2.4GHz支持20/40MHz
      支持WLAN SDIO和蓝牙Uart接口
      支持蓝牙V2.1+EDR/3.0/3.0+HS/BLE4.2

      芒果派MangoPi MQ Quad支持Android10、Debian以及全志的Tina-Linux,网上很多人选择Android10用于看电视,个人比较系统Debian,所以直接烧写Debian。

      从百度云(Debian_bullseye_desktop_xfce_linux5.16.17_mqquad_ephy_root_orangepi.img.gz_免费高速下载|百度网盘-分享无限制 (baidu.com))下载芒果派MangoPi MQ Quad的Debian系统,准备一张32G 的TF卡,通过Win32DiskImager烧入TF卡。

      通电,接上HDMI,因为芒果派MangoPi MQ Quad比较tiny,所以HDMI需要一个转接头。

      wKgZomSbAfqAU4qXAAag-sS-5Xg346.jpg

      等一会进入Debian系统,因为没用贴上金属散热片,SoC有点热,稳定再60度左右。

      wKgaomSbAqyAbln_AAWHjRS9dNc663.jpg

      基本的系统功能都具备,受限于1G RAM,感觉图形界面下的操作还是能微微感觉有点迟滞。

      wKgZomSbBCWALVHJAAfrai-0eYQ876.jpg

      发布在 H/F/TV Series
      bayche
      bayche
    • 回复: 全志V3S嵌入式驱动开发 - 驱动开发合集

      音频输出和音频录制

      之前在芯片公司的时候,基本没有看过音频这一块,只知道有个alsa框架这么个知识点。要驱动音频,需要两部分,一部分就是底层驱动,一部分就是alsa上层接口,两者缺一不可。对于荔枝派来说,底层的驱动其实都已经包含在linux kernel里面了,客户只要自己port好一个alsa库,或者类alsa库,就可以开始播放音频、录制音频了。

      1、电路

      电路分成两个部分,一个是mic,也就是麦克风,录制音频用,

      27c4b9919eb34cc98650b6ea2db670ef.png

      另外一个是headphone,也就是耳机,输出音频用,

      fd7814995c2a4cd2be5c48b1a36c5e08.png

      不管是哪一个电路,通过观察发现,电路中并没有音频电路经常出现的iis接口。这就说明,v3s和网卡一样,本身已经集成了数模转换和功放功能了,不需要额外芯片了。遇到这种情况,一般soc厂商都会自己默默把驱动代码准备好,省着使用者去二次开发了。毕竟都是自己的东西,驱动写起来也得心应手,不用外人劳神劳力了。

      2、设备树

      本次使用的内核依然是linux-zero-4.14.y,顶层设备树是 sun8i-v3s-licheepi-zero-dock.dts。查看一下设备树的内容,可以发现声卡驱动已经集成到里面了,

      &codec {
      	allwinner,audio-routing =
      		"Headphone", "HP",
      		"Headphone", "HPCOM",
      		"MIC1", "Mic",
      		"Mic",  "HBIAS";
      	status = "okay";
      };
      

      当然仅仅有这些还是不够的,进一步阅读sun8i-v3s.dtsi文件,可以看到codec的具体实现细节,

      codec: codec@01c22c00 {
      			#sound-dai-cells = <0>;
      			compatible = "allwinner,sun8i-v3s-codec";
      			reg = <0x01c22c00 0x400>;
      			interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
      			clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_AC_DIG>;
      			clock-names = "apb", "codec";
      			resets = <&ccu RST_BUS_CODEC>;
      			dmas = <&dma 15>, <&dma 15>;
      			dma-names = "rx", "tx";
      			allwinner,codec-analog-controls = <&codec_analog>;
      			status = "disabled";
      		};
       
      		codec_analog: codec-analog@01c23000 {
      			compatible = "allwinner,sun8i-v3s-codec-analog";
      			reg = <0x01c23000 0x4>;
      		};
      

      有了这两个配置,基本上声卡驱动就有保证了。好在这些都是默认配置,对于用户来说,就是什么都不需要做,系统上电后,声卡就已经加载好了。

      3、判断声卡是否正确加载

      判断声卡有没有加载好,主要有两个办法。第一,就是看内核启动日志;第二,就是看/dev/snd下面的节点有没有正确生成。查看日志的话,如果启动ok,应该是可以看到这些打印的,

      [    1.380188] sun4i-codec 1c22c00.codec: Codec <-> 1c22c00.codec mapping ok
      [    1.388822] sun6i-rtc 1c20400.rtc: setting system clock to 1970-01-01 00:00:40 UTC (40)
      [    1.397167] vcc5v0: disabling
      [    1.400142] ALSA device list:
      [    1.403106]   #0: V3s Audio Codec
      

      不放心日志的话,可以输入ls -l /dev/snd进一步确认下,

      # ls -l /dev/snd
      total 0
      crw-------    1 root     root      116,   0 Jan  1 00:00 controlC0
      crw-------    1 root     root      116,  24 Jan  1 00:00 pcmC0D0c
      crw-------    1 root     root      116,  16 Jan  1 00:00 pcmC0D0p
      crw-------    1 root     root      116,  33 Jan  1 00:00 timer
      

      另外,也可以查看下/sys/class/sound下面的节点,也可以算是一种方法,

      # cd /sys/class/sound/
      # ls
      card0      controlC0  pcmC0D0c   pcmC0D0p   timer
      

      不管是哪一种方法,基本上看到这些打印或者节点信息,就可以认为声卡被系统正确加载了。

      4、编译安装TinyAlsa

      前面我们说过,如果需要让声卡驱动起来,除了驱动本身之外,还需要一个alsa的库。TinyAlsa就是比较适合使用的那个库,下载位置在这,

      https://github.com/tinyalsa/tinyalsa
      

      下载好压缩包之后,拷贝到ubuntu虚拟机,直接用arm-linux-gnueabihf-交叉编译器来编译。解压一下,接着cd到解压目录后,直接输入这个命令,

      make CROSS_COMPILE=arm-linux-gnueabihf-
      

      不出意外的话,在utils子目录下面,就可以看到四个编译好的工具,

      tinycap
      tinymix
      tinypcminfo
      tinyplay
      

      通过观察编译日志,发现这四个程序都是静态链接libtinyalsa.a,所以直接拷贝四个文件即可,不需要拷贝其他动态库。

      make -C src
      make[1]: Entering directory '/home/feixiaoxing/Desktop/tinyalsa-master/src'
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o limits.o limits.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o mixer.o mixer.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o pcm.o pcm.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o pcm_plugin.o pcm_plugin.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o pcm_hw.o pcm_hw.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o snd_card_plugin.o snd_card_plugin.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o mixer_plugin.o mixer_plugin.c
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC    -c -o mixer_hw.o mixer_hw.c
      arm-linux-gnueabihf-ar rv libtinyalsa.a limits.o mixer.o pcm.o pcm_plugin.o pcm_hw.o snd_card_plugin.o mixer_plugin.o mixer_hw.o
      arm-linux-gnueabihf-ar: creating libtinyalsa.a
      a - limits.o
      a - mixer.o
      a - pcm.o
      a - pcm_plugin.o
      a - pcm_hw.o
      a - snd_card_plugin.o
      a - mixer_plugin.o
      a - mixer_hw.o
      arm-linux-gnueabihf-gcc  -shared -Wl,-soname,libtinyalsa.so.2 limits.o mixer.o pcm.o pcm_plugin.o pcm_hw.o snd_card_plugin.o mixer_plugin.o mixer_hw.o -o libtinyalsa.so.2.0.0
      ln -sf libtinyalsa.so.2.0.0 libtinyalsa.so.2
      ln -sf libtinyalsa.so.2 libtinyalsa.so
      make[1]: Leaving directory '/home/feixiaoxing/Desktop/tinyalsa-master/src'
      make -C utils
      make[1]: Entering directory '/home/feixiaoxing/Desktop/tinyalsa-master/utils'
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC -O2   -c -o tinyplay.o tinyplay.c
      arm-linux-gnueabihf-gcc -L ../src -pie  tinyplay.o ../src/libtinyalsa.a  -ldl -o tinyplay
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC -O2   -c -o tinycap.o tinycap.c
      arm-linux-gnueabihf-gcc -L ../src -pie  tinycap.o ../src/libtinyalsa.a  -ldl -o tinycap
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC -O2   -c -o tinymix.o tinymix.c
      arm-linux-gnueabihf-gcc -L ../src -pie  tinymix.o ../src/libtinyalsa.a  -ldl -o tinymix
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include -fPIC -O2   -c -o tinypcminfo.o tinypcminfo.c
      arm-linux-gnueabihf-gcc -L ../src -pie  tinypcminfo.o ../src/libtinyalsa.a  -ldl -o tinypcminfo
      make[1]: Leaving directory '/home/feixiaoxing/Desktop/tinyalsa-master/utils'
      make -C doxygen
      make[1]: Entering directory '/home/feixiaoxing/Desktop/tinyalsa-master/doxygen'
      Makefile:11: "doxygen is not available please install it"
      make[1]: Nothing to be done for 'all'.
      make[1]: Leaving directory '/home/feixiaoxing/Desktop/tinyalsa-master/doxygen'
      make -C examples
      make[1]: Entering directory '/home/feixiaoxing/Desktop/tinyalsa-master/examples'
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include    pcm-readi.c ../src/libtinyalsa.so  -ldl -o pcm-readi
      arm-linux-gnueabihf-gcc -Wall -Wextra -Werror -Wfatal-errors -I ../include    pcm-writei.c ../src/libtinyalsa.so  -ldl -o pcm-writei
      make[1]: Leaving directory '/home/feixiaoxing/Desktop/tinyalsa-master/examples'
      

      如何把四个文件拷贝到开发板,这个就不再赘述了。主要还是使用python http库和开发板上的wget命令来共同完成的。

      5、寻找音频文件

      目前,tinyalsa的工具只能播放wav文件,所以我们还需要找一个可以下载wav文件的网站。这里推荐一个网站链接给大家,

      https://www.xmwav.com/
      

      下载好音频文件之后,还是用同样的方法下载到开发板上面。

      6、播放音频和录制音频

      6.1 播放音频

      播放音频的时候,除了正常插入耳机,还有三个地方需要注意下,不然听不到音频输出。第一,就是打开播放开关;第二,设置音量;第三,确认下前面的设置有没有对。这三个步骤都做完了,就可以播放音频了。设置命令主要是tinymix,播放命令是tinyplay。

      # ./tinymix set 1 40
      # ./tinymix set 2 1
      # ./tinymix contents
      Number of controls: 13
      ctl	type	num	name                                    value
      0	INT	1	DAC Playback Volume                     63 (range 0->63)
      1	INT	1	Headphone Playback Volume               40 (range 0->63)
      2	BOOL	2	Headphone Playback Switch               On, Off
      3	INT	1	Mic1 Playback Volume                    3 (range 0->7)
      4	INT	1	Mic1 Boost Volume                       4 (range 0->7)
      5	INT	1	ADC Gain Capture Volume                 3 (range 0->7)
      6	BOOL	2	DAC Playback Switch                     Off, Off
      7	BOOL	2	DAC Reversed Playback Switch            Off, Off
      8	BOOL	2	Mic1 Playback Switch                    Off, Off
      9	BOOL	2	Mixer Capture Switch                    Off, Off
      10	BOOL	2	Mixer Reversed Capture Switch           Off, Off
      11	BOOL	2	Mic1 Capture Switch                     Off, Off
      12	ENUM	2	Headphone Source Playback Route         > DAC, Mixer, , > DAC, Mixer,
      

      播放刚才下载的音频,

      # ./tinyplay  test.wav 
      playing 'test.wav': 2 ch, 44100 hz, 16-bit signed PCM
      

      6.2 录制音频

      录制音频和播放音频差不多。第一步打开录制开关,第二步确认配置ok。前两步都做好了之后,就可以用tinycap录制音频了,结束录制用ctrl+c,

      # ./tinymix set 11 1
      # ./tinymix contents
      Number of controls: 13
      ctl	type	num	name                                    value
      0	INT	1	DAC Playback Volume                     63 (range 0->63)
      1	INT	1	Headphone Playback Volume               40 (range 0->63)
      2	BOOL	2	Headphone Playback Switch               On, Off
      3	INT	1	Mic1 Playback Volume                    3 (range 0->7)
      4	INT	1	Mic1 Boost Volume                       4 (range 0->7)
      5	INT	1	ADC Gain Capture Volume                 3 (range 0->7)
      6	BOOL	2	DAC Playback Switch                     Off, Off
      7	BOOL	2	DAC Reversed Playback Switch            Off, Off
      8	BOOL	2	Mic1 Playback Switch                    Off, Off
      9	BOOL	2	Mixer Capture Switch                    Off, Off
      10	BOOL	2	Mixer Reversed Capture Switch           Off, Off
      11	BOOL	2	Mic1 Capture Switch                     On, Off
      12	ENUM	2	Headphone Source Playback Route         > DAC, Mixer, , > DAC, Mixer, 
      # ./tinycap record.wav
      Capturing sample: 2 ch, 48000 hz, 16 bit
      

      如果想要确认录制的音频有没有问题,那么直接用tinyplay播放下即可,

      # ./tinyplay record.wav 
      playing 'record.wav': 2 ch, 48000 hz, 16-bit signed PCM
      Played 1601536 bytes. Remains 0 bytes.
      
      发布在 爱搞机专区
      bayche
      bayche
    • 回复: Yuzuki Lizard V851S开发板 –获取正确的本地时间

      @ary_ye 有一点不同
      具体参考
      https://forums.100ask.net/t/topic/3021
      是基于docker版V851S开发环境

      发布在 V Series
      bayche
      bayche
    • 回复: Yuzuki Lizard V851S开发板 –获取正确的本地时间

      @ary_ye 你跑tina的话是没有systemd注册,ntpd是service用不了ntpdate

      发布在 V Series
      bayche
      bayche
    • 回复: 全志V3S嵌入式驱动开发 - 驱动开发合集

      gpio输出

      不管是对mcu,还是对soc来说,gpio肯定是越多越好。但是一个芯片上,它的引脚总是有限的,特别对于非BGA的soc来说,芯片又要做的小,引脚又要多,这几乎是不可能的。因此,在芯片领域,很多引脚功能都是复用的,至于选用哪一个功能完全看客户自己的选择,很多时候只能2选1,或者3选1。

      对于v3s也是一样的,从全志的芯片手册,也就是Allwinner_V3s_Datasheet_V1.0.pdf中的第53页,我们看到v3s中很多的功能也是复用的,

      3a0f61c49bb34afa8aca44af71f1e12c.png

      所以,大家如果在荔枝派中看到,给客户的引脚只有那么几个,这其实是误解。有很多的pin,如果不使用,完全可以拿过来直接当成gpio使用。

      1、使用spi接口当成gpio口

      070ef1ec2e34476bba6a9c4fd5d63418.png

      这张图我们已经使用过很多次。图中有一个spi接口,之前主要是用作norflash访问使用的。现在因为所有系统都保存在sd卡里面,因此完全可以用这个当成gpio使用。

      2、修改sun8i-v3s.dtsi文件

      首先注释掉之前spi0_pins这个部分,

      /*spi0_pins: spi0 {
      				pins = "PC0", "PC1", "PC2", "PC3";
      				function = "spi0";
      };*/
      

      接着注释掉spi0,

      /*spi0: spi@1c68000 {
      			compatible = "allwinner,sun8i-h3-spi";
      			reg = <0x01c68000 0x1000>;
      			interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
      			clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>;
      			clock-names = "ahb", "mod";
      			pinctrl-names = "default";
      			pinctrl-0 = <&spi0_pins>;
      			resets = <&ccu RST_BUS_SPI0>;
      			status = "disabled";
      			#address-cells = <1>;
      			#size-cells = <0>;
      		};*/
      

      注释掉这两部分呢,重新编译成sun8i-v3s-licheepi-zero-dock.dtb文件就可以了。细心的同学也许会看到sun8i-v3s-licheepi-zero.dts和sun8i-v3s-licheepi-zero-dock.dts这两个文件中均有leds的配置,是不是status设置为okay就好了?要注意它们的状态都是写死的,后期不能通过命令和配置的方法来解决,虽然启动后也可以在/sys/kernel/debug/gpio下面看到映射关系,这个需要注意下。

      3、重启开发板

      重启开发板之后,首先需要查看一下端口使用情况,没有debug信息,先要mount debugfs系统,

      mount -t debugfs debugfs /sys/kernel/debug
      

      加载好了之后,就可以看看端口的使用情况了,

      # cat /sys/kernel/debug/gpio
      gpiochip0: GPIOs 0-223, parent: platform/1c20800.pinctrl, 1c20800.pinctrl:
       gpio-166 (                    |usb0_id_det         ) in  lo
      

      看上去gpio情况还算正常。

      4、创建通道,开始设备外设

      看过上面一篇文章的同学,对于/sys/class/pwm里面的export不会陌生。但是pwm只有两个,分别是0和1,gpio这么多,我们怎么把这些pin和通道bind在一起呢?其实这里面是有规律的。首先我们找到一个pin,但不知道它的序号是多少,那可以先找到名称,比如SPI_CS,

      8de808b8d2c54627a8afcef1acace1ca.png

      接着看Allwinner_V3s_Datasheet_V1.0.pdf中的第54页,获取引脚名称,

      0da71c1c51604cb894cf905798405d85.png

      找到了这个信号叫PC2,下面就好办了。所有的端口一般都是channel = 32*x+y来实现的。PA、PB、PC...,这些代表x,分别是0、1、2...。而PC2中的2就代表y,如果是PB9,那么y就是9。所以对于PC2来说,channel = 32 * 2+ 2,也就是66,就是这么简单。那么,刚才说的PB9呢,它的channel = 32 * 1 + 9,应该就是41。

      说了这么多,下面开始实验,

      echo 66 > /sys/class/gpio/export
      echo out > /sys/class/gpio/gpio66/direction
      echo 1 > /sys/class/gpio/gpio66/value
      echo 0 > /sys/class/gpio/gpio66/value
      

      四条命令依次解释下,第一条创建channel 66。第二条呢,设定chanel 66的方向为输出。第三条,设置高电平,与此相对的,第四条就是设置低电平。

      为了验证设置的电平是不是正确,一个靠谱的办法就是在spi_cs处于高电平和低电平的时候都测量下,这样就知道电压有没有设置对了。

      71b7fa7e0c4d41cca98b88f726708f28.png

      发布在 爱搞机专区
      bayche
      bayche
    • 回复: 全志V3S嵌入式驱动开发 - 驱动开发合集

      PWM驱动

      pwm驱动也是常见的一种驱动方式。常见的pwm,其实就是一组方波,方波中的高低电平之比称之为空占比。通过调节这个空占比,可以实现不同的控制目的,比如说呼吸灯、电机控制等等。接下来,正好可以看看如何对v3s的pwm进行设置,以及如何在linux平台下使用pwm。

      1、pwm0和pwm1

      目前V3S支持两个pwm输出,分别是pwm0和pwm1。如下图所示,

      b4983719e5b14f359afa9c0e74f2167d.png

      2、要使能pwm功能,最主要就是修改设备树配置文件,

      第一,在sun8i-v3s.dtsi中,添加pwm0和pwm1节点,

      pwm0_pins: pwm0 {
      				pins = "PB4";
      				function = "pwm0";
      			};
       
      			pwm1_pins: pwm1 {
        			      	pins = "PB5";
           				function = "pwm1";
      			};
      

      第二,在sun8i-v3s-licheepi-zero.dts中使能pwm,

      &pwm {
                      pinctrl-names = "default";
                      pinctrl-0 = <&pwm0_pins>, <&pwm1_pins>;
                      status = "okay";
              };
      

      修改了这两个文件,下面要做的就是把他们编译成dtb,下载到sd卡里面,等待重启即可。注意,拷贝的dtb文件是un8i-v3s-licheepi-zero-dock.dtb。

      3、pwm驱动文件

      如果对驱动代码有兴趣,可以通过sun8i-v3s-pwm这个关键字去查找一下。查找后发现,相关的驱动文件名是drivers/pwm/pwm-sun4i.c,不想下载的朋友也可以在网上直接查看代码,链接地址如下所示,

      https://github.com/Lichee-Pi/linux/blob/zero-4.14.y/drivers/pwm/pwm-sun4i.c

      此外,之前这份驱动已经包含在了zImage里面,所以不需要重新编译内核。

      4、开始调试

      前面如果大家做过实验,就可以发现,如果我们没有修改设备树文件,那么发现在/sys/class/pwm节点下什么也没有。但是修改了之后,就会发现/sys/class/pwm一下子多了很多的内容,

      # cd /sys/class
      # cd pwm/
      # ls
      pwmchip0
      # cd pwmchip0/
      # ls
      device     export     npwm       power      subsystem  uevent     unexport
      # ls -l
      total 0
      lrwxrwxrwx    1 root     root             0 Jan  1 00:31 device -> ../../../1c21400.pwm
      --w-------    1 root     root          4096 Jan  1 00:31 export
      -r--r--r--    1 root     root          4096 Jan  1 00:31 npwm
      drwxr-xr-x    2 root     root             0 Jan  1 00:31 power
      lrwxrwxrwx    1 root     root             0 Jan  1 00:31 subsystem -> ../../../../../../class/pwm
      -rw-r--r--    1 root     root          4096 Jan  1 00:31 uevent
      --w-------    1 root     root          4096 Jan  1 00:31 unexport
      

      首先,我们可以通过export来使能通道,输入0就可以创建通道0,输入1就可以创建通道1,根据具体情况而定。

      # echo 0 > /sys/class/pwm/pwmchip0/export
      # ls
      device     npwm       pwm0       uevent
      export     power      subsystem  unexport
      # ls -l
      total 0
      lrwxrwxrwx    1 root     root             0 Jan  1 00:31 device -> ../../../1c21400.pwm
      --w-------    1 root     root          4096 Jan  1 00:31 export
      -r--r--r--    1 root     root          4096 Jan  1 00:31 npwm
      drwxr-xr-x    2 root     root             0 Jan  1 00:31 power
      drwxr-xr-x    3 root     root             0 Jan  1 00:31 pwm0
      lrwxrwxrwx    1 root     root             0 Jan  1 00:31 subsystem -> ../../../../../../class/pwm
      -rw-r--r--    1 root     root          4096 Jan  1 00:31 uevent
      --w-------    1 root     root          4096 Jan  1 00:31 unexport
      # echo 1 > /sys/class/pwm/pwmchip0/export
      # ls -l
      total 0
      lrwxrwxrwx    1 root     root             0 Jan  1 00:31 device -> ../../../1c21400.pwm
      --w-------    1 root     root          4096 Jan  1 00:31 export
      -r--r--r--    1 root     root          4096 Jan  1 00:31 npwm
      drwxr-xr-x    2 root     root             0 Jan  1 00:31 power
      drwxr-xr-x    3 root     root             0 Jan  1 00:31 pwm0
      drwxr-xr-x    3 root     root             0 Jan  1 00:31 pwm1
      lrwxrwxrwx    1 root     root             0 Jan  1 00:31 subsystem -> ../../../../../../class/pwm
      -rw-r--r--    1 root     root          4096 Jan  1 00:31 uevent
      --w-------    1 root     root          4096 Jan  1 00:31 unexport
      

      通道创建好了,就可以进入到通道里面,看看有哪些配置。以通道0为例,

      # cd pwm0
      # ls
      capture     enable      polarity    uevent
      duty_cycle  period      power
      # ls -l
      total 0
      -r--r--r--    1 root     root          4096 Jan  1 00:32 capture
      -rw-r--r--    1 root     root          4096 Jan  1 00:32 duty_cycle
      -rw-r--r--    1 root     root          4096 Jan  1 00:32 enable
      -rw-r--r--    1 root     root          4096 Jan  1 00:32 period
      -rw-r--r--    1 root     root          4096 Jan  1 00:32 polarity
      drwxr-xr-x    2 root     root             0 Jan  1 00:32 power
      

      简单来说,可以通过三个数值就可以实现最基本的pwm功能。其中period代表频率,duty_cycle代表空占比,enable代表使能开关,

      echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period
      echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
      echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
      echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
      

      假设cpu频率是1GHz,而我们希望得到的pwm频率是1000,那么这里的period就是1G/1000,而duty_cycle被设置成了500000,代表空占比是50%,enable为1代表打开,0则代表关闭。通道1也是这个道理,用同样的方法配置一下即可。

      5、实际测量和验证

      如果需要实际验证pwm的效果,最好有一个示波器,这样会比较方便一点,效果也比较明显。

      81dd38bc3e8f49c68202b988a76eadff.png

      发布在 爱搞机专区
      bayche
      bayche
    • 回复: 全志V3S嵌入式驱动开发 - 驱动开发合集

      多按键输入驱动

      前面我们说过,荔枝派的开发板上面,有4个按键本身不是通过gpio连接到soc上面的。它是通过ad的方法,连接到主芯片的。这个时候,不同的按键被按下的时候,就会生成不同的电压或者电流,那么完全可以根据对应的电信号,推算出当前是哪一个按键被按下去了。

      1、查找电路图

      04019fb44a2242199e6d5070eb68a44b.png

      简单看一下电路之后,下面就是去找设备树,对应的信号是什么、在哪里。

      2、查找设备树

      在sun8i-v3s-licheepi-zero-dock.dts文件当中,我们发现了这样的内容,

      &lradc {
      	vref-supply = <&reg_vcc3v0>;
      	status = "okay";
       
      	button@200 {
      		label = "Volume Up";
      		linux,code = <KEY_VOLUMEUP>;
      		channel = <0>;
      		voltage = <200000>;
      	};
       
      	button@400 {
      		label = "Volume Down";
      		linux,code = <KEY_VOLUMEDOWN>;
      		channel = <0>;
      		voltage = <400000>;
      	};
       
      	button@600 {
      		label = "Select";
      		linux,code = <KEY_SELECT>;
      		channel = <0>;
      		voltage = <600000>;
      	};
       
      	button@800 {
      		label = "Start";
      		linux,code = <KEY_OK>;
      		channel = <0>;
      		voltage = <800000>;
      	};
      };
      

      很明显,每一个button都是和电路中的按键是一一对应的,这个没有问题。那么,我们不禁还有一个疑问,既然是ad转换得到的结果,那么肯定要知道ad相关的设备配置是恶还那么。仔细找了一下,可以在sun8i-v3s.dtsi文件发现这样的内容,

      lradc: lradc@01c22800 {
      			compatible = "allwinner,sun4i-a10-lradc-keys";
      			reg = <0x01c22800 0x400>;
      			interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
      			status = "disabled";
      		};
      

      看到这里,大家应该放心了,确实是有这么一个ad的驱动。兼容的设备是sun4i-a10-lradc-keys,寄存器地址空间是0x01c22800,长度是0x400,中断是GIC_SPI类型,状态关闭。有了设备树,还有了兼容设备号,接下来的一步就是根据设备号sun4i-a10-lradc-keys找到对应的驱动文件。

      3、查找驱动代码,准备测试程序

      通过工具查找一下,不难发现,文件在这,即sun4i-lradc-keys.c,

      static const struct of_device_id sun4i_lradc_of_match[] = {
      	{ .compatible = "allwinner,sun4i-a10-lradc-keys", },
      	{ /* sentinel */ }
      };
      MODULE_DEVICE_TABLE(of, sun4i_lradc_of_match);
       
      static struct platform_driver sun4i_lradc_driver = {
      	.driver = {
      		.name	= "sun4i-a10-lradc-keys",
      		.of_match_table = of_match_ptr(sun4i_lradc_of_match),
      	},
      	.probe	= sun4i_lradc_probe,
      };
       
      module_platform_driver(sun4i_lradc_driver);
       
      MODULE_DESCRIPTION("Allwinner sun4i low res adc attached tablet keys driver");
      MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
      MODULE_LICENSE("GPL");
      

      大致看一下最后一段的代码,内容方面应该错不了。一般来说,如果按键ok的话,会在设备启动的时候生成个/dev/input/event0节点,此时,如果编写一个应用程序,读写这些节点,就完全可以获取相关的按键信息。所以,我们还得准备一个input.c的读写程序,

      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <unistd.h>
      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      #include <errno.h>
      #include <linux/input.h>
      #include <linux/input-event-codes.h>
       
      const char * path = "/dev/input/event0";
       
      int main(char argc,char *argv[])
      {
         int ret;
       
         int fd;
         struct input_event event;
       
         fd = open(path,O_RDONLY);
         if(fd < 0)
         {
            perror(path);
            exit(-1);
         }
       
         while(1)
         {
            ret = read(fd,&event,sizeof(struct input_event));
            if(ret == sizeof(struct input_event))
            {
                  if(event.type != EV_SYN)
                  {
                     printf("Event: time %ld.%ld,",event.time.tv_sec,event.time.tv_usec);
                     printf("type:%d,code:%d,value:%d\n", event.type,event.code,event.value);
                  }
            }
         }
       
         close(fd);
       
         return 0;
      }
      

      上面这段代码是从其他地方copy而来,谢谢了。准备好了程序之后,下面就是交叉编译,下载到开发板上面。但是实际运行的时候,发现按键被按下的时候,有三个按键的数值居然是一样的,都是352,另外一个是114。这就非常蹊跷了。

      4、发现问题、解决问题

      一般情况下,遇到这种情况,第一个怀疑的就是电阻坏了,R24、R25、R26、R27当中肯定有三个被击穿了,不然这种情况是说不过去的。于是,我们拿掉sd卡,让v3s继续跑之前norflash里面的嵌入式系统,输入key程序,也就是按键测试程序,没想到结果居然是正常的。这说明,硬件,没问题。问题出在上层应用或者驱动程序。

      回过头查看sun4i-lradc-keys.c,惊讶地发现电压判断标准是根据sun8i-v3s-licheepi-zero-dock.dts中的voltage来验证的,这并不符合实际的情况。我们通过printk&dmesg打印,也验证了这一想法,所以如果需要得到正确的按键数值,只需要修正一下sun4i-lradc-keys.c中的判断逻辑就可以了,修改方法如下,具体的标定数值可以做实验来解决,

      #if 0 // by feixiaoxing
      		voltage = val * lradc->vref / 63;
       
      		for (i = 0; i < lradc->chan0_map_count; i++) {
      			diff = abs(lradc->chan0_map[i].voltage - voltage);
      			if (diff < closest) {
      				closest = diff;
      				keycode = lradc->chan0_map[i].keycode;
      			}
      		}
      #else
      		printk("val = %d\n", val);
      		if(val >=9 && val <= 13)
      			keycode = lradc->chan0_map[0].keycode;
      		else if(val >=24 && val <= 29)
      			keycode = lradc->chan0_map[1].keycode;
      		else if(val >= 35 && val <= 40)
      			keycode = lradc->chan0_map[2].keycode;
      		else
      			keycode = lradc->chan0_map[3].keycode;
      #endif
      

      经过这一次修改,我们重新编译kernel内核,烧入zImage,启动后输入key程序,这样就得到了我们想要的最终结果,即稳定地输出按键值,

      # ./input 
      [    8.623196] val = 10
      Event: time 47.807318,type:1,code:115,value:1
      Event: time 48.78567,type:1,code:115,value:0
      [   10.920313] val = 26
      Event: time 50.104437,type:1,code:114,value:1
      Event: time 50.340531,type:1,code:114,value:0
      [   12.709584] val = 37
      Event: time 51.893708,type:1,code:353,value:1
      Event: time 52.141508,type:1,code:353,value:0
      [   14.549618] val = 45
      Event: time 53.733726,type:1,code:352,value:1
      Event: time 53.969827,type:1,code:352,value:0
      [   16.186513] val = 11
      Event: time 55.370623,type:1,code:115,value:1
      Event: time 55.645799,type:1,code:115,value:0
      [   17.514789] val = 27
      Event: time 56.698907,type:1,code:114,value:1
      Event: time 56.950631,type:1,code:114,value:0
      [   20.823740] val = 39
      Event: time 60.7851,type:1,code:353,value:1
      Event: time 60.279112,type:1,code:353,value:0
      [   21.987936] val = 44
      Event: time 61.172044,type:1,code:352,value:1
      Event: time 61.435486,type:1,code:352,value:0
      
      发布在 爱搞机专区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发 - 网卡驱动

      一开始上来就说网卡,好像有点不太对劲。这主要是因为如果开发板可以连接网络的话,可以帮我们节约很多的时间,开发效率也会得到提高。另外一方面,v3s自身也比较特殊,因为它自己集成了mac和phy,所以驱动本身并不是那么好写。好在v3s帮助客户做好了这一点,我们要做的只是需要把内核升级到4.14.y就可以,其他什么都不用做。

      查看翻了一下,在之前4.10.y版本里面,sun8i-v3s.dtsi文件当中根本没有emac的内容,但是在4.14.y当中,我们看到了相关的脚本,所以果断把内核切到4.14.y,

      55ccf0f66d024ff7bd2290313a40bfac.png

      1、第一步,重新编译内核和dtb文件

      注意更换zImage和sun8i-v3s-licheepi-zero-dock.dtb。其中设备树文件一定要跟着替换,这是至关重要的。有兴趣的同学,可以看这里的驱动代码

      https://github.com/Lichee-Pi/linux/blob/zero-4.14.y/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c
      

      2、启动开发板、插上网线

      buildroot login: root
      # ifconfig
      lo        Link encap:Local Loopback  
                inet addr:127.0.0.1  Mask:255.0.0.0
                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:1000 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      

      输入root密码之后,我们输入ifconfig,提示并没有网卡。这是什么情况?其实主要是因为还没有手动把网卡启动开来。只要输入ifconfig eth0 up即可,

      # ifconfig eth0 up
      [   13.914168] Generic PHY stmmac-0:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=stmmac-0:01, irq=POLL)
      [   13.926199] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
      [   13.933868] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
      # [   16.004609] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
       
      # ifconfig
      eth0      Link encap:Ethernet  HWaddr 02:00:A4:52:F3:CC  
                UP BROADCAST RUNNING MULTICAST  MTU:1500  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:1000 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
                Interrupt:38 
       
      lo        Link encap:Local Loopback  
                inet addr:127.0.0.1  Mask:255.0.0.0
                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:1000 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      

      这个时候再输入ifconfig,就会发现多了一个eth0的网卡。这就是需要配置的部分,继续输入ip、netmask和gateway。

      # ifconfig eth0 192.168.0.230 netmask 255.255.255.0 broadcast 192.168.0.1
      # ifconfig
      eth0      Link encap:Ethernet  HWaddr 02:00:A4:52:F3:CC  
                inet addr:192.168.0.230  Bcast:192.168.0.1  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:15 errors:0 dropped:0 overruns:0 frame:0
                TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000 
                RX bytes:1197 (1.1 KiB)  TX bytes:0 (0.0 B)
                Interrupt:38 
       
      lo        Link encap:Local Loopback  
                inet addr:127.0.0.1  Mask:255.0.0.0
                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:1000 
                RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
      
              通过ifconfig查看,可以发现当前addr、bcast和mask都已经配置上了。为了进一步验证判断开发板和电脑之间是否通信正常,可以输入ping命令来验证,
      
      # ping 192.168.0.101
      PING 192.168.0.101 (192.168.0.101): 56 data bytes
      64 bytes from 192.168.0.101: seq=0 ttl=128 time=28.197 ms
      64 bytes from 192.168.0.101: seq=1 ttl=128 time=48.854 ms
      64 bytes from 192.168.0.101: seq=2 ttl=128 time=1.981 ms
      64 bytes from 192.168.0.101: seq=3 ttl=128 time=96.510 ms
      64 bytes from 192.168.0.101: seq=4 ttl=128 time=3.070 ms
      ^C
      --- 192.168.0.101 ping statistics ---
      5 packets transmitted, 5 packets received, 0% packet loss
      round-trip min/avg/max = 1.981/35.722/96.510 ms
      

      从打印来看一切正常,没有什么问题。

      3、通过网络验证第一个用户侧程序

      开发到现在,我们还没有开发过应用程序。不妨写一个简单的hello来验证下,像这样,

      #include <stdio.h>
       
      int main(int argc, char* argv[])
      {
      	printf("hello, world!\n");
      	return 0;
      }
              使用交叉编译器编译一下即可,
      
      arm-linux-gnueabihf-gcc hello.c -g -o hello
      

      编译好了,关键是我们怎么把程序从虚拟机拷贝到开发板呢。关于这个流程,可以这么来做,首先,把程序从虚拟机拷贝到windows目录下,

      sudo cp hello /media/sf_Downloads/
      

      接着,对于hello所在的目录,用python命令将其设置为web服务器的起始目录,

      C:\Python39\python.exe  -m http.server 9000 --bind 192.168.0.101 -d C:\Users\feixiaoxing\Downloads
      

      最后一步就比较简单了,那就是用开发板上面的wget命令下载hello文件,

      # wget -c http://192.168.0.101:9000/hello
      Connecting to 192.168.0.101:9000 (192.168.0.101:9000)
      hello                100% |*******************************| 12264   0:00:00 ETA
      

      注意,这个时候,hello文件还没有被当成是可执行文件,所以需要chmod一下才能执行,

      # ls
      hello
      # chmod +x hello
      # ls
      hello
      # ./hello
      hello, world!
      

      4、继续验证第一个驱动文件

      前面我们说了应用程序是怎么写的,这个时候就可以看下驱动是怎么编写的,其实步骤差不多,首先准备驱动文件,

      #include <linux/init.h>
      #include <linux/sched.h>
      #include <linux/module.h>
       
      MODULE_LICENSE("GPL");
      MODULE_AUTHOR("feixiaoxing");
      MODULE_DESCRIPTION("This is just a hello module!\n");
       
      static int __init hello_init(void)
      {
              printk(KERN_EMERG "hello, init\n");
              return 0;
      }
       
      static void __exit hello_exit(void)
      {
              printk(KERN_EMERG "hello, exit\n");
      }
       
      module_init(hello_init);
      module_exit(hello_exit);
      

      因为驱动本身是和kernel强绑定在一起的,所以一般情况下还需要写一个makefile,其中KDIR的位置十分重要,

      ifneq ($(KERNELRELEASE),)
      obj-m := hello.o
       
      else
      PWD  := $(shell pwd)
      KDIR := /home/feixiaoxing/Desktop/linux-zero-4.14.y
      all:
      	$(MAKE) -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm
      clean:
      	rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *.symvers
      endif
      

      此时,所需要做的就是输入make命令即可,这样就可以生成ko文件。生成了hello.ko之后,接着就需要把这个文件copy到开发板上面,流程和copy应用层的执行文件是一样的,这里略过。

      # wget -c http://192.168.0.101:9000/hello.ko
      Connecting to 192.168.0.101:9000 (192.168.0.101:9000)
      hello.ko             100% |*******************************|  3340   0:00:00 ETA
      

      为了验证我们的驱动是否正确,可以通过insmod、lsmod和rmmod这个三个命令,并结合相关打印来综合进行判断。

      # ls
      hello     hello.ko
      # lsmod
      Module                  Size  Used by    Not tainted
      # insmod hello.ko
      [ 1704.500799] hello: loading out-of-tree module taints kernel.
      [ 1704.507037] hello, init
      # lsmod
      Module                  Size  Used by    Tainted: G  
      hello                  16384  0 
      # rmmod hello
      [ 1719.946160] hello, exit
      # lsmod
      Module                  Size  Used by    Tainted: G
      

      5、总结

      有了网络驱动,确实可以提高我们开发的效率。除了串口之外,网络几乎是嵌入式开发最重要的开发方式。当然,它不仅仅可以接收外部的命令控制,还可以和各种传感器进行通信,这样就能构成一个基本的嵌入式系统产品。

      发布在 爱搞机专区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发 - 驱动开发合集

      之前的文章都是教大家怎么搭建环境、看原理图、编译内核和根文件系统、做镜像,直到现在才进入驱动开发的主题。毕竟整个专栏的目的,还是希望大家能够学会驱动外部硬件。驱动好硬件,分成硬件和软件两个部分,硬件的部分比较好理解,就是看相关的信号有没有对接上即可,但是软件对接、甚至于怎么写软件,大家好像接触的比较少,所以这个时候,就可以简单讨论一下,怎么样才能写驱动代码。

      目录:

      1.多按键输入驱动
      2.PWM驱动
      3.GPIO驱动
      4.音频输出和音频录制

      1、了解外部驱动芯片手册

      所谓驱动,其实就是用soc里面的io控制器来驱动外部电路,或者说是外部芯片。如果是简单的io和uart这些,当然不需要知道驱动芯片的内容。但是如果驱动的是外部芯片,那么这个时候我们就要把对应芯片的资料找过来,好好读一读。里面协议的内容,就是我们将来编程的依据,

      274644966316418f8cadf388bb9760e0.png

      2、了解soc芯片手册

      了解外部芯片主要是解决发送内容的问题,而soc芯片则会告诉我们怎么发送这些内容。比如,它是iic接口,还是spi接口,还是普通的uart接口等等。这些内容,都可以通过soc的芯片手册找到,比如下面s3c2440中nandflash controller的介绍,

      191066c1ada246a986f8d1212940ee24.png

      3、os驱动框架的学习

      不同的os,它的驱动框架其实是不一样的。比如说,windows有windows的驱动框架,linux有linux的驱动框架,android系统甚至于把一部分驱动代码放到了应用层,这都是有可能的。所以,对于驱动工程师来说,如果需要编写驱动,那么要做的就是熟悉对应系统的驱动框架。一般来说,大部分驱动代码都是差不多的,没有必要从0开始写,可以找一个差不多的模板代码,根据芯片手册改一下内容,基本就可以用了。

      当然,除了框架之外,还有一些特殊的配置文件需要注意,以linux驱动为例,除了驱动框架之外,还需要学习一下dts文件,也就是设备树,

      https://github.com/Lichee-Pi/linux/tree/zero-4.10.y/arch/arm/boot/dts
      

      4、熟悉os kernel API

      一般来说,编写驱动的时候,我们也会用到内核的API。比如说,需要申请内存,需要申请中断,需要访问io地址等等,这些操作都需要小心、谨慎地去做。因为,如果是上层去做开发,最多也就是程序闪退,出不了大错,但是底层驱动如果写错,会直接重启硬件,或者程序死锁,这些都是很常见的现象。所以在真正使用API的时候,一定要理解了之后再使用,驱动的一些故障、特别是一些低概率的故障还是比较难调试的。

      5、适当编写上层代码

      驱动写好了,是需要搭配上层代码进行配套测试的。如果公司不是很大,这部分也是需要驱动工程师自己去完成的。另外从提高工作效率的角度来说,自己会写上层应用,也可以更好地发现问题、解决问题,省的拖到最后解决,只会让自己搞得措手不及。

      注:
      面说的都是软件的工作,有时候驱动工程师还需要自己量电压、测信号。不需要很懂,但是可以解决最低级的故障。根据2/8原则来说,我们会的硬件知识也许不多,但是掌握了常见的套路之后,它已经足够可以解决80%的问题。这样遇到难题,也不会受制于人,效率上不打折扣。

      发布在 爱搞机专区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发 - 制作根文件系统

      根文件系统是嵌入式开发很重要的一环。目前对于大多数soc来说,制作嵌入式系统就是配置buildroot文件。今天使用的buildroot版本是buildroot-2017.08.tar.gz,大家也可以使用自己比较熟悉的buildroot版本,关键是配置信息需要选对。

      1、解压文件

      tar xzvf buildroot-2017.08.tar.gz
      

      下载地址如下所示,

      https://buildroot.org/downloads/
      

      2、开始准备配置

      配置的方法其实和内核编译比较接近,也是make menuconfig。

      cd buildroot-2017.08
      make menuconfig
      

      配置主要有两部分,一部分是关于cpu的,一部分是关于toolchain交叉编译的。有这两部分选好了,最基本的rootfs就可以编译出来。

      3、配置cpu

      0158fb82b5394037b6cfdef87bd72d1b.png

      配置cpu的部分主要就是两点,第一,选择ARM little endian;第二,选择cotex-A7。其他的配置都选择默认就好了。

      4、toolchain编译器的配置

      这部分的配置有几个方面,第一,告诉buildroot,这里使用自己的编译器,

      7330ff3cd09946e3a7384666ddf8d792.png

      第二,告知buildroot,不使用它推荐的编译器,

      7a8baf69ef8b49b8819881231998c67b.png

      第三,设置自定义编译器的位置,

      1d72c3e656d3436fbce4969367235be0.png

      第四,依次设置编译器前缀、gcc版本、内核头文件版本、glibc库、使能SSP、RPC、C++。

      f89c3f85c80b492384a6531960d7684e.png

      5、保存

      退出的时候,提示是否保存,直接选择“是”即可。

      6、开始编译

      make clean; make
      

      7、确认是否编译成功

      等待一会,如果没有错误发生的话,在out/images目录下面,就有一个rootfs.tar文件。里面包含了所有的编译结果。当然在这个过程当中,务必保持ubuntu上位机处于一个良好的网络状态,这主要是因为buildroot在编译的同时,需要不停地从第三方下载代码进行解压和编译,比如说busybox。如果网络中间出现卡顿,其实比较影响编译效率的。

      当然,如果后期客户需要添加自己的程序,只需要把rootfs.tar解压一下,同时把自己的程序重新copy到对应的目录,再次压缩一下就可以了。

      8、总结

      通过练习,大家也发现根文件系统的制作主要还是依赖两个方面,一个是cpu,一个是编译器,剩下的部分基本就是功能的选择、模块的选择、特性的选择等等。这部分大家可以根据自己的需求灵活做出改变。

      此外,如果不想记住这么多配置,那么可以把buildroot下面的.config文件保存下来,到时候直接拷贝粘贴也可以的。这样也能省略很多不必要的烦恼,提高一下开发的效率。

      发布在 爱搞机专区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发 - uboot,linux kernel和rootfs移植

      安装了ubuntu操作系统,有了开发板,下面就可以进行我们的开发工作了。第一步,我们要面临的问题就是uboot移植。一般来说,嵌入式的基础环境就是uboot、linux和rootfs。uboot完成一些基本硬件的初始化,比如cpu频率设置、ddr初始化、加载linux等等。早前,uboot的烧入比较麻烦,需要jtag工具才能完成。现在来说,很多soc支持系统直接从sd卡启动,这对开发者就比较友好了。

      要做好uboot移植,做好四个方面的工作就可以了。第一,下载好uboot代码;第二,安装交叉编译工具;第三,编译uboot;第四,选择好sd卡,将uboot的bin文件烧入到sd卡。这样,将sd卡插入到开发板中,上电,就可以看到uboot的启动画面了,比如像这样,

      2c63c57e7c994af79acdf3caf78fcb14.png

      1、下载uboot代码

      针对uboot代码,可以直接从官方的github地址下载就可以了,

      git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
      

      2、下载交叉编译工具

      目前v3s的交叉编译工具都可以直接从网上下载,下载地址在这个位置,

      https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/
      

      注意,如果是ubuntu系统,可以选择这个安装包即可,

      879e0372504b4f00914be0f833f69cd2.png

      安装好之后,如果发现对应的gcc没有办法打开,记得安装一下lib32的包,

      sudo dpkg --add-architecture i386
      sudo apt-get update
      sudo apt-get install zlib1g:i386 libstdc++6:i386 libc6:i386
      

      并且在.bashrc当中设置一下环境变量,

      export PATH=$PATH:/home/feixiaoxing/gcc-linaro-6.3.1-2017.05-i686_arm-linux-gnueabihf/bin
      

      3,编译uboot

      相比较而言,编译uboot还是比较简单的,cd到uboot目录,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig
      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
      

      如果没有make命令,先用apt-get安装一下make命令,

      sudo apt-get install make
      

      4、烧入sd卡

      做到了前面三步,好像第四步最简单。其实不然,要实现这个功能,要注意两个方面。第一,选择sd卡的时候一定要选择正规的sd卡,差的sd卡是没有办法完成uboot启动的,这算是自己很大的一个教训吧,浪费了不少时间。实践中发现,一线品牌的sd卡更好一点,启动基本没问题。另外一个方面,一定要让虚拟机支持usb功能,虽然开发板使用的是sd卡,但是这种sd卡是micro sd卡,因此需要一个读卡器,所以如果需要ubuntu支持sd卡的读写,最要让虚拟机支持usb,这样才可以完成ubuntu对sd卡的读写功能。

      sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
      

      烧写直接使用dd命令就好了,注意这里烧写的文件是u-boot-sunxi-with-spl.bin,烧入的设备是/dev/sdb,也就是刚刚插入的sd卡。做到这两点,基本就可以保证烧入成功了。

      除了少部分嵌入式设备使用vxworks和freertos之外,大部分嵌入式都是使用linux来做基础os来使用的。linux使用场景很多,除了大家都知道的android设备、娱乐设备之外,在汽车、工控、网络交换机、服务器等领域,linux也扮演着重要的角色。所以,对于linux或者linux kernel来说,大家没必要神话它,也没有必要轻视它,就把它当成一个工具好了,该优化优化、该加驱动加驱动、该写上层软件写上层软件就行。

      前面学习了uboot,板子是可以启动了,但是不能称之为一个完整的系统,因为它还缺少了两样东西,一个是linux kernel,一个是rootfs。

      不同厂家的soc,一般对uboot和kernel,他们自己都已经移植好了,用户只需要到对应的地址下载代码编译即可。而对于rootfs,如果本身没有特殊的需求,可以考虑直接使用别人做好的rootfs.tar,这样效率会高很多。

      1、下载linux kernel

      git clone https://github.com/Lichee-Pi/linux.git -b zero-4.10.y
      

      不出意外,我们就可以下载到4.10.y版本的linux内核代码,首先,配置config文件

      make ARCH=arm licheepi_zero_defconfig
      

      接着,开始编译内核,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
      

      这个时候就可以搜索发现,生成了一个zImage文件,接着继续编译设备树

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
      

      最后就是生成驱动modules,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules
      

      当然,如果需要自己把驱动放到统一的目录里面,就可以这么做,

      make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules_install
      

      2、编译rootfs

      关于rootfs,一般都是用buildroot进行配置编译的。之前练习的时候,下载的buildroot版本是buildroot-2017.08.tar.gz。这部分还是建议使用别人编译好的根文件系统,差别不大,编译好之后,在./output/images目录下面,会有一个rootfs.tar文件,这就是我们需要的根文件系统。在文章的最后,我们也给出了自己编译好的rootfs.tar下载地址,供大家参考。

      3、烧入sd卡

      除linux kernel编译和rootfs编译之外,另外很重要的一个部分就是sd卡烧入。所有的操作都是在ubuntu虚拟机里面完成的,有这么几个流程,

      3.1 分区

      利用ubuntu里面的fdisk进行分区,输入

      sudo fdisk /dev/sdb
      

      分成两个区即可,第一个分区32M,剩下的空间留给另外一个分区,注意在第一个分区的最后一步输入+32M即可。

      3.2 在刚才创建好的分区构建文件系统

      sudo mkfs.vfat /dev/sdb1
      sudo mkfs.ext4 /dev/sdb2
      

      3.3 重新插拔sd卡

      sudo sync
      sudo eject /dev/sdb
      

      3.4 拷贝文件

      把zImage和sun8i-v3s-licheepi-zero.dtb拷贝到vfat分区,与此同时把rootfs.tar拷贝到ext4分区,并解压,

      tar -xvf rootfs.tar ./
      

      因为之前已经烧入过uboot,这步可以省略,当然不放心的话,可以再烧入一下,

      sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
      

      3.5 重启板子,因为uboot中我们没有对代码进行修改,所以uboot启动后,需要输入下面这些命令,才能启动kernel

      setenv bootm_boot_mode sec
      load mmc 0:1 0x41000000 zImage
      load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb
       
      setenv bootargs console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0
      bootz 0x41000000 - 0x41800000
      

      4、效果图

      之前说过,uboot启动后,如果需要进入Linux,那么需要进行一些配置,效果如下,

      221759927b9e45178b330fb87bb54635.png

      所有命令输入完毕之后,也就是输入bootz 0x41000000 - 0x41800000后,kernel就可以开始启动了,

      7e30dc37f5f74c79ad0ab413e7ab64f0.png

      因为目前驱动的内容比较少,上层软件也不多,所以不到2s就启动结束,这里输入rootfs之后,马上就进入根文件系统了,

      12e35cd572ad4b83b7acb436bdb295af.png

      至此,一个最小的嵌入式linux系统就已经实实在在的跑起来了。

      发布在 爱搞机专区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发 - 原理图解读

      对于嵌入式软件开发的同学来说,你可能不一定要会自己画原理图、做pcb板。但是,别人已经设计好的原理图,自己还是要看得懂、读的明白的。此外,原理图无非就是各种符号放在一起,彼此把信号串在一起形成回路,这就是原理图的基本原理。即使一开始不是很明白,每天看一点,总能搞清楚、弄明白的。

      前面我们讨论的V3S,其实网上有很多好的原理图可以参考,荔枝派就是其中一个,完全可以拿来读读看看。链接地址在这,https://whycan.com/files/members/6625/CherryPi-PC-V3S_V1.2.pdf

      1、V3S的soc原理图

      d1e9db139651489bbf0b126691177f0a.png

      这幅图的内容比较简单,主要说的就是V3S。V3S不是BGA封装,就是普通的PGFP封装,所有的引脚都是遍布在芯片周围,加上中间的GND,一共129个信号。这颗芯片非常容易焊接,基本上没有虚焊的风险。当然,如果是自己焊接的话,最好搭配一块钢网,这样更好一点。

      2、PMIC

      8b5f7059832e4279a36f3d0ae4ab2acb.png

      熟悉arm soc的同学都知道,一颗大的soc常常会有不同的电压输入要求,V3S当然也不例外。对于它来说,除了输入的5V之外,其他电压主要有四种,分别是3.3V、1.8V、1.2V和3.0V。其中前三个电压是U7提供的,使能信号直接5V给到,3V则是U12简单的LDO输出得到。

      有了PMIC,那么与之配套的滤波电路也是少不了的,

      a647bfd9a202400bb59899199dca1bd8.png

      在这中间,还有一个小插曲。一般为了让使用者意识到设备已经上电了,还会有一个led灯提示一下。这也是非常常规的做法。

      f68b95292c4e4bb2afcbc8c8e1bd53e3.png

      电源的信号来自于typec,这从电路上可以看出来,

      6c9aae0852a140c9a60dc1284a794189.png

      3、 按键输入

      2b9b16723a07438aa43ba5ec596b68d3.png

      这个原理图的按键输入非常有意思。它不是用通常的gpio来做的。反而,它是通过不同按键按下去之后,KEYADC0采样到不同的电流,利用这种办法反向算出来,当前用户是对哪个按键进行了操作。整个想法非常的巧妙。之前看过有人在汽车上用了类似的设计,还申请了专利。

      4、MIC设计

      e8a47261e7124325a49aeb6f1f0bcafe.png

      这部分电路比较简单,MIC_P&MIC_N都是直接来自V3S,两者最终连接到MIC上面。

      5、耳机设计

      b9ffc51caa444adb903e2265d6e53948.png

      耳机的电路也不复杂。HBIAS、HP_R、HP_L、HP_COM、HP_COMFB这5个信号也同样直接来自V3S,J4就是普通的耳机接口,没有什么特别之处。

      6、mipi camera接口

      3bef36e34e2a42c18b8a1f8abd4f90a8.png

      V3S支持mipi camera,这其中CSI_SDA、CSI_SCK是典型的I2C信号接口,MCSI_RST是复位,MCSI_PWDN是断电,MSCI_MCLK是时钟。另外D0、D1是两组差分信号,而CK这一组则代表时钟差分信号。

      另外注意下,这里的CSI_AVDD是2.8V,和板子上面其他的电压不太一样。

      7、SPI接口

      a47d28d3e0904333aeba3aa8beabceb9.png

      V3S支持SPI存储,四个信号直接连接V3S。

      48157b7edae84d009968a8ace5ad0aea.png

      spi上面的这个按键非常有意义,如果上电启动后,按键被按下,那么系统会优先进入spi下载模式。

      8、SD卡接口

      c5c024416f454a7cbd8a7bb122481790.png

      V3S同样支持SD卡启动,如果SD卡和Spi Flash都有系统,那么V3S会优先选择从SD卡启动。这个从V3S的芯片手册上可以找到。

      9、USB otg接口

      2a48dce17f8d4d1f941868faebfbd79b.png

      USB_N、USB_P一对差分信号直接连接V3S,也是常见的连接器。

      10、无线网卡

      e18dddc2445b4082ae494adaf7e61152.png

      原理图中采用了ESP8089无线网络模块作为了无线wifi的应用方案,接口是sd协议,天线是是ipex,需要一个26M的晶振作为输入。

      11、lcd电路

      lcd的电路事实上是由三个部分组成,一个是主电路,一个是背光电路,一个是触摸采样电路。

      709cab67b99547839d6c14d95ccde1fd.png

      这里给出的主电路就是普通的40pin接口电路,LCD采用一般的RGB屏即可。

      12e61c66341847daa3f171b81eb03301.png

      PT4103电路主要生成屏幕需要的背光信号,即VLED+&VLED-。

      1ade3ef842ef4f3ea4ef56079de8fb66.png

      NS2009则是屏幕采样信号,主要是获取触点的x、y信息。

      12、有线以太网

      9145704eef2e4ffba6d1ff1e9e66507a.png

      V3S是支持有线以太网的,差分TX、RX直接连接V3S soc即可,不需要再添加任何的phy芯片。

      13、其他信号

      d3605a01ed53445b849fb21bc6df7d6d.png

      其他没有使用到的信号,直接用排针给出,大家可以一并看下。

      发布在 爱搞机专区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发(开发软件搭建)

      要学好嵌入式,其实最好自己可以画板子、调试板子、写软件、调试软件这样来学习。简单的51单片机、stm32这样的mcu或许画起来不是很复杂,但是如果是运行linux系统的soc芯片,那么就没有这么简单了。虽然说linux的核心板无非就是soc、ddr、emc、pwic这些,然而如果真的需要自己画图、自己布线的话,还是需要花费不少心力的。

      1、选择一个简单的soc芯片来学习

      **很多同学都对ddr比较陌生,更对ddr如何进行pcb layout比较担心,那么我们就可以选择那些集成了ddr的soc,同样可以运行linux系统,比如说V3S就是其中的一种。**和一般的soc相比较,它除了集成ddr之外,还集成了ethernet phy,这对于我们学习网络还是非常方便的。

      8c2e3495fd68420aa655b2ca487028f3.png

      另外一般的soc中,cpu的频率都比较高一点,很多都是1G以上,cpu本身也支持mmu和cache。当然,它相比较mcu最重要的方面,还是在于对音频、视频编解码的支持,这方面mcu差很多。不过,这也与mcu的定位有关,毕竟大多数mcu都是用于工业上使用,而soc还是用在消费品居多,虽然soc在工业上面用的也不少。

      2、选择一个开发板

      电商网站上V3S开发板很多,大家可以灵活进行选择。不过,V3S支持从SD卡启动,也支持Spi Nor Flash/Spi Nand flash启动,还支持USB启动,所以大家如果是为了学习V3S,还是需要购买一个SanDisk品牌的micro SD卡。这样,把所有的code都放在一张micro SD卡上面,就可以进行所有的驱动开发工作。

      V3S中SD卡的启动顺序优先级是最高的,如果SD卡启动失败,才会进行其他方式的选择。这方面来讲,对于初学者来说是很方便的。下面这张图就摘抄自V3S的芯片手册,Page 60

      3、准备串口和type C线

      串口打印是嵌入式开发的主要方式。在没有驱动屏幕之前,开发者和芯片的主要交流方式就是串口,甚至对于部分应用来说,根本就没有屏幕,这也是有可能的,比如说一些服务器引用。所以对于开发者来说,最好购买一个usb转ttl的模块,这样就算将来学习其他的板子也会用得到。

      type C线主要是用来进行电源供电使用的。当然,也有的开发板选择的是传统的usb接口,这也是可以的,没有好坏之分。

      4、准备开发的电脑和软件

      电脑是肯定要准备的,笔记本电脑最好,一般配置即可,内存最好大一点。此外,因为V3S的cpu是arm,所以这里就用到交叉开发的内容。所以我们需要依次安装虚拟机、ubuntu系统、交叉编译工具、uboot代码、linux kernel代码、build root代码这些内容。等到编译出合适的image文件之后,再把这些文件烧入到SD卡上面,这样简单的系统就可以跑起来了。

      5、深入嵌入式linux驱动的开发

      在前面第4个步骤的时候,虽然uboot起来了、kernel起来了、文件系统也起来了,但是很多驱动还没有加载上去。所以这个时候才走到了linux驱动开发这个环节,拿到电路图、熟悉芯片手册、按照linux框架编写驱动代码、测试代码,这才是真正驱动开发的开始。这中间还会涉及到很多的问题,比如硬件的测量、板子的虚焊、驱动的bug,这都是避免不了的,慢慢往前做就好了。


      以前我也有个观点,认为学习嵌入式只要用qemu仿真平台来学学就可以了。后来发现了,其实不是那么一回事。从技术角度来看,用qemu来学习嵌入式,这个是完全成立的。**但是我们忽略了,只有实际物理平台的效果反馈,才能不断激发学习者的兴趣去学习新的内容。**有过嵌入式开发经验的同学都知道,嵌入式的知识点比较琐碎,如果我们只是在平台上仿真得到一些结果,这中间的成就感有可能并没有实际点灯、打印那样多。有过类似体验的朋友,应该能理解我说的内容。

      另外,很多同学认为嵌入式知识点多,觉得就应该把所有的理论知识都学习到了,才开始去实际的硬件学习。这也是本末倒置的做法。很多时候,理论和实践是相互促进的。用到什么学什么,实践遇到的问题可以把理论补一下继续实践,而不是等理论学习好了再去进行。况且,没有实践支撑的理论,自己理解地也未必那么正确、那么深入。

      不多说,我们看下要学习V3S嵌入式驱动,需要怎么搭建开发环境。

      1、windows平台安装一个串口打印工具

      串口打印软件是嵌入式开发的标配。建议安装SecureCRT或者Xshell。

      2、windows平台安装一个文本编辑工具

      Notepad++就很好。

      3、安装VirtualBox虚拟机

      因为V3S的源代码、交叉编译工具都是基于linux的,所以这里建议大家安装一个虚拟机。很多同学喜欢用vmware,不过还是建议大家使用VirtualBox这款虚拟机软件,毕竟这没有版权问题的困扰。此外,已经使用vmware的同学也可以使用VirtualBox提供的命令工具,很轻松地转到VirtualBox平台上面,blog的最后也给出了完整的转换方法。

      3.1 下载VirtualBox虚拟机软件

      https://www.virtualbox.org/wiki/Download_Old_Builds_6_1

      3.2 下载VirtualBox对应版本的Extension Pack软件

      aaadbdca472b4c5fb03398f0a5445571.png

      很多同学安装了VirtualBox软件,但是在虚拟机里面没有使用办法使用外部的USB接口,本质原因就是没有安装extension pack软件包。

      3.3 安装VirtualBox软件,安装extension pack软件

      4、下载ubuntu软件

      下载的ubuntu操作系统已经非常好用了,反正比我们读书时用的redhat 9好用多了。建议选择ubuntu版本的时候不一定要用最新的版本,使用较新的版本就可以了。比如今年是2023年,那我们可以选用2020年的ubuntu版本就不错。所以这里,我们选用了ubuntu20.04, 下载地址在这https://releases.ubuntu.com/focal/

      5、创建虚拟机、安装ubuntu系统

      5.1 利用VirtualBox创建一个虚拟机,硬盘留大一点,比如30G左右;

      5.2 将下载的iso文件导入到虚拟机的虚拟光驱里面,开始启动;

      5.3 安装ubuntu和一般的OS没有区别,就是各种配置,一般就是一路按“确定”就可以;

      5.4 ubuntu安装完毕后,弹出iso文件,重启虚拟机;

      5.5 添加几个重要的设置,

      1)选择“设备”-》“安装增强功能”,这样才能虚拟机屏幕最大化;

      2)选择“设备”-》“共享文件夹”,这样ubuntu就可以和外面的windows共享目录了,位于/media下;

      3)选择“设备”-》“共享粘贴板”,这样ubuntu和windows的鼠标可以相互拷贝了。

      6、初步设置ubuntu系统

      这个时候安装的ubuntu系统还比较原始,需要安装一些基础的软件,这样有利于后期的开发工作。下面是自己常用的一些操作,供大家参考,

      6.1 通过“Software & Updates”软件更换软件源,比如aliyun、163

      6.2 把shell软件放在左侧的快捷栏里面

      6.3 安装i386软件包

      sudo dpkg --add-architecture i386
      sudo apt-get update
      sudo apt-get install zlib1g:i386 libstdc++6:i386 libc6:i386
      

      6.4 安装gcc、g++

      6.5 安装cmake

      6.6 安装git

      6.7 设置.vimrc配置

      set nocompatible
      set backspace=2
      set number
      set incsearch
      set history=50
      set autowrite
      

      其他:

      a) 前面说过可以用VirtualBox打开vmware地vmdk软件,这里给出命令,大家可以好好尝试下。

      "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" clonehd "CherryPi_V3S-disk1.vmdk" "cloned.vdi" --format vdi
      

      b) 软件编辑尽量用vim,如果没有语法提示,可以sudo apt-get install vim即可。还是不行,可以再sudo apt-get update一下,再安装vim。

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 全志V3S嵌入式驱动开发-入门

      现在的嵌入式芯片越来越多,从51、stm32、soc到gpu、fpga、dsp等专用芯片,基本上只要涉及到逻辑编程,就会涉及到驱动开发。但是什么是驱动开发,为什么要做驱动开发?不知道大家有没有考虑过?嵌入式开发有哪几种?怎么做嵌入式开发?

      1、驱动是cpu和其他芯片交互的一种方法

      bf4134b187ef4d0587bab4b381ce0547.png

      不管是哪一种运算芯片,它如果需要和外面的其他芯片打交道,那么只能通过内部的ip core和外界进行通讯,没有其他的办法。外面的芯片可能是各种各样的类型,有存储的、有计算的、有网络的、有传感器的,那么这个时候就需要各种各样对应的ip core来与之通信。所谓的驱动,就是对ip core进行配置,使之可以正常地和外界进行数据的交互,仅此而已。

      2、嵌入式驱动和操作系统的关系

      本质上说,嵌入式驱动和操作系统没有一点点关系。比如说,一个i2c的存储芯片,可以在uboot下面写驱动,也可以在linux下面写驱动,同样也可以在android下面写驱动,甚至于不需要任何的平台,直接裸写驱动也是可以的。只不过各个平台为了自己的方便,把驱动中通过的代码抽象成了一个一个的框架,开发的同学只需要了解这个框架,做对应的代码适配就好了,无需重头开始写代码。

      3、嵌入式驱动不一定都是内核层代码

      很多同学都以为嵌入式驱动都是内核层代码,这也是不正确的。以linux系统为例,最初设计的时候,确实是想把大多数驱动都放在内核来做。但是到了android的时候,由于GPL协议的限制,很多厂家并不想把所有的驱动都开源出来,这就出现了一种情形,有的厂家把一部分驱动放在了内核层,一部分放在应用层。处于内核层的驱动代码就开源出来,而不想开源的代码就用动态库的方法提供给开发者。此外,还有一种驱动,就是纯应用层的。这一类的驱动包括串口RS232、以太网都属于这一类,比如gps、相机这一类设备的访问,就很大程度上依赖于厂家提供的sdk代码。

      4、驱动的作用

      很多同学都以为驱动只是把外界的设备添加到当前的平台中,其实不仅仅如此。如果用的好,驱动可以扮演很多的角色。比如说,对于一些手机拍照软件,完全可以把ddr的一部分内存预留出来,单独做成驱动给camera访问,这样做成buffer之后,可以供消费者快速浏览和处理图片使用。再比如,像zynq这样的arm+fpga集成soc,完全可以自定义ip core,把一些经典的算法设计成ip core,这个时候驱动的作用就不仅仅是驱动设备这么简单,而是说通过驱动实现协处理器的功能,加速代码的执行过程。

      5、软件栈中驱动的角色

      23c75e0e10bb4dcab61e3913a8917fcf.png

      驱动在软件开发中的角色,就相当于人的各个感知器官和执行机构。cpu处理的数据再强,没有这些外部数据的输入,就没有办法感知这个世界。同样输出的结果,如果没有执行结构,同样也就没有办法带来任何的改变和效果。所以,driver就是一个承上启下的角色。对于使用者来说,怎么把嵌入式设备用到自己的业务场景和专业领域,这才是自己核心的竞争力。

      6、写好驱动需要设计的几个知识点

      写好驱动主要涉及到这几个方面,1)会读原理图,不会读原理图,不会量电压、测信号,什么也做不了;2)会读芯片手册,很多时候驱动只是把厂家的流程描绘成代码而已;3)会使用平台给出的驱动框架,不管是linux平台还是windows平台;4)会测试代码,很多时候测试完全靠自己,不可能依赖于别人来帮自己进行测试;5)这一点也是最难的,要充分发挥驱动的优势,寻找驱动可以充分发挥自己应用场景的地方,比前四点都要难。

      总是,我们学习是为了应用,绝不是为了学习驱动而学习,怎么用起来才是最重要的。

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: 支持DDR4的芯片(如H616)想用DDR3时引脚该怎么接

      @ljty_fq 大佬开源的 https://oshwhub.com/gloomyghost/yuzukih616

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 100ASK_V853-PRO开发板支持人形检测和人脸识别

      本文转载自:https://forums.100ask.net/t/topic/3074/1

      1.前言

      V853 芯片内置一颗 NPU核,其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换,支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用,同时也支持导入大量常用的深度学习模型。本章提供一个例程,展示如何使用V853芯片中的NPU部分进行人形检测和人脸识别。

      资源包(含有应用程序、模型和yuvplayer软件包等文件):source.zip

      2.示例程序目录

      将上述资源包下载完成解压后,把示例程序100ASK_viplite-driver放在Ubuntu中的任意目录中。假设我放在/home/book/workspaces目录下,下面为人形识别和人脸识别应用程序的目录结构。

      book@100ask:~/workspaces/100ASK_viplite-driver$ tree
      .
      ├── 100ASK_Algo
      │ ├── det_demo
      │ │ ├── 100ASK_det_demo
      │ │ ├── aw_errors.c
      │ │ ├── aw_errors.h
      │ │ ├── body_384x216.yuv
      │ │ ├── body_640x360.yuv
      │ │ ├── demo.cc
      │ │ ├── face_480x270.nv12
      │ │ ├── list.c
      │ │ ├── list.h
      │ │ ├── Makefile
      │ │ ├── Readme.txt
      │ │ └── testcase.txt
      │ ├── fdet
      │ │ └── 100ASK_Facedet_480_288_nv12.nb
      │ ├── include
      │ │ ├── awnn_det.h
      │ │ ├── awnn.h
      │ │ ├── awnn_info.h
      │ │ ├── awnn_lib.h
      │ │ └── cross_utils.h
      │ ├── libawnn.a
      │ ├── libawnn.so
      │ ├── pdet
      │ │ ├── 100ASK_humandet_384_224_V0.nb
      │ │ ├── 100ASK_humandet_384_224_V1.nb
      │ │ ├── 100ASK_humandet_640_384_V0.nb
      │ │ └── 100ASK_humandet_640_384_V1.nb
      │ └── Readme.txt
      └── sdk_release
      ├── libVIPlite.a
      ├── libVIPlite.so
      ├── libVIPuser.a
      ├── libVIPuser.so
      └── sdk
      ├── vip_lite_common.h
      └── vip_lite.h
      
      7 directories, 31 files
      
      
      • 其中100ASK_Algo文件包含了:
        1.det_demo目录包含应用程序和测试图片
        2.fdet目录包含人脸模型
        3.include目录包含应用程序头文件和
        4.pdet目录包含人形模型
        5.sdk_release中包含了NPU相关的模型处理文件

      3.主函数 demo.cc

      下面仅对应用程序中的demo.cc程序中的main.cc进行讲解,对于其他代码,您可以直接查看应用程序压缩包的其他文件。

      int main(int argc, char* argv[]) {
      if (argc != 2) {
      printf("%s testcase.txt\n", argv[0]);
      return 0;
      }
      int count = 0;
      /*创建一个结构体获取参数1的中的数据,该结构体是输入nbg路径,返回awnn_info_t结构体。包含库名称,网络输入图像宽高,内存占用大小,阈值信息等,其中count为处理的图像和网络模型个数*/
      network_info_t **infos = create_infos_from_testcase(argv[1], count);
      printf("count=%d\n", count);
      ​
      if (count && infos) {
      awnn_info_t * nbinfo;
      unsigned int mem_size = 0;
      pthread_t thread[count] = {0};
      //获取参数1获取对应模型个数
      for (int i = 0; i < count; i++) {
      nbinfo = awnn_get_info(infos[i]->nbg);
      printf("info %s %s %u %u %u %f\n", nbinfo->name, nbinfo->md5,
      nbinfo->width, nbinfo->height, nbinfo->mem_size, nbinfo->thresh);
      infos[i]->nbinfo = nbinfo;
      mem_size += nbinfo->mem_size;
      }
      //根据内存初始化申请NPU模型所需的内存大小
      printf("mem_size: %u\n", mem_size);
      awnn_init(mem_size);
      //创建线程处理模型和图片
      for (int i = 0; i < count; i++) {
      pthread_create(&thread[i], NULL, detect_thread, infos[i]);
      }
      
      for (int i = 0; i < count; i++) {
      if (thread[i] != 0)
      pthread_join(thread[i], NULL);
      }
      awnn_uninit();
      }
      //销毁结构体内存
      destroy_infos(infos, count);
      return 0;
      }
      
      

      可以看到上述过程并没有涉及到模型的处理过程,可以查看100ASK_viplite-driver/100ASK_Algo/include/目录中对应函数的函数说明。

      4.编译应用程序

      假设我将应用程序文件夹100ASK_viplite-driver放在~/workspaces/100ASK_viplite-driver,进入应用程序目录下

      book@100ask:~$ cd ~/workspaces/100ASK_viplite-driver/
      book@100ask:~/workspaces/100ASK_viplite-driver$ cd 100ASK_Algo/det_demo/
      

      假设我的Tina SDK放在/home/book/workspaces/tina-v853-open,为应用程序增加环境变量。

      book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ export TINA_TOP=/home/book/workspaces/tina-v853-open
      book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ export STAGING_DIR=~/workspaces/tina-v853-open/openwrt/openwrt/staging_dir/
      

      添加完成后即可编译应用程序

      book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ make
      /home/book/workspaces/tina-v853-open/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-muslgnueabi-g++ demo.cc list.c aw_errors.c -I./ -I./../../100ASK_Algo/include -L./../../100ASK_Algo -L./../../sdk_release -l:libawnn.a -l:libVIPlite.a -l:libVIPuser.a -o 100ASK_det_demo
      book@100ask:~/workspaces/100ASK_viplite-driver/100ASK_Algo/det_demo$ ls
      100ASK_det_demo aw_errors.h body_640x360.yuv face_480x270.nv12 list.h Readme.txt
      aw_errors.c body_384x216.yuv demo.cc list.c Makefile testcase.txt
      

      编译完成后,可以在当前目录下生成一个名为100ASK_det_demo的应用程序。

      5.修改testcase.txt

      testcase.txt文件里面包含有模型路径、待检测的图像、图像尺寸。下面对该文件进行详细的解读,testcase.txt原文件为:

      # example:
      # [network]
      # network type thresh loop
      # input1 width height
      # input2 width height
      # input3 width height
      #
      # network: nbg path
      # type: 1(humanoidv1.0),3(humanoidv3.0),4(face)
      # thresh: postprocess thresh
      # loop: loop count
      # input: multi test case each in oneline
      ​
      [network]
      models/100ASK_humandet_640_384_V1.nb 1 0.25 1
      body_640x360.yuv 640 360
      ​
      [network]
      models/100ASK_humandet_384_224_V1.nb 3 0.25 1
      body_384x216.yuv 384 216
      ​
      [network]
      models/100ASK_Facedet_480_288_nv12.nb 4 0.6 1
      face_480x270.nv12 480 270
      

      可以看到文件已经对该文件如何使用和网络节点的各参数定义有了解释。testcase.txt文件中可以包含有多个处理的模型,每个需要处理的模型需要有特定的格式要求,假设我现在使用的是100ASK_humandet_640_384_V1.nb模型文件处理test1_640x360.yuv的图像文件,则可以修改testcase.txt文件为

      [network]
      models/100ASK_humandet_640_384_V1.nb 1 0.25 1
      test1_640x360.yuv 640 360
      

      models/100ASK_humandet_640_384_V1.nb为模型的存放路径;1为模型的类别;0.25为后处理阈值;1为循环次数;test1_640x360.yuv为测试图像的名称;640 360为测试图像的尺寸。

      注意:100ASK_humandet_640_384_V1.nb为类别1,100ASK_humandet_384_224_V1.nb为类别3。

      如果你还想使用同一个模型,增加一个test2_640x360.yuv测试图像,可以直接在该模型下增加

      test2_640x360.yuv测试图像和图像尺寸,例如:

      [network]
      models/100ASK_humandet_640_384_V1.nb 1 0.25 1
      test1_640x360.yuv 640 360
      test2_640x360.yuv 640 360
      

      6.运行测试程序

      我们在示例程序中已经放入供您进行测试使用的图像,您也可以使用TF卡将虚拟机中的应用程序、模型和测试图像等文件拷贝到TF卡中 ,TF卡中的文件结构应如下所示

      book@100ask:/media/book/B89C-7C55$ tree
      .
      ├── 100ASK_det_demo
      ├── body_384x216.yuv
      ├── body_640x360.yuv
      ├── face_480x270.nv12
      ├── models
      │ ├── 100ASK_Facedet_480_288_nv12.nb
      │ ├── 100ASK_humandet_384_224_V1.nb
      │ └── 100ASK_humandet_640_384_V1.nb
      └── testcase.txt
      

      可以看到应用程序、测试图片和testcase.txt文件放在TF卡根目录的文件夹下,单独创建一个models文件夹将模型文件放在该文件夹下。

      将开发板板上电,插入12V电源线和2条Type-C数据线后,再将TF卡插入开发板中

      8d09d57caff533f572d14e2fe651d6b8969c7090.jpeg

      启动完成开发板后,挂载TF卡到/mnt目录下,输入mount /dev/mmcblk1p1 /mnt/

      root@TinaLinux:/# [ 9866.263682] sunxi-mmc sdc0: sdc set ios:clk 0Hz bm PP pm UP vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.523742] sunxi-mmc sdc0: no vqmmc,Check if there is regulator
      [ 9866.553676] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.593686] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.606971] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.619855] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.633161] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.855649] sunxi-mmc sdc0: sdc set ios:clk 0Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.866027] sunxi-mmc sdc0: no vqmmc,Check if there is regulator
      [ 9866.893675] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 1 timing LEGACY(SDR12) dt B
      [ 9866.914333] mmc1: host does not support reading read-only switch, assuming write-enable
      [ 9866.924044] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 4 timing LEGACY(SDR12) dt B
      [ 9866.938320] sunxi-mmc sdc0: sdc set ios:clk 400000Hz bm PP pm ON vdd 22 width 4 timing UHS-DDR50 dt B
      [ 9866.948838] sunxi-mmc sdc0: sdc set ios:clk 50000000Hz bm PP pm ON vdd 22 width 4 timing UHS-DDR50 dt B
      [ 9866.959640] mmc1: new ultra high speed DDR50 SDHC card at address aaaa
      [ 9866.967694] mmcblk1: mmc1:aaaa SU08G 7.40 GiB
      [ 9866.990824] mmcblk1: p1
      root@TinaLinux:/# mount /dev/mmcblk1p1 /mnt/
      [ 3573.953864] FAT-fs (mmcblk1p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
      

      进入mnt目录下即可看到TF卡内的文件

      root@TinaLinux:/# cd /mnt/
      root@TinaLinux:/mnt# ls
      100ASK_det_demo face_480x270.nv12
      System Volume Information models
      body_384x216.yuv testcase.txt
      body_640x360.yuv
      root@TinaLinux:/mnt# ls models/
      100ASK_Facedet_480_288_nv12.nb 100ASK_humandet_640_384_V1.nb
      100ASK_humandet_384_224_V1.nb
      

      确保应用程序、模型文件夹中的模型文件、测试图片、testcase.txt都存在后,即可开始运行测试程序,输入

      ./100ASK_det_demo testcase.txt

      root@TinaLinux:/mnt# ./100ASK_det_demo testcase.txt
      count=3
      info 05dc32ee903c08a3abd53ddd829a8dd5 640 384 10061394 0.000000
      info 827b3a725d0fd7173338a56fd06c8db0 384 224 2829624 0.000000
      info 3d42fcd47490a62d52ea021760[ 7944.592701] npu[665][665] vipcore, device init..
      [ 7944.600170] set_vip_power_clk ON
      ​
      mem_size: 16530637
      Version: AW[ 7944.608597] enter aw vip mem alloc size 16530637
      NN_LIB_1.0.3
      [0xb6f8f560]vip_in[ 7944.615697] aw_vip_mem_alloc vir 0xe1328000, phy 0x48800000
      it[121],
      The version of Viplit[ 7944.623477] npu[665][665] gckvip_drv_init kernel logical phy address=0x48800000 virtual =0xe1328000
      e is: 1.8.0-0-AW-2023-02-24
      VIPLite driver version=0x00010800...
      malloc 384x224 nv12 buffer
      malloc 480x288 nv12 buffer
      malloc 640x384 nv12 buffer
      save file: post_body_384x216.yuv
      save file: post_face_480x270.nv12
      save file: post_body_640x360.yuv
      [ 7946.373546] npu[665][665] gckvip_drv_exit, aw_vip_mem_free
      [ 7946.379816] aw_vip_mem_free vir 0xe1328000, phy 0x48800000
      [ 7946.386027] aw_vip_mem_free dma_unmap_sg_atrs
      [ 7946.391003] aw_vip_mem_free ion_unmap_kernel
      [ 7946.396101] aw_vip_mem_free ion_free
      [ 7946.400118] aw_vip_mem_free ion_client_destroy
      [ 7946.410983] npu[665][665] vipcore, device un-init..
      

      执行测试程序完成后可以查看当前目录下的文件,输入ls

      root@TinaLinux:/mnt# ls
      100ASK_det_demo post_body_640x360.yuv.input_0.txt
      System Volume Information post_body_640x360.yuv.input_1.txt
      body_384x216.yuv post_body_640x360.yuv.output_0.txt
      body_640x360.yuv post_data
      face_480x270.nv12 post_face_480x270.nv12
      models post_face_480x270.nv12.input_0.txt
      post_body_384x216.yuv post_face_480x270.nv12.input_1.txt
      post_body_384x216.yuv.input_0.txt post_face_480x270.nv12.output_0.txt
      post_body_384x216.yuv.input_1.txt post_face_480x270.nv12.output_1.txt
      post_body_384x216.yuv.output_0.txt post_face_480x270.nv12.output_2.txt
      post_body_384x216.yuv.output_1.txt testcase.txt
      post_body_640x360.yuv
      

      上述文件中,带有post前缀的文件为执行应用程序后生成的文件。其中post_data文件夹含有模型的执行结果和执行性能

      post_data/result_TID.txt :输出每个模型检测结果,其中 TID 为检测线程ID号。
      post_data/performance_TID.txt :输出每个模型检测性能结果,其中 TID 为检测线程ID号;性能评测时建议运行单个模型且将 stdout 重定向为 /dev/null 。
      post_inputN :每个输入的画框结果,其中 inputN 为输入图像路径,直接在路径前添加 post_前缀进行保存,因此输入图像路径请勿添加 ./ 或使用绝对路径。
      

      post_body_384x216.yuv、post_body_640x360.yuv、post_face_480x270.nv12为输出画框结果的图像。

      卸载TF卡所用的文件系统,输入

      root@TinaLinux:/mnt# cd ../
      root@TinaLinux:/# umount /mnt/
      

      7.使用yuvplayer软件查看图像

      将TF卡放入读卡器后,插入电脑端,使用yuvplayer软件打开图像,该文件放在source目录下的yuvplayer-2.5.zip,解压后即可使用。设置图像尺寸和颜色空间即可查看图像。

      在电脑端,打开U盘文件夹。注意:您之前没使用过yuvplayer.exe,可能不会出现我的.nv12文件一样的图标,但不影响后续的操作。

      3d88a1b8c9bc8330f2f99f2046984858d5afd7c7.png

      选择我们需要查看的图像,例如我想查看body_640x360.yuv文件,单击body_640x360.yuv文件后,右键后选择打开方式。

      ceee827852b29190f3667d02a8591d1f9efdcc89.png

      点击更多应用

      c705913b89a28836c9477e8094542d80dffe7fbe.png

      使用滚轮往下滑,点击在这台电脑上查找其他应用

      735f8a995292a65552cd9a4b1f61d08f0e2d6a98.png

      找到yuvplayer-2.5.zip解压出来的yuvplayer-2.5文件夹中的yuvplayer.exe文件,选中该文件后点击打开

      a1db7165384e4c62012894f514926921aeefff14.png

      打开后,会出现如下画面,该画面是由于没有设置尺寸和颜色空间导致的

      5d71be34721b0a80aa0fa118719b0b04693aaf9f.png

      在选项栏中点击Size后,选择Custom。这样的选择意思是选择自定义尺寸

      957025fabf7b0b9f27f6701563c0d026431b0cea.png

      在自定义尺寸界面输入图像尺寸,该图像尺寸宽为640,高为360,设置完成后点击确定

      13e51a9f4a34ff08359b8834d8ecf0bb8bb2cb61.png

      确定完成之后可以,看到大致的图像,但此时还需要修改显示的图像空间。

      acc8bb5980d84677160090ed774ac2219c886461.jpeg

      在选项栏中点击选择Color后,点击选择NV12颜色空间

      7d9409975e21961d7a5ba9371006e018c6bc9825.png

      选择完成后,即可看到正常的图像

      9fcd255dd30108781ead55f2b85c3575873366a4.png

      其他图像的查看方式也同理,值得注意的是每张图像的尺寸可能不一样,需要根据源图像的尺寸设置。
      使用yuvplayer查看post_face_480x270.nv12 图像文件为:
      image-20230423183022049

      7.使用自定义图片测试

      由于我们平常使用的图片格式多为JPG或者PNG格式,其图像数据格式都为RGB等常见颜色空间,但在视频编解码和视频传输应用中通常使用NV12的视频存储格式,它将图片中 Y 轴色度信息和 UV 轴亚像素信息存储在同一个平面中。这就导致在 NV12 格式中,图像的每一行都存储一个 Y 值(代表色度信息),然后每隔两行存储一个 U 和 V 值(代表亚像素信息)。所以NV12 格式中的图像数据通常会比其他格式(如 RGB)少一半。

      如果您获取的应用的图像为NV12就不需要进行格式转换,如果您想测试的图像为并不是NV12格式,而是我们常见的RGB格式的JPG或PNG图像,则需要使用工具进行转换。

      下面我们使用的工具是ffmpeg,下面演示如何使用ffmpeg进行图像存储格式的转换。

      安装ffmpeg,在虚拟机终端界面输入sudo apt-get install ffmpeg

      book@100ask:~$ sudo apt-get install ffmpeg
      [sudo] password for book:
      Reading package lists... Done
      Building dependency tree
      Reading state information... Done
      The following package was automatically installed and is no longer required:
      libdumbnet1
      Use 'sudo apt autoremove' to remove it.
      The following additional packages will be installed:
      i965-va-driver libaacs0 libass9 libavcodec57 libavdevice57 libavfilter6
      libavformat57 libavresample3 libavutil55 libbdplus0 libbluray2 libbs2b0
      libchromaprint1 libcrystalhd3 libdc1394-22 libflite1 libgme0 libgsm1
      libllvm10 libmysofa0 libnorm1 libopenal-data libopenal1 libopenjp2-7
      libopenmpt0 libpgm-5.2-0 libpostproc54 librubberband2 libsdl2-2.0-0
      libshine3 libsnappy1v5 libsndio6.1 libsoxr0 libssh-gcrypt-4 libswresample2
      libswscale4 libva-drm2 libva-x11-2 libva2 libvdpau1 libx264-152 libx265-146
      libxvidcore4 libzmq5 libzvbi-common libzvbi0 mesa-va-drivers
      mesa-vdpau-drivers va-driver-all vdpau-driver-all
      Suggested packages:
      ffmpeg-doc i965-va-driver-shaders libbluray-bdj firmware-crystalhd
      libportaudio2 sndiod libvdpau-va-gl1 nvidia-vdpau-driver
      nvidia-legacy-340xx-vdpau-driver
      The following NEW packages will be installed:
      ffmpeg i965-va-driver libaacs0 libass9 libavcodec57 libavdevice57
      libavfilter6 libavformat57 libavresample3 libavutil55 libbdplus0 libbluray2
      libbs2b0 libchromaprint1 libcrystalhd3 libdc1394-22 libflite1 libgme0
      libgsm1 libllvm10 libmysofa0 libnorm1 libopenal-data libopenal1 libopenjp2-7
      libopenmpt0 libpgm-5.2-0 libpostproc54 librubberband2 libsdl2-2.0-0
      libshine3 libsnappy1v5 libsndio6.1 libsoxr0 libssh-gcrypt-4 libswresample2
      libswscale4 libva-drm2 libva-x11-2 libva2 libvdpau1 libx264-152 libx265-146
      libxvidcore4 libzmq5 libzvbi-common libzvbi0 mesa-va-drivers
      mesa-vdpau-drivers va-driver-all vdpau-driver-all
      0 upgraded, 51 newly installed, 0 to remove and 242 not upgraded.
      Need to get 32.5 MB/47.9 MB of archives.
      After this operation, 222 MB of additional disk space will be used.
      Do you want to continue? [Y/n] y
      

      此时会提示您将有222M空间需要被使用,此时输入y,即可进行下载安装

      等待安装完成后,输入ffmpeg -h

      book@100ask:~$ ffmpeg -h
      ffmpeg version 3.4.11-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
      built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
      ...
      

      可以看到ffmpeg的版本号和适用的Ubuntu,后续的使用指南可自行观看,这里就不展示全部输出信息。

      下面我们使用《RISC-V嵌入式开发线下交流会》中的照片,尺寸为480×270,图像格式为JPG

      56b5b6eb8b7eab72a3cd0a4c28bacfdff5f5879e.jpeg

      book@100ask:~/workspaces/testImg$ ls
      test_480-270.jpg
      

      使用ffmpeg进行格式转换,在终端输入ffmpeg -i test_480-270.jpg -s 480x288 -pix_fmt nv12 100ask_face-480-270.yuv

      book@100ask:~/workspaces/testImg$ ffmpeg -i test_480-270.jpg -s 480x270 -pix_fmt nv12 100ask_face-480-270.yuv
      ffmpeg version 3.4.11-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
      built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
      configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
      libavutil 55. 78.100 / 55. 78.100
      libavcodec 57.107.100 / 57.107.100
      libavformat 57. 83.100 / 57. 83.100
      libavdevice 57. 10.100 / 57. 10.100
      libavfilter 6.107.100 / 6.107.100
      libavresample 3. 7. 0 / 3. 7. 0
      libswscale 4. 8.100 / 4. 8.100
      libswresample 2. 9.100 / 2. 9.100
      libpostproc 54. 7.100 / 54. 7.100
      Input #0, image2, from 'test_480-270.jpg':
      Duration: 00:00:00.04, start: 0.000000, bitrate: 5699 kb/s
      Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 480x270 [SAR 96:96 DAR 16:9], 25 tbr, 25 tbn, 25 tbc
      Stream mapping:
      Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native))
      Press [q] to stop, [?] for help
      [swscaler @ 0x55787ff64b20] deprecated pixel format used, make sure you did set range correctly
      Output #0, rawvideo, to '100ask_face-480-270.yuv':
      Metadata:
      encoder : Lavf57.83.100
      Stream #0:0: Video: rawvideo (NV12 / 0x3231564E), nv12, 480x270 [SAR 1:1 DAR 16:9], q=2-31, 38880 kb/s, 25 fps, 25 tbn, 25 tbc
      Metadata:
      encoder : Lavc57.107.100 rawvideo
      frame= 1 fps=0.0 q=-0.0 Lsize= 190kB time=00:00:00.04 bitrate=38880.0kbits/s speed=0.664x
      video:190kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
      

      执行完成没有出现报错,并可以输入ls查看转换后的图像文件

      book@100ask:~/workspaces/testImg$ ls
      test_480-270.jpg 100ask_face-480-270.yuv
      

      可以发现生成了一个名为100ask_face-480-270.yuv文件,该文件的图像尺寸为480×270,图像存储格式为NV12。

      将其拷贝到开发板上,与应用程序100ASK_det_demo放在同一目录中,例如:

      root@TinaLinux:/mnt# ls
      100ASK_det_demo
      100ask_face-480-270.yuv
      System Volume Information
      body_384x216.yuv
      body_640x360.yuv
      face_480x270.nv12
      models
      post_100ask_face-480_288.yuv.input_0.txt
      post_100ask_face-480_288.yuv.input_1.txt
      post_100ask_face-480_288.yuv.output_0.txt
      post_100ask_face-480_288.yuv.output_1.txt
      post_100ask_face-480_288.yuv.output_2.txt
      post_body_384x216.yuv
      post_body_384x216.yuv.input_0.txt
      post_body_384x216.yuv.input_1.txt
      post_body_384x216.yuv.output_0.txt
      post_body_384x216.yuv.output_1.txt
      post_body_640x360.yuv
      post_body_640x360.yuv.input_0.txt
      post_body_640x360.yuv.input_1.txt
      post_body_640x360.yuv.output_0.txt
      post_data
      post_face_480x270.nv12
      post_face_480x270.nv12.input_0.txt
      post_face_480x270.nv12.input_1.txt
      post_face_480x270.nv12.output_0.txt
      post_face_480x270.nv12.output_1.txt
      post_face_480x270.nv12.output_2.txt
      testcase.txt
      

      修改testcase.txt,增加人脸模型的输入图像,在串口终端输入

      root@TinaLinux:/mnt# vi testcase.txt
      

      修改文件内容为:

      # example:
      # [network]
      # network type thresh loop
      # input1 width height
      # input2 width height
      # input3 width height
      #
      # network: nbg path
      # type: 1(humanoidv1.0),3(humanoidv3.0),4(face)
      # thresh: postprocess thresh
      # loop: loop count
      # input: multi test case each in oneline
      ​
      [network]
      models/100ASK_humandet_640_384_V1.nb 1 0.25 1
      body_640x360.yuv 640 360
      ​
      [network]
      models/100ASK_humandet_384_224_V1.nb 3 0.25 1
      body_384x216.yuv 384 216
      ​
      [network]
      models/100ASK_Facedet_480_288_nv12.nb 4 0.6 1
      face_480x270.nv12 480 270
      100ask_face-480-270.yuv 480 270
      

      运行100ASK_det_demo应用程序

      root@TinaLinux:/mnt# ./100ASK_det_demo testcase.txt
      count=3
      info 05dc32ee903c08a3abd53ddd829a8dd5 640 384 10061394 0.000000
      info 827b3a725d0fd7173338a56fd06c8db0 384 224 2829624 0.000000
      info 3d42fcd47490a62d52ea021760[ 212.538113] npu[465][465] vipcore, device init..
      [ 212.545449] set_vip_power_clk ON
      ​
      mem_size: 16530637
      Version: AW[ 212.553935] enter aw vip mem alloc size 16530637
      NN_LIB_1.0.3
      [0xb6fe0560]vip_init[121],
      The version of Viplite is: 1.8.0-0-AW-2023-02-24
      [ 212.569158] aw_vip_mem_alloc vir 0xe1353000, phy 0x48800000
      [ 212.575548] npu[465][465] gckvip_drv_init kernel logical phy address=0x48800000 virtual =0xe1353000
      VIPLite driver version=0x00010800...
      malloc 480x288 nv12 buffer
      malloc 384x224 nv12 buffer
      malloc 640x384 nv12 buffer
      save file: post_body_384x216.yuv
      save file: post_face_480x270.nv12
      save file: post_body_640x360.yuv
      save file: post_100ask_face-480-270.yuv
      [ 215.019076] npu[465][465] gckvip_drv_exit, aw_vip_mem_free
      [ 215.025231] aw_vip_mem_free vir 0xe1353000, phy 0x48800000
      [ 215.031525] aw_vip_mem_free dma_unmap_sg_atrs
      [ 215.036451] aw_vip_mem_free ion_unmap_kernel
      [ 215.041627] aw_vip_mem_free ion_free
      [ 215.045646] aw_vip_mem_free ion_client_destroy
      [ 215.051785] npu[465][465] vipcore, device un-init..
      

      使用yuvplayer软件查看图像,配置图像的尺寸:宽480、高270;配置图像颜色空间为NV12

      22a3027605a6ce16a408dd4cf151e944d6c9f0c6.png

      可以看到该模型已经检测到大部分人脸模型,可能由于图像过于模糊导致有个别未能识别到,但该模型的精度还是比较高的。这里仅演示人脸识别,对于人形识别大家也可以参考这个示例自行去修改增加。参考这个示例大家可以去自己尝试获取自定义的图像进行人脸识别或人形检测。

      对于如何在100ASK_V853-PRO如何实时处理从摄像头获取的图像进行人脸识别和人形检测可在下节MPP中讲述。

      发布在 V Series
      bayche
      bayche
    • Yuzuki Lizard V851S开发板 –获取正确的本地时间
      • 本文转载自:https://forums.100ask.net/t/topic/3031
        (群友Blev提供)

      获取正确的本地时间

      要使用 ntpdate 功能,那么要在menuconfig中编译ntpdate 否则板子是找不到这个功能的。

      1、进入 menuconfig
      然后找到 Network ,然后是 时间同步

      *号模块 ntpclient 和 ntpdate

      5cf177e5664d78ce9ea40955a533fc2d387a4277.png

      2、进入终端连上wifi,同步时间

      执行

      ntpdate 0.pool.ntp.org
      
      ntpdate ntp.aliyun.com
      

      检查获取到的时间 date

      此时会发现获取到的时间与北京时间相差8小时。

      3、添加模块zoneinfo,然后修改时区

      1、
      8266025f1b43619d259f04bd0ca4228014f82d6a.png

      2、
      07510f145e146a283e35346873131e7dc5b6b053.jpeg

      此时再进入终端,会发现zoneinfo已经出来了。
      62279a3f13bd652c068b772565e0f173e42b5628.png

      3、设定为当地时间:

      ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      

      最终按照此教程,成功更新时间。

      发布在 V Series
      bayche
      bayche
    • Yuzuki Lizard V851S开发板 –摄像头画面输出到屏幕
      • 本文转载自:https://forums.100ask.net/t/topic/3028
        (群友Blev提供)

      基于Yuzukilizard docker 1编译:V851S 摄像头画面输出到屏幕
      和SAMPLE-RTSP的操作基本一致:

      有变动的地方
      1、要勾选下面这项

      d700ec22f6d315ea1a4855c571c49a93e0d3cfda.png

      2、进入下面文件夹,单独编译。

      /root/tina-v853-docker/openwrt/package/allwinner/eyesee-mpp/middleware/
      

      bf1acf7f9ba0b56ebb90b6c70eff19d6d355bf44.png

      终端执行:mm -B

      3、找到这两个文件,下载到内存卡

      /root/tina-v853-docker/out/v851s/lizard/openwrt/build_dir/target/eyesee-mpp-middleware/eyesee-mpp-middleware/sample/sample_virvi2vo/
      

      afb027b1703ef41f4d7b1780c16e93f806b588ce.png

      4、进入板子的终端,执行

      ./sample_virvi2vo -path sample_virvi2vo.conf
      就可以看到画面了

      5、测试参数的说明:
      (1)capture_width:指定camera采集的图像宽度
      (2)capture_height:指定camera采集的图像高度
      (3)display_width:指定输出图像宽度
      (4)display_height:指定输出图像高度
      (5)dev_num:指定VIPP设备号
      (6)disp_type:指定显示设备(hdmi, lcd, cvbs)
      (7)pic_format:指定camera采集的图像格式
      (8)frame_rate:指定camera采集的帧率
      (9)test_duration:指定测试时间

      发布在 V Series
      bayche
      bayche
    • Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4
      • 本文转载自:https://forums.100ask.net/t/topic/3028
        (群友Blev提供)

      1.主要参考教程地址,实际操作结合多个教程。

      https://blog.csdn.net/Flag_ing/article/details/109508374

      2.放从OPENCV RELEASE 下载的解压出来的文件,里面还要放对应版本的contribute 解压文件

      /root/opencv-4.5.4

      /root/opencv-4.5.4/build6

      4380b3cf1073d156882edfae8bee420cee3f6268_2_690x108.png 8ab0518a84f6882613d06e28f694a4249cd8b5fc.png b4feccafe75d72c1e6154a40e64cb27b1d60f9bb.png

      在这里要找到三个地方进行修改;

      1、勾选上BUILD_opencv_world
      2、在CMAKE_BUILD_TYPE后填上:RELEASE

      3、在OPENCV_EXTRA_MODULES_PATH后填上opencv-contrib/modules的路径

      比如我是:/home/wsx/opencv/opencv/opencv_contrib/modules
      完成之后再次点击Configure按钮,稍等片刻,之后在点击Generate按钮
      (所有红色报错,全部关掉即可)

      交叉编译工具链地址:

      /root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-gcc
      
      /root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-g++
      
      /root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/bin/
      

      f0c93d14fb1b2c6f5eb02064bd0789d9f944d09a.png

      注意:

      • 取消WITH_GTK
        取消WITH_TIFF , PNG ,JPG
        所有红色报错的功能,都不要勾选,或者自己搞定。

      • 如果点击configure提示处理器未识别
        那么执行vi /root/opencv-4.5.4/cmake/OpenCVDetectCXXCompiler.cmake
        可以在第47行,写入 set(CMAKE_SYSTEM_PROCESSOR arm)
        (一定会提示,一定要这么做。)

      d1731a06afdd77ed4cdd71306b390fae7508d12e.jpeg

      4、 如果要修改默认的install文件夹,要在点击Generate之前修改,修改方式如下
      vi /root/opencv-4.5.4/build6/CMakeCache.txt
      修改CMAKE_INSTALL_PREFIX:PATH=/root/opencv-4.5.4/build6

      5、进入目录
      /root/opencv-4.5.4/build6/

      执行 cmake .
      执行 export STAGING_DIR=/root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin
      执行 make -j20

      (看自己的线程数,设定)

      cee978248008e49be79eea9e044c207e9417100a_2_690x250.jpeg

      到此编译成功

      6、编译出来的文件
      动态库文件 /usr/local/lib/
      文件库 /usr/local/include/opencv4/

      注意下面步骤中成功编译出来的固件,是不含动态库的,所以还需要编译时所用的动态库,同步复制到板子的/usr/lib/ 里面去。否则报错找不到动态库

      7、编译一个opencv example

      首先 执行

      export STAGING_DIR=/root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin
      

      任意目录下创建3个文件

      1.CMakeLists.txt

      cmake_minimum_required(VERSION 3.10)
      
      set (ARM_LINUX_GCC_PATH /root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/) # 改成你的路径
      set (CMAKE_C_COMPILER ${ARM_LINUX_GCC_PATH}arm-openwrt-linux-gcc)
      set (CMAKE_CXX_COMPILER ${ARM_LINUX_GCC_PATH}arm-openwrt-linux-g++)
      
      project(Test_OpenCV_Mobile)
      set(CMAKE_CXX_STANDARD 11)
      set(OpenCV_DIR "/root/opencv-4.5.4/") # 改成你的路径
      find_package(OpenCV REQUIRED)
      FIND_PACKAGE(OpenMP REQUIRED)
      add_executable(Test_OpenCV_Mobile main.cpp)
      target_link_libraries(Test_OpenCV_Mobile pthread)
      target_link_libraries(Test_OpenCV_Mobile dl)
      target_link_libraries(Test_OpenCV_Mobile -fopenmp)
      target_link_libraries(Test_OpenCV_Mobile ${OpenCV_LIBS})
      

      2.makefile

      OPENCV_DIR := /root/opencv-4.5.4/
      THIRD_PART_INCLUDE := -I$(OPENCV_DIR)include/opencv4 -I$(OPENCV_DIR)include/opencv4/opencv2
      THIRD_PART_LIBRARY := $(OPENCV_DIR)lib/libopencv_highgui.a $(OPENCV_DIR)lib/libopencv_features2d.a $(OPENCV_DIR)lib/libopencv_imgproc.a $(OPENCV_DIR)lib/libopencv_photo.a $(OPENCV_DIR)lib/libopencv_video.a $(OPENCV_DIR)lib/libopencv_core.a
      
      TARGET = Test_OpenCV_Mobile
      START:
          @echo START
          rm -rf $(TARGET)
          /root/tina-v853-docker/prebuilt/rootfsbuilt/arm/toolchain-sunxi-musl-gcc-830/toolchain/bin/arm-openwrt-linux-g++ -O2 -std=c++11 -lpthread -fopenmp -ldl $(CFLAGS) $(THIRD_PART_INCLUDE) -o $(TARGET) ./main.cpp $(THIRD_PART_LIBRARY)
      
      .PHONY:clean
      
      clean:
          rm -rf $(BINDIR)
      

      3.main.cpp

      #include <opencv2/opencv.hpp>
      #include <iostream>
      int main()
      {
          cv::Mat mat = cv::Mat::zeros(256,256, CV_8UC1);
          {
              cv::rectangle(mat, cv::Rect(40, 45, 51, 65), cv::Scalar(255), -1, cv::LINE_8, 0);//绘制填充矩形
              cv::rectangle(mat, cv::Rect(180, 180, 85, 21), cv::Scalar(255), -1, cv::LINE_8, 0);//绘制填充矩形
              std::cout << "mat.rows = " << mat.rows << std::endl;
              std::cout << "mat.cols = " << mat.cols << std::endl;
          }
          return 0;
      }
      

      8.编译 opencv example
      在创建的目录里面,执行

      cmake .
      make
      

      3bfe5fb0d1a9585333d1532c369f1fac4a941bc5_2_690x379.jpeg

      9、将文件推进板子,并添加权限执行

      10、推送相应的动态库进入 /usr/lib
      比如 world,core….

      11、最后终端执行,推送进来的文件。
      ./Test_OpenCV/example

      到此 opencv 4.5.4 编译成功,并运行opencv example成功。

      发布在 V Series
      bayche
      bayche
    • Yuzuki Lizard V851S开发板 –触摸适配
      • 本文转载自:https://forums.100ask.net/t/topic/3028
        (群友Blev提供)

      1.修改屏幕驱动 从ft6236 (删掉,不要保留),改为下面的

      路径:/home/wells/tina-v853-open/tina-v853-open/device/config/chips/v851s/configs/lizard/board.dts(注意路径,要设置为自己的实际路径)

      ctp@38 {
              compatible = "focaltech,fts";
              reg = <0x38>;
              interrupt-parent = <&pio>;
              interrupts = <PH 13 IRQ_TYPE_LEVEL_LOW>;
              focaltech,reset-gpio = <&pio PH 14 GPIO_ACTIVE_HIGH>;
              focaltech,irq-gpio = <&pio PH 13 IRQ_TYPE_LEVEL_LOW>;
              focaltech,max-touch-number = <2>;
              focaltech,display-coords = <0 0 480 800>;
              status = "okay";
          };
      

      2.修改config

      路径:/home/wells/tina-v853-open/tina-v853-open/device/config/chips/v851s/configs/lizard/linux-4.9/

      原来:
      5dfcfc2dc565096b89f69d65fee9c9581a9840fb.jpeg

      现在
      cb6671a32ae357511f5828774d488755d0a27150.jpeg

      更换驱动

      3.关闭自定义电源功能使能

      修改路径:/home/wells/tina-v853-open/tina-v853-open/drivers/input/touchscreen/focaltech_touch/focaltech_config.h

      从1改为0

      80fb5bec214d7b99250a5b33e9396ab1c2bdcdf1.png

      #define FTS_POWER_SOURCE_CUST_EN 0

      用于防止睡眠后唤醒触摸失灵,没反应。(没试过)

      到此触摸可以运行.

      触摸还有一个小问题,就是点左边,变成点右边!

      修改文件,调换x 和 y的坐标即可

      文件路径:

      /home/wells/tina-v853-open/tina-v853-open/kernel/linux-4.9/drivers/input/touchscreen/focaltech_touch/

      fbbda645f4a8abc7dff265dd8348579889111d22.png

      然后搜索REPORT 找到event 上报

      注意默认是适配竖屏的,所以X Y 是正确的,不是互换XY的位置就能解决触摸的问题。

      正确的思路是保持Y不变。调整X的坐标。

      解决办法:
      只需要改一下两行代码就可以了

      input_report_abs(data->input_dev, ABS_MT_POSITION_X, -(event->au16_x[i]-480));

      9b6e951c1bec29d6df6ab74d8affd98039d198f3.jpeg

      发布在 V Series
      bayche
      bayche
    • Yuzuki Lizard V851S开发板 –移植 QT5.12.9教程
      • 本文转载自:https://forums.100ask.net/t/topic/3027
        (群友Blev提供)

      移植 QT5 教程 (此教程基于docker版V851S开发环境)

      docker pull registry.cn-hangzhou.aliyuncs.com/gloomyghost/yuzukilizard

      编译依赖

      apt-get install repo git gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools \
      parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools libssl-dev \
      autotools-dev libsigsegv2 m4 libdrm-dev curl sed make binutils build-essential gcc g++ bash \
      patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libglib2.0-dev \
      openssh-client lib32stdc++6 gcc-aarch64-linux-gnu libncurses5-dev lzop libssl1.0.0 libssl-dev \
      libglade2-dev cvs mercurial subversion asciidoc w3m dblatex graphviz python-matplotlib \
      libc6:i386 texinfo liblz4-tool genext2fs expect autoconf intltool libqt4-dev libgtk2.0-dev
      

      安装第一遍会有报错,部分无法执行。在执行一遍,就可以了。

      1.建议新建一个docker避免环境污染的问题。

      2.打开下面目录

      /root/tina-v853-docker/platform/thirdparty/gui/qt/
      

      并解压

      tar -xvf qt-5.12.9.tar.xz
      

      10458b6a4c869af090aabeedeb1c4b236a697eeb.png

      3.导入编译工具链

      3.1 新建tool文件夹

      mkdir /root/tool
      

      3.2 将toolchain.tar解压到tool文件夹下面

      cd /root/tool/
      tar -xvf toolchain.tar
      

      18b96bb4ef7cb8feb35f8da68e22a8457006d051.png

      4.source 编译工具链

      4.1 修改profile

      vi /etc/profile
      

      增加一行代码

      export PATH=$PATH:/root/tool/toolchain/bin
      

      4.2 增加环境变量

      nano /root/.bashrc
      

      增加二行代码

      export PATH=$PATH:/root/tool/toolchain/bin
      export STAGING_DIR=$STAGING_DIR:/root/tool/toolchain/bin
      

      5.qt解压完成后,进入文件夹

      cd /root/tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9/
      

      在当前文件夹里面创建一个.sh文件
      执行

      touch make.sh
      chmod 777 make.sh
      nano make.sh
      

      复制粘贴下面内容到文件里面

      #!/bin/sh
      PWD=`pwd`
          mkdir arm-qt
          ./configure \
          -prefix $PWD/arm-qt \
          -release \
          -opensource \
          -shared \
          -xplatform linux-arm-gnueabi-g++ \
          -optimized-qmake \
          -pch \
          -qt-sqlite \
          -qt-libjpeg \
          -qt-libpng \
          -qt-zlib \
          -no-opengl \
          -skip qt3d \
          -skip qtcanvas3d \
          -skip qtpurchasing \
          -skip qtlocation \
          -skip qttools \
          -no-sse2 \
          -no-openssl \
          -no-cups \
          -no-glib \
          -no-dbus \
          -no-xcb \
          -no-iconv \
          -no-separate-debug-info \
          -no-fontconfig \
          -recheck-all \
          -make examples
      
          make -j16 
          make install
      

      这里面比较复杂,里面开启和关闭部分项目是为了保证编译可以成功。

      如果需要编译复杂的QT可以自己测试。

      6.将工具链改为自己的

      执行:

      nano /root/tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
      #
      # qmake configuration for building with arm-linux-gnueabi-g++
      #
      
      MAKEFILE_GENERATOR      = UNIX
      CONFIG                 += incremental
      QMAKE_INCREMENTAL_STYLE = sublib
      
      include(../common/linux.conf)
      include(../common/gcc-base-unix.conf)
      include(../common/g++-unix.conf)
      
      CROSS_COMPILE=arm-openwrt-linux
      
      # modifications to g++.conf
      QMAKE_CC                = $${CROSS_COMPILE}-gcc
      QMAKE_CXX               = $${CROSS_COMPILE}-g++
      QMAKE_LINK              = $${CROSS_COMPILE}-g++
      QMAKE_LINK_SHLIB        = $${CROSS_COMPILE}-g++
      
      # modifications to linux.conf
      QMAKE_AR                = $${CROSS_COMPILE}-ar cqs
      QMAKE_OBJCOPY           = $${CROSS_COMPILE}-objcopy
      QMAKE_NM                = $${CROSS_COMPILE}-nm -P
      QMAKE_STRIP             = $${CROSS_COMPILE}-strip
      load(qt_config)
      

      7.编译QT5

      执行:

      cd /root/tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9/
      

      执行:

      ./make.sh
      

      8.安装

      如果没有报错,就编译完成了。

      make install
      

      9.下载build文件

      执行:

      tar -cvf arm-qt.tar arm-qt
      

      压缩包压缩好,就可以通过ftp下载下来了。

      10.编译qtdemo

      10.1 编译qtdemo
      创建一个文件夹helloworld,然后再文件夹里面创建一个文件 main.cpp

      #include <QApplication>
      #include <QWidget>
      #include <QLabel>
      #include <QSlider>
      #include <QHBoxLayout>
       
      int main(int argc, char **argv)
      {
       QApplication app(argc, argv);
       QWidget *window  = new QWidget;
       window->setWindowTitle("I am a slider");
       
       QLabel *label = new QLabel;  // QLabel控件,用于显示数字
       QSlider *slider = new QSlider(Qt::Horizontal);  // 滑动条
       slider->setRange(0, 100);
       
       QObject::connect(slider, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
       slider->setValue(50);
       
       QHBoxLayout *layout = new QHBoxLayout; //level 
       layout->addWidget(label);
       layout->addWidget(slider);
       window->setLayout(layout);
       
       window->resize(400, 240);
       
       window->show();
       
       return app.exec();
      }
      

      10.2 编译
      执行:

      /root/tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9/arm-qt/bin/qmake -project
      

      执行:

      /root/tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9/arm-qt/bin/qmake
      

      执行:

      make
      

      此时会提示报错:修改.pro结尾的文件,末尾增加一行代码。

      参考这个代码

      ######################################################################
      # Automatically generated by qmake (3.1) Sun Apr 2 23:32:59 2023
      ######################################################################
      
      TEMPLATE = app
      TARGET = helloworld
      INCLUDEPATH += .
      
      # The following define makes your compiler warn you if you use any
      # feature of Qt which has been marked as deprecated (the exact warnings
      # depend on your compiler). Please consult the documentation of the
      # deprecated API in order to know how to port your code away from it.
      DEFINES += QT_DEPRECATED_WARNINGS
      
      # You can also make your code fail to compile if you use deprecated APIs.
      # In order to do so, uncomment the following line.
      # You can also select to disable deprecated APIs only up to a certain version of Qt.
      #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
      
      # Input
      SOURCES += hello.cpp
      
      
      
      greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
      

      并重新执行一遍

      10.3 下载可执行文件 helloworld

      11.导入

      /root/tina-v853-docker/platform/thirdparty/gui/qt/qt-5.12.9/arm-qt/bin
      

      下面的两个文件夹到板子上,其余的不用

      复制bin下面的lib 到usr/lib 并根据报错相应的修改文件名
      复制bin下面的plugin到usr目录下面
      复制刚才的可执行文件helloworld 到/mnt

      12.进入板子/mnt

      添加权限 chmod 777 helloworld
      执行

      ./helloworld
      

      13.此时会报错,要修改文件名

      凡是涉及到5.12.9.so的文件名,全部要改成5.so 否则会报错
      (如何快速改文件名呢?)
      其中包含名字为core,gui,widget的,一定要改链接文本

      发布在 V Series
      bayche
      bayche
    • Yuzuki Lizard V851S开发板 –使用SSH 配置步骤
      • 本文转载自:https://forums.100ask.net/t/topic/3025
        由群友Blev提供
      在Tina板子上面开启SSH SERVER
      

      在Tina配置界面的以下目录中

      > Network > SSH
      

      勾选的项目

      《》openssh-keygen… OpenSSH keygen
      <> openssh-server… OpenSSH server
      

      1.配置 sshd_config

      rm -rf /etc/ssh/sshd_config;touch /etc/ssh/sshd_config;vi /etc/ssh/sshd_config;
      

      sshd_config 配置文件

      Port 22
      
      # Logging
      SyslogFacility AUTH
      LogLevel INFO
      
      
      HostKey /etc/ssh/ssh_host_rsa_key
      
      HostKey /etc/ssh/ssh_host_ed25519_key
      
      # Authentication:
      LoginGraceTime 2m
      PermitRootLogin yes
      PermitEmptyPasswords yes
      StrictModes yes
      MaxAuthTries 6
      MaxSessions 10
      AuthorizedKeysFile      .ssh/authorized_keys
      
      TCPKeepAlive yes
      
      Subsystem       sftp    /usr/lib/sftp-server
      

      2.启动SSH SERVER

      etc/init.d/sshd start
      

      3.处理报错
      报错Privilege separation user sshd does not exist
      执行:

      vi /etc/passwd
      

      添加一行代码

      sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
      

      3.报错procd_add_mdns

      执行:

      vi /etc/init.d/sshd
      

      注释掉 #procd_add_mdns “ssh” “tcp” “$lport”

      4.启动SSH SERVER

      etc/init.d/sshd start
      
      • TIP:
        启动SSH 之前最好先连上wifi
        建议用MobaXterm 可以做到SSH 和 文件传输,两个功能同时使用。

      • 注意:
        SSH 登录账户 root
        SSH 登录密码 tina

      上述操作如何在编译前配置好OPENSSH

      修改4个地方:

      1,设置开机启动wifi
      启动 wifi, opensshserver

      nano /root/tina-v853-docker/openwrt/target/v851s/v851s-lizard/busybox-init-base-files/etc/init.d/S50wifideamon
      

      修改 S50wifideamon作为开机启动项配置文件:

      #!/bin/sh
      #
      # Start wifi_daemon....
      #
      
      start() {
              wifi_daemon
              sleep 2
              wifi -o sta
              sleep 2
              wifi -c d1
      //sleeep for 4seconds
              sleep 4
              ifconfig wlan0 192.168.0.105
              /etc/init.d/sshd start
      }
      
      stop() {
              printf "Stopping wifi_daemon: "
      }
      
      case "$1" in
          start)
              start
              ;;
          stop)
              stop
              ;;
          restart|reload)
              stop
              start
              ;;
        *)
              echo "Usage: $0 {start|stop|restart}"
              exit 1
      esac
      
      exit $?
      

      2,通过Makefile配置sshd_config

      nano /root/tina-v853-docker/openwrt/package/feeds/net/openssh/Makefile
      

      完整文件代码

      #
      # Copyright (C) 2006-2014 OpenWrt.org
      #
      # This is free software, licensed under the GNU General Public License v2.
      # See /LICENSE for more information.
      #
      
      include $(TOPDIR)/rules.mk
      
      PKG_NAME:=openssh
      PKG_VERSION:=8.4p1
      PKG_RELEASE:=4
      
      PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
      PKG_SOURCE_URL:=https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ \
        https://ftp.spline.de/pub/OpenBSD/OpenSSH/portable/
      PKG_HASH:=5a01d22e407eb1c05ba8a8f7c654d388a13e9f226e4ed33bd38748dafa1d2b24
      
      PKG_LICENSE:=BSD ISC
      PKG_LICENSE_FILES:=LICENCE
      PKG_CPE_ID:=cpe:/a:openssh:openssh
      
      PKG_REMOVE_FILES:=
      PKG_CONFIG_DEPENDS := \
       CONFIG_OPENSSH_LIBFIDO2
      
      PKG_BUILD_DEPENDS += OPENSSH_LIBFIDO2:libfido2
      
      include $(INCLUDE_DIR)/package.mk
      
      define Package/openssh/Default
       SECTION:=net
       CATEGORY:=Network
       DEPENDS:=+libopenssl +zlib
       TITLE:=OpenSSH
       MAINTAINER:=Peter Wagner <tripolar@gmx.at>
       URL:=http://www.openssh.com/
       SUBMENU:=SSH
       VARIANT:=without-pam
      endef
      
      define Package/openssh-moduli
       $(call Package/openssh/Default)
       DEPENDS+= +openssh-keygen
       TITLE+= moduli file
      endef
      
      define Package/openssh-moduli/description
      OpenSSH server moduli file.
      endef
      
      define Package/openssh-client
       $(call Package/openssh/Default)
       TITLE+= client
       ALTERNATIVES:=\
        200:/usr/bin/ssh:/usr/libexec/ssh-openssh \
        200:/usr/bin/scp:/usr/libexec/scp-openssh
      endef
      
      define Package/openssh-client/description
      OpenSSH client.
      endef
      
      define Package/openssh-client/conffiles
      /etc/ssh/ssh_config
      endef
      
      define Package/openssh-client-utils
       $(call Package/openssh/Default)
       DEPENDS+= +openssh-client +openssh-keygen
       TITLE+= client utilities
      endef
      
      define Package/openssh-client-utils/description
      OpenSSH client utilities.
      endef
      
      define Package/openssh-keygen
       $(call Package/openssh/Default)
       TITLE+= keygen
      endef
      
      define Package/openssh-keygen/description
      OpenSSH keygen.
      endef
      
      define Package/openssh-server
       $(call Package/openssh/Default)
       DEPENDS+= +openssh-keygen +OPENSSH_LIBFIDO2:libfido2
       TITLE+= server
       USERID:=sshd=22:sshd=22
      endef
      
      define Package/openssh-server/config
       source "$(SOURCE)/Config.in"
      endef
      
      define Package/openssh-server/description
      OpenSSH server.
      endef
      
      define Package/openssh-server/conffiles
      /etc/ssh/sshd_config
      /etc/ssh/ssh_host_ed25519_key
      /etc/ssh/ssh_host_ed25519_key.pub
      /etc/ssh/ssh_host_rsa_key
      /etc/ssh/ssh_host_rsa_key.pub
      endef
      
      define Package/openssh-server-pam
       $(call Package/openssh/Default)
       DEPENDS+= +libpthread +openssh-keygen +libpam
       TITLE+= server (with PAM support)
       VARIANT:=with-pam
       USERID:=sshd=22:sshd=22
      endef
      
      define Package/openssh-server-pam/description
      OpenSSH server (with PAM support).
      endef
      
      define Package/openssh-server-pam/conffiles
      /etc/pam.d/sshd
      /etc/security/access-sshd-local.conf
      /etc/ssh/sshd_config
      endef
      
      define Package/openssh-sftp-client
       $(call Package/openssh/Default)
       TITLE+= SFTP client
      endef
      
      define Package/openssh-sftp-client/description
      OpenSSH SFTP client.
      endef
      
      define Package/openssh-sftp-server
       $(call Package/openssh/Default)
       TITLE+= SFTP server
      endef
      
      define Package/openssh-sftp-server/description
      OpenSSH SFTP server.
      endef
      
      define Package/openssh-sftp-avahi-service
       $(call Package/openssh/Default)
       TITLE+= (SFTP Avahi service)
       DEPENDS:=+openssh-sftp-server +avahi-daemon
      endef
      
      define Package/openssh-sftp-avahi-service/description
       This package contains the service definition for announcing
       SFTP support via mDNS/DNS-SD.
      endef
      
      define Package/openssh-sftp-avahi-service/conffiles
      /etc/avahi/services/sftp-ssh.service
      endef
      
      CONFIGURE_ARGS += \
       --sysconfdir=/etc/ssh \
       --with-privsep-user=sshd \
       --with-privsep-path=/var/empty \
       --disable-strip \
       --disable-etc-default-login \
       --disable-lastlog \
       --disable-utmp \
       --disable-utmpx \
       --disable-wtmp \
       --disable-wtmpx \
       --without-bsd-auth \
       --without-kerberos5 \
       --with-stackprotect \
       --with$(if $(CONFIG_OPENSSL_ENGINE),,out)-ssl-engine \
       --with$(if $(CONFIG_OPENSSH_LIBFIDO2),,out)-security-key-builtin
       
      ifeq ($(BUILD_VARIANT),with-pam)
      CONFIGURE_ARGS += \
       --with-pam
      else
      CONFIGURE_ARGS += \
       --without-pam
      endif
      
      CONFIGURE_VARS += LD="$(TARGET_CC)"
      
      ifeq ($(BUILD_VARIANT),with-pam)
      TARGET_LDFLAGS += -lpthread
      endif
      
      define Build/Compile
       $(MAKE) -C $(PKG_BUILD_DIR) \
        DESTDIR="$(PKG_INSTALL_DIR)" \
        STRIP_OPT="" \
        all install
      endef
      
      define Package/openssh-moduli/install
       $(INSTALL_DIR) $(1)/etc/ssh
       $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/ssh/moduli $(1)/etc/ssh/
      endef
      
      define Package/openssh-client/install
       $(INSTALL_DIR) $(1)/etc/ssh
       chmod 0700 $(1)/etc/ssh
       $(CP) $(PKG_INSTALL_DIR)/etc/ssh/ssh_config $(1)/etc/ssh/
       $(INSTALL_DIR) $(1)/usr/libexec
       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ssh $(1)/usr/libexec/ssh-openssh
       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/scp $(1)/usr/libexec/scp-openssh
      endef
      
      define Package/openssh-client-utils/install
       $(INSTALL_DIR) $(1)/usr/bin
       $(INSTALL_BIN) $(foreach bin,add agent keyscan keysign,$(PKG_BUILD_DIR)/ssh-$(bin)) $(1)/usr/bin/
      endef
      
      define Package/openssh-keygen/install
       $(INSTALL_DIR) $(1)/usr/bin
       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ssh-keygen $(1)/usr/bin/
      endef
      
      define Package/openssh-server/install
       $(INSTALL_DIR) $(1)/etc/ssh
       chmod 0700 $(1)/etc/ssh
       $(INSTALL_DATA) $(PKG_INSTALL_DIR)/etc/ssh/sshd_config $(1)/etc/ssh/
       sed -r -i 's,^#(HostKey /etc/ssh/ssh_host_(rsa|ed25519)_key)$$$$,\1,' $(1)/etc/ssh/sshd_config
       $(INSTALL_DIR) $(1)/etc/init.d
       $(INSTALL_BIN) ./files/sshd.init $(1)/etc/init.d/sshd
       $(INSTALL_DIR) $(1)/lib/preinit
       $(INSTALL_BIN) ./files/sshd.failsafe $(1)/lib/preinit/99_10_failsafe_sshd
       $(INSTALL_DIR) $(1)/usr/sbin
       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/sshd $(1)/usr/sbin/
      endef
      
      
      define Package/openssh-server-pam/install
       $(call Package/openssh-server/install,$(1))
       sed -i 's,#Port 22,Port 22,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#SyslogFacility AUTH,SyslogFacility AUTH,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#LogLevel INFO,LogLevel INFO,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#LoginGraceTime 2m,LoginGraceTime 2m,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#StrictModes yes,StrictModes yes,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#MaxAuthTries 6,MaxAuthTries 6,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#MaxSessions 10,MaxSessions 10,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#TCPKeepAlive yes,TCPKeepAlive yes,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#PermitRootLogin prohibit-password,PermitRootLogin yes,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#UsePAM no,UsePAM yes,g' $(1)/etc/ssh/sshd_config
       sed -i 's,#PermitEmptyPasswords yes,PermitEmptyPasswords yes,g' $(1)/etc/ssh/sshd_config
       $(INSTALL_DIR) $(1)/etc/pam.d
       $(INSTALL_DATA) ./files/sshd.pam $(1)/etc/pam.d/sshd
       $(INSTALL_DIR) $(1)/etc/security
       $(INSTALL_DATA) ./files/sshd.pam-access $(1)/etc/security/access-sshd-local.conf
      endef
      
      define Package/openssh-sftp-client/install
       $(INSTALL_DIR) $(1)/usr/bin
       $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sftp $(1)/usr/bin/
      endef
      
      define Package/openssh-sftp-server/install
       $(INSTALL_DIR) $(1)/usr/lib
       $(CP) $(PKG_INSTALL_DIR)/usr/lib/sftp-server $(1)/usr/lib/
       $(INSTALL_DIR) $(1)/usr/libexec
       ln -sf ../lib/sftp-server $(1)/usr/libexec/sftp-server
      endef
      
      define Package/openssh-sftp-avahi-service/install
       $(INSTALL_DIR) $(1)/etc/avahi/services
       $(INSTALL_DATA) ./files/sftp-ssh.service $(1)/etc/avahi/services/
      endef
      
      $(eval $(call BuildPackage,openssh-client))
      $(eval $(call BuildPackage,openssh-moduli))
      $(eval $(call BuildPackage,openssh-client-utils))
      $(eval $(call BuildPackage,openssh-keygen))
      $(eval $(call BuildPackage,openssh-server))
      $(eval $(call BuildPackage,openssh-server-pam))
      $(eval $(call BuildPackage,openssh-sftp-client))
      $(eval $(call BuildPackage,openssh-sftp-server))
      $(eval $(call BuildPackage,openssh-sftp-avahi-service))
      

      3,配置passwd

      nano /root/tina-v853-docker/openwrt/package/allwinner/system/busybox-init-base-files/files/etc/passwd
      

      添加一行代码

      sshd:x:109:65534::/var/run/sshd:/usr/sbin/nologin
      

      4,ssh开机脚本

      nano /root/tina-v853-docker/openwrt/package/feeds/net/openssh/files/sshd.init
      

      注释掉 procd…

      配置文件

      #!/bin/sh /etc/rc.common
      # Copyright (C) 2006-2011 OpenWrt.org
      
      START=50
      STOP=50
      
      USE_PROCD=1
      PROG=/usr/sbin/sshd
      
      start_service() {
       for type in rsa ed25519
       do
        # check for keys
        key=/etc/ssh/ssh_host_${type}_key
        [ ! -f $key ] && {
         # generate missing keys
         [ -x /usr/bin/ssh-keygen ] && {
          /usr/bin/ssh-keygen -N '' -t $type -f $key 2>&- >&-
         }
        }
       done
       mkdir -m 0700 -p /var/empty
      
       local lport=$(awk '/^Port / { print $2; exit }' /etc/ssh/sshd_config)
       [ -z "$lport" ] && lport=22
      
       procd_open_instance
       #procd_add_mdns "ssh" "tcp" "$lport"
       procd_set_param command $PROG -D
       procd_close_instance
      }
      
      shutdown() {
       local pid
      
       stop
      
       # kill active clients
       for pid in $(pidof sshd)
       do
        [ "$pid" = "$$" ] && continue
        [ -e "/proc/$pid/stat" ] && kill $pid
       done
      }
      

      5.勾选编译项目 (3个)如下图(要选准哦,否则会报错)
      36e372c63cbd1e1286fb13eec0f5ae0cfc61f822.jpeg

      发布在 V Series
      bayche
      bayche
    • 全志 Tina Linux 图形系统 框架介绍 最全介绍 MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland

      原文链接:https://blog.csdn.net/thisway_diy/article/details/128459538
      作者@韦东山

      1 概述

      本文档将介绍 Allwinner Tina Linux 中已经移植好的窗口系统,以及怎么使用,包括
      MiniGUI、QT5、EFL、GTK+(WebkitGtk、Midori)、DirectFB、Wayland,整体结构
      如下:

      596ff5c5c6637ddd282b44933f03dce2.jpeg

      适用范围:Tina Linux v3.5及以上版本。

      2 MiniGUI

      2.1 MiniGUI说明.

      目前Tina中移植了MiniGUI3.2的核心库以及其组件,下表列出MiniGUI相关包说明:

      表2-1: MiniGUI相关包说明

      包名 说明
      cell-phone-ux-demo MiniGUI手机界面应用
      libminigui-gpl MiniGUI核心库
      minigui-res-be MiniGUI资源库
      mg-samples MiniGUI示例应用
      libmdolphin MiniGUI浏览器核心库
      mdolphin-release-home MiniGUI浏览器应用
      mdolphin-release-tv MiniGUI浏览器应用
      mdolphin-samples MiniGUI浏览器应用
      libmg3d MiniGUI提供3D接口组件
      libmgeff MiniGUI动画框架
      libmgi MiniGUI输入法组件
      libmgncs MiniGUI新控件集
      libmgp MiniGUI提供打印功能组件
      libmgplus 对MiniGUI图形绘制接口的增强
      libmgutils MiniGUI提供对话框模板

      表2-2:基于MiniGUI开发的应用

      包名 说明
      multimedia-test 多媒体测试Demo,包含摄像头预览、拍照、录像、播放音、视频、浏览图片功能
      r11-board 智能洗衣机Demo,包含一些界面滑动效果,选择控件等常用功能实现
      smart-music-player 智能音乐播放器Demo,包含滑动列表实现,在R328和R329上适配

      下面是multimedia-test应用截图:

      62e7acd241ff3b734683538c751b1071.jpeg

      点击SD卡和U盘图标,可以对SD卡和U盘格式化,在拍照与录制的时候需要正确的格式,不然不能录制。蓝色的SD卡与U盘表示SD卡与U盘正确挂载,灰色的表示没有正确挂载。SD卡与U盘同时挂载的时候,默认使用SD卡,点击相应图标进入相应功能界面。

      下面是r11-board应用截图:
      4ace771815273251e00dfd26e7184508.jpeg

      主页三个页面可以左右滑动切换下一个页面,点击不同的洗衣图片进入具体的洗衣功能界面。
      115503111a837989e868cb75c48eca15.jpeg

      点击底部的洗涤、漂洗和脱水可以弹出滑动列表选择不同的参数,点击功能+按钮有旋转动画。

      下面是smart-music-player应用截图:

      da8e8678fabea517f702a2ee4e5b55b8.jpeg 2761543af13badfce77c097018307d6c.jpeg

      2.2 MiniGUI配置.

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          Minigui --->
              <*> libminigui-gpl --->
                  [*] Enabel truetype font support (支持TTF矢量字体)
                  [*] Enabel tslib support for MiniGUI (支持触摸屏)
                  [ ] Enabel g2d support for MiniGUI (支持G2D硬件加速,需要用sunxifb显示引擎,目前只在R528/D1上支持)
                  [ ] Enabel g2drotate support for MiniGUI (支持G2D旋转,需要用sunxifb显示引擎,目前只在R528/D1上支持)
                  [ ] Enabel sunxifb support for MiniGUI (显示引擎,类似fbcon,framebuffer长度大于 3时,切换成循环buffer)
                  [ ] Enabel sunxifbion support for MiniGUI (显示引擎,通过libuapi申请显示buffer)
                  [ ] Enabel coortrans cw support for MiniGUI(UI旋转 90 度)
                  [ ] Enabel reduce size for MiniGUI (裁剪一些不需要的模块)
              -*- minigui-res-be
              <*> mg-samples
      

      MiniGUI有些示例程序需要将MiniGUI的核心库变编译为多进程模式,因此需要进行如下的配
      置:

      Gui --->
          Minigui --->
              <*> libminigui-gpl --->
                  Preferred Minigui Run Mode (ths) ---> proc
      

      几点差异化说明:

      • 目前Tina中集成的是MiniGUI3.2版本,在 64 位与 32 位的机器上都可以正常运行。
      • 如果使用的不是触摸屏,需要配置鼠标,为了正常的显示鼠标光标,需要修改如下Makefile:
      tina/package/minigui/libminigui-gpl/Makefile
      

      把–enable-cursor=no改成yes,表示使用鼠标。

      V853平台MiniGUI配置选项

      source build/envsetup.sh
      lunch选择v853_perf1-tina
      make menuconfig
      
      CONFIG_PACKAGE_eyesee-minigui:
      eyesee-minigui is a GUILib for eyesee project.
      Symbol: PACKAGE_eyesee-minigui [=y]
      Type : tristate
      Prompt: eyesee-minigui............................. eyesee-minigui for Tina Linux
      

      代码路径为:external/minigui/

      2.3 MiniGUI使用.

      成功烧写固件后,在小机端使用MiniGUI,需要进行如下几步:

      • 使用的是触摸屏,需要进行触摸屏校准。
      • 配置MiniGUI.cfg文件。

      2.3.1 触摸屏校准.

      电容屏不需要校准,如果电容屏触摸不准确,需要把/etc/pointercal文件删除。

      电阻屏首先要确保触摸驱动正常工作,有触摸节点生成,比如说是/dev/input/event1,可以执行下面的命令,再触摸屏幕看串口有无打印。

      cat /dev/input/event
      

      在小机端设置如下变量:

      export TSLIB_CALIBFILE=/etc/pointercal
      export TSLIB_CONFFILE=/etc/ts.conf
      export TSLIB_PLUGINDIR=/usr/lib/ts
      export TSLIB_CONSOLEDEVICE=none
      export TSLIB_FBDEVICE=/dev/fb
      // TSLIB_TSDEVICE根据触摸屏生成的设备节点来配置
      export TSLIB_TSDEVICE=/dev/input/event
      ts_calibrate
      

      注意TSLIB_TSDEVICE需要是生成的触摸节点,按照屏幕上的提示点击完成校准,校准完成

      后/etc/pointerca文件生成,保存这个校准文件,就不用每台产品都校准。

      2.3.2 MiniGUI.cfg配置

      小机端/usr/local/etc/MiniGUI.cfg文件:

      vim usr/local/etc/MiniGUI.cfg
      

      配置MiniGUI的ial和gal引擎,其配置文件的使用如下:

      [system]
      // GAL engine and default options
      gal_engine=fbcon
      // defaultmode设置显示的大小
      defaultmode=800x480-32bpp
      
      [fbcon]
      // defaultmode设置显示的大小
      defaultmode=800x480-32bpp
      
      [sunxifb]
      defaultmode=800x480-32bpp
      // flipbuffer=1代替原来的export MG_DOUBLEBUFFER=1
      flipbuffer=1
      // cacheflag=1使能fb的cache,使buffer拷贝更快,在R328/R329上fb没有cache功能,需要置为0
      cacheflag=1
      // rotate是控制旋转的角度,使能G2D旋转后有效,当旋转角度为0与180度时,defaultmode不用改变
      // 旋转角度为90与270度时,system和sunxifb的defaultmode要改成480x800-32bpp
      rotate=0
      

      使用触摸屏,注意mdev需配置成生成的触摸节点,输入引擎配置如下:

      // IAL engine
      ial_engine=tslib
      mdev=/dev/input/event1
      mtype=none
      

      使用鼠标,输入引擎配置如下:

      // IAL engine
      ial_engine=console
      mdev=/dev/input/mouse0
      mtype=IMPS
      

      2.4 MiniGUI优化.

      2.4.1 Double Buffer

      双缓冲的目的主要是防止画面撕裂或者闪烁

      • 修改内核开启双buffer。
        修改文件tina/lichee/linux-3.4/drivers/video/sunxi/disp2/disp/dev_disp.c

      注:V853平台代码路径为:lichee/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c

      //fb0,注意赋值为 3 或者更多时,使用sunxifb引擎会切换成循环buffer,在快速滑动下可以提升一些帧率
      init_para->buffer_num[0] = 2;
      
      • 在MiniGUI程序执行前导入环境变量。
      export MG_DOUBLEBUFFER=11
      

      注意只在使用fbcon引擎的时候需要导入这个环境变量,sunxifb引擎由flipbuffer字段指定。

      执行完 1 、 2 步,MiniGUI内部就会使用双缓冲,解决界面切换时闪烁的问题。

      • 还提供了一个函数,可以在应用层控制是否使用双buffer,比如在打开界面前打开双缓冲,打开界面之后停止使用双缓冲。

      开机 framebuffer 是不带 cache 的,运行 minigui 程序的时候,如果执行了 export
      MG_DOUBLEBUFFER=1或者flipbuffer=1并且cacheflag=1,framebuffer会切换成带
      cache的,默认换页的时候会刷cache。

      表2-3: DoubleBufferEnable函数说明

      函数 说明
      DoubleBufferEnable(FALSE) framebuffer会切换成不带cache的,因此不用刷cache
      DoubleBufferEnable(TRUE) framebuffer会切换成带cache的,默认换页的时候会刷cache

      DoubleBufferEnable需要在执行export MG_DOUBLEBUFFER=1或者flipbuffer=1之
      后才能调用,DoubleBufferEnable返回 0 表示调用成功,如果返回-1表示调用失败,可能是关闭cache失败,也可能是mmap framebuffer失败,需要应用层再次调用该接口,不然显示异常或出错。

      2.4.2 其他

      • 键盘换肤,可以参考《MiniGUI更换键盘皮肤》文档。
      • 输入法更新词库,可以参考《MiniGUI输入法更新词库》文档。
      • 文字旋转,可以参考《MiniGUI TTF旋转字库制作并竖直显示文字》文档。
      • Ubuntu移植MiniGUI,可以参考《Ubuntu 64位移植Minigui3.2》文档。
      • 视频小窗,可以参考《minigui_per_view视频小视窗播放》文档。

      3 QT

      3.1 QT5配置

      目前Tina中移植了QT5.10.1版本,Qt配置可以参考如下说明:

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Global build settings
          Binary stripping method (strip) ---> strip
      Gui --->
          Qt --->
              -*- qt5-core
              <*> qt5-examples
      

      这个将原本的库的制表符信息裁剪,来减小库的大小,Qt的某些库需要用到库的头信息strtab这个符号表,因此选择strip这种轻度的裁剪,留下strtab这个符号表,默认的选择是sstrip。

      为了加快编译速度,提供了不同编译工具链预编译的QT包:

      tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_glibc_32bit.tar.gz
      tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_glibc_64bit.tar.gz
      tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_musl_32bit.tar.gz
      tina/dl/qt-everywhere-opensource-src-5.12.9-prebuilt_musl_64bit.tar.gz
      tina/dl/qt-everywhere-opensource-src-5.12.9.tar.xz
      

      如果源码编译有问题,查看alsa-lib配置是否选上。

      通过在make menuconfig中选择Qt–> qt5 use prebuilt来判断使用哪种编译方法。

      make menuconfig
      Libraries --->
          -*- alsa-lib
      Gui --->
          Qt --->
              [*] qt5 use prebuilt
      

      qt5 use prebuilt的值会在tina/package/qt/qt5/Makefile文件中使用。

      ifeq ($(CONFIG_QT5_USE_PREBUILT),y)
      ifeq ($(CONFIG_USE_GLIBC),y)
      ifeq ($(TARGET_ARCH),aarch64)
          PKG_MD5SUM:=b96ae8d2d55983911b7bf46896d516bc
          PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_glibc_64bit.tar.gz
      
          PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)-
          prebuilt_glibc_64bit
      else
          PKG_MD5SUM:=6fc40f289dd51ad2bf2403ad2da85bf
          PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_glibc_32bit.tar.gz
          PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)-
          prebuilt_glibc_32bit
      endif
      else ifeq ($(CONFIG_USE_MUSL),y)
          ifeq ($(TARGET_ARCH),aarch64)
          PKG_MD5SUM:=b7859b3fc75a28f10047cc63f8bb
          PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_musl_64bit.tar.gz
          PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)-
          prebuilt_musl_64bit
      else
          PKG_MD5SUM:=9d1e2d3b5673976b3277142f047d2c
          PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION)-prebuilt_musl_32bit.tar.gz
          PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)-
          prebuilt_musl_32bit
      endif
      endif
      else
          PKG_MD5SUM:=f177284b4d3d572aa46a34ac8f5a7f
          PKG_SOURCE:=qt-everywhere-opensource-src-$(PKG_VERSION).tar.xz
          PKG_BUILD_DIR=$(COMPILE_DIR)/qt-everywhere-opensource-src-$(PKG_VERSION)
      endif
      

      3.2 QT5 platforms选择

      • eglfs,在绘图的时候会使用GPU渲染UI,如果平台有GPU,尽量使用eglfs。
      • libqlinuxfb,linux标准的显示框架,会打开/dev/fb0节点进行绘图和显示。

      平台插件的参数配置在package/qt/qt5/files/qt-env.sh 这个文件,如下所示,默认的plat-
      forms是eglfs,其中MALI_NOCLEAR环境变量的作用是调用eglInitialize函数时不清屏,
      不然在显示开机logo之后,会有一段黑屏时间,用户体验不好。

      #!/bin/sh
      
      export QT_QPA_PLATFORM=eglfs:size=800x
      export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt5/plugins
      export QT_QPA_FONTDIR=/usr/lib/fonts
      export QT_QPA_GENERIC_PLUGINS=tslib
      export QT_QPA_GENERIC_PLUGINS=evdevmouse:/dev/input/event
      export QT_QPA_GENERIC_PLUGINS=evdevkeyboard:/dev/input/event
      export MALI_NOCLEAR=
      

      通常生成的平台插件在小机端的:

      /usr/lib/qt5/plugins/platforms/libqeglfs.so
      

      linuxfb平台插件动态库为libqlinuxfb.so。

      如需更改为linuxfb,需要修改tina/package/qt/qt5/files/qt-env.sh文件内容,还需要make
      menuconfig选上qt5-drivers-linuxfb,如下所示:

      Gui --->
          Qt --->
              -*- qt5-core
              <*> qt5-drivers-linuxfb
              <*> qt5-examples
      

      linuxfb可以通过以下环境变量进行配置:

      #!/bin/sh
      
      export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=800x480:mmSize=800x480:offset=0x0:tty=/dev/tty1
      export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt5/plugins
      export QT_QPA_FONTDIR=/usr/lib/fonts
      export QT_QPA_GENERIC_PLUGINS=tslib
      export QT_QPA_GENERIC_PLUGINS=evdevmouse:/dev/input/event1
      export QT_QPA_GENERIC_PLUGINS=evdevkeyboard:/dev/input/event2
      
      fb=/dev/fbN //指定帧缓冲设备;
      size=<width>x<height> //指定屏幕大小,以像素为单位;
      mmsize=<width>x<height> //物理宽度和高度;
      offset=<width>x<height> //屏幕左上角像素偏移量
      nographicsmodeswitch- //不要将虚拟终端切换到图形模式;
      tty=/dev/ttyN //覆盖虚拟控制台,仅在nographicsmodeswitch未设置时使用;
      

      eglfs可以通过以下环境变量进行配置:

      export QT_QPA_EGLFS_WIDTH=800 //包含屏幕宽度(以像素为单位)
      export QT_QPA_EGLFS_HEIGHT=480 //包含屏幕高度(以像素为单位)
      export QT_QPA_EGLFS_FB=/dev/fb0 //覆盖帧缓冲设备,默认是/dev/fb0
      export QT_QPA_EGLFS_DEPTH=32 //覆盖屏幕的颜色深度,默认值为 32
      

      3.3 QT5鼠标触摸屏配置

      Qt中使用鼠标,需要启动udev,将鼠标设备标记为输入设备,然后Qt的libinput来处理输入
      事件,才能够识别鼠标。设置udev为自启动,默认已经将udev设置为自启动。

      屏幕为触摸屏,因此需要make menuconfig选上Qt触摸模块qt5-drivers-touchscreen,如
      下所示:

      Gui --->
          Qt --->
              -*- qt5-core
              <*> qt5-drivers-touchscreen
              <*> qt5-examples
      

      触摸屏驱动在小机端的:

      /usr/lib/qt5/plugins/generic/libqtslibplugin.so
      

      如果触摸没效果,执行如下环境变量:

      export QT_QPA_GENERIC_PLUGINS=tslib
      

      3.4 QT5示例运行

      成功烧写固件后,在小机端使用QT,如果使用的是电阻触摸屏,需要进行触摸屏校准,请参考本文档2.3.1小节。

      QT的应用示例在小机端的如下路径:

      usr/share/qt5/examples /这是QT自带的测试应用/
      
      make menuconfig
      Gui --->
          Qt --->
              <*> qt-easing.
              <*> qt-textures
              <*> qt-washing-machine
      
      //这是新添加的三个QT应用,如果运行此应用有问题,请参照package/qt/qt-washing-machine/src/doc文档
      

      运行qt应用需要指定插件平台,目前QT支持的插件平台有eglfs或者linuxfb,运行示例如下
      所示:

      ./application -platform eglfs
      ./application -platform linuxfb
      

      或者先执行下面的命令,导入QT的环境变量,再执行程序。

      ./etc/qt-env.sh
      

      3.5 QT5问题锦集

      3.5.1 strip

      运行QT的应用程序会出现如下问题,需要将libqeglfs.so库重新推到/usr/lib/qt5/plugins/platforms路径下。这里如果多个插件平台库都出现这个问题,可能是由于,Tina系统中将编译生成的库进行裁剪,使其更小,Qt在进行动态加载的时候,需要找到库头信息中的strtab制表符,因此在make menuconfig中选择轻度裁剪模式-strip。

      d54c0df02bbb05038b4ffbb382054555.jpeg

      3.5.2 eglfs

      出现下面错误,申请不上native window有可能是缺少libqeglfs-mali-integration.so这个库,需要将其adb push到小机端的/usr/lib/qt5/plugins/egldeviceintegrations路径下。

      9f49646ec1bbdf423280244de8d3f506.jpeg

      3.5.3 runtime

      出现下面错误,传入环境变量:

      414920d9e0a532a846af06dea94ca1f3.jpeg

      export QT_QPA_EGLFS_INTEGRATION=none
      export XDG_RUNTIME_DIR=/dev/shm
      

      3.5.4 触摸使用不了.

      出现这个原因有可能是下面步骤导致:

      • 触摸屏没有适配校准。
        参考《2.3.1触摸屏校准》/etc/ts_calibrate进行校准。

      • qt没有配置触摸屏的节点。
        参考《3.2 QT5 platforms选择》。

      • 如果还是不行单独执行。

      export QT_QPA_GENERIC_PLUGINS=tslib
      

      4 EFL

      4.1 EFL说明

      Enlightenment Foundation Libraries (EFL)驱动Enlightenment,它们也可以独立使用或
      者构建在其他库之上以提供有用的功能并创建强大的应用程序。

      核心库EFL在速度和大小方面都比其GTK +和Qt等的效率更高,并且具有更小的内存占用
      量。

      目前Tina中移植了EFL 1.20.6的核心库以及其组件,下表列出EFL相关包说明。

      表4-1: EFL相关包说明

      包名 说明
      efl EFL功能函数库
      ephoto 依赖与EFL的相册应用
      terminology 依赖于EFL的终端仿真器

      下面是应用截图:

      9999795892a4dfb4ce3b154a3625f918.jpeg

      4.2 EFL配置

      EFL可以使用Framebuffer或者Wayland显示图像,如果使用Wayland,需按照本文档第 8
      小节配置好Wayland。在Tina系统中,已经默认配置好了Framebuffer。执行如下命令配置
      EFL:

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          EFL --->
              -*- efl
              <*> ephoto
              <*> terminology
      

      efl是核心库,ephoto是一个相册应用,该应用可以选择板子里的图片进行浏览与幻灯片播放,terminology是一个终端仿真器,类似于ubuntu中的终端,进入到efl的配置界面,可以配置efl支持的功能。如下图所示:

      1f073102928b6f7ec2dd72c50fdd44c2.jpeg

      主要关注以下几项配置:

      表4-2: EFL配置说明

      配置 说明
      Enable raw Framebuffer access 使用framebuffer显示efl的界面
      Enabel wayland display server 使用wayland显示efl的界面
      Enabel sunxi-mali opengl es support 使用opengl es
      Enable bidirectional text support 是否支持双向文本,从左到右,或从右到左显示文字
      Enable tslib for touchscreen events 是否支持触摸

      如果使用framebuffer显示efl的界面,则不需要再做其他配置什么,因为在Tina中默认开启framebuffer的,如果使用wayland,则需要参考本文档第 8 小节配置好wayland。

      4.3 EFL运行

      成功烧写固件后,如果使用Wayland的话,需要保证Weston已经运行,在小机端使用EFL,执行以下命令运行测试程序:

      elementary_test
      

      elementary_test是官方的小程序,包含efl中各种控件的使用示例。其他两个测试程序也是这
      样执行:

      ephoto
      
      terminology
      

      还可以执行elementary_config去配置elf,可以配置界面渲染的模式,字体、控件的大小等
      等。

      elementary_config
      

      也可以手动指定渲染引擎,比如:

      ECORE_EVAS_ENGINE=wayland_egl elementary_test
      //或者
      ELM_ACCEL=gl elementary_test
      //或者
      ELM_DISPLAY=wl elementary_test
      

      如果想看efl的调试信息,可以在运行程序前加上:

      EINA_LOG_LEVEL=4 elementary_test
      

      如果是使用wayland显示efl界面的,并且想测试opengl es,则执行:

      ELM_ACCEL=gl elementary_test
      

      然后点击GLView Gears,GLView Many Gears,GLViewSimple查看结果,执行elemen-tary_test的时候界面可能是黑的,移动一下界面,滚动一下界面,或者最大化界面,就可以显示界面了,如果elementary_test没有响应,可以结束进程,再次尝试。使用kill -9 PID命令结束。

      5 GTK+

      5.1 GTK+说明

      GTK+是用来创造图形界面的库,它可以运行在许多类UNIX系统,Windows和OSX。GTK+
      按照GNU LGPL许可证发布,这个许可证对程序来说相对宽松。GTK+有一个基于C的面向对
      象的灵活架构,它有对于许多其他语言的版本,包括C++, Objective-C, Guile/Scheme, Perl,
      Python, TOM, Ada95, Free Pascal和Eiffel。GTK+依赖于以下库:

      • GLib是一个多方面用途的库,不仅仅针对图形界面。GLib提供了有用的数据类型、宏、类型转换,字符串工具,文件工具,主循环抽象等等。
      • GObject是一个提供了类型系统、包括一个元类型的基础类型集合、信号系统的库。
      • GIO是一个包括文件、设备、声音、输入输出流、网络编程和DBus通信的现代的易于使用的VFS应用程序编程接口。
      • cairo Cairo是一个支持复杂设备输出的2D图形库。
      • Pango Pango是一个国际化正文布局库。它围绕一个表现正文段落的PangoLayout ob-
        ject。Pango提供GtkTextView、GtkLabel、GtkEntry和其他表现正文的引擎。
      • ATK是一个友好的工具箱。它提供了一个允许技术和图形用户界面交互的界面的集合。例如,一个屏幕阅读程序用ATK去发现界面上的文字并为盲人用户阅读。GTK+部件已经被制作方便支持ATK框架。
      • GdkPixbuf是一个允许你从图像数据或图像文件创建GdkPixbuf(“pixel buffer”)的小的库。用一个GdkPixbuf与显示图像的GtkImage结合。
      • GDK是一个允许 GTK+支持复杂图形系统的抽象层。GDK支持X11、wayland、Win-dows和OS X的图形系统工具。
      • GTK+是GTK+库本身包含的部件,确切的说是GUI零件,比如GtkButton或者Gtk-TextView。

      更多GTK应用编程可参考:示例

      Gtk+(GIMP Tool Kit,GIMP工具包)是一个用于创造图形用户接口的图形库,下面是GIMP on GNU/Linux的截图:
      4cda7ad2a1d409404cc0fdace424225e.jpeg

      Tina系统移植了GTK+3的库及其组件,对应GTK包及依赖说明如下:

      gtk±3.22.10.tar.xz:Gtk+3对应源代码。

      Pkgconf、gettext-full、atk、glib2、libcairo、pango、gdk-pixbuf、libepoxy、libxkb-common、libpixman、libinput、wayland、wayland-protocols、udev、libdrm、sunxi-mali:Openwrt系统Gtk+3依赖包名称;对应Makefile位于package/libs/libgtk3/。

      5.2 GTK+配置

      GTK仅基于R18系统平台验证过,其它平台暂未验证;默认GTK配置成wayland port,理论
      上GTK可以运行于所有支持Wayland的平台;其中R40使用Wayland+FBDEV作为显示后
      端,R18使用Wayland+DRM。

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      

      以R18平台为例,主要配置项如下:

      Gui --->
          Libs --->
              -*- libcairo --->
                  [*] Enable cairo postscript support
                  [*] Enable cairo pdf support
                  [*] Enable cairo png support
                  [ ] Enable script support
                  [*] Enable cairo svg support
                  [ ] Enable cairo tee support
                  [ ] Enable cairo xml support
          Gtk --->
              <*> libgtk3 --->
                  [*] Broadway GDK backend
                  [*] Wayland GDK backend
                  [*] Install libgtk3 demo program
      

      因为Gtk+3依赖于Wayland,Wayland依赖于Weston合成器,配置时需要选上Weston和
      Wayland,需按照本文档第 8 小节配置好Wayland。

      5.3 GTK+运行

      成功烧写固件后,如果使用Wayland的话,需要保证Weston已经运行,然后在小机终端运行:

      /usr/bin/gdk-pixbuf-query-loaders --update-cache
      gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
      

      然后运行gtk3-demo:

      gtk3-demo
      

      b9a252dc70735af0c4e85f7db8dc698a.jpeg

      5.4 GTK+示例

      #include <gtk/gtk.h>
      
      int main( int argc, char *argv[] ){
          GtkWidget *window;
          gtk_init (&argc, &argv);
          window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
          gtk_widget_show(window);
          gtk_main ();
          return(0);
      }
      

      6 WebKitGtk

      6.1 WebkitGtk说明.

      Tina系统移植了WebKitGtk的库及其组件,对应WebKitGtk包及依赖说明如下:

      webkitgtk-2.18.6.tar.xz、midori_0.5.11_all_.tar.bz2、package/libs/webkitgtk、pack-age/utils/midori:WebKitGtk和Midori浏览器对应源代码及Makefile。

      ruby/host、flex/host、bison/host、gperf/host、enchant、harfbuzz、icu、libjpeg、libgtk3、libsecret、libsoup、libxml2、libxslt、libsqlite3、libegl、libgles、libwebp libgles、lcms2、libtasn1、gstreamer1、gst1-libav 、gst1-plugins-bas、gst1-plugins-good、gst1-plugins-ugly、gst1-plugins-bad:Openwrt系统WebkitGtk依赖包名称。

      下面是WebKitGtk的截图:

      c586c282c2c212544122dc4252ebde75.jpeg

      6.2 WebKitGtk配置

      WebKitGtk仅基于R18系统平台验证过,其它平台暂未验证;默认WebKitGtk配置成way-
      land port,R18使用Wayland+DRM。

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          Gtk --->
              <*> webkitgtk
              <*> midori
      

      因为WebKitGtk依赖于Gtk+3和Wayland,Wayland依赖于Weston合成器,配置时需要选上Gtk+3、Weston和Wayland,需按照本文档第 5 和 8 小节配置好Gtk+3和Wayland。

      6.3 WebKitGtk运行

      成功烧写固件后,如果使用Wayland的话,需要保证Weston已经运行,然后在小机终端运行:

      /usr/bin/gdk-pixbuf-query-loaders --update-cache
      gdk-pixbuf-query-loaders > /usr/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
      

      然后运行Midori或minibrowser:

      midori
      

      或者:

      minibrowser
      

      6.4 WebKitGtk问题锦集

      报错:

      error: Package `gee-0.8' not found in specified Vala API directories or GObject-Introspection GIR directories
      

      原因是主机环境安装了Vala这个工具,但是需要的是tina中编译出的这个工具,卸载主机Vala工具即可。

      7 DirectFB

      7.1 DirectFB说明

      DirectFB(直接帧缓冲区)是在Linux帧缓冲区(fbdev)抽象层之上实现的一组图形API。

      • 最大化硬件加速的实用程序。
      • 支持高级图形操作,例如多种alpha混合模式。
      • 没有内核修改没有库依赖项,libc除外。
      • 符合MHP规范的要求。

      目前在Tina中,还没有对接过GPU。

      目前Tina中移植了DirectFB的核心库以及其Demo,下表列出DirectFB相关包说明:

      表7-1: DirectFB相关包说明

      包名 说明
      directfb directfb核心库
      directfb-examples directfb demo

      7.2 DirectFB配置

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          Directfb --->
              -*- directfb
              <*> directfb-examples
      

      7.3 DirectFB运行

      在小机端可以执行一些df_开头的测试用例,比如df_andi,df_dok:

      df_andi
      

      c2c167a0210845ede919f9962e254454.jpeg

      8 Wayland

      8.1 Wayland说明.

      Wayland是一套display server(Wayland compositor)与client间的通信协议,而Weston是Wayland compositor的参考实现,定位于在Linux上替换X图形系统。

      目前Tina中移植了Wayland的核心库以及其组件,下表列出Wayland相关包说明:

      表8-1: Wayland相关包说明

      包名 作用
      glmark2 使用Wayland作为运行后端的GPU测试程序,或者使用FBDEV进行显示
      wayland 编译Weston需要用到的主机端工具
      wayland-protocols Wayland协议,相当于插件
      weston 核心库

      8.2 Wayland配置.

      8.2.1 menuconfig.

      Wayland目前可以在R18与R40上运行,其他平台暂未测试,其中在R40只能使用FBDEV
      作为运行后端,在R18上可以使用DRM与FBDEV。执行如下命令进行配置:

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          Wayland --->
              < > glmark2
                  [ ] Enabel fbdev support
                  [*] Enabel wayland support
              -*- wayland
              -*- wayland-protocols
              <*> weston --->
                  [ ] Enabel dbus support
                  [ ] Enabel weston-launch linux pam support
                  [*] Enabel opengl es support
                  [ ] Enabel fbdev compositor support
                  [*] Enabel drm compositor support
                  [ ] Enabel lcms supports support
                  [ ] Enabel junit xml support
                  [ ] Enabel demo clients install
      

      如下图所示:
      323ac3efdd61eaa4f663e743f01273db.jpeg

      glmark2是使用GPU的跑分测试程序,可以在R18上使用DRM作为Wayland后端的时候使用,除此之外还可以使用FBDEV进行显示并测试GPU性能。wayland,wayland-protocols在编译weston的时候用到,进入到weston的配置界面,可以配置weston支持的功能。如下图所示:

      0b1e15195c07fd186d70634d4920f9eb.jpeg

      主要关注以下几项配置:

      表8-2: Wayland配置说明

      选项 说明
      Enabel opengl es support 只能在使用DRM 作为weston 后端的时候选上,支持opengl es GPU 加速
      Enabel fbdev compositor support 使用framebuffer 作为显示引擎
      Enabel drm compositor support 使用DRM 作为显示引擎
      Enabel demo clients install 编译出Wayland 测试Demo

      如果使用FBDEV,需要选上kmod-mali-utgard-km与kmod-sunxi-disp:

      Kernel modules --->
          Video Support --->
              <*> kmod-mali-utgard-km
              <*> kmod-sunxi-disp
              < > kmod-sunxi-drm
      

      如果使用DRM与GPU加速,需要选上kmod-mali-utgard-km与kmod-sunxi-drm:

      Kernel modules --->
          Video Support --->
              <*> kmod-mali-utgard-km
              < > kmod-sunxi-disp
              <*> kmod-sunxi-drm
      

      选择DRM与GPU加速的如下图所示:

      cf7ccb7ac40451387cd9e5772b25618a.jpeg

      注意FBDEV与DRM是互斥的,不能同时选择。

      如果需要Weston开机自启动,需要修改 tina/package/wayland/weston目录下的Make-
      file,把$(CP) ./weston $(1)/etc/init.d的注释去除即可。

      如果选择了DRM作为显示引擎,还可以把DRM的测试Demo给选上,选项如下:

      Gui --->
          Libs --->
              libdrm --->
                  [*] install libdrm test programs
                  [ ] Enable support for vc4's API
      

      weston依赖的库cairo也可以配置,其中Enable cairo pdf support与Enable cairo png
      support是必须选择上的,不然编译的时候会报错,如果编译GTK+的话,需要多选择一些,参
      考本文档第5.2小节。

      Gui --->
          Libs --->
              -*- libcairo --->
                  [ ] Enable cairo postscript support
                  [*] Enable cairo pdf support
                  [*] Enable cairo png support
                  [ ] Enable script support
                  [ ] Enable cairo svg support
                  [ ] Enable cairo tee support
                  [ ] Enable cairo xml support
      

      d6c15e83a4c9356251a327e518af52e3.jpeg

      8.2.2 kernel_menuconfig

      8.2.2.1 FBDEV

      如果menuconfig选择的是使用FBDEV作为后端,已经选择kmod-sunxi-disp,R18平台会
      自动配置下面的选项,不用再执行这一小节的步骤,其他平台暂未实现自动配置,下面的主要是
      记录使用FBDEV作为后端,需要的内核配置。其他平台内核已经默认配置使用FBDEV。

      执行以下命令,以R18的为例:

      make kernel_menuconfig
      

      选上 Framebuffer Console Support(sunxi)、DISP Driver Support(sunxi-disp2)、Framebuffer Console support与Transform Driver Support(sunxi):

      Device Drivers --->
          Graphics support --->
              Frame buffer Devices --->
                  <*> Support for frame buffer devices --->
                  Video support for sunxi --->
                      [*] Framebuffer Console Support(sunxi)
                      <*> DISP Driver Support(sunxi-disp2)
              Console display driver support --->
                  <*> Framebuffer Console support
          Character devices --->
              <*> Transform Driver Support(sunxi)
      

      如下图所示:

      39918f21e8a1596edc58b41de69d76ba.jpeg 8e5c3089251699e8d8ec8b28d91d892e.jpeg 27a02a65a683b0c2fc0676fcf1b6b40b.jpeg

      8.2.2.2 DRM.

      如果menuconfig选择的是使用DRM作为后端,由于内核中默认使用FBDEV,所以先要取消原本的配置,再选择上DRM的配置,在menuconfig的配置中取消kmod-sunxi-disp,选上kmod-sunxi-drm,R18平台会自动配置下面的选项,不用在执行这一小节的步骤,其他平台暂未实现自动配置。

      执行以下命令,以R18的为例。现阶段只有R18支持DRM:

      make kernel_menuconfig
      

      取消选择Framebuffer Console Support(sunxi)、DISP Driver Support(sunxi-disp2)、Framebuffer Console support与Transform Driver Support(sunxi):

      Device Drivers --->
          Graphics support --->
              Frame buffer Devices --->
                  < > Support for frame buffer devices --->
                      Video support for sunxi --->
                          [ ] Framebuffer Console Support(sunxi)
                          < > DISP Driver Support(sunxi-disp2)
              Console display driver support --->
                  < > Framebuffer Console support
          Character devices --->
              < > Transform Driver Support(sunxi)
      

      选上DRM配置:

      Device Drivers --->
          Graphics support --->
              <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
              <*> DRM Support for Allwinnertech SoC A and R Series
      

      如下图所示:
      0ee40e10f6a3fec7a89983f81f97315c.jpeg

      DRM配置好之后,以前可能编译过不使用DRM的固件,需要先把out删除掉,并且需要清理
      之前内核编译的文件,不然可能会遇到一些编译问题,在内核目录下执行:

      make clean
      

      8.3 Wayland使用.

      8.3.1 weston运行.

      成功烧写固件后,在小机端使用Wayland,需要执行以下命令:

      chmod 0700 /dev/shm/
      export XDG_RUNTIME_DIR=/dev/shm
      export XDG_CONFIG_HOME=/etc/xdg
      weston --backend=drm-backend.so --tty=1 --idle-time=0 &
      //或者
      weston --backend=fbdev-backend.so --tty=1 --idle-time=0 &
      

      如果没有/dev/shm/文件夹,手动创建即可:

      mkdir /dev/shm/
      

      需要开启调试的话,运行weston前执行以下命令:

      export MESA_DEBUG=1
      export EGL_LOG_LEVEL=debug
      export LIBGL_DEBUG=verbose
      export WAYLAND_DEBUG=1
      

      如果有编译Wayland Demo的话,运行weston之后,可以运行Demo,在/usr/bin下:

      wayland-scanner、weston-calibrator、weston-clickdot、weston-cliptest、weston-confine、weston-dnd、weston-eventdemo、weston-flower、weston-fullscreen、weston-image、weston-info、weston-multi-resource、weston-presentation-shm、weston-resizor、weston-scaler、weston-simple-damage、weston-simple-dmabuf-intel、weston-simple-dmabuf-v4l、weston-simple-egl、weston-simple-shm、weston-simple-touch、weston-smoke、weston-stacking、weston-subsurfaces、weston-terminal、weston-transformed。

      GPU跑分测试程序可以执行以下命令,前提是编译了glmark2:

      glmark2-es2-wayland
      

      鼠标、键盘等输入设备,插上就可以使用。如果没有反应的话,确定是否编译了鼠标,键盘的驱动。

      8.3.2 weston.ini.

      weston.ini 是 Wayland 的桌面配置文件,比如说想要去掉背景与状态栏,则可以修改以下的参数值。注释掉 background-image,background-color 改成黑色 0xff000000,panel-position改成none:

      vi /etc/xdg/weston.ini
      
      [shell]
      # background-image=/usr/share/weston/background.png
      background-color=0xff000000
      panel-position=none
      

      如果需要旋转屏幕的话:

      # [output]
      [output]
      # name=LVDS1,mipi屏DSI-1
      name=DSI-1
      # mode=1680x1050,修改成对应的分辨率
      
      mode=480*800
      # transform=90,旋转的角度
      transform=90
      

      更多具体参数,请参考weston.ini( 5 )- Arch手册页。

      8.4 Wayland问题锦集

      报错:

      no "wayland-egl" found
      

      原因可能是在之前已经编译过了没有 wayland 的图形系统,GPU 库被编译成不支持 wayland 的库,在配置 weston 的时候一定要把 Enabel opengl es support 选择上,在tina/package/libs/gpu-um/目录下执行mm -B重新编译GPU的库,如果还报no “wayland-egl” found,可以删除tina/out/目录再重新编译。

      9 LVGL

      9.1 LVGL说明.

      LVGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美观的视觉效果和低内存占用,采用MIT许可协议,可以访问LittlevGL获取更多资料。

      • 强大的构建块:按钮、图表、列表、滑块、图像等。
      • 高级图形引擎:动画、抗锯齿、不透明度、平滑滚动、混合模式等。
      • 支持各种输入设备:触摸屏、鼠标、键盘、编码器、按钮等。
      • 支持多显示器。
      • 独立于硬件,可与任何微控制器和显示器一起使用。
      • 可扩展以使用少量内存(64 kB闪存、16 kB RAM)运行。
      • 多语言支持,支持UTF-8处理、CJK、双向和阿拉伯语。
      • 通过类CSS样式完全可定制的图形元素。
      • 受CSS启发的强大布局:Flexbox和Grid。
      • 支持操作系统、外部内存和GPU,但不是必需的。
      • 使用单个帧缓冲区也能平滑渲染。
      • 用C编写并与C++兼容。
      • Micropython Binding在Micropython中公开LVGL API。
      • 可以在PC上使用模拟器开发。
      • 100 多个简单的例子。
      • 在线和PDF格式的文档和API参考。
      • 目前Tina中移植了LVGL 8.1.0核心组件与Demo,下表列出LVGL相关库说明:

      表9-1: LVGL相关库说明

      包名 说明
      lv_demos lvgl的官方demo
      lv_drivers lvgl的官方设备驱动程序,集成了sunxifb、sunxig2d和sunximem
      lv_examples lvgl测试用例,最终调用的是lv_demos中的函数
      lvgl lvgl核心库
      lv_g2d_test g2d测试用例,专门测试已经对接好的g2d接口
      lv_monitor 压力测试与状态监测软件
      sunxifb.mk 公共配置文件,写应用Makefile时需要包含进去
      下面是应用lv_examples截图:

      a65833c937fa63b4b4128a9621198e2e.jpeg

      cb2d14ad7d3c7bf3d8e511c8b637a7a2.jpeg

      下面是应用lv_monitor截图:

      d1b146a9b48ead54819f6671fa6e640b.jpeg

      9.2 LVGL配置.

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          Littlevgl --->
              < > lv_demo
              <*> lv_examples (lvgl官方demo)
              -*- lvgl-8.1.0 use sunxifb double buffer (使能双缓冲,解决撕裂问题)
              [*] lvgl-8.1.0 use sunxifb cache (使能fb cache)
              [ ] lvgl-8.1.0 use sunxifb g2d (使能G2D硬件加速)
              [ ] lvgl-8.1.0 use sunxifb g2d rotate (使能G2D硬件旋转)
              [ ] lvgl-8.1.0 use freetype (自动链接freetype)
              <*> lv_g2d_test (g2d接口测试用例)
              <*> lv_monitor (压力测试与数据监测软件)
              < > smartva
              < > smartva_ota
      

      9.3 LVGL使用.

      lvgl路径:

      tina/package/gui/littlevgl-8
      

      9.3.1 sunxifb

      在sunxifb中,我们提供了一组接口,如下:

      表9-2: sunxifb相关接口说明

      接口 说明
      sunxifb_init 该函数主要功能是初始化显示引擎。带一个旋转参数,使能g2d旋转的话,就用这个参数指定旋转方向
      sunxifb_exit 该函数比较简单,实现关闭cache,关闭g2d,释放旋转buffer,关闭fb0
      sunxifb_flush 该函数比较重要,负责把draw buffer拷贝到back buffer中,并且绘制最后一帧后,交换frontback buffer。应用不要调用该函数
      sunxifb_get_sizes 该函数获取屏幕分辨率,这样应用程序就可以不用写死初始化时的分辨率了
      sunxifb_alloc 该函数主要用来申请系统绘图内存,使能部分G2D功能后,会申请连续物理内存
      sunxifb_free 该函数用来释放sunxifb_alloc申请的内存

      代码位置如下:

      tina/package/gui/littlevgl-8/lv_drivers/display/sunxifb.c
      

      在sunxifb_init(rotated),中rotated的值为LV_DISP_ROT_NONE,LV_DISP_ROT_90,LV_DISP_ROT_180,LV_DISP_ROT_270。

      最后还有赋值disp_drv.rotated=rotated。如果没有g2d旋转,也可以指定disp_drv.sw_rotate = 1使用软件旋转。

      9.3.2 sunxig2d

      在sunxig2d中,实现了对g2d ioctl的封装,这些函数都不需要应用调用,如下:

      表9-3: sunxig2d相关接口说明

      接口 说明
      sunxifb_g2d_init g2d模块初始化函数,打开/dev/g2d节点,设置g_format。初始化时,根据使能的宏,打印相应的log
      sunxifb_g2d_deinit 该函数关闭g2d设备
      接口 说明
      sunxifb_g2d_get_limit 该函数获取g2d使用阈值
      sunxifb_g2d_blit_to_fb 该函数用来拷贝fb0的front和back buffer这两块buffer,也可以把rotate buffer旋转到back buffer
      sunxifb_g2d_fill 该函数使用g2d填充一个颜色矩形,颜色可以带透明度
      sunxifb_g2d_blit 该函数用来拷贝图像,不能blend图像
      sunxifb_g2d_blend 该函数可以进行图像blend
      sunxifb_g2d_scale 该函数用来缩放图像

      代码位置如下:

      tina/package/gui/littlevgl-8/lv_drivers/display/sunxig2d.c
      

      以上g2d函数,都已经对接lvgl绘图框架,使用lvgl的lv_draw_map、lv_img_set_zoom和lv_canvas_draw_img函数就可以使用起来。

      lv_g2d_test应用中有完整的使用示例。

      9.3.3 sunximem.

      在sunximem中,实现了管理物理内存的封装,这些函数都不需要应用调用,如下:

      表9-4: sunximem相关接口说明

      接口 说明
      sunxifb_mem_init 该函数会在sunxifb_init中调用,初始化物理内存申请接口,使用的是libuapi中间件
      sunxifb_mem_deinit 该函数通过调用SunxiMemClose,释放申请的接口资源
      sunxifb_mem_alloc 该函数比较重要,许多地方都会用到,需要传入申请的字节数和使用说明
      sunxifb_mem_free 该函数用来释放调用sunxifb_mem_alloc申请的内存
      sunxifb_mem_get_phyaddr 该函数把sunxifb_mem_alloc申请内存的虚拟地址转换为物理地址,g2d驱动只接受buffer的物理地址或者fd
      sunxifb_mem_flush_cache 该函数用来刷sunxifb_mem_alloc申请buffer的cache
      代码位置如下:
      tina/package/gui/littlevgl-8/lv_drivers/display/sunxigmem.c
      

      因为g2d驱动只能使用物理连续内存,因此解码图片时,必须要通过sunxifb_mem_alloc来申请内存。

      说明:当前只实现了 bmp 、 png 和 gif 图片的内存申请, jpeg 图片暂未实现。

      当使用lv_canvas_set_buffer时,传入的buffer需要是sunxifb_alloc申请的buffer,sunx-ifb_alloc中会判断是否需要申请物理连续内存。

      说明:自定义画布 lv_canvas 暂未对接 g2d 缩放功能。

      9.3.4 evdev

      触摸我们用的是lvgl官方的evdev。

      代码位置如下:

      tina/package/gui/littlevgl-8/lv_drivers/indev/evdev.c
      

      在应用 lv_drv_conf.h 中修改 EVDEV_NAME 为触摸屏对应生成的 event 节点,例如lv_examples的配置文件:

      tina/package/gui/littlevgl-8/lv_examples/src/lv_drv_conf.h
      

      另外也可以用命令生成软连接touchscreen,就会直接以touchscreen为触摸节点,方便调试。命令如下:

      ln -s /dev/input/eventX /dev/input/touchscreen
      

      如果disp_drv.rotated指定了旋转 90 或者 180 度,lvgl内部会自行旋转触摸坐标,不用触摸驱动内部去旋转触摸坐标。

      9.4 LVGL新建应用

      推荐以lv_g2d_test为模板,复制一个新项目:

      tina/package/gui/littlevgl-8/lv_g2d_test
      

      在Makefile中,需要包含sunxifb.mk公共配置,在编译应用时会把宏传递下去。方式如下:

      tina/package/gui/littlevgl-8/lv_g2d_test/Makefile
      
      include ../sunxifb.mk
      

      另外可以注意到有以下配置,这些配置需要按需开启,在部分芯片上是不支持G2D_BLEND等

      操作的,只支持简单的旋转功能:

      ifeq ($(CONFIG_LVGL8_USE_SUNXIFB_G2D),y)
      TARGET_CFLAGS+=-DLV_USE_SUNXIFB_G2D_FILL \
                      -DLV_USE_SUNXIFB_G2D_BLEND \
                      -DLV_USE_SUNXIFB_G2D_BLIT \
                      -DLV_USE_SUNXIFB_G2D_SCALE
      endif
      

      在应用编译的实际Makefile中,可以只编译需要的文件,缩减可执行文件的大小,像下面示例就是不编译examples文件夹:

      tina/package/gui/littlevgl-8/lv_g2d_test/src/Makefile
      
      include $(LVGL_DIR)/lvgl/lvgl.mk
      include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
      
      #Do not compile the example
      EXCSRCS += $(shell find -L $(LVGL_DIR)/$(LVGL_DIR_NAME)/examples -name \*.c)
      CSRCS := $(filter-out $(EXCSRCS),$(CSRCS))
      

      关于lvgl的配置文件,也是建议用lv_g2d_test中的,可以对比原始未修改过的配置,然后再根
      据实际场景开关相应配置。配置文件如下:

      tina/package/gui/littlevgl-8/lv_g2d_test/src/lv_conf.h
      tina/package/gui/littlevgl-8/lv_g2d_test/src/lv_drv_conf.h
      
      tina/package/gui/littlevgl-8/lvgl/lv_conf_template.h
      tina/package/gui/littlevgl-8/lv_drivers/lv_drv_conf_template.h.h
      

      最后就是应用的初始化了,在lv_g2d_test中,有比较清晰的调用流程了,需要注意的是sunx-
      ifb_init需要传入旋转参数和sunxifb_alloc申请内存即可。

      9.5 LVGL运行.

      我们提供了几个测试用例,执行命令如下:

      lv_examples 0
      
      lv_examples 0, is lv_demo_widgets
      lv_examples 1, is lv_demo_music
      lv_examples 2, is lv_demo_benchmark
      lv_examples 3, is lv_demo_keypad_encoder
      lv_examples 4, is lv_demo_stress
      
      lv_g2d_test
      
      lv_g2d_test 0 5 0 1
      one num is rotate, range is 0~3
      tow num is gif, range is 0~11, 11 is no show gif
      three num is bmp, range is 0~2, 2 is no show bmp
      four num is png, range is 0~3, 3 is no show png
      
      lv_monitor
      

      在初始化时,会有如下打印,根据配置的不同会有差异,表示打开了某项配置:

      wh=1280x800, vwh=1280x1600, bpp=32, rotated=0
      Turn on double buffering.
      Turn on 2d hardware acceleration.
      Turn on 2d hardware acceleration fill.
      Turn on 2d hardware acceleration blit.
      Turn on 2d hardware acceleration blend.
      Turn on 2d hardware acceleration scale.
      Turn on 2d hardware acceleration rotate.
      

      10 Flutter

      10.1 Flutter说明

      Flutter为应用开发带来了革新:只要一套代码库,即可构建、测试和发布适用于移动、Web、桌面和嵌入式平台的精美应用。Flutter特性如下:

      • 快速:Flutter代码可以编译为ARM 32、ARM 64、x86和JavaScript代码,确保了有原生平台的性能。
      • 高效:使用热重载(HotReload)快速构建和迭代你的产品,更新代码之后可以立即看到变化,且不会丢失应用状态。
      • 灵活:屏幕的每一个像素皆可由你创作,创建高定制性、自适应的设计,在所有屏幕上都有优雅的体验。
      • 多平台:部署到多种设备,只需要一份代码库,支持移动、网页、桌面和嵌入式设备。
      • 开发体验:在工程中可以使用插件、自动化测试、开发者工具以及任何可以用来帮助构建高质量应用的工具。
      • 稳定可依赖:Flutter由Google支持并广泛使用,全球性的开发者社区广泛参与和维护,并得到众多世界知名品牌的信任。
      • 编程语言:Flutter由Dart强力驱动,为全平台优化,构建快速应用。
      • 本地迭代:部署到设备之前,你可以在本地调试代码,并在Web或移动平台运行产品原型。
      • 灵活扩展:任何嵌入式设备,Flutter灵活且轻量级的UI引擎都能轻松扩展以满足你的需求。
        蓬勃发展的生态:通过Flutter成熟的package生态,你可以为众多嵌入式设备创造新的可能。

      目前Tina中移植了Flutter 2.10.4与Demo,注意Flutter应用只能在glibc编译工具链下运行。下表列出Flutter相关库说明:

      表10-1: Flutter相关库说明

      包名 说明
      complex_layout 滑动列表测试app应用
      gallery flutter 的官方大型app应用,集成了各种控件效果和常见应用场景
      video_player 视频播放测试app应用
      flutter_eglfs 预编译加载flutter app的应用,用gpu渲染,支持旋转
      flutter_fbdev 预编译加载flutter app的应用,用cpu渲染,暂时不支持旋转
      flutter-client 预编译加载flutter app的应用,用gpu渲染,支持旋转与视频播放
      libvideo_player_plugin.so 视频播放插件,目前仅供测试使用,后续会替换视频播放接口
      libflutter_elinux_eglfs.so 如果需要自定义插件,需要链接该库
      libflutter_engine.so flutter核心库
      gen_snapshot flutter app编译AOT所需要的工具

      下面是应用complex_layout截图:

      847bf8c7389ce2592b7831d43969ea53.jpeg

      下面是应用gallery截图:

      3f37d3c04db877332c6699fa5eb59d08.jpeg bbfed3da34a09aa56444a3d25bf2699b.jpeg

      10.2 Flutter配置

      source build/envsetup.sh
      lunch XXX平台名称
      make menuconfig
      
      Gui --->
          Flutter --->
              flutter-sunxi --->
                  --- flutter-sunxi
                  -*- flutter use fbdev
                  [*] flutter use eglfs
                  [ ] flutter use client
                  [ ] flutter use elinux so
                  [*] flutter demo complex layout
                  [*] flutter demo gallery
                  [ ] flutter demo video player
      

      10.3 Flutter运行

      flutter路径如下:

      tina/package/gui/flutter/flutter-sunxi
      tina/dl/flutter-sunxi-1.0.7.tar.gz
      

      当配置上flutter之后,会把flutter_fbdev,complex_layout等放到/usr/bin目录下,libflut-
      ter_engine.so等放到/usr/lib目录下,执行如下命令:

      flutter_eglfs /usr/bin/bundle_complex_layout/
      flutter_eglfs /usr/bin/usr/bin/bundle_gallery/
      
      flutter_fbdev /usr/bin/bundle_complex_layout/
      flutter_fbdev /usr/bin/usr/bin/bundle_gallery/
      
      flutter-client -b /usr/bin/bundle_complex_layout/
      flutter-client -b /usr/bin/bundle_gallery/
      

      初始化时会打印一些信息和探测触摸节点,log如下:

      root@TinaLinux:/# flutter_eglfs /usr/bin/bundle_gallery/
      flutter: egl version: 1.4 (1.4 build 1.11@5516664)
      flutter: egl vendor: Imagination Technologies
      flutter: red OK: 8
      flutter: green OK: 8
      flutter: blue OK: 8
      flutter: alpha OK: 8
      flutter: found input device <sunxi-keyboard>
      flutter: input props: <none>
      flutter: found input device <axp806-pek>
      flutter: input props: <none>
      
      flutter: found input device <gt82x>
      flutter: input props: <INPUT_PROP_DIRECT>
      

      如果没有识别到INPUT_PROP_DIRECT,那么需要在触摸驱动中加上如下代码:

      set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit);
      

      另外也可以用命令生成软连接touchscreen,就会直接以touchscreen为触摸节点,方便调
      试。命令如下:

      ln -s /dev/input/eventX /dev/input/touchscreen
      

      还可以看更详细的信息,增加旋转参数,命令如下:

      root@TinaLinux:/# flutter_eglfs -h
          flutter_eglfs - run flutter apps on your device.
      
      USAGE:
          flutter_eglfs [options] <bundle path>
      
      OPTIONS:
          -f, --fps-print Print frame rates.
          -p, --touch-print Print touch points.
          -r, --rotate-screen Rotate the screen, the values are 0, 90, 180, 270.
          -v, --version Show flutter_eglfs version and exit.
          -h, --help Show this help and exit.
      
      BUNDLE PATH TREE:
          ./app_bundle/data/flutter_assets
          ./app_bundle/data/icudtl.dat
          ./app_bundle/lib/libapp.so
      
      EXAMPLES:
          flutter_eglfs ./app_bundle
          flutter_eglfs -r 90 ./app_bundle
          LD_LIBRARY_PATH=./ flutter_eglfs ./app_bundle
          LD_LIBRARY_PATH can ensure that libflutter_engine.so is found.
      
      OTHER:
          Some applications may require system information.
          export LANG="en_US.UTF-8"
      

      关于如何编译flutter应用,可以看readme.txt中的说明,路径如下:

      tina/out/方案名称/compile_dir/target/flutter-sunxi-1.0.7/readme.txt
      
      发布在 GUI
      bayche
      bayche
    • 回复: t113 mq_r自己外接以太网引脚选择

      @abcdef 在这里搜:https://mangopi.org/_media/mq-1p6_bom.html
      mq-r的话,看这个:https://mangopi.org/_media/mq-r-1p0_bom.html

      QQ图片20230410112900.png

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: D1 Tina2.1编译报错

      20230407103524.png

      发布在 MR Series
      bayche
      bayche
    • 回复: 支持DDR4的芯片(如H616)想用DDR3时引脚该怎么接

      @zznzzn 因为这个是通过软件配置的,不是固定的,但是内存控制器的寄存器不开放,看参考设计里咋接就行了

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: 支持DDR4的芯片(如H616)想用DDR3时引脚该怎么接

      方便接线内存重新排布的

      微信图片_20230406085013.jpg

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: 没有装载mmc驱动启动卡住

      @livpo 把设备树sd节点电源改成固定3.3(亲测有效,虽然不知道为什么,但是确实有用)

      发布在 H/F/TV Series
      bayche
      bayche
    • 回复: 启动系统上电一会,就会重新启动一次

      检查一下底板看门狗跳线帽是否为ON状态

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: 电阻触摸不知道为什么有很大的延迟

      实锤一下是驱动问题还是lvgl的输入转换问题,建议cat触摸的event看看

      发布在 MR Series
      bayche
      bayche
    • 回复: 851可以通过USB将camera 搞到电脑上显示吗?也就是uvc,但是demo里的eis找不到在哪里打开

      @haaland 在 851可以通过USB将camera 搞到电脑上显示吗?也就是uvc,但是demo里的eis找不到在哪里打开 中说:

      说需要打开eis ,这个在哪里,没搜到,求大佬指点

      这个应该是在framework里

      发布在 V Series
      bayche
      bayche
    • 回复: 参照大佬的教程在Tina下适配 i80 LCD 显示屏,一接屏幕就报错重启

      触发thermal的过温保护了

      看看是不是真的温度很高,如果不是排查thermal驱动,一般是adc读的值

      发布在 MR Series
      bayche
      bayche
    • 快来尝鲜!!使用 D1s (RDC2022 纪念版) 运行 RT-Smart

      软件环境:

      • Ubuntu20.0.4
      • win10

      硬件环境:

      • RDC2022 纪念版开发板
      • Type-c 头数据线

      e5c61fb3163baf240f797cab63a24635.png.webp

      驱动安装

      1. 上电前,按住下载模式按钮。然后使用 Type-c 数据线插入下载接口给开发板上电。
      2. 打开资料包中的 zadig 软件/ zadig 官网下载。然后参照如下所示的 “驱动安装示意图”,安装 fel 驱动。
        66ea6f46e96dc3fe36ffbc267332959b.png.webp

      连接串口工具

      打开 MobaXterm /其他终端工具,将 Type-C 数据线插入开发板下方的串口调试口,并连接到对应的端口,选择波特率为:500000。

      429d0ec0db8fb623bf6ac54ac7821c5c.png.webp

      可以按一下开发板的 RST 按钮,可以看到终端输出以下的信息,即为出厂固件

      6a3899d6562ee99ea3408b118ca6ffc4.png

      二次开发指南

      下载代码

      1.下载 RT-Smart 用户态应用代码:

      git clone https://github.com/RT-Thread/userapps.git
      

      2.进入 userapps 目录,下载 RT-Smart 内核代码(RT-Smart 现在已经合入 master,可以直接使用主线代码)

      cd  userapps && git clone https://github.com/RT-Thread/rt-thread.git
      

      配置工具链

      运行 userapps\tools 目录下 get_toolchain.py 的脚本,会下载对应的工具链并展开到userapps\tools\gun_gcc 目录。

      因为 D1S 是 RISCV-64 架构的,所以输入下面的命令:

      python3 tools/get_toolchain.py riscv64
      

      在 userapps 目录下,运行 smart-env.sh 配置工具链路径

      source smart-env.sh riscv64
      

      编译内核程序

      进入 rt-thread/bsp/allwinner/d1s 目录下

      cd rt-thread/bsp/allwinner/d1s
      

      使用 scons --menuconfig 查看配置

      smart 使用的串口为 UART3 ,对应引脚为 PG8 和 PG9。

      • 检查 UART3 是否开启,以及引脚是否正确
        14117a528c96f0ee58ce6ec734eda152.png

      • 检查终端使用串口是否为 uart3
        5f7a96da8d4a7fa6d144d75b6958a64d.png

      • 使用 scons 命令编译 BSP
        编译完内核之后,会自动执行打包命令 ./mksdimg.sh 打包出 sd.bin 镜像文件。此文件将在后面借助下载工具,下载到 D1s 上运行。
        b5ab2a41b0da0cc502ae14910d4cf4a1.png.webp

      烧录系统内核

      接下来借助 fel 工具烧录系统内核。

      boot0_sdcard_sun20iw1p1_f133.bin   ---- 第一次烧录需要烧录此boot文件(后面不需要再烧录)
      sd.bin                             ---- 打包好的系统内核镜像
      xfel.exe                           ---- 烧录工具
      

      在 window 中的 xfel_v1.2.9目录下,打开终端使用以下命令烧录固件:

      • 烧录boot镜像: xfel.exe write 8192 boot0_sdcard_sun20iw1p1_f133.bin

      • 烧录内核镜像: xfel.exe sd write 57344 sd.bin

      f740d0cf43ecca8a82304dc8ea92085b.png
      注意:执行烧录命令前,需要使开发板处于fel下载模式(按住下载按钮并上电)

      运行用户态应用(可选)

      将 D1s BSP 目录下的 ./mksdcard.sh 拷贝到 userapps 下。运行该脚本,将生成的sdroot.bin,复制到 window 中的 xfel_v1.2.9 目录下,使用以下命令即可烧录用户态程序到存储设备 :

      xfel.exe sd write 8388608 sdroot.bin
      

      2566de67121fa4dc90413b3bfd8469eb.png

      参照下面的运行日志,运行对应的用户态应用:

      msh />ls
      Directory /:
      hello.elf           341224
      ping.elf            347336
      pong.elf            342160
      umailbox.elf        357440
      vi.elf              517464
      webclient.elf       393032
      webserver.elf       489416
      msh /bin>hello.elf
      msh /bin>hello world!
      

      可以看到 hello world 程序已经成功运行,至此我们的用户态程序已经跑起来了。

      文章中涉及到的软件以及开发板资料下载:RDC资料.7z

      原文链接:https://club.rt-thread.org/ask/article/bd9c5cb55e0bc8f5.html

      发布在 MR Series
      bayche
      bayche
    • 回复: Tina下使用dhcp自动获取ip
      udhcpc eth0
      

      开机自动跑ifconfig eth0 up和udhcpc eth0可以参考这里:https://v853.docs.aw-ol.com/soft/soft_start/

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: 【FAQ】全志V853芯片 适配双目GC2053的操作步骤

      gc2053_ds.pdf

      发布在 其它全志芯片讨论区
      bayche
      bayche
    • 回复: V853 openWrt编译SDK报错

      @haaland

      1.你选了uImage但是没有选上kernel

      QQ图片20220913142948.png

      2.qt5的libcpp依赖不完整

      QQ图片20220913142951.png

      发布在 V Series
      bayche
      bayche
    • 回复: 交叉编译PPP源码的时候修改CC选项报错

      @dort91011 就是这个软件他链接了一个ssl库,这个ssl库也需要交差编译,可能这个ssl库也有链接其他库,要保证整条编译链路都是一个编译器编译的才能链接上

      发布在 MR Series
      bayche
      bayche
    • 回复: 交叉编译PPP源码的时候修改CC选项报错

      @dort91011 修改编译器后链接库也需要修改到对应编译器,不能用原来gcc的,可以用objdump查看格式

      发布在 MR Series
      bayche
      bayche
    • 回复: 交叉编译PPP源码的时候修改CC选项报错

      是链接库的问题还需要加-I头文件和-L链接,这里只修改了编译器链接

      发布在 MR Series
      bayche
      bayche
    • 回复: 交叉编译后的文件通过ADB PUSH到开发板失败

      要退出adb shell 再执行push命令 后面的地址就是你想要oush的目录

      @haaland 在 交叉编译后的文件通过ADB PUSH到开发板失败 中说:

      串口 Transfer->Zmodem 添加文件点Start upload下载到853失败了

      串口多慢啊,ADB在各个芯片平台使用方法都通用的,教程也多可以多看看

      发布在 V Series
      bayche
      bayche
    • D1哪吒Debian系统内核驱动模块编译和使用(以CP210x USB to Serial 为例)

      最近在使用哪吒D1开发板时遇到了一些USB转串口驱动上的小问题。

      方案基于PerfXLab的Debian系统进行开发,最近在测试2D LIDAR时发现内核中没有带USB转串口驱动,无法加载/dev/ttyUSB0设备,故需自行编译对应内核模块,具体步骤如下:

      1. Kernel源代码准备

      PerfXLab的内核源代码已经在GitHub上开源(开源地址:https://github.com/rvboards/linux_kernel_for_d1 ),将代码clone到本地后,依README.md要求准备.config文件和board.dts文件

      2. 编译内核所需工具链准备

      编译内核需要使用到D1的SDK工具,该工具可与全志客户服务中心下载,在步骤1仓库的README文件中亦有上传到百度云的工具链压缩包文件。解压工具链包后可以得到以下二进制文件以及对应库文件。

      053e725183dbce1f7aba0e9a7fc27f1a.png

      使用--version参数运行对应gcc程序,可以看到gcc的版本是8.1.0。

      847544d3dd3ded8f79fb5bb1d0915271.png

      3. 配置内核

      在内核目录下运行如下命令:

      make ARCH=riscv CROSS_COMPILE={工具链的bin目录}/riscv64-unknown-linux-gnu- menuconfig
      

      进入内核配置界面。在主界面按下/键搜索cp210x。

      0b892ee699b413c9d82f0bf19d1f1b4d.png

      得到以下搜索结果:

      5021a4f46161a8a967371b0233f82c64.png

      将对应选项勾选为<M>,表示编译为内核模块。

      d64c388d78f2ec17cea2c2a075f9b890.png

      之后使用命令

      make ARCH=riscv CROSS_COMPILE={工具链的bin目录}/riscv64-unknown-linux-gnu- -j$(nproc)
      

      完成内核编译工作。

      内核编译完成后,在内核目录的drivers/usb/serial文件夹下将出现usbserial.ko和cp210x.ko文件,将其复制到开发板上。

      195f9137942541fb5ecf9f414569ee17.png

      4. 内核模块加载

      SSH进入哪吒开发板,首先使用lsmod查看当前加载的内核模块。

      39d7fb42bc46bc25d17afdfa5cbe1e4b.png

      使用insmod命令按顺序加载usbserial.ko和cp210x.ko模块,之后使用lsmod查看加载的内核模块列表。

      2bf2c2c73b54378da41e534e06ed57bb.png

      可以使用dmesg命令查看内核日志,日志中将显示cp210x模块已经成功加载。

      f473445761bac2a8f50c4ec6b2363fe2.png

      5. 设备使用

      插入cp210x设备,在内核日志中可以看到设备加载完成并被分配到ttyUSB0。

      24c12b3802446761fdc3e252dab74fb1.png

      使用lsusb命令检查设备状态。

      926a140c4b7c59b484c28ba83db40ac1.png

      同样地,我们的ROS2应用程序可以正常运行并读取激光传感器输入。ROS2到D1开发板的移植部分将在后续博文中详细介绍。

      d53f3e3d9a601fab0a919a2bd1504a8f.png

      原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.429d2846YxH5Fg&id=4080021079526019072

      发布在 MR Series
      bayche
      bayche
    • 如何用100元制作一块V853 AI 开发板

      全志最新发布的V853芯片拥有1T的NPU算力,还有Arm+RISC-V+NPU三核异构和丰富的音视频接口,那么用V853 DIY一块小开发板需要多少钱呢?

      答案是:100元

      让我们跟着社区大佬【GloomyGhost】的脚步,制作一块开发板属于自己的AI开发板吧!
      @YuzukiTsuru

      640.png

      开发板全部设计文件已通过全志在线开发者社区开源,开发板遵循【Open Source Harware】协议,任何组织和个人均可用于生产、二次开发及获利。详情点击文末【阅读原文】了解。

      第一步 硬件设计

      首先,在进入嘉立创EDA界面后可以点击“新建工程”首先创建一个属于自己的Project,为Project取名后就可以进入到编辑页面,可以先在右下角修改一下表格信息,标注一下相关的情况,也相当于给自己的板子加个水印了。

      D0892BDC-80DA-4efc-8B75-BAB2FCBCE156.png

      再来给空空如也的画板添上一点元件,在嘉立创EDA中可以直接在元件库中搜索自己需要的元件,并直接将原理图放置到画板上。

      C866795F-2B3C-45de-93FF-B00BC6CF2217.png

      放置好元件后你可以找到对应引脚,然后画线,GND等符号和标识符都可以在上方的“电气工具”栏目中找到,将这些标识符都标好之后,就可以得到一张这样的图,此时是不是已经有一点画板的成就感了。

      1F75C3C6-E2E9-4f53-A999-5A45DB6161F6.png

      原理图画完接着就可以绘制PCB了,在上方的导航栏里可以点击“设计”—“原理图转PCB”进行转换,尺寸参数可以按照自己的需求填写。为方便做兼容设计,这里我们参考树莓派A的版型。

      14F2EFD0-36AC-4beb-8E88-AD95D606BCE9.png B440241F-C4CF-4f0b-92F9-878A6C779D70.png

      转换后将所有元件集中到同一面上,接下来就是十分折磨人的“布线”过程,在这里也可以为了后续开发引出排针连接传感器。这一步骤也是DIY过程里最磨心思的步骤,当然,你也可以选择自动布线。

      534266B0-ED8B-4ad7-BDAC-2B919DDF21BA.png
      微信图片_20220803112535.png

      到这里为止,开发板的硬件设计部分就完成了。

      V853 YUANLI.jpg

      第二步 打板备料

      万事俱备后就可以在嘉立创下单打板,静候板子的到来。

      IMG_0411.PNG.JPG

      在JLC平台打板速度很快,大约只要2-3天,就可以送到你的手上。学生党还可以免费打样板。

      与此同时,我们可以导出Bom表,准备贴片用的元器件。

      5E32E6FE-9402-418b-8BF0-64C028627F5C.png 640 (1).png
      【Bom表截图(部分)】

      **其中,全志V853芯片可以在全志在线开发者社区买到样片。

      个人开发者分享设计方案到社区,可以免费获赠样片哦~**

      板子到手后,我们就可以将事先准备好的元器件焊到开发板上了。

      5b5ecac1-6c94-4539-9d51-430e7e944e69-e4a66a54658144cc37549dc78f4d019-resized.jpg

      第三步 焊接调试

      接下来,就是最考验我们手艺人手艺的焊接环节了。

      微信图片_20220810155253.jpg

      此处省略小心翼翼的焊接过程10000字……
      贴片完成:

      V853ce.jpg

      最后,烧入官方提供的Tina Linux系统固件,板子完美运行。

      微信图片_20220810155250.jpg

      这样,一块“简简单单”的V853 AI开发板就做好了。

      总成本:

      • 大件物料:主控V853+WiFi/BT芯片XR829+PMU+AXP2101+eMMC+DDR 约70元(样片价估算)
      • 小料:电容+电阻+USB接口+LED灯+接插件…… 约10元
      • PCB:约20元(小批量打样)
      • 总价:¥100元

      凡在哇酷淘店购买V853开发板者在社区分享开发经验,最高可返还全部购买费用:https://bbs.aw-ol.com/topic/1724/
      全志V853可以申请样片了,本站网友开源原理图与PCB送两片V853芯片(不能与其他网友作品雷同):https://bbs.aw-ol.com/topic/1677/
      全志在线开发者论坛V853 AI开发板资料获取:https://bbs.aw-ol.com/topic/1389/
      开发板jlc开源地址:https://oshwhub.com/gloomyghost/porject-yosemite

      发布在 V Series
      bayche
      bayche
    • V853开发板移植基于 LVGL 的 2048 小游戏

      LVGL 开发实战

      移植基于 LVGL 的 2048 小游戏

      这一节将以一个已经编写好的 lvgl 小游戏 2048 描述如何将已经编写完成的 lvgl 程序移植到开发板上。

      这里使用的 2048 小游戏由百问网提供,开源地址:lv_lib_100ask

      准备脚手架

      在这之前,我们先准备基础的 LVGL 脚手架。可以直接从 lv_g2d_test 里复制过来进行修改即可。

      首先我们复制源码,在 platform/thirdparty/gui/lvgl-8 源码文件夹里,把 红色箭头 所指的 lv_g2d_test 的源码作为模板复制到 黄色箭头指向的 lv_2048 文件夹里。

      如下图所示,并清理下 res 资源文件夹,

      2022-07-18-13-53-08-1658123584(1).png

      同样的,复制一份引索文件,找到 openwrt/package/thirdparty/gui/lvgl-8 并把 lv_g2d_test 复制一份重命名为 lv_2048 作为我们 2048 小游戏使用的引索。

      2022-07-18-13-53-55-1658123630(1).png

      并编辑 Makefile,修改文件名称,把 lv_g2d_test 修改为这里的 lv_2048

      include $(TOPDIR)/rules.mk
      include $(INCLUDE_DIR)/package.mk
      include ../sunxifb.mk
      
      PKG_NAME:=lv_2048
      PKG_VERSION:=8.1.0
      PKG_RELEASE:=1
      
      PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
      SRC_CODE_DIR := $(LICHEE_PLATFORM_DIR)/thirdparty/gui/lvgl-8/$(PKG_NAME)
      define Package/$(PKG_NAME)
        SECTION:=gui
        SUBMENU:=Littlevgl
        CATEGORY:=Gui
        DEPENDS:=+LVGL8_USE_SUNXIFB_G2D:libuapi +LVGL8_USE_SUNXIFB_G2D:kmod-sunxi-g2d \
                 +LVGL8_USE_FREETYPE:libfreetype
        TITLE:=lvgl 2048 
      endef
      
      PKG_CONFIG_DEPENDS := \
          CONFIG_LVGL8_USE_SUNXIFB_DOUBLE_BUFFER \
          CONFIG_LVGL8_USE_SUNXIFB_CACHE \
          CONFIG_LVGL8_USE_SUNXIFB_G2D \
          CONFIG_LVGL8_USE_SUNXIFB_G2D_ROTATE
      
      define Package/$(PKG_NAME)/config
      endef
      
      define Package/$(PKG_NAME)/Default
      endef
      
      define Package/$(PKG_NAME)/description
        a lvgl 2048 v8.1.0
      endef
      
      define Build/Prepare
          $(INSTALL_DIR) $(PKG_BUILD_DIR)/
          $(CP) -r $(SRC_CODE_DIR)/src $(PKG_BUILD_DIR)/
          $(CP) -r $(SRC_CODE_DIR)/../lvgl $(PKG_BUILD_DIR)/src/
          $(CP) -r $(SRC_CODE_DIR)/../lv_drivers $(PKG_BUILD_DIR)/src/
      endef
      
      define Build/Configure
      endef
      
      TARGET_CFLAGS+=-I$(PKG_BUILD_DIR)/src
      
      ifeq ($(CONFIG_LVGL8_USE_SUNXIFB_G2D),y)
      TARGET_CFLAGS+=-DLV_USE_SUNXIFB_G2D_FILL \
                      -DLV_USE_SUNXIFB_G2D_BLEND \
                      -DLV_USE_SUNXIFB_G2D_BLIT \
                      -DLV_USE_SUNXIFB_G2D_SCALE
      endif
      
      define Build/Compile
          $(MAKE) -C $(PKG_BUILD_DIR)/src\
              ARCH="$(TARGET_ARCH)" \
              AR="$(TARGET_AR)" \
              CC="$(TARGET_CC)" \
              CXX="$(TARGET_CXX)" \
              CFLAGS="$(TARGET_CFLAGS)" \
              LDFLAGS="$(TARGET_LDFLAGS)" \
              INSTALL_PREFIX="$(PKG_INSTALL_DIR)" \
              all
      endef
      
      define Package/$(PKG_NAME)/install
          $(INSTALL_DIR) $(1)/usr/bin/
          $(INSTALL_DIR) $(1)/usr/share/lv_2048
          $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/$(PKG_NAME) $(1)/usr/bin/
      endef
      
      $(eval $(call BuildPackage,$(PKG_NAME)))
      

      完成脚手架的搭建后,可以 make menuconfig 里查看是否出现了 lv_2048 这个选项,选中它。

      2022-07-18-13-56-31-image.png

      修改源码

      第二步是修改源码。编辑之前复制的 main.c 文件,把不需要的 lv_g2d_test 的部分删去。保留最基础的部分。

      #include "lvgl/lvgl.h"
      #include "lv_drivers/display/sunxifb.h"
      #include "lv_drivers/indev/evdev.h"
      #include <unistd.h>
      #include <pthread.h>
      #include <time.h>
      #include <sys/time.h>
      #include <stdlib.h>
      #include <stdio.h>
      
      static lv_style_t rect_style;
      static lv_obj_t *rect_obj;
      static lv_obj_t *canvas;
      
      int main(int argc, char *argv[]) {
          lv_disp_drv_t disp_drv;
          lv_disp_draw_buf_t disp_buf;
          lv_indev_drv_t indev_drv;
          uint32_t rotated = LV_DISP_ROT_NONE;
      
          lv_disp_drv_init(&disp_drv);
      
          /*LittlevGL init*/
          lv_init();
      
          /*Linux frame buffer device init*/
          sunxifb_init(rotated);
      
          /*A buffer for LittlevGL to draw the screen's content*/
          static uint32_t width, height;
          sunxifb_get_sizes(&width, &height);
      
          static lv_color_t *buf;
          buf = (lv_color_t*) sunxifb_alloc(width * height * sizeof(lv_color_t), "lv_2048");
      
          if (buf == NULL) {
              sunxifb_exit();
              printf("malloc draw buffer fail\n");
              return 0;
          }
      
          /*Initialize a descriptor for the buffer*/
          lv_disp_draw_buf_init(&disp_buf, buf, NULL, width * height);
      
          /*Initialize and register a display driver*/
          disp_drv.draw_buf = &disp_buf;
          disp_drv.flush_cb = sunxifb_flush;
          disp_drv.hor_res = width;
          disp_drv.ver_res = height;
          disp_drv.rotated = rotated;
          disp_drv.screen_transp = 0;
          lv_disp_drv_register(&disp_drv);
      
          evdev_init();
          lv_indev_drv_init(&indev_drv); /*Basic initialization*/
          indev_drv.type = LV_INDEV_TYPE_POINTER; /*See below.*/
          indev_drv.read_cb = evdev_read; /*See below.*/
          /*Register the driver in LVGL and save the created input device object*/
          lv_indev_t *evdev_indev = lv_indev_drv_register(&indev_drv);
      
          /*Handle LitlevGL tasks (tickless mode)*/
          while (1) {
              lv_task_handler();
              usleep(1000);
          }
      
          return 0;
      }
      
      /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
      uint32_t custom_tick_get(void) {
          static uint64_t start_ms = 0;
          if (start_ms == 0) {
              struct timeval tv_start;
              gettimeofday(&tv_start, NULL);
              start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
          }
      
          struct timeval tv_now;
          gettimeofday(&tv_now, NULL);
          uint64_t now_ms;
          now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;
      
          uint32_t time_ms = now_ms - start_ms;
          return time_ms;
      }
      

      接下来则是对接 lv_lib_100ask 与 2048 小游戏,我们先下载 lv_lib_100ask 的源码,放置到 platform/thirdparty/gui/lvgl-8/lv_2048 的 src 文件夹里。并按照 lv_lib_100ask 的说明,复制一份 lv_lib_100ask_conf_template.h 到 src 目录,并改名为 lv_lib_100ask_conf.h

      2022-07-18-14-55-44-image.png

      编辑 lv_lib_100ask_conf.h,开启整个库的引用,并配置启用 LV_USE_100ASK_2048 。为了简洁,这里删除了不需要的配置项。

      /**
       * @file lv_lib_100ask_conf.h
       * Configuration file for v8.2.0
       *
       */
      /*
       * COPY THIS FILE AS lv_lib_100ask_conf.h
       */
      
      /* clang-format off */
      #if 1 /*Set it to "1" to enable the content*/ 
      
      #ifndef LV_LIB_100ASK_CONF_H
      #define LV_LIB_100ASK_CONF_H
      
      #include "lv_conf.h"
      
      /*******************
       * GENERAL SETTING
       *******************/
      
      /*********************
       * USAGE
       *********************
      
      /*2048 game*/
      #define LV_USE_100ASK_2048                               1
      #if LV_USE_100ASK_2048
          /* Matrix size*/
          /*Do not modify*/
          #define  LV_100ASK_2048_MATRIX_SIZE          4
      
          /*test*/
          #define  LV_100ASK_2048_SIMPLE_TEST          1
      #endif  
      
      #endif /*LV_LIB_100ASK_H*/
      
      #endif /*End of "Content enable"*/
      

      再编辑 platform/thirdparty/gui/lvgl-8/lv_2048/src/lv_lib_100ask/lv_lib_100ask.h 中的版本号,修改为 (8,1,0)

      2022-07-18-15-13-39-image.png

      之后在 main.c 里修改,对接 lv_100ask_2048_simple_test,具体如下。

      (1)头文件加入 lv_lib_100ask/lv_lib_100ask.h

      #include <lv_lib_100ask/lv_lib_100ask.h>
      

      (2)在 main 函数里添加接口调用

      lv_100ask_2048_simple_test();
      

      完整的 main.c 如下

      #include <unistd.h>
      #include <pthread.h>
      #include <time.h>
      #include <sys/time.h>
      #include <stdlib.h>
      #include <stdio.h>
      
      #include "lvgl/lvgl.h"
      #include "lv_drivers/display/sunxifb.h"
      #include "lv_drivers/indev/evdev.h"
      
      #include "lv_lib_100ask/lv_lib_100ask.h"  // 引用头文件
      
      static lv_style_t rect_style;
      static lv_obj_t *rect_obj;
      static lv_obj_t *canvas;
      
      int main(int argc, char *argv[]) {
          lv_disp_drv_t disp_drv;
          lv_disp_draw_buf_t disp_buf;
          lv_indev_drv_t indev_drv;
          uint32_t rotated = LV_DISP_ROT_NONE;
      
          lv_disp_drv_init(&disp_drv);
      
          /*LittlevGL init*/
          lv_init();
      
          /*Linux frame buffer device init*/
          sunxifb_init(rotated);
      
          /*A buffer for LittlevGL to draw the screen's content*/
          static uint32_t width, height;
          sunxifb_get_sizes(&width, &height);
      
          static lv_color_t *buf;
          buf = (lv_color_t*) sunxifb_alloc(width * height * sizeof(lv_color_t), "lv_nes");
      
          if (buf == NULL) {
              sunxifb_exit();
              printf("malloc draw buffer fail\n");
              return 0;
          }
      
          /*Initialize a descriptor for the buffer*/
          lv_disp_draw_buf_init(&disp_buf, buf, NULL, width * height);
      
          /*Initialize and register a display driver*/
          disp_drv.draw_buf = &disp_buf;
          disp_drv.flush_cb = sunxifb_flush;
          disp_drv.hor_res = width;
          disp_drv.ver_res = height;
          disp_drv.rotated = rotated;
          disp_drv.screen_transp = 0;
          lv_disp_drv_register(&disp_drv);
      
          evdev_init();
          lv_indev_drv_init(&indev_drv); /*Basic initialization*/
          indev_drv.type = LV_INDEV_TYPE_POINTER; /*See below.*/
          indev_drv.read_cb = evdev_read; /*See below.*/
          /*Register the driver in LVGL and save the created input device object*/
          lv_indev_t *evdev_indev = lv_indev_drv_register(&indev_drv);
      
          lv_100ask_2048_simple_test();  // 调用 2048 小游戏
      
          /*Handle LitlevGL tasks (tickless mode)*/
          while (1) {
              lv_task_handler();
              usleep(1000);
          }
      
          return 0;
      }
      
      /*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
      uint32_t custom_tick_get(void) {
          static uint64_t start_ms = 0;
          if (start_ms == 0) {
              struct timeval tv_start;
              gettimeofday(&tv_start, NULL);
              start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;
          }
      
          struct timeval tv_now;
          gettimeofday(&tv_now, NULL);
          uint64_t now_ms;
          now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;
      
          uint32_t time_ms = now_ms - start_ms;
          return time_ms;
      }
      

      然后就是 Makefile 修改,增加一个 lv_lib_100ask 的 SRC 引用。

      include lv_lib_100ask/lv_lib_100ask.mk
      

      顺便也把 BIN 改为 lv_2048 ,完整的 Makefile 如下

      #
      # Makefile
      #
      CC ?= gcc
      LVGL_DIR_NAME ?= lvgl
      LVGL_DIR ?= ${shell pwd}
      CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare
      LDFLAGS ?= -lm
      BIN = lv_2048
      
      
      #Collect the files to compile
      SRCDIRS   =  $(shell find . -maxdepth 1 -type d)
      MAINSRC = $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
      
      include $(LVGL_DIR)/lvgl/lvgl.mk
      include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
      include lv_lib_100ask/lv_lib_100ask.mk
      
      OBJEXT ?= .o
      
      AOBJS = $(ASRCS:.S=$(OBJEXT))
      COBJS = $(CSRCS:.c=$(OBJEXT))
      
      MAINOBJ = $(MAINSRC:.c=$(OBJEXT))
      
      SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
      OBJS = $(AOBJS) $(COBJS)
      
      ## MAINOBJ -> OBJFILES
      
      all: default
      
      %.o: %.c
          @$(CC)  $(CFLAGS) -c $< -o $@
          @echo "CC $<"
      
      default: $(AOBJS) $(COBJS) $(MAINOBJ)
          $(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)
      
      clean: 
          rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)
      

      对接触摸

      做了以上操作,可能会发现触摸没有反应,这是因为触摸绑定的 event 事件号不对,默认的绑定是 event3 而查阅启动 log 可知,开发板的触摸屏对接的是 event0

      2022-07-18-15-17-48-image.png

      这时需要修改绑定的 event 事件号,其配置文件在 lv_drv_conf.h 内:

      2022-07-18-15-19-12-image.png

      这里将 event3 改为 event0 即可

      #  define EVDEV_NAME   "/dev/input/event0"
      

      当然除了这样的方法,另外也可以用命令生成软连接touchscreen,就会直接以 touchscreen 为触摸节点,方便调试:

      ln -s /dev/input/eventX /dev/input/touchscreen
      

      测试编译

      修改好了,希望单独编译这个包测试下而不编译完整的 SDK。可以这样做:

      (1)确保已经 source build/envsetup.sh 并已经 lunch

      (2)在任意文件夹下执行命令 mmo lv_2048 -B

      其中 mmo 的意思是 单独编译一个 openWrt 软件包,后面的 lv_2048 是软件包名。-B 参数是先 clean 再编译,不加这个参数就是直接编译了。

      测试运行

      编译打包后,到开发板上使用 lv_2048 即可运行

      2022-07-18-14-47-19-lQDPJxaBvZoKbvPNC9DND8CwaCpI77wfq4cC1aIjrECqAA_4032_3024.jpg

      发布在 V Series
      bayche
      bayche
    • V853开发板开发进阶——在Linux下加载E907核心固件

      以下内容均来自V853在线文档:https://v853.docs.aw-ol.com/soft/dev_e907_firm/

      E907 核心固件加载

      在调试阶段,需要经常修改 E907 的代码。而为了调试代码多次刷写系统非常麻烦。其实 E907 核心的固件可以在 Linux 系统内加载,本文将描述如何在 Linux 系统内启动 E907 核心、加载 E907 固件、关闭 E907 核心。

      如何加载

      从上一篇文章可以知道,这里使用 remoteproc 管理小核的生命周期。
      上一篇文章:详解全志V853上的ARM A7和RISC-V E907之间的通信方式
      remoteproc 框架抽象出硬件差异,允许不同的平台/架构来控制(开机、加载固件、关机)这些远程处理器,此外,还为支持这种通信的远程处理器添加了 rpmsg virtio 设备。这样,特定平台的 remoteproc 驱动程序只需要提供一些低级处理程序,然后所有 rpmsg 驱动程序就可以正常工作。

      作用:

      • 从文件系统加载固件
      • 准备远程处理器所需资源
      • 注册一个 rpmsg virtio 设备
      • 提供对要提供对远程处理器的生命周期进行管理

      2022-07-19-15-33-28-image.png

      所以固件的加载流程大致如下:

      1. 加载固件
         1. 调用 firmware 接口获取文件系统中的固件
         2. 解析固件的 resource_table 段,该段有如下内容
            1. 声明需要的内存(Linux 为其分配)
            2. 声明使用的 vdev(固定为一个)
            3. 声明使用的 vring(固定为两个)
         3. 将固件加载到指定地址
      2. 注册 rpmsg virtio 设备
         1. 提供 vdev->ops(基于 virtio 接口实现的)
         2. 与 rpmsg_bus 驱动匹配,完成 rpmsg 初始化
      3. 启动小核
         1. 调用 rproc->ops->start
      

      Kernel 的配置

      首先需要配置设备树,预留 E907 核心内存,buffer 内存,vring 内存等。并正确配置 rproc 与 rpbuf,也不要忘记配置 firmware-name,下面的配置示例为测试固件所使用的地址。不同的固件地址可能不同。

      reserved-memory {
          e907_dram: riscv_memserve {
              reg = <0x0 0x48000000 0x0 0x00400000>;
              no-map;
          };
      
          vdev0buffer: vdev0buffer@47000000 {
              /* 256k reserved for shared mem pool */
              compatible = "shared-dma-pool";
              reg = <0x0 0x47000000 0x0 0x40000>;
              no-map;
          };
      
          vdev0vring0: vdev0vring0@47040000 {
              reg = <0x0 0x47040000 0x0 0x20000>;
              no-map;
          };
      
          vdev0vring1: vdev0vring1@47060000 {
              reg = <0x0 0x47060000 0x0 0x20000>;
              no-map;
          };
      };
      
      e907_rproc: e907_rproc@0 {
          compatible = "allwinner,sun8iw21p1-e907-rproc";
          clock-frequency = <600000000>;
          memory-region = <&e907_dram>, <&vdev0buffer>,
                          <&vdev0vring0>, <&vdev0vring1>;
          mboxes = <&msgbox 0>;
          mbox-names = "mbox-chan";
          iommus = <&mmu_aw 5 1>;
      
          memory-mappings =
              /* DA              len         PA */
              /* DDR for e907  */
              < 0x48000000 0x00400000 0x48000000 >;
          core-name = "sun8iw21p1-e907";
          firmware-name = "melis-elf";
          status = "okay";
      };
      
      rpbuf_controller0: rpbuf_controller@0 {
          compatible = "allwinner,rpbuf-controller";
          remoteproc = <&e907_rproc>;
          ctrl_id = <0>;    /* index of /dev/rpbuf_ctrl */
          iommus = <&mmu_aw 5 1>;
          status = "okay";
      };
      
      rpbuf_sample: rpbuf_sample@0 {
          compatible = "allwinner,rpbuf-sample";
          rpbuf = <&rpbuf_controller0>;
          status = "okay";
      };
      

      接下来需要配置 kernel 选项,配置驱动。

      make kernel_menuconfig
      

      并勾选以下驱动:

      Device Drivers  --->
        Remoteproc drivers  --->
          <*> SUNXI remote processor support
        Rpmsg drivers  --->
          <*> allwinnertech rpmsg driver for v853-e907
          <*> allwinnertech rpmsg hearbeat driver
          <*> Virtio RPMSG bus driver 
          <*> sunxi rpmsg ctrl driver
        [*] Mailbox Hardware Support  --->
          <*>   sunxi Mailbox
          <*>   sunxi rv32 standby driver
      

      加载小核固件

      测试固件下载地址:https://www.aw-ol.com/downloads?cat=16

      烧录启动系统后,可以在 /sys/kernel/debug/remoteproc/ 节点找到 remoteproc0

      2022-07-19-15-58-51-image.png

      我们可以使用 cat 命令检查小核目前的状况

      cat /sys/kernel/debug/remoteproc/remoteproc0/state
      

      2022-07-19-16-04-59-image.png

      可以看到目前是 offline 的。可以尝试使用 echo 启动小核

      echo start > /sys/kernel/debug/remoteproc/remoteproc0/state
      

      2022-07-19-16-07-40-image.png

      可以看到,由于我们没有加载固件,小核启动失败。此时我们需要把准备好的固件放置到开发板的 lib/firmware 文件夹内。这里我们使用 adb 上传小核固件。

      !2022-07-19-16-17-14-image.png

      然后我们将固件名称置于 firmware 节点内,并启动固件。

      echo e907_test.elf > /sys/kernel/debug/remoteproc/remoteproc0/firmware
      
      echo start > /sys/kernel/debug/remoteproc/remoteproc0/state
      

      此时可以看到 remote processor e907_rproc is now up,同时查看状态也显示了 running

      2022-07-19-16-46-33-image.png

      此时也可以用 stop 命令停止小核运行

      echo stop > /sys/kernel/debug/remoteproc/remoteproc0/state
      

      2022-07-19-16-49-24-image.png

      测试小核

      在测试之前我们先把 kernel 侧的设备树中 uart3 禁用,使小核可以使用 uart3 外设打印日志。

      &uart3 {
              pinctrl-names = "default", "sleep";
              pinctrl-0 = <&uart3_pins_active>;
              pinctrl-1 = <&uart3_pins_sleep>;
              uart-supply = <&reg_dcdc1>;
              status = "disabled";
      };
      

      如果不禁用 uart3 会出现错误提示:

      uart: create mailbox fail
      uart: irq for uart3 already enabled
      uart: create mailbox fail
      

      然后将调试串口连接到 UART3 排针,加载固件。

      echo e907_test.elf > /sys/kernel/debug/remoteproc/remoteproc0/firmware
      
      echo start > /sys/kernel/debug/remoteproc/remoteproc0/state
      

      便可以启动小核的固件

      2022-07-19-18-26-16-image.png

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件资料——RISC-V核E907

      玄铁E907 R1S1用户手册:玄铁E907 R1S1用户手册_OCC.pdf
      E907小核测试固件下载链接:https://www.aw-ol.com/downloads?cat=16

      简介

      E907 是一款基于 RISC-V 指令集的高性能嵌入式微处理处理器,是平头哥 RISC-V MCU 产品线中的最高性能处理器。E907 主要面向语音、MPU、导航、WiFi 等应用领域。

      特点

      E907 处理器体系结构的主要特点如下:
      • 32 位 RISC 处理器;
      • 支持 RISC-V RV32IMA[F][D]C[P] 指令集;
      • 支持 RISC-V 32/16 位混编指令集;
      • 支持 RISC-V 机器模式和用户模式;
      • 32 个 32 位整型通用寄存器,32 个 32 位/64 位浮点通用寄存器;
      • 整型 5 级/浮点 7 级,单发射,顺序执行流水线;
      • 支持 AXI4.0 主设备接口以及 AHB5.0 外设接口;
      • 指令 cache,两路组相连结构,2KB-32KB 可配置;
      • 数据 cache,两路组相连结构,2KB-32KB 可配置;
      • 支持非对齐内存访问;
      • 双周期硬件乘法器,基 4 硬件除法器;
      • 可选配 BHT 和 BTB;
      • 支持平头哥扩展增强指令集;
      • 支持平头哥 MCU 特性扩展技术,包括中断处理加速技术、MCU 扩展特性;
      • 兼容 RISC-V CLIC 中断标准,支持中断嵌套,外部中断源数量最高可配置 240 个;
      • 兼容 RISC-V PMP 内存保护标准,0/4/8/12/16 区域可配置;
      • 支持可配的性能监测单元;
      • 支持 RISC-V Debug 协议标准;
      • 频率 >1.0GHz@T28 HPCPlus, 9T SVT(worst case), Coremark > 3.8 coremark/MHz, Dhrystone >2.0DMIPS/MHz。

      E907特性.jpg

      发布在 V Series
      bayche
      bayche
    • 回复: 求 V853 RISC 端的资料,目的是在 E907 上运行 RTOS !!!

      资料都在这里呢 https://bbs.aw-ol.com/topic/1776/

      发布在 V Series
      bayche
      bayche
    • V853开发板开发进阶——GPADC

      以下内容转自全志在线V853在线文档:https://v853.docs.aw-ol.com/soft/dev_gpadc/

      GPADC

      GPADC(General Purpose Analog to Digital Converter)是指高精度数模转换模块,拥有12bit分辨率,8位采集精度。模拟输入范围0~1.8V,最高采样率1MHz。

      V853 GPADC驱动路径:

      tina/lichee/linux-4.9/drivers/input/sensor/sunxi_gpadc.c
      tina/lichee/linux-4.9/drivers/input/sensor/sunxi_gpadc.h
      

      GPADC硬件介绍

      image-20220701143019291.png
      AVCC 为 1.8V 电源供电,通过一个电阻串联到GPADC的按键组。按键通过不同阻值的电阻相连接,按下不同的按键,GPADC0 口的电压不同,CPU 通过对这个电压的采样来决定具体是哪一个按键被按下。上图按键与电压的对应关系如下表所示:

      0.21V 0.41V 0.59V 0.75V 0.88V
      VOL+ VOL- MENU ENTER HOME

      当按键按下时,会触发 GPADC 模块的中断,CPU 会采集 GPADC 的数据,采集到的数据转换成相应的键值之后通过 input 子系统上传到 /dev/input/event 节点,程序便可以从相应的节点获取数据。

      GPADC软件介绍

      设备树配置

      GPADC 的设备树配置分为两个部分:

      第一部分包括基础的寄存器配置、设备驱动绑定配置和时钟中断配置。这一部分的配置位于 kernel/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi 文件内。这一部分通常不需要修改。

      gpadc:gpadc@2009000 {
      	compatible = "allwinner,sunxi-gpadc";         // 用于驱动和设备的绑定
      	reg = <0x0 0x02009000 0x0 0x400>;             // 设备使用的寄存器地址
      	interrupts = <GIC_SPI 57 IRQ_TYPE_NONE>;      // 设备使用的中断
      	clocks = <&clk_gpadc>;                        // 设备使用的时钟
      	status = "disabled";                          // 配置默认不启用GPADC
      };
      

      第二部分包括采样相关的配置,键值,电压数据等等,在 device/config/chips/v853/configs/vision/board.dts 文件内

      &gpadc {
      	channel_num = <1>;                        // 使用1通道
      	channel_select = <0x01>;                  // 选择 0x01 通道
      	channel_data_select = <0>;                // 启用数据通道
      	channel_compare_select = <0x01>;          // 启用通道比较功能
      	channel_cld_select = <0x01>;              // 启用数据小于比较功能
      	channel_chd_select = <0>;                 // 启用数据大于比较功能
      	channel0_compare_lowdata = <1700000>;     // 小于这个值触发中断
      	channel0_compare_higdata = <1200000>;     // 大于这个值触发中断
      	channel1_compare_lowdata = <460000>;      // 小于这个值触发中断
      	channel1_compare_higdata = <1200000>;     // 大于这个值触发中断
      	key_cnt = <5>;                            // 按键数量
      	key0_vol = <210>;                         // 按键电压,单位mv
      	key0_val = <115>;                         // 按下按键的键值
      	key1_vol = <410>;                         // 按键电压,单位mv
      	key1_val = <114>;                         // 按下按键的键值
      	key2_vol = <590>;                         // 按键电压,单位mv
      	key2_val = <139>;                         // 按下按键的键值
      	key3_vol = <750>;                         // 按键电压,单位mv
      	key3_val = <28>;                          // 按下按键的键值
      	key4_vol = <880>;                         // 按键电压,单位mv
      	key4_val = <102>;                         // 按下按键的键值
      	status = "okay";                          // 启用GPADC
      };
      

      内核驱动配置

      make kernel_menuconfig 进入内核配置界面,找到Device Drivers,进入。

      01.png

      找到 Input device support ,进入。

      02.png

      找到 Sensors 空格勾选并进入。

      03.png

      空格选中 <*> SUNXI GPADC ,保存并退出配置页面。

      04.png

      之后编译内核,打包烧录即可

      测试 GPADC

      make menuconfig 进入 openWrt 配置页面,找到 getevent 软件包。

      Utilities  --->
      	<*> getevent.................................... getevent for Android Toolbox
      

      之后编译打包烧录到开发板上,运行 getevent,可以看到sunxi-gpadc

      05.png

      此时按下按键,可以看到按键键值显示出来了

      06.png

      编写一个程序

      测试完成设备正常使用后,可以尝试编写一个程序测试GPADC。

      以下demo程序用来读取 GPADC 模块用于 KEY 的按键上报事件,其循环10次读取按键上报事件输入,并且显示出相应按键的值。

      #include <stdio.h>
      #include <linux/input.h>
      #include <stdlib.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <sys/time.h>
      #include <limits.h>
      #include <unistd.h>
      #include <signal.h>
      
      #define DEV_PATH "/dev/input/event3"   //查看上节sunxi-gpadc的event号,是event3
      static int gpadc_fd = 0;
      
      unsigned int test_gpadc(const char * event_file)
      {
      	int code = 0, i;
      
      	struct input_event data;
      
      	gpadc_fd = open(DEV_PATH, O_RDONLY);
      
      	if(gpadc_fd <= 0)
      	{
      		printf("open %s error!\n", DEV_PATH);
      		return -1;
      	}
      
      	for(i = 0; i < 10; i++) //读10次
      	{
      		read(gpadc_fd, &data, sizeof(data));
      		if(data.value == 1)
      		{
      			printf("key %d pressed\n", data.code);
      		}
      		else if(data.value == 0)
      		{
      			printf("key %d releaseed\n", data.code);
      		}
      	}
      	close(gpadc_fd);
      	return 0;
      }
      
      int main(int argc,const char *argv[])
      {
          int rang_low = 0, rang_high = 0;
      	return test_gpadc(DEV_PATH);
      }
      

      编译后将demo adb push到开发板中,执行demo并按下对应按键,将会有响应的按键反馈输出:

      07.png

      发布在 V Series
      bayche
      bayche
    • 详解全志V853上的ARM A7和RISC-V E907之间的通信方式

      V853芯片包含两个CPU。一个是主核心Arm A7 CPU,运行Tina Linux(全志自研Linux)系统,为芯片主系统;一个是RISC-V E907辅助CPU,运行Melis(全志自研RTOS)系统,主要功能是提供通用算力补充、辅助 Linux 实现快起和低功耗管理等功能。

      微信图片_20220523110309.png

      • A7 - Linux系统

      V853主核心 A7上运行的是Tina Linux系统。Tina Linux是全志针对AIoT类产品,基于Linux内核深度定制的嵌入式系统。

      在 Tina Linux 中,提供 AMP 与 RPMsg 对接 E907

      1.Linux remoteproc 管理控制 E907
      2.RPMsg 与 E907 通讯

      • E907 - RTOS系统

      V853 辅助核心 E907 上运行的是全志自研 RTOS 系统 Melis。其独立于 A7 主核心中的 Linux 系统。可以独立运行。

      在 E907 Melis 中,提供 OpenAMP 软件框架来与 A7 Linux 系统进行通信。

      1.提供了处理器的生命周期管理(LCM,Life Cycle Management),与 Linux 的 remoteproc 兼容
      2.提供了处理器间的消息传输机制,与 Linux 的 RPMsg 兼容

      异构系统启动流程

      首先,由芯片内部的 BORM 寻找启动介质,在 V853 开发板上便是 eMMC 储存器。找到启动介质后会运行其中的 BOOT0 代码。BOOT0 会在 A7 主核心中运行 Linux 系统,也会在 E907 核心中运行 RTOS 系统。启动的两个系统是独立运行的。

      boot.png

      异构系统的通信

      V853 的异构系统通讯在硬件上使用的是 MSGBOX,在软件层面上使用的是 AMP 与 RPMsg 通讯协议。其中 A7 上基于 Linux 标准的 RPMsg 驱动框架,E907基于 OpenAMP 异构通信框架。

      V853 所带有的 A7 主核心与 E907 辅助核心是完全不同的两个核心,为了最大限度的发挥他们的性能,协同完成某一任务,所以在不同的核心上面运行的系统也各不相同。这些不同架构的核心以及他们上面所运行的软件组合在一起,就成了 AMP 系统 (Asymmetric Multiprocessing System, 异构多处理系统)。

      由于两个核心存在的目的是协同处理,因此在异构多处理系统中往往会形成 Master - Remote 结构。主核心启动后再启动辅助核心。当两个核心上的系统都启动完成后,他们之间就通过 IPC(Inter Processor Communication)方式进行通信,而 RPMsg 就是 IPC 中的一种。

      在AMP系统中,两个核心通过共享内存的方式进行通信。两个核心通过 AMP 中断来传递讯息。内存的管理由主核负责。

      image-20220704155816774.png

      AMP 系统在每个通信方向上都有两个缓冲区,分别是 USED 和 AVAIL,这个缓冲区可以按照 RPMsg 中消息的格式分成一块一块链接形成一个环。

      image-20220704160952936.png

      当主核需要和从核进行通信的时候可以分为四步:

      • 主核先从USED中取得一块内存(Allocate)
      • 将消息按照消息协议填充
      • 将该内存链接到 AVAIL 缓冲区中(Send)
      • 触发中断,通知辅助核有消息处理

      2958689-e0da20bb240ff26d.png

      反之,从核需要和主核通信的时候也类似:

      • 主核先从AVAIL中取得一块内存(Allocate)
      • 将消息按照消息协议填充
      • 将该内存链接到 USED 缓冲区中(Send)
      • 触发中断,通知主核有消息处理。

      2958689-9430112ac1bc82dd.png

      既然 RPMsg 是一种信息交换的协议,与TCP/IP类似,RPMsg 协议也有分层,主要分为三层,分别是传输层、MAC层和物理层。

      image-20220704161948895.png

      其中 MAC层 的 VirtIO 是一种I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用 I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率。

      RPMsg 总线上的消息都具有以下结构,包含消息头和数据两个固定的部分,该消息格式的定义位于drivers/rpmsg/virtio_rpmsg_bus.c中,具体定义如下:

      struct rpmsg_hdr {
          u32 src;
          u32 dst;
          u32 reserved;
          u16 len;
          u16 flags;
          u8 data[];
      } __packed;
      

      异构系统的控制

      在异构系统中,不止需要消息的传输,还需要相关控制。例如主核对辅助核心的开启,加载固件,关闭等等。这就需要用到 remoteproc 框架。

      remoteproc 框架支持对不同平台,不同架构的处理器进行控制,可以监控辅助核心的运行情况。

      对于 V853 来说,remoteproc 用于对 E907 进行生命周期管理,一般来说包含有加载固件、 检测远端处理器是否崩溃等功能。它在加载远端处理器的固件时,会根据固件中定义的 resource table 来申请资源,并创建 VirtIO 设备。

      v853shi2.jpg

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——开发板双目摄像头模组原理图

      C9202669-7BBB-4123-B55B-6DECBD85D12D.png

      V853开发板双目摄像头模组原理图20220624.pdf.pdf

      发布在 V Series
      bayche
      bayche
    • 回复: V853开发板硬件指南——开发板硬件框图及各模块原理图

      更新原理图pdf!更新原理图pdf!更新原理图pdf!
      AWOL资料下载处也更新了
      https://www.aw-ol.com/downloads?cat=17

      发布在 V Series
      bayche
      bayche
    • 全志V853开发板原理图

      开发板原理图

      V853 开发板由全志合作伙伴 索智科技 根据全志提供的参考设计修改设计。

      本章节将对开发板几个主要的部件的原理图进行说明,方便快速上手开发板的硬件资料。

      开发板硬件框图如下:

      HardwareOverview.png

      模块介绍

      GPIO 分配

      此表格为 V853 部分重要的 GPIO 的分配表,> 表示对IO的另外一个复用,完整的 GPIO 分配请参阅原理图。

      GPIO GROUP 用途 接口
      PA[0:21] MIPI CSI 摄像头 CAMERA FPC 连接器
      PC[0:11] eMMC 板载eMMC
      > PC[0:11] SPF 板载SOIC16焊盘(未贴装)
      > PC[0:6] SPI0 板载SOIC8焊盘(未贴装)
      PD[0:22] RGB(HV)LCD RGB-LCD FPC 连接器
      > PD[1:7] MIPI-DSI MIPI-LCD 连接器
      > PD[13:14] IR-CUT 摄像头 IR 滤光片驱动
      PE[0:17] DVP-CSI 板载2x16p连接器母座
      > PE[0:15] RMII 板载IP101GR,百兆以太网
      > PE[8:15] XR829 蓝牙 板载XR829模块
      PF[0:6] SDC0 板载TF卡槽
      PG[0:7] XR829 WLAN 板载XR829模块
      PH[0:1] UART 3 UART3 排针
      > PH[0:1] GPS GPS 3.5mm 连接器
      PH[0:4] I2S I2S 排针
      PH[5:8] CTP 触摸屏FPC连接器
      PH[9:10] UART0 UART0排针
      PI[1:2] PMU TWI 板载 AXP2101 通讯使用
      PI[3:4] TWI3 SC7A20 3轴数字加速度计(未贴装)DA380B 惯性传感器

      DRAM(DDR3)

      开发板使用 Rayson晶存 所生产的 RS256M16VRDK DDR3 512MB 内存,BGA96 封装。

      下图为DRAM原理图,其中颗粒端的 SDQ 信号线乱序是 DDR本身的特性,SDQ 线在组内的顺序是可以改变的,一共分两组:第一组 SDQ0-SDQ7+SDQSN/P0+SDQM0,第二组 SDQ8-SDQ16+SDQSN/P1+SDQM1 这样可以方便内存的 PCB 布线。

      V853 芯片支持双贴DRAM、同时也支持单帖双RANK的DRAM,最大16Gb。

      DRAMSCH.png

      Memory(eMMC)

      开发板 Memory 使用的是 珠海妙存科技 设计的 AT70B08G3 eMMC ,容量为 8GB,运行在 8bit 模式下。

      其中 PC2,PC3 脚为 BOOT SEL 启动顺序选择脚,通过上拉或下拉执行启动。

      开发板预留了SPI NOR、SPI NAND的焊盘,可以焊接 V853 芯片支持的 SPI NOR、SPI NAND 储存器

      BOOT SEL 0 BOOT SEL 1 1 2 3 4 5 6 7 8 备注
      0 0 SPI NAND SPI NOR(4线) SPI NOR(1线) USB FEL
      0 1 SPI NOR(4线) SPI NOR(1线) SPI NAND USB FEL 快速启动使用
      1 0 SDC 0 SPI NAND SPI NOR(4线) SPI NOR(1线) UART BRUN USB FEL
      1 1 SDC 0 SPI NOR(4线) SPI NOR(1线) EMMC2 USR EMMC BOOT SPI0 NAND UART BURN USB FEL 默认

      eMMC.png

      MIPI 摄像头(MIPI CSI)

      V853 开发板板载 40Pin FPC 连接器引出了全部 MIPI CSI 资源,支持双2lane摄像头与单4lane摄像头,开发板默认提供 1080P 双目摄像头方案,型号:GC2063。

      CSI.png

      DVP 摄像头(DVP CSI)

      V853 开发板使用排母连接器引出了DVP所需的IO,由于PE接口存在复用关系,使用时请注意其复用关系。

      DVP_CSI.png

      屏幕(LCD)

      V853 开发板配套 7寸 LCD屏幕,配有相对应的电容式触摸屏幕。

      屏幕使用MIPI DSI接口,连接到板子对应的 MIPI LCD FPC 连接器上,触摸屏则连接到 CTP 接口上。

      同时开发板也引出了 RGB666 FPC 连接器,可以连接RGB屏幕(带触摸)

      MIPI-DSI.png

      音频输入部分(MICIN、LINEIN)

      V853 开发板提供2路MIC音频输入与LINE输入,当使用LINE输入时复用MIC的接口。使用内部音频Codec,也可以使用 Inter-IC Sound (I2S)总线外接外部数字Codec,实现麦克风阵列与声源定位。

      AudioIN.png

      音频输出部分(LINEOUT)

      V853 开发板提供一路差分音频输出接口,并使用CG8302功放连接到扬声器,音频输出使用内部音频Codec,也可以使用 Inter-IC Sound (I2S)总线外接外部数字Codec获得更好的音质。

      LINEOUT.png

      Micro SD卡(TF Card)

      Micro SD卡(又称TF卡) 板载自弹式TF卡槽,卡槽所有引脚均使用ESD器件加以保护。img

      开发板预留了管理Micro SD卡供电防止烧毁低内阻的Micro SD卡的保护电路,开发板默认不贴装这一部分保护电路。

      MicroSD卡所使用的SDIO接口均使用芯片内部上拉,无需外部上拉电路。

      TFCard.png

      有线网络(Network)

      V853 开发板板载了IP101GR百兆以太网收发器,连接网线即可连接上网。

      EPHY.png

      无线网络(Wireless Network)

      V853 开发板板载了XR829 Wi-Fi,蓝牙模块,支持2.4G IEEE 802.11 b/g/n WLAN,Bluetooth v2.1/4.0/4.2。Wi-Fi通过SDIO总线与 V853 通讯,蓝牙通过 UART 通讯。

      WLAN.png

      电源(Poewr Tree)

      开发板使用同为全志自研的 AXP2101 PMU 作为电源管模块。可支持DC 12V输入、USB 5V输入和电池输入。其使用 TWI 总线与 V853 进行通讯。

      AXP2101 为通用 PMU,可以适配多种芯片,提供了多路电源输出,不需要使用的电源部分可以将其关闭。

      电源输出分配见下图(红色为启用电源输出,黑色为未启用电源输出)

      PowerTreeOverview.png

      按键(Key)

      V853 开发板共有8个按键,其中按键 VOL+ VOL- MENU ENTER HOME 按键连接在 GPADC 上,通过识别当前ADC的电压识别按键键值。另外 UBOOT 按键连接到 V853 芯片上的 FEL 引脚,按下后可以进行刷机调试操作。

      还有PWR 键与 RESET 键,是连接到 AXP2101 PMU上的,用于开机与 RESET 芯片。

      Keys.png

      串口(UART)

      V853 开发板提供 2个 独立的UART调试口,分别是 UART0 与 UART3,默认配置 UART0 为 Arm 核串口调试口,UART3 为 E907 核调试口。

      同时 UART3 也可复用为 GPS 的通讯接口,板载 3.5mm 连接器进行连接。

      UART.png

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——USB及TF Card

      USB

      USB OTG 切换模式

      切换到 Device 模式

      root@TinaLinux:~# cat /sys/devices/platform/soc/usbc0/usb_device
      

      切换到 Host 模式

      root@TinaLinux:~# cat /sys/devices/platform/soc/usbc0/usb_host
      

      USB U盘测试

      V853 的 Type C USB 连接器支持 OTG,可以连接 U盘、鼠标键盘 等物品。在接入 USB TYPE A 设备的时候需要一个 USB TYPE C 转 TYPE A 转接头。

      先把USB切换到 HOST 模式

      root@TinaLinux:~# cat /sys/devices/platform/soc/usbc0/usb_device
      

      插入 U 盘,自动挂载 /mnt/exUDISK 目录

      TF Card

      插入 TF 卡,TF卡将自动挂载到 /mnt/sdcard 目录下

      TF_Card.jpg

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——有线网络

      有线网络

      V853 开发板板载百兆以太网络,使用 IP101GR 以太网收发器。

      RJ45.jpg

      测试网络

      插入网线,使用 ifconfig eth0 up 打开网络设备,udhcp -i eth0 动态活动IP地址。之后可以使用 ping 命令测试网络连接。

      root@TinaLinux:/# ifconfig eth0 up
      root@TinaLinux:/# udhcp -i eth0
      

      运行 ping 测试

      root@TinaLinux:/# ping www.baidu.com
      

      它会输出以下内容

      PING 202.108.22.5 (202.108.22.5): 56 data bytes
      64 bytes from 202.108.22.5: seq=0 ttl=49 time=48.734 ms
      64 bytes from 202.108.22.5: seq=1 ttl=49 time=48.624 ms
      64 bytes from 202.108.22.5: seq=2 ttl=49 time=58.370 ms
      64 bytes from 202.108.22.5: seq=3 ttl=49 time=69.119 ms
      64 bytes from 202.108.22.5: seq=4 ttl=49 time=49.635 ms
      
      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——GPIO点灯测试

      GPIO 点灯测试

      开发板有一颗 LED 灯供用户操作,接在 PH11 上。换算该 IO 的数字标号为:7 * 32 + 11 = 235,或者查看 IO 复用情况表,其中(MUX UNCLAIMED) 表示这个 GPIO 目前没有被使用:

      root@TinaLinux:/# cat /sys/kernel/debug/pinctrl/pio/pinmux-pins
      

      它会输出以下内容

      ...上略
      pin 231 (PH7): (MUX UNCLAIMED) (GPIO UNCLAIMED)
      pin 232 (PH8): (MUX UNCLAIMED) (GPIO UNCLAIMED)
      pin 233 (PH9): uart0 (GPIO UNCLAIMED) function uart0 group PH9
      pin 234 (PH10): uart0 (GPIO UNCLAIMED) function uart0 group PH10
      pin 235 (PH11): (MUX UNCLAIMED) (GPIO UNCLAIMED)
      pin 236 (PH12): (MUX UNCLAIMED) pio:236
      pin 237 (PH13): 2020000.wiegand pio:237 function wiegand group PH13
      pin 238 (PH14): 2020000.wiegand pio:238 function wiegand group PH14
      pin 239 (PH15): (MUX UNCLAIMED) pio:239
      ...下略
      

      我们先导出该 GPIO:

      echo 235 > /sys/class/gpio/export
      cd /sys/class/gpio/gpio235
      

      然后再将该 IO 置为输出状态,即可操作其电平:

      echo out > direction
      echo 1 > value  #LED点亮
      echo 0 > value  #LED熄灭
      

      LED.jpg

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——LCD相关测试

      LCD 显示

      V853 开发板配套 7寸 LCD屏幕,配有相对应的电容式触摸屏幕。

      屏幕基本测试

      当前固件在开机时会显示 Tina 小企鹅的开机 LOGO。

      花屏测试

      cat /dev/urandom > /dev/fb0
      

      lcd_random.jpg

      彩色条纹测试

      通过 echo 到 /sys/class/disp/disp/attr/colorbar 进行测试,0 到 7 是不同的彩色条纹效果哦

      echo 0 > /sys/class/disp/disp/attr/colorbar
      

      lcd_colorbar.jpg

      UI 测试

      LVGL 测试

      LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。 这里运行 lv_examples 1 进行测试。

      root@TinaLinux:/# lv_examples 1
      

      lcd_lvgl.jpg

      同时固件也提供了多种测试效果,

      运行 lv_examples 0 是 lv_demo_widgets
      运行 lv_examples 1 是 lv_demo_music
      运行 lv_examples 2 是 lv_demo_benchmark
      运行 lv_examples 3 是 lv_demo_keypad_encoder
      运行 lv_examples 4 是 lv_demo_stress
      

      DirectFB 测试

      DirectFB是一个轻量级的硬件图形加速、输入设备处理特性和抽象的图形库,它集成了在Linux Framebuffer驱动之上的多层显示的功能。

      root@TinaLinux:/# df_andi
      

      df_andi.jpg

      同时固件也提供了多种测试效果可供选择。

      df_andi            df_drivertest2     df_matrix          df_texture
      df_flip            df_neo             df_window          df_dok             
      df_knuckles        df_porter          df_drivertest
      

      LCD 触摸
      LCD 触摸测试

      LCD 触摸时会向 V853 发送数据,可以通过 cat 命令获取这些数据。

      root@TinaLinux:~# cat /dev/input/event0
      

      运行后触摸屏幕在终端命令行会输出乱码。即为获得的触摸信号。

      发布在 V Series
      bayche
      bayche
    • 回复: V853开发板硬件指南——音频功能

      @yelong98 阿巴阿巴🙃

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——开发板硬件框图及各模块原理图

      开发板原理图

      V853 开发板由全志合作伙伴 索智科技 根据全志提供的参考设计修改设计。

      本章节将对开发板几个主要的部件的原理图进行说明,方便快速上手开发板的硬件资料。

      开发板硬件框图如下:

      HardwareOverview.png

      模块介绍

      GPIO 分配

      此表格为 V853 部分重要的 GPIO 的分配表,> 表示对IO的另外一个复用,完整的 GPIO 分配请参阅原理图。

      GPIO GROUP 用途 接口
      PA[0:21] MIPI CSI 摄像头 CAMERA FPC 连接器
      PC[0:11] eMMC 板载eMMC
      > PC[0:11] SPF 板载SOIC16焊盘(未贴装)
      > PC[0:6] SPI0 板载SOIC8焊盘(未贴装)
      PD[0:22] RGB(HV)LCD RGB-LCD FPC 连接器
      > PD[1:7] MIPI-DSI MIPI-LCD 连接器
      > PD[13:14] IR-CUT 摄像头 IR 滤光片驱动
      PE[0:17] DVP-CSI 板载2x16p连接器母座
      > PE[0:15] RMII 板载IP101GR,百兆以太网
      > PE[8:15] XR829 蓝牙 板载XR829模块
      PF[0:6] SDC0 板载TF卡槽
      PG[0:7] XR829 WLAN 板载XR829模块
      PH[0:1] UART 3 UART3 排针
      > PH[0:1] GPS GPS 3.5mm 连接器
      PH[0:4] I2S I2S 排针
      PH[5:8] CTP 触摸屏FPC连接器
      PH[9:10] UART0 UART0排针
      PI[1:2] PMU TWI 板载 AXP2101 通讯使用
      PI[3:4] TWI3 SC7A20 3轴数字加速度计(未贴装)DA380B 惯性传感器

      DRAM(DDR3)

      开发板使用 Rayson晶存 所生产的 RS256M16VRDK DDR3 512MB 内存,BGA96 封装。

      下图为DRAM原理图,其中颗粒端的 SDQ 信号线乱序是 DDR本身的特性,SDQ 线在组内的顺序是可以改变的,一共分两组:第一组 SDQ0-SDQ7+SDQSN/P0+SDQM0,第二组 SDQ8-SDQ16+SDQSN/P1+SDQM1 这样可以方便内存的 PCB 布线。

      V853 芯片支持双贴DRAM、同时也支持单帖双RANK的DRAM,最大16Gb。

      DRAMSCH.png

      Memory(eMMC)

      开发板 Memory 使用的是 珠海妙存科技 设计的 AT70B08G3 eMMC ,容量为 8GB,运行在 8bit 模式下。

      其中 PC2,PC3 脚为 BOOT SEL 启动顺序选择脚,通过上拉或下拉执行启动。

      开发板预留了SPI NOR、SPI NAND的焊盘,可以焊接 V853 芯片支持的 SPI NOR、SPI NAND 储存器

      BOOT SEL 0 BOOT SEL 1 1 2 3 4 5 6 7 8 备注
      0 0 SPI NAND SPI NOR(4线) SPI NOR(1线) USB FEL
      0 1 SPI NOR(4线) SPI NOR(1线) SPI NAND USB FEL 快速启动使用
      1 0 SDC 0 SPI NAND SPI NOR(4线) SPI NOR(1线) UART BRUN USB FEL
      1 1 SDC 0 SPI NOR(4线) SPI NOR(1线) EMMC2 USR EMMC BOOT SPI0 NAND UART BURN USB FEL 默认

      eMMC.png

      MIPI 摄像头(MIPI CSI)

      V853 开发板板载 40Pin FPC 连接器引出了全部 MIPI CSI 资源,支持双2lane摄像头与单4lane摄像头,开发板默认提供 1080P 双目摄像头方案,型号:GC2063。

      CSI.png

      DVP 摄像头(DVP CSI)

      V853 开发板使用排母连接器引出了DVP所需的IO,由于PE接口存在复用关系,使用时请注意其复用关系。

      DVP_CSI.png

      屏幕(LCD)

      V853 开发板配套 7寸 LCD屏幕,配有相对应的电容式触摸屏幕。

      屏幕使用MIPI DSI接口,连接到板子对应的 MIPI LCD FPC 连接器上,触摸屏则连接到 CTP 接口上。

      同时开发板也引出了 RGB666 FPC 连接器,可以连接RGB屏幕(带触摸)

      MIPI-DSI.png

      音频输入部分(MICIN、LINEIN)

      V853 开发板提供2路MIC音频输入与LINE输入,当使用LINE输入时复用MIC的接口。使用内部音频Codec,也可以使用 Inter-IC Sound (I2S)总线外接外部数字Codec,实现麦克风阵列与声源定位。

      AudioIN.png

      音频输出部分(LINEOUT)

      V853 开发板提供一路差分音频输出接口,并使用CG8302功放连接到扬声器,音频输出使用内部音频Codec,也可以使用 Inter-IC Sound (I2S)总线外接外部数字Codec获得更好的音质。

      LINEOUT.png

      Micro SD卡(TF Card)

      Micro SD卡(又称TF卡) 板载自弹式TF卡槽,卡槽所有引脚均使用ESD器件加以保护。img

      开发板预留了管理Micro SD卡供电防止烧毁低内阻的Micro SD卡的保护电路,开发板默认不贴装这一部分保护电路。

      MicroSD卡所使用的SDIO接口均使用芯片内部上拉,无需外部上拉电路。

      TFCard.png

      有线网络(Network)

      V853 开发板板载了IP101GR百兆以太网收发器,连接网线即可连接上网。

      EPHY.png

      无线网络(Wireless Network)

      V853 开发板板载了XR829 Wi-Fi,蓝牙模块,支持2.4G IEEE 802.11 b/g/n WLAN,Bluetooth v2.1/4.0/4.2。Wi-Fi通过SDIO总线与 V853 通讯,蓝牙通过 UART 通讯。

      WLAN.png

      电源(Poewr Tree)

      开发板使用同为全志自研的 AXP2101 PMU 作为电源管模块。可支持DC 12V输入、USB 5V输入和电池输入。其使用 TWI 总线与 V853 进行通讯。

      AXP2101 为通用 PMU,可以适配多种芯片,提供了多路电源输出,不需要使用的电源部分可以将其关闭。

      电源输出分配见下图(红色为启用电源输出,黑色为未启用电源输出)

      PowerTreeOverview.png

      按键(Key)

      V853 开发板共有8个按键,其中按键 VOL+ VOL- MENU ENTER HOME 按键连接在 GPADC 上,通过识别当前ADC的电压识别按键键值。另外 UBOOT 按键连接到 V853 芯片上的 FEL 引脚,按下后可以进行刷机调试操作。

      还有PWR 键与 RESET 键,是连接到 AXP2101 PMU上的,用于开机与 RESET 芯片。

      Keys.png

      串口(UART)

      V853 开发板提供 2个 独立的UART调试口,分别是 UART0 与 UART3,默认配置 UART0 为 Arm 核串口调试口,UART3 为 E907 核调试口。

      同时 UART3 也可复用为 GPS 的通讯接口,板载 3.5mm 连接器进行连接。

      UART.png

      原理图下载

      DSN原理图.pdf

      发布在 V Series
      bayche
      bayche
    • 回复: V853开发板硬件指南——音频功能

      @yelong98 我先来:搁这挤牙膏呢😠

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——音频功能

      音频功能

      V853 开发板板载了两路麦克风输入,一路音频输入,一个扬声器输出。(注意,左侧 UART0 旁的 3.5mm 耳机接口是 GPS 使用的 UART 接口,不是耳机接口)

      录音

      • 查看录音设备

      可以使用 arecord -l 命令查看开发板提供的录音设备。

      root@TinaLinux:/# arecord -l
      

      它会输出以下内容

      **** List of CAPTURE Hardware Devices ****
      card 0: audiocodec [audiocodec], device 0: soc@03000000:codec_plat-sunxi-snd-codec sunxi-snd-codec-0 []
        Subdevices: 1/1
        Subdevice #0: subdevice #0
      card 1: snddaudio0 [snddaudio0], device 0: 2032000.daudio0_plat-snd-soc-dummy-dai snd-soc-dummy-dai-0 []
        Subdevices: 1/1
        Subdevice #0: subdevice #0
      
      • 麦克风录音

      V853 开发板板载了两个麦克风,位于 LINE-IN接口附近。

      在录音之前,首先需要打开音频通路,配置内部 MIC1,MIC2 录制双通道音频。

      选择 MIC1 输入

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='MIC1 Input Select' 0
      

      它会输出以下内容

      numid=23,iface=MIXER,name='MIC1 Input Select'
        ; type=ENUMERATED,access=rw------,values=1,items=2
        ; Item #0 'differ'
        ; Item #1 'single'
        : values=0
      

      选择 MIC2 输入

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='MIC2 Input Select' 0
      

      它会输出以下内容

      numid=23,iface=MIXER,name='MIC2 Input Select'
        ; type=ENUMERATED,access=rw------,values=1,items=2
        ; Item #0 'differ'
        ; Item #1 'single'
        : values=0
      

      开启 MIC1

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='MIC1 Switch' 1
      

      它会输出以下内容

      numid=17,iface=MIXER,name='MIC1 Switch'
        ; type=BOOLEAN,access=rw------,values=1
        : values=on
      

      开启 MIC2

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='MIC2 Switch' 1
      

      它会输出以下内容

      numid=17,iface=MIXER,name='MIC2 Switch'
        ; type=BOOLEAN,access=rw------,values=1
        : values=on
      

      设置 MIC1 音量

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='MIC1 gain volume' 30
      

      它会输出以下内容

      numid=12,iface=MIXER,name='MIC1 gain volume'
        ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0
        : values=19
        | dBscale-min=0.00dB,step=1.00dB,mute=0
      

      设置 MIC2 音量

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='MIC2 gain volume' 30
      

      它会输出以下内容

      numid=12,iface=MIXER,name='MIC2 gain volume'
        ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0
        : values=19
        | dBscale-min=0.00dB,step=1.00dB,mute=0
      

      使用arecord -D hw:audiocodec -f S16_LE -t wav -c2 -r 16000 -d 3 t.wav 命令,使用板载的两个麦克风进行录音。

      root@TinaLinux:/# arecord -D hw:audiocodec -f S16_LE -t wav -c2 -r 16000 -d 3 t.wav
      

      它会输出以下内容

      Recording WAVE 't.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo
      

      播放

      SPK.jpg

      • 查看播放设备

      使用 aplay -l 查看播放设备

      root@TinaLinux:/# aplay -l
      

      它会输出以下内容

      **** List of PLAYBACK Hardware Devices ****
      card 0: audiocodec [audiocodec], device 0: soc@03000000:codec_plat-sunxi-snd-codec sunxi-snd-codec-0 []
        Subdevices: 1/1
        Subdevice #0: subdevice #0
      card 1: snddaudio0 [snddaudio0], device 0: 2032000.daudio0_plat-snd-soc-dummy-dai snd-soc-dummy-dai-0 []
        Subdevices: 1/1
        Subdevice #0: subdevice #0
      
      • 扬声器播放音频

      在播放之前,首先需要打开音频通路,配置扬声器播放音频。

      开启 LINEOUT 输出功能

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='LINEOUT Output Select' 1
      

      它会输出以下内容

      numid=22,iface=MIXER,name='LINEOUT Output Select'
        ; type=ENUMERATED,access=rw------,values=1,items=2
        ; Item #0 'single'
        ; Item #1 'differ'
        : values=1
      

      开启 LINEOUT 通路

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='LINEOUT Switch' 1
      

      它会输出以下内容

      numid=20,iface=MIXER,name='LINEOUT Switch'
        ; type=BOOLEAN,access=rw------,values=1
        : values=on
      

      设置输出音量

      root@TinaLinux:/# amixer -D hw:audiocodec cset name='LINEOUT volume' 25
      

      它会输出以下内容

      numid=16,iface=MIXER,name='LINEOUT volume'
        ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0
        : values=25
        | dBrange-
          rangemin=0,,rangemax=1
            | dBscale-min=0.00dB,step=0.00dB,mute=1
          rangemin=2,,rangemax=31
            | dBscale-min=-43.50dB,step=1.50dB,mute=1
      

      使用 aplay 通过外接扬声器播放刚才录制的音频。

      aplay -D hw:audiocodec t.wav
      

      它会输出以下内容

      Playing WAVE 't.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Stereo
      

      修改音量

      使用 alsamixer 提供的图形化界面调整音量。

      root@TinaLinux:/# alasmixer
      

      Alasmixer.jpg

      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——WiFi与蓝牙

      Wi-Fi

      V853 开发板使用的是 XR829 Wi-Fi & BT 模块,使用 40M 外部晶振,其Wi-Fi部分通过SDIO总线与 V853 通讯,设备位于 SDC1 接口上。

      Wi-Fi 测试与连接网络

      • Wi-Fi 扫描网络与连接网络

      Tina 提供了一套简易方便的 Wi-Fi 测试套件:wifi ,使用 wifi 命令可以设置 Wi-Fi 的工作模式,扫描网络,连接网络等等。它的使用方法可以通过运行 wifi -h 了解。这里首先介绍如何使用 wifi 扫描网络:

      (1)设置 Wi-Fi 为 STA 模式

      root@TinaLinux:/# wifi -o sta
      

      (2)扫描当前网络环境的 Wi-Fi 站点

      root@TinaLinux:/# wifi -s
      

      (3)连接Wi-Fi(SSID:awol,密码 12345678)

      root@TinaLinux:/# wifi -c awol 12345678
      

      (4)连接网络后输入 ifconfig 即可查看当前 ip 地址

      WiFiIF.jpg
      可以使用 ping 命令测试 网络连接

      root@TinaLinux:/# ping www.baidu.com
      

      它会输出以下内容

      PING 202.108.22.5 (202.108.22.5): 56 data bytes
      64 bytes from 202.108.22.5: seq=0 ttl=49 time=48.734 ms
      64 bytes from 202.108.22.5: seq=1 ttl=49 time=48.624 ms
      64 bytes from 202.108.22.5: seq=2 ttl=49 time=58.370 ms
      64 bytes from 202.108.22.5: seq=3 ttl=49 time=69.119 ms
      64 bytes from 202.108.22.5: seq=4 ttl=49 time=49.635 ms
      

      (5)关闭Wi-Fi

      root@TinaLinux:/# wifi -f
      
      • 列表Wi-Fi 建立热点
        (1)创建热点,SSID v853 密码 12345678
      root@TinaLinux:/# wifi -o ap v853 12345678
      

      (2)然后就可以扫描到 Wi-Fi 了,输入密码 12345678 进行连接

      WiFiAP.jpg

      蓝牙

      V853 开发板使用的是 XR829 Wi-Fi & BT 模块,使用 40M 外部晶振,其 蓝牙 部分通过 UART 总线与 V853 通讯,设备位于 UART2 接口上。

      • 蓝牙测试

      命令:

      bt_test
      
      • 蓝牙sink

      将v853开发板作为蓝牙小音箱,通过蓝牙在开发板上播放音频

      root@TinaLinux:/# bt_test -i -p a2dp-sink
      
      发布在 V Series
      bayche
      bayche
    • V853开发板硬件指南——开机与重启

      V853开发板集成了LED、WiFi、蓝牙、以太网、音频、屏幕、USB、TF卡等模块。本章节将对这些模块进行简单的操作介绍,方便开发者快速上手了解开发板。

      v853kaifabanjiekou.png

      注:

      本文中 root@TinaLinux:~# 开头的命令是在开发板上通过 ADB、串口 在 Tina Linux 系统内运行的。C:\System> 是在电脑 命令提示符(CMD) 中运行的,=> 开头的命令是在 U-Boot 内运行的。在输入命令时候不需要输入上面提到的命令头。

      本文中部分命令提供了运行命令后的打印输出,方便运行参考。

      开机

      目前开发板为上电即开机的模式,仅需要插入 12V DC 电源适配器或使用USB Type C线连接电源即可。

      请注意,如果 Type C 连接电脑的 USB 口可能会因为电脑的 USB 输出电流较低导致设备反复启动。这时需要插入 12V DC 电源适配器作为辅助供电。

      同时 USB 也可以通过位于 USB 口后方的连接器进行连接(米白色),方便装配使用。

      开发板右下角的白色连接器为电池接口,可以连接受支持的锂电池使用。

      PowerSupplies.jpg
      上电开机完毕后会有如下打印。

      BusyBox v1.33.2 (2022-05-31 06:54:45 UTC) built-in shell (ash)
      
      ------run profile file-----
       _____  _              __     _
      |_   _||_| ___  _ _   |  |   |_| ___  _ _  _ _
        | |   _ |   ||   |  |  |__ | ||   || | ||_'_|
        | |  | || | || _ |  |_____||_||_|_||___||_,_|
        |_|  |_||_|_||_|_|  Tina is Based on OpenWrt!
       ----------------------------------------------
       Tina Linux (5.0)
       ----------------------------------------------
      swu_param: ####
      swu_software: ####
      swu_mode: ####
      no swupdate_cmd to run, wait for next swupdate
      root@TinaLinux:/#
      

      重启

      重启有两种方式,第一种通过按压 RESET 按键重置 CPU 达到重启的功能,另外一种通过 linux 命令行实现。

      1.RESET 重启

      在开发板左下角部分找到 RESET 按键,按压即可重启。

      Keys.jpg

      2.软件重启

      在 Linux 命令行中输入 reboot 即可重启

      root@TinaLinux:/# reboot
      

      在 U-Boot 命令行中输入 reset 即可重启

      => reset
      

      重启进入烧录模式

      1.RESET 重启进入烧录模式

      在开发板左下角找到按键 RESET UBOOT

      (1)按住 UBOOT 按键
      (2)轻点 RESET 按键,开发板重置
      (3)等待电脑连接成功,松开 UBOOT 按键

      2.软件进入烧录模式

      在 Linux 命令行中输入 reboot efex 即可重启进入烧录模式

      root@TinaLinux:/# reboot efex
      

      在 U-Boot 命令行中输入 efex 即可重启进入烧录模式

      => efex
      
      发布在 V Series
      bayche
      bayche
    • 阿里玄铁910是个啥?来康康如何对其进行功能仿真吧~

      1.阿里玄铁910是个啥?

      阿里玄铁910是阿里巴巴旗下的芯片公司平头哥,于2019年7月发布的一款采用RISC-V开源指令集的64位多核处理器。通俗一点讲,就是牛逼哄哄的CPU啦。它的主要定位是应用于高端嵌入式系统和SoC(System on Chip),比如ADAS(自动驾驶)、AI(人工智能)、AIoT(物联网)、5G、边缘计算、高端MCU等众多应用场景。

      C910采用了RISC-V 64GC基本指令集,和平头哥性能增强指令集,具有出色的性能表现,号称业界性能最强的一款RISC-V处理器。以ARM为参照,更容易理解C910。你可以理解为它是类似于ARM CPU的IP Core。华为麒麟(Kiren)需要用,Qualcom骁龙(snapdragon)需要用,三星和苹果的手机芯片也要用。只不过C910面向的更加偏向AIoT(物联网),万物互联,使用场景更广泛。我觉得它最牛逼的地方是开源,这样大大降低了小公司前期的开发门槛。希望它的开源生态能早日完善起来。RISC-V现在势头很猛,未来可期。现在开始好好研究它,或许是明智的选择,毕竟书到用时方恨少。

      2.如何快速地对它进行研究?

      这么好的一个开源项目,我们应该如何展开对它的研究和学习呢?幸运的是阿里已经将其开源托管到github了,参考链接:https://github.com/T-head-Semi/openc910,下载到本地后,doc目录下有“openc910_datasheet.pdf”、“玄铁 C910 集成手册.pdf”“玄铁 C910 用户手册.pdf”。通过这些文档,我们可以快速地对其有一个大致的了解。先来一个overview。

      微信图片_20220607132705.png 微信图片_20220607132722.png
      那么问题来了,作为工程师都知道看文档是很容易犯困的一件事情,大家更喜欢跑仿真、debug。好消息是,这个开源的openc910的资料还是相对很完整的(尽管有部分瑕疵),我们根据makefile脚本,很容易把功能仿真跑起来,下面就把整个功能仿真的过程step-by-step的记录下来。

      3.如何对C910进行功能仿真?

      3.1 openc910简单介绍
      参考下图:玄铁C910 IP包主要由以下两部分组成:①C910源码包:包含固定功能配置的C910 RTL Code; ②C910 Smart平台,提供了C910的参考集成设计、仿真环境和测试用例等,帮我我们熟悉C910的功能和使用方法,并辅助C910的集成工作。
      微信图片_20220607132726.png

      同时,在github上也给出了简单的注释

      |--C910_RTL_FACTORY/
      
            |--gen_rtl/     ## Verilog source code of C910
      
            |--setup/       ## Script to set the environmentvariables
      
      |--smart_run/     ## RTL simulation environment
      
            |--impl/        ## SDC file, scripts and file lists forimplementation
      
            |--logical/     ## SoC demo and test bench to run thesimulation
      
            |--setup/       ## GNU tool chain setting
      
            |--tests/       ## Test driver and test cases
      
            |--work/        ## Working directory for builds
      
            |--Makefile     ## Makefile for building and running simtargets
      
      |--doc/           ## The user and integration manualof C910
      

      3.2 C910功能仿真步骤

      Step1.Download and install C/C++ Compiler:
      参考hyperlink:https://occ.t-head.cn/community/download?id=3948120165480468480,我下载的版本是:Xuantie-900-gcc-elf-newlib-x86_64-V2.2.5,参考下图
      微信图片_20220607132731.png

      Step2. 参考下图红色高亮的需要自己手动改写,顺便多说一句,官方给的是基于csh的,我把它改成基于bash了,原因是我用的虚拟机默认是bash,如果切换成csh的话,EDA工具的环境变量都要修改,我嫌它工作量太大了,所以不如直接改成bash更划算。
      微信图片_20220607132733.png

      Step3:source环境变量example_setup.sh:source ./setup/example_setup.sh
      微信图片_20220607132736.png

      Step4:进入 smart_run目录,通过make help查看帮助信息
      微信图片_20220607132738.png

      Step5: 我用的EDA工具是Cadence的Incisive15.2, Makefile中有几处错误,我做了修正。
      微信图片_20220607132740.png

      Step6:为了dump波形,我新增了一个脚本文件dump_waves.tcl
      微信图片_20220607132743.png

      Step7:随机跑一个case/smoke_bus:
      make runcase CASE=smoke_bus SIM=nc DUMP=on
      微信图片_20220607132744.png

      Step8:基于incisive和simvision的功能仿真波形如下图所示:

      Step9:其他case我也试过了,没有任何问题。到这里,第一阶段的研究完美结束。后续敬请期待…

      4.总结与展望

      Openc910是非常好的学习资料,对我们研究RISC-V和SoC有重要的意义。结合EDA工具和仿真波形,后续我们对openc910的研究会进一步深入,芯片验证我们一起玩下去……

      参考资料:

      https://github.com/T-head-Semi/openc910
      https://occ.t-head.cn/community/download?id=3948120165480468480

      原文链接:https://mp.weixin.qq.com/s/HDNN0Pay5yAN9To9YWtxcw
      转自 芯片验证一起玩

      发布在 灌水区
      bayche
      bayche
    • 1 / 1