# 学习记录 **Repository Path**: foggof/learning-record ## Basic Information - **Project Name**: 学习记录 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-10 - **Last Updated**: 2025-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README T5 instrument App ## 编译环境搭建 ### 1.搭建ssh环境 参考:http://confluence.carbit.lo/pages/viewpage.action?pageId=88646470 ### 2.配置T5条件编译 在T5编译套件的Build Step -> qmake ...中,打开“详情(details)”,在additional arguments中定义 CONFIG+=T5 ![config_t5](.doc/config_t5.png) ### 3.设置多语言 使用QCreator里的更新工具,更新多语言文件,更新后的文件在translations目录下,如下图所示: ![lupdate](.doc/lupdate.png) 编译时,自动更新ts文件为qm文件,设置自定义编译步骤,调用%{buildDir}/../../translations/ts2qm.sh ![translation](.doc/translation.png) ### 4.增加customer build step 调用部署脚本 在T5编译套件的Build Step -> Custom Process Step中,增加一个步骤,调用部署脚本: %{buildDir}/../../adb_push_files.sh ![custom_build_step](.doc/custom_build_step.png) ### 5.修改运行的目标文件为 /apps/instrument ![run_instrument](.doc/run_instrument.png) ## 目录结构 > Qt_BLL :Qbll 的库和头文件 > > imports : > > > imports/QRCode 二维码 > > imports/IEAI 存放自定义控件 > > imports/Data 数据层隔离封装BLL层的数据和接口 > > imports/SkyData 临时添加的模块 > > assets 资源文件 图片字体等 > > src c++ 文件 > pyscript 包含一个python脚本,依据bll 中的头文件中的枚举 自动生成 qt_yps_mcu.h ,用来解决枚举值的qt化 > content > content/FunScreen 功能屛qml代码 > content/UI 其他平台代码,留做参考用,后面逐渐删除 > doc 文档图片 > translations > images 功能屛的UI,后续会转移到assets中 ## 名词定义 * dvr:指的是dvrapp ,该模块控制摄像头录像,视频播放 * fb:framebuffer设备,也可以说是显示设备,双屏有两个,一个是fb0 ,另一个是fb1 * DE 有 2 个独立单元(可以简称 de0、de1),可以分别接受用户输入的图层进行合成,输出到不同的显示器,以实现双显。DE 的每个独立的单元有1-4 个通道(典型地,de0 有 4 个,de1 有 2 个),每个通道可以同时处理接受 4 个格式相同的图层。sunxi(全志) 平台有视频通道和 UI 通道之分。视频通道功能强大,可以支持 YUV 格式和 RGB图层。UI 通道只支持 RGB 图层。 * DE:display engine,显示引擎,负责将输入的多图层进行叠加、混合、缩放等处理的硬件模块 * channel: 一个硬件通道,包含若干图层处理单元,可以同时处理若干(典型 4 个)格式相同的图层 * layer 一个图层处理单元,可以处理一张输入图像,按支持的图像格式分 video 和 ui 类型 * tcon:各类型控制器 * DE下边是通道,由通道抽象出来图层 * 屏幕实际上是有两个显示是个是yuv层 ,摄像机显示在该层 。 一个是rgb层qml在该层显示 ## 问题及解决 ### #、如何烧录 * 如果没有烧写工具 ,先安装PhoenixSuit-v1.19-烧写工具 * 打开烧写工具,先点击一键刷机,然后点击浏览选择目标rom(*.img)文件 * ![image-20240417105001313](.images/项目中的问题及知识点/image-20240417105001313.png)* * 如果是正式板子,按住短路按钮,保持按压状态然后通电,等待个三四秒,将USB插入电脑,此时会自动进入烧录 * 如果是开发板,直接插上USB,选择好Rom,手动点击升级。 ### #、USB 不能自动进入烧录 ​ 新配的电脑可能没有安装USB驱动程序, 所以不能识别进入烧录,找到 AW_Driver 安装驱动 ### #、烧写固件失败 安装驱动后,在自己的板子上进入烧录后,开始烧录,然后会弹出烧写固件失败 请确保固件文件有效且只能设备可以正常工作 ![image-20240117104751614](.images/工作记录2024/image-20240117104751614.png) ​ 可能是板子不支持烧写。需将核心板插到支持的开发板上进行烧写 ### #、画面显示异常(过大或过小) ​ 新建的项目Qt默认开启了,AA_EnableHighDpiScaling, ​ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); ​ 在main.cpp 删除后可解决 ​ ### #、目录下动态库,编译不到库 ​ 因为该库使用了软链接,如果解压后从win拷贝到Linux,软连接失效。 ​ 拷贝更新文件时,直接拷贝压缩包,到虚拟机中解压 ### #、按键不能被qt响应 ​ qml 接收消息是由QtBll将mcu的消息注册到系统内的,如果不对bll初始化则不能正常进行消息转发注册 1. 程序调用步骤问题,QtBll创建、初始化最好在qt应用创建之前, ```js Qt_bll_proxy *instance = Qt_bll_proxy::getInstance(); instance->init(initString); QGuiApplication app(argc, argv) ``` 2. 还有确保 Component.onCompleted: 被调用,在这里面设置了对JS消息的响应 { JS.setCallback() //内部调用了按键响应 dvrRes = getDvrRes(); } ### #、摄像头画面没显示 ​ 当dvrapp 不能正确调用摄像,检查是否有如下的问题 1. 是否启动了多个dvrapp 2. 是不是启动了sdktest,所有摄像头调用程序只能存在一个 3. dvrapi_connect(&dvrapi_callback);// 一定要首先调用,注册回掉函数与链接整到一块了 4. sdktest 1 0 测试摄像头是不是可以显示 * 1 表示一个摄像头 * 0 表示摄像头编号0 5. 是否有qml 遮挡 先杀掉qt程序,是显示在主屏 则fbinit 0 ,显示在副屏则 fbinit 1,如果此时出现则是qml有遮挡 将 main.qml中的 Window的 color 设置为 color: "#00000000"(transparent),再将当前显示的Item设置为全透明 或直接设置 visible为 false 6. 还是不行输入 `cat /sys/class/disp/disp/attr/sys `,查看信息图层分配是否正常 ```shell cat /sys/class/disp/disp/attr/sys screen 0: de_rate 696000000 hz, ref_fps:60 mgr0: 1024x600 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0] unblank direct_show[false] dmabuf: cache[7] cache max[10] umap skip[2] overflow[1] lcd output backlight(255) fps:60.6 1024x 600 err:0 skip:75 irq:153147 vsync:153146 vsync_skip:0 BUF enable ch[1] lyr[0] z[16] prem[N] a[pixel 255] fmt[ 0] fb[1024, 600;1024, 600;1024, 600] crop[ 0, 0,1024, 600] frame[ 0, 0,1024, 600] addr[ff800000, 0, 0] flags[0x 0] trd[0,0] depth[ 0] transf[0] ``` ![img](.doc/企业微信截图_17127374868320.png) ### #、四摄未显示全、只显示两个 ​ 检查方式同上 ,再检查板子 /data/dvr.ini 是否配置正确 ``` sh-4.4# cat /data/dvr.ini [dvrinfo] version = V1.1.0 autorecord = N [front] enable = Y cameraid = 0 width = 1280 height = 720 fps = 25 bitrate = 3686400 saveseconds = 120 encoder = 0 picsize = 1572864 osdpos_x = 4 osdpos_y = 4 osdpos_w = 512 osdpos_h = 32 osdcolor = 0xFFFFFFFF osdbcolor = 0x77777777 brightness = 0x0 contrast = 0x80 saturation = 0x80 huecontrol = 0x80 clarity = 0x0 checkid = 0x0 [back] enable = Y cameraid = 1 width = 1280 height = 720 fps = 25 bitrate = 3686400 saveseconds = 120 encoder = 0 picsize = 1572864 osdpos_x = 4 osdpos_y = 4 osdpos_w = 512 osdpos_h = 32 osdcolor = 0xFFFFFFFF osdbcolor = 0x77777777 brightness = 0x0 contrast = 0x80 saturation = 0x80 huecontrol = 0x80 clarity = 0x0 checkid = 0x1 [left] enable = Y cameraid = 2 width = 1280 height = 720 fps = 25 bitrate = 3686400 saveseconds = 120 encoder = 0 picsize = 1572864 osdpos_x = 4 osdpos_y = 4 osdpos_w = 512 osdpos_h = 32 osdcolor = 0xFFFFFFFF osdbcolor = 0x77777777 brightness = 0x0 contrast = 0x80 saturation = 0x80 huecontrol = 0x80 clarity = 0x0 checkid = 0x2 [right] enable = Y cameraid = 3 width = 1280 height = 720 fps = 25 bitrate = 3686400 saveseconds = 120 encoder = 0 picsize = 1572864 osdpos_x = 4 osdpos_y = 4 osdpos_w = 512 osdpos_h = 32 osdcolor = 0xFFFFFFFF osdbcolor = 0x77777777 brightness = 0x0 contrast = 0x80 saturation = 0x80 huecontrol = 0x80 clarity = 0x0 checkid = 0x3 ``` ### #、如何调用互联 需要先调用 ```js Values.loadfinished() Values.afterInit() ``` 在 yps_mcu_data.js中接收到 ```js function ec_notify(type, para1, para2) { values.log('ec_notify', type, para1, para2) if (type === MCU_DATA_INDEX.YPS_NOTIFY_EC_CONNECT_STATUS) { values.isECConnect = (para1 === 1) ec_start() //自动互联 //qtEcExecCommand(0,0,0) } ``` ### #、板子只读修改成非只读 ```js adb shell //进入板子然后执行下边命令 mount -o remount rw /apps ``` ### #、开机启动选项 有两个地方设置 1. `/etc/init.d/rcS` 2. `/etc/init.rc` ### #、怎么播放视频 > tplayer -sid1 1 -sw1 1920 -sh1 1080 -t1 4 -m1 9 -i /data/01.mp4 ```shell tplayer -sid1 1 -sw1 1920 -sh1 1080 -t1 4 -m1 9 -i /data/01.mp4 副屏播放 tplayer -sid0 0 -sw1 1920 -sh1 1080 -t1 4 -m1 9 -i /data/01.mp4 主屏播放 ``` ### #、如何不带bll运行 将编译选项中的CONFIG+=T5 去掉![image-20240417143753801](.doc/image-20240417143753801.png) 将 Values.qml中 property int bootAnimationStatus: 1 //开机动画要改为1 并将: property bool boot_animate_done: true //开场动画 播放完毕 将import 模块修改为如下内容 ```js pragma Singleton import QtQuick 2.15 import "simulate.js" as JS //import "yps_mcu_data.js" as JS //import Qt_bll_proxy 1.0 //import Qt_dvrapi_proxy 1.0 //import MCU_DATA_INDEX 1.0 ``` ### #、指定输出到fbN显示 * fb:framebuffer设备 * 方式1:环境变量: N可以等于0,1,2等,取决于系统。在T5上,fb0绑定了内置的RGB或LVDS屏,fb1绑定了HDMI屏, 执行该脚本后,在运行程序将会在显示在fb1上 ```shell export QT_QPA_EGLFS_FB=/dev/fb1 ``` * 方式2:运行参数 程序执行时 指定直接 ``` ./PSDDemo -platform linuxfb:=/dev/fb1 ``` ### #、查看layer等显示信息 > cat /sys/class/disp/disp/attr/sys ### #、板子启动Qt环境 source /etc/qtenv.sh ### #、如和绑定app与按键 1. 查看硬件句柄 板子终端输入 `cat /proc/bus/input/devices ` 查看Name 对应的 ` Handlers=event1 ` 如果没找到名字就是硬件没有挂载上,换个硬件试试,检查是线的问题还是硬件的问题 ```shell sh-4.4# cat /proc/bus/input/devices I: Bus=0000 Vendor=0000 Product=0000 Version=0000 N: Name="axp2101-pek" P: Phys=m1kbd/input2 S: Sysfs=/devices/platform/soc/twi5/i2c-5/5-0036/axp2101-pek.0/input/input0 U: Uniq= H: Handlers=event0 B: PROP=0 B: EV=100003 B: KEY=10000000000000 0 I: Bus=0003 Vendor=0001 Product=0001 Version=0001 N: Name="yps_Keyboard" P: Phys= S: Sysfs=/devices/virtual/input/input1 U: Uniq= H: Handlers=event1 B: PROP=0 B: EV=3 B: KEY=168000000000 40010000002 ``` 2. 在 `/etc/init.rc` 对应的app下 输入对应的event ` setenv QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS "/dev/input/event3"` ```shell # /etc/init.rc service new_funcgui /apps/funcgui setenv PATH "/usr/local/Qt_5.15.8/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin" setenv LD_LIBRARY_PATH "/usr/local/Qt_5.15.8/lib:/usr/lib/cedarx/:/usr/local/lib/:/apps/libs" setenv QML2_IMPORT_PATH "/usr/local/Qt_5.15.8/qml" setenv QML_IMPORT_PATH "/usr/local/Qt_5.15.8/qml" setenv QTDIR "/usr/local/Qt_5.15.8" setenv QT_QPA_EGLFS_INTEGRATION "eglfs_mali" setenv QT_QPA_FONTDIR "/usr/local/Qt_5.15.8/fonts" setenv QT_QPA_GENERIC_PLUGINS "evdevtouch" setenv QT_QPA_PLATFORM "eglfs" setenv QT_QPA_PLATFORM_PLUGIN_PATH "/usr/local/Qt_5.15.8/plugins" setenv QT_ROOT "/usr/local/Qt_5.15.8" setenv QT_QPA_EGLFS_FB "/dev/fb0" setenv QT_QPA_FB_HIDECURSOR 1 setenv QT_QPA_EGLFS_HIDECURSOR 1 setenv QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS "/dev/input/event3" class core disabled console ``` ### #、yxbin 启动网络初始界面 ### #、Can简单使用 安装 Windows 安装 CANTest_Setup_V2.68.exe 然后照这个USB驱动的安装与卸载说明书.pdf * 查看是否有can设备 :ifconfig -l * 板子上:开启can并设置: ip link set up can0 type can bitrate 250000 restart-ms 100 含义设置can0 波特率 250k 阻塞后100 毫秒重启 设置can1 ip link set up can1 type can bitrate 250000 restart-ms 100 * 打印到控制台can消息 candump can0