导航

    全志在线开发者论坛

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

    baycheLV 6

    @bayche

    4992
    积分
    34
    声望
    103
    资料浏览
    95
    帖子
    5
    粉丝
    1
    关注
    注册时间 最后登录
    位置 奥比岛

    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
    • 全志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嵌入式驱动开发(开发软件搭建)

      要学好嵌入式,其实最好自己可以画板子、调试板子、写软件、调试软件这样来学习。简单的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
    • 麦当劳的点单系统居然是linux

      微信图片_20230801100430.png

      发布在 灌水区
      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
    • 全志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
    • V853开发板硬件指南——开发板双目摄像头模组原理图

      C9202669-7BBB-4123-B55B-6DECBD85D12D.png

      V853开发板双目摄像头模组原理图20220624.pdf.pdf

      发布在 V Series
      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
    • 回复: 全志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嵌入式驱动开发-入门

      现在的嵌入式芯片越来越多,从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

    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