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,这对于我们学习网络还是非常方便的。
另外一般的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软件
很多同学安装了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。
-
全志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
配置cpu的部分主要就是两点,第一,选择ARM little endian;第二,选择cotex-A7。其他的配置都选择默认就好了。
4、toolchain编译器的配置
这部分的配置有几个方面,第一,告诉buildroot,这里使用自己的编译器,
第二,告知buildroot,不使用它推荐的编译器,
第三,设置自定义编译器的位置,
第四,依次设置编译器前缀、gcc版本、内核头文件版本、glibc库、使能SSP、RPC、C++。
5、保存
退出的时候,提示是否保存,直接选择“是”即可。
6、开始编译
make clean; make
7、确认是否编译成功
等待一会,如果没有错误发生的话,在out/images目录下面,就有一个rootfs.tar文件。里面包含了所有的编译结果。当然在这个过程当中,务必保持ubuntu上位机处于一个良好的网络状态,这主要是因为buildroot在编译的同时,需要不停地从第三方下载代码进行解压和编译,比如说busybox。如果网络中间出现卡顿,其实比较影响编译效率的。
当然,如果后期客户需要添加自己的程序,只需要把rootfs.tar解压一下,同时把自己的程序重新copy到对应的目录,再次压缩一下就可以了。
8、总结
通过练习,大家也发现根文件系统的制作主要还是依赖两个方面,一个是cpu,一个是编译器,剩下的部分基本就是功能的选择、模块的选择、特性的选择等等。这部分大家可以根据自己的需求灵活做出改变。
此外,如果不想记住这么多配置,那么可以把buildroot下面的.config文件保存下来,到时候直接拷贝粘贴也可以的。这样也能省略很多不必要的烦恼,提高一下开发的效率。
-
全志 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,整体结构
如下:适用范围: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应用截图:
点击SD卡和U盘图标,可以对SD卡和U盘格式化,在拍照与录制的时候需要正确的格式,不然不能录制。蓝色的SD卡与U盘表示SD卡与U盘正确挂载,灰色的表示没有正确挂载。SD卡与U盘同时挂载的时候,默认使用SD卡,点击相应图标进入相应功能界面。
下面是r11-board应用截图:
主页三个页面可以左右滑动切换下一个页面,点击不同的洗衣图片进入具体的洗衣功能界面。
点击底部的洗涤、漂洗和脱水可以弹出滑动列表选择不同的参数,点击功能+按钮有旋转动画。
下面是smart-music-player应用截图:
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。
3.5.2 eglfs
出现下面错误,申请不上native window有可能是缺少libqeglfs-mali-integration.so这个库,需要将其adb push到小机端的/usr/lib/qt5/plugins/egldeviceintegrations路径下。
3.5.3 runtime
出现下面错误,传入环境变量:
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的终端仿真器 下面是应用截图:
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支持的功能。如下图所示:
主要关注以下几项配置:
表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的截图:
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
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的截图:
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
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
如下图所示:
glmark2是使用GPU的跑分测试程序,可以在R18上使用DRM作为Wayland后端的时候使用,除此之外还可以使用FBDEV进行显示并测试GPU性能。wayland,wayland-protocols在编译weston的时候用到,进入到weston的配置界面,可以配置weston支持的功能。如下图所示:
主要关注以下几项配置:
表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加速的如下图所示:
注意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
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)
如下图所示:
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
如下图所示:
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截图: 下面是应用lv_monitor截图:
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截图:
下面是应用gallery截图:
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
-
全志V3S嵌入式驱动开发 - 驱动开发合集
之前的文章都是教大家怎么搭建环境、看原理图、编译内核和根文件系统、做镜像,直到现在才进入驱动开发的主题。毕竟整个专栏的目的,还是希望大家能够学会驱动外部硬件。驱动好硬件,分成硬件和软件两个部分,硬件的部分比较好理解,就是看相关的信号有没有对接上即可,但是软件对接、甚至于怎么写软件,大家好像接触的比较少,所以这个时候,就可以简单讨论一下,怎么样才能写驱动代码。
目录:
1.多按键输入驱动
2.PWM驱动
3.GPIO驱动
4.音频输出和音频录制1、了解外部驱动芯片手册
所谓驱动,其实就是用soc里面的io控制器来驱动外部电路,或者说是外部芯片。如果是简单的io和uart这些,当然不需要知道驱动芯片的内容。但是如果驱动的是外部芯片,那么这个时候我们就要把对应芯片的资料找过来,好好读一读。里面协议的内容,就是我们将来编程的依据,
2、了解soc芯片手册
了解外部芯片主要是解决发送内容的问题,而soc芯片则会告诉我们怎么发送这些内容。比如,它是iic接口,还是spi接口,还是普通的uart接口等等。这些内容,都可以通过soc的芯片手册找到,比如下面s3c2440中nandflash controller的介绍,
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%的问题。这样遇到难题,也不会受制于人,效率上不打折扣。 -
T113平台快速启动配置
哪些应用场景需要快速启动
很多应用场景对系统启动时间都有严苛的要求,例如在工业组态屏、工业HMI、机器人示教器、工业PLC、物联网网关、通讯管理机等应用场景对系统启动的时间都会有所要求。
当系统启动时间过长时,用户需要很长时间才能开始使用系统,不仅会对产品的精准度和实时性有所影响,而且过长时间的启动也会导致系统资源浪费,例如电力和硬件资源。而优化启动时间可节省这些资源,从而提高系统的效率和可靠性。另外,在某些嵌入式系统和设备中,启动时间对于系统的稳定性和可靠性至关重要,因此尽可能缩短启动时间,以确保系统能够在最短的时间内启动至关重要。
T113-i 系统快速启动实测数据
为了满足客户需求,我司对T113-i原生系统进行剪裁,得到一个可快速启动的程序镜像。经测试,eMMC配置核心板从上电至进入文件系统的时间为4.3秒,从上电至显示Qt界面的时间为7.7秒。详细数据请参考如下表格:
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".
关闭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"
(2) 内核快速启动优化。
由于random设备初始化太慢,应用程序调用random的函数时可能被阻塞,导致应用启动慢,因此可通过关闭crng_ready()功能从而缩短启动时间,关闭crng_ready()功能后启动时间可缩短2~3秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:
"kernel/linux-5.4/drivers/char/random.c"
通过修改串口打印优先级,关闭串口内核启动信息打印从而缩短启动时间。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:
"device/config/chips/t113_i/configs/tlt113-evm-nand/longan/env.cfg"
(3) 文件系统快速启动优化。
通过取消相关服务启动以及自动挂载功能,优先执行Qt程序,并且延时一段时间再执行其他功能。启动时间可缩短约10秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:
"platform/framework/auto/rootfs/etc/init.d/rcS"
如需关闭Qt Launcher,优化上电启动至进入文件系统的时间,需修改rcS脚本。修改内容如下:
修改完成后,请参考我司的T113-i产品资料《Linux系统使用手册》文档,重新编译生成Linux系统镜像,同时参考《Linux系统启动卡制作及系统固化》文档,将Linux系统镜像文件固化至NAND FLASH或eMMC,再从NAND FLASH或eMMC上电启动即可。
-
回复: 全志V3S嵌入式驱动开发 - 驱动开发合集
多按键输入驱动
前面我们说过,荔枝派的开发板上面,有4个按键本身不是通过gpio连接到soc上面的。它是通过ad的方法,连接到主芯片的。这个时候,不同的按键被按下的时候,就会生成不同的电压或者电流,那么完全可以根据对应的电信号,推算出当前是哪一个按键被按下去了。
1、查找电路图
简单看一下电路之后,下面就是去找设备树,对应的信号是什么、在哪里。
2、查找设备树
在sun8i-v3s-licheepi-zero-dock.dts文件当中,我们发现了这样的内容,
&lradc { vref-supply = <®_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
-
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 地址
可以使用 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 进行连接
蓝牙
V853 开发板使用的是 XR829 Wi-Fi & BT 模块,使用 40M 外部晶振,其 蓝牙 部分通过 UART 总线与 V853 通讯,设备位于 UART2 接口上。
- 蓝牙测试
命令:
bt_test
- 蓝牙sink
将v853开发板作为蓝牙小音箱,通过蓝牙在开发板上播放音频
root@TinaLinux:/# bt_test -i -p a2dp-sink
-
在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/"目录下。
首先,将评估板HDMI OUT接口连接至HDMI显示屏。评估板上电启动,将产品资料“4-软件资料\Demo\video-demos\”目录下的video-h265.mkv视频文件拷贝至评估板文件系统,执行如下命令关闭默认运行的Qt GUI显示程序。
#killall Launcher #fbinit
执行如下命令,运行官方案例xplayerdemo。
#xplayerdemo
执行如下命令,设置需要解码播放的视频文件。
#set url: video-h265.mkv
输入play命令解码播放视频,可看到HDMI显示屏输出视频。
#play
执行stop命令,停止视频解码。
#stop
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/"目录下。
首先,将评估板HDMI OUT接口连接至HDMI显示屏。评估板上电启动,将产品资料“4-软件资料\Demo\video-demos\”目录下的video-h265.mkv视频文件拷贝至评估板文件系统,执行如下命令关闭默认运行的Qt GUI显示程序。
#killall Launcher #fbinit
执行如下命令,运行官方案例xplayerdemo。
#xplayerdemo
执行如下命令,设置需要解码播放的视频文件。
#set url: video-h265.mkv
输入play命令解码播放视频,可看到HDMI显示屏输出视频。
#play
执行stop命令,停止视频解码。
#stop
-
T113平台快速启动配置
哪些应用场景需要快速启动
很多应用场景对系统启动时间都有严苛的要求,例如在工业组态屏、工业HMI、机器人示教器、工业PLC、物联网网关、通讯管理机等应用场景对系统启动的时间都会有所要求。
当系统启动时间过长时,用户需要很长时间才能开始使用系统,不仅会对产品的精准度和实时性有所影响,而且过长时间的启动也会导致系统资源浪费,例如电力和硬件资源。而优化启动时间可节省这些资源,从而提高系统的效率和可靠性。另外,在某些嵌入式系统和设备中,启动时间对于系统的稳定性和可靠性至关重要,因此尽可能缩短启动时间,以确保系统能够在最短的时间内启动至关重要。
T113-i 系统快速启动实测数据
为了满足客户需求,我司对T113-i原生系统进行剪裁,得到一个可快速启动的程序镜像。经测试,eMMC配置核心板从上电至进入文件系统的时间为4.3秒,从上电至显示Qt界面的时间为7.7秒。详细数据请参考如下表格:
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".
关闭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"
(2) 内核快速启动优化。
由于random设备初始化太慢,应用程序调用random的函数时可能被阻塞,导致应用启动慢,因此可通过关闭crng_ready()功能从而缩短启动时间,关闭crng_ready()功能后启动时间可缩短2~3秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:
"kernel/linux-5.4/drivers/char/random.c"
通过修改串口打印优先级,关闭串口内核启动信息打印从而缩短启动时间。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:
"device/config/chips/t113_i/configs/tlt113-evm-nand/longan/env.cfg"
(3) 文件系统快速启动优化。
通过取消相关服务启动以及自动挂载功能,优先执行Qt程序,并且延时一段时间再执行其他功能。启动时间可缩短约10秒。在LinuxSDK解压目录T113-i_v1.0下修改如下文件:
"platform/framework/auto/rootfs/etc/init.d/rcS"
如需关闭Qt Launcher,优化上电启动至进入文件系统的时间,需修改rcS脚本。修改内容如下:
修改完成后,请参考我司的T113-i产品资料《Linux系统使用手册》文档,重新编译生成Linux系统镜像,同时参考《Linux系统启动卡制作及系统固化》文档,将Linux系统镜像文件固化至NAND FLASH或eMMC,再从NAND FLASH或eMMC上电启动即可。
-
回复: OKT507 -c在有交互按钮的界面显示AHD摄像头的影像该如何实现
飞凌提供了一个关于camera的一个qt_demo程序,可以参考forlinx_desktop的源码中/OKT507-desktop-release/platform/framework/auto/qt_demo
-
回复: T507qt虚拟键盘二次开发
@nzdzhd
这是虚拟键盘存放路径,可以先尝试修改
/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生成新的可执行文件,然后回到源码路径全编译,打包新镜像烧写即可 -
回复: 关于T113-i的核心板GPIO号查询和/sys/class/spidev目录下找不到设备
gpio可以用/sys/class/gpio/export导出对应引脚文件后操作,spidev需要添加驱动到设备文件dts里
-
把眼镜困在屏幕里!在米尔T113开发板上做一个简易人体传感器
1. 下载
从米尔电子官方下载站:http://down.myir-tech.com/MYD-YT113X/ 下载相关资料
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 变成全局的才可以。
-
-
回复: 按照文档的教程用SPI驱动LCD屏幕初始化失败
你这是用dbi协议来驱动了,去这个位置
hal/source/spilcd/lcd/lcd什么什么feature
把dbi那个define注释掉,像下面这样应该就可以了 -
回复: 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)