i.MX Android 常见问题解答 i.MX_Android_常见问题解答
i.MX Android FAQ
1 同步项目并构建
1.1 如何从镜像服务器下载 AOSP repo?
默认情况下,Android项目中的所有aosp repo都将直接从google服务器下载。但有些人可能无法访问谷歌服务器,如果你的服务器已经镜像了 aosp repo,那么你可以重定向 aosp repo 下载链接。
在i.MX android项目中,所有的aosp repo都会被包含在${MY_ANDROID} /.repo/manifests/aosp*.xml中,您可以通过更改远程“aosp”的“fetch”来重定向aosp repo远程,下面是将远程链接重定向到 的示例:
@@ -2,7 +2,7 @@
https://android.googlesource.com/" + fetch=" /" review="https://android-review.googlesource.com/" />
1.2 如何配置构建信息?
BUILD_ID 和 BUILD_NUMBER 是两个 makefile 变量,如果定义了它们,则可以在 Android 核心构建系统中使用它们来指定构建信息。在我们的发布包中,我们将 BUILD_ID 定义为内部发布版本号,并将 BUILD_NUMBER 定义为内部发布日期。您可以在${MY_ANDROID} /device/fsl/{product}/build_id.mk文件中自定义这两个变量的值。“ ${MY_ANDROID} ”代表Android源代码的根目录。“{product}”与特定的芯片和主板相关,例如,它可以是“imx8m/evk_8mq”。
以下是更新 i.MX 8MQuad EVK 的 BUILD_ID 的示例
diff --git a/imx8m/evk_8mq/build_id.mk b/imx8m/evk_8mq/build_id.mk 索引 257b500..b177202 100644 --- a/imx8m/evk_8mq/build_id.mk +++ b/imx8m/evk_8mq/build_id.mk @@ -18,5 +18,5 @@ #(如“CRB01”)。它必须是一个单词,并且按照惯例以# 大写。
-export BUILD_ID=1.0.0-ga-rc2 +export BUILD_ID=1.0.0-ga-rc3 导出 BUILD_NUMBER=20190114
1.3 如何更改 boot.img 中的启动命令行?
使用 boot.img 后,我们将默认的内核启动命令行存储在这个图像中。 它将在 android 构建期间一起打包。
您可以通过更改${MY_ANDROID} /device/fsl/{product}/BoardConfig.mk 文件中 BOARD_KERNEL_CMDLINE 的定义来更改此设置。
注意:
将 {product} 替换为您的产品,例如 imx8m/evk_8mq。
1.4 如何修复 Python2 与最新的 git-repo 不兼容?
当你执行“repo init”或“repo sync”时,你可能会遇到以下异常:
haoran@pentakill:~/ssd/imx_5.4.y$ 存储库同步-c repo:警告:Python 2 不再受支持;请升级到 Python 3.6+。 回溯(最近一次调用最后一次): 文件“/home/ssd-1/haoran/imx_5.4.y/.repo/repo/main.py”,第 56 行,位于 从 subcmds.version 导入版本 文件“/home/ssd-1/haoran/imx_5.4.y/.repo/repo/subcmds/ __init__ .py”,第 38 行,位于 ['%s' % 名称]) 文件“/home/ssd-1/haoran/imx_5.4.y/.repo/repo/subcmds/upload.py”,第 27 行,位于 从 hooks 导入 RepoHook 文件“/home/ssd-1/haoran/imx_5.4.y/.repo/repo/hooks.py”,第 472 行 文件=sys.stderr) ^
在 Android 代码库中,之前实际可用的“repo”工具来自${MY_ANDROID} /.repo/repo/repo。默认情况下,这个 Python 脚本来自 Google 的https://gerrit.googlesource.com/git-repo 。Google 推动了此 git-repo.git 的更改,并在 2020 年 12 月之后删除了 repo 工具的 Python2 支持。因此 Python2 无法再基于最新的 repo 工具执行 repo sub 命令。对于较旧的 Android 版本,某些 Android 构建脚本不支持 Python 3。因此,经常在“repo sync”和镜像构建之间切换 Python 工具非常不方便。解决这个问题的一个方法是,您可以按照以下说明,将 git-repo 版本回退到适用于 Python 2 的版本,以支持较旧的 Android 版本:
$cd ${MY_ANDROID} /.repo/repo
$git checkout -b python2_repo 58ac1678e8438fd029a22365741fc57276eda404
$git 分支 python2_repo --set-upstream-to=origin/master
2 连接性
2.1 如何设置计算机以支持 ADB?
要设置计算机以支持 ADB,请参阅 Android 网站 了解更多详情。
上述页面中关于在 Ubuntu Linux 上“设置系统以检测设备”有一点不清楚,需要创建并编辑一个 udev 规则文件,请按照以下步骤操作:
1.使用 root 权限创建“/etc/udev/rules.d/90-android.rules”文件,并将设备的供应商添加到文件中,格式如下
子系统=="usb",属性{idVendor}=="18d1",模式="0666",组="plugdev"
子系统=="usb",属性{idVendor}=="1fc9",模式="0666",组="plugdev"
“18d1”的id值是google的USB VID,在我们的USB HAL代码中使用。
“1fc9”的id值是NXP的USB VID。
2.现在在主机上执行blow命令
chmod a+r /etc/udev/rules.d/90-android.rules
2.2 如何设置计算机以支持恢复模式下的 ADB?
NXP i.MX 6/7 系列支持从 ADB 应用系统更新。 Linux 操作系统默认支持该功能。 对于 Windows 操作系统,请按照以下步骤操作:
安装 Google USB 驱动程序。
将下面的补丁应用到 Google 的 USB 驱动程序。
将 USB 电缆连接到开发板并按照提供的说明安装驱动程序。
--- android_winusb.inf 2013-06-04 13:39:40.344756457 +0800 +++ android_winusb.inf 2013-06-04 13:43:46.634756423 +0800 @@ -23,6 +23,8 @@
[Google.NTx86] +;adb 侧载支持 + %SingleAdbInterface% = USB_Install,USB\VID_18D1&PID_D001
;Google Nexus One %SingleAdbInterface% = USB_Install,USB\VID_18D1&PID_0D02 @@ -59,7 +61,8 @@
[Google.NTamd64] - +;adb sideload support +%SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_D001 ;Google Nexus One %SingleAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02 %CompositeAdbInterface% = USB_Install, USB\VID_18D1&PID_0D02&MI_01
2.3 如何启用 USB 网络共享?
我们支持USB网络共享功能,上游设备可以是WIFI或以太网。 将 OTG USB 线连接到 PC 后,可以在设置 UI 中启用 USB 网络共享:设置 -> 网络和互联网 -> 热点和网络共享 -> USB 网络共享。
在 Linux 和 Windows 7 PC 上,当启用 USB 网络共享时,您可以轻松获得自动安装主机驱动程序的 USB 网络设备。 IP 和 DNS 服务器是自动配置的。
在 Windows XP PC 上,当您将开发板与 PC 连接后,您可以在设备管理器中看到一个名为“Android”的未知设备,您必须手动安装 tetherxp.inf 的网络共享驱动程序文件。 安装成功后,可以在设备管理器中看到“Android USB RNDIS设备”。 这时就可以使用USB rndis网络设备访问网络了。
2.4 如何使用 MTP?
媒体传输协议是 图片传输协议 (PTP)。 PTP 是为从数码相机下载照片而设计的,而媒体传输协议 (MTP) 支持传输数字音频播放器上的音乐文件和便携式媒体播放器上的媒体文件,以及 个人 数字 助理.
从 4.0 版本开始,Android 支持 MTP 作为与 PC 传输文件的默认协议,而不是 USB 大容量存储。 默认情况下,按照 Google 的建议,我们禁用了 UMS 并启用了 MTP。
注意:请确保在使用 MTP 时禁用 USB 网络共享。在 WinXP 下,启用 ADB 后 MTP 无法工作,但在 Win7 下,大多数情况下 MTP 可以与 ADB 协同工作。
当通过 USB 线将开发板连接到 PC 时,通知栏中将显示 USB 图标。 然后您可以点击通知区域,并选择“作为媒体设备连接”以启动 USB 计算机连接选项 UI。 其中,可以选择MTP和PTP作为当前传输协议。您也可以通过设置->存储->菜单->USB 计算机连接启动选项 UI。
Windows XP 上的 MTP
Windows XP默认支持PTP协议。 为了支持 MTP 协议,您必须安装 Windows Media Player(版本 >= 10)。 当连接到PC时,您可以在Windows资源管理器中看到MTP设备。 由于 Windows XP 仅支持在资源管理器中复制/粘贴文件,因此您无法直接打开 MTP 设备中的文件。
Windows 7 上的 MTP
Windows 7默认支持MTP(PTP)协议。 当连接到PC时,您可以在Windows资源管理器中看到MTP设备。 您可以像对硬盘一样进行任何操作。
MTP on ubuntu
Ubuntu默认支持PTP协议。 要支持 MTP 协议,必须安装以下软件包:libmtp、mtp-tools
$ sudo apt-get 安装 mtp-tools
如果您的默认 libmtp 版本不是 1.1.1(目前 Ubuntu 上最新的 libmtp 是 1.1.0),您必须通过以下方式手动升级:
$ sudo apt-get install libusb-dev $ wget http://downloads.sourceforge.net/project/libmtp/libmtp/1.1.1/libmtp-1.1.1.tar.gz $ tar -xvf libmtp-1.1.1.tar.gz $ cd libmtp-1.1.1 $ ./configure--prefix=/usr $ make -j4 $ sudo make install
完成上述步骤后,您可以通过以下命令在 PC 和设备之间传输文件:
mtp-detect:查找当前连接的 MTP 设备
mtp-files:列出 MTP 设备上的所有文件
2.5 如何设置Wi-Fi网络代理?
要配置 Wi-Fi 网络的代理设置,您必须:
从已添加的 Wi-Fi 网络列表中点击并按住一个网络
现在选择“高级选项”,然后向下滚动到“代理”。
选择“手动”。然后输入网络管理员提供的代理设置。
最后点击标有“连接”的按钮。
2.6 如何使“wifi国家代码”适应特定国家和/或地区?
i.MX Android软件中默认使用“CN”代码,主要用于中国大陆地区。为了方便起见,下表列出了一些其他国家和/或地区。如果目标国家/地区不在下表中,请在互联网上使用关键字“ISO 3166”搜索结果。
代码
国家/地区名称
CA
加拿大
JP
日本
DE
德国
荷兰
荷兰
IT
意大利
PT
葡萄牙
LU
Luxembourg
NO
挪威
fi
芬兰
DK
丹麦
通道
瑞士
CZ
捷克共和国
ES
西班牙
GB
英国
韩国
大韩民国(韩国)
法国
法国
SG
新加坡
BR
巴西
IL
以色列
在
奥地利
AU
澳大利亚
BE
比利时
CY
塞浦路斯
EE
Estonia
生长激素
希腊
胡
匈牙利
ID
Indonesia
IE
爱尔兰
ID
印度
是
冰岛
LT
立陶宛
LV
拉脱维亚
我的
马来西亚
新西兰
新西兰
PH
菲律宾
PL
波兰
SE
瑞典
SI
斯洛文尼亚
SK
斯洛伐克共和国
个
泰国
美国
美国
ZA
南非
2.7 如何通过 USB Type-C 切换 USB Power Delivery 的电源角色?
多个 i.MX 8 开发板通过 USB Type-C 端口支持 USB 电力传输 (PD)。该开发板可用作电源接收器或电源。 检查相应的 Android 发行说明以了解主板是否支持 USB 电源传输 (PD)。 以下是切换权力角色的步骤:
1.将参考设备与i.MX板连接:
使用 Type-C 转 Type-C 电缆将 i.MX 板与参考设备连接(支持 Usb Power Delivery)。
2.检查i.MX板设备的角色
如果 i.MX 板作为主机连接,并且参考设备是一个设备(有一个 usb 下拉菜单来选择传输文件、ptp),则在参考设备上执行步骤 3。 如果 i.MX 板作为设备连接(有一个 usb 下拉菜单来选择传输文件、ptp),并且参考设备是主机,则在 i.MX 板上执行步骤 3。
3.电源角色切换
如果 i.MX 板是主机: 要将 i.MX 板作为电源为参考设备充电,请在参考设备的 USB 下拉菜单上选择“为此设备充电”。 要使 i.MX 板作为电源接收器由参考设备充电,请在参考设备的 USB 下拉菜单上选择“供电”。
如果 i.MX 板是设备: 要将 i.MX 板作为电源为参考设备充电,请在 i.MX 板的 USB 下拉菜单上选择“供电”。 要使 i.MX 板成为由参考设备充电的电源接收器,请在 i.MX 板的 USB 下拉菜单上选择“为此设备充电”。
注意:
1.以下命令可以检查i.MX板的当前电源角色
猫/系统/类/typec/port0/power_role
源[接收器]:表示此 i.MX 板已由参考设备充电,
[source] sink :表示此 i.MX 板正在为参考设备充电,
2.参考设备应支持USB Power Delivery(PD)。您可以通过以下命令检查参考设备是否支持它
当它连接到i.MX板的USB Type-C端口时:
猫/ sys /类/ typec / port0 / port0-partner / support_usb_power_delivery,
如果该值为是,则该参考设备支持 USB 电源传输。Google Pixel 手机满足此要求,但 Google Nexus 6 不满足。
3 核
3.1 如何手动进入 Android 恢复模式?
系统运行时,如果主板有这些键,请按“音量减小”和“电源”进入恢复模式。 该检查位于 u-boot.git 板支持文件中,您可以在其中更改您喜欢的组合键。 您也可以在控制台中输入此命令:
重启恢复# 主板重置为恢复模式。
进入恢复模式。
3.2 如何在恢复模式下进入文本菜单?
注意:此功能仅适用于带有 POWER / VOLUME UP / VOLUME DOWN 键的主板。
当系统完成启动进入恢复模式时,您将看到一个 Android 机器人徽标
按 电源键(按住) , 进而 音量增大键 去 文本菜单 像这样:
移动菜单项 音量增大 和 音量降低 按钮。
选择菜单项 电源键。
使用小键盘或键盘上的方向键选择所需的选项。
立即重启系统
从 ADB 应用更新,您可以通过 adb sideload 命令从 update.zip 更新软件。仅 NXP i.MX 6/7 系列支持此功能。
清除数据/回复原厂设定。/data 和 /cache 分区已格式化。
擦除缓存分区。/cache 分区已格式化。
重新启动系统。
3.3 如何通过ADB升级系统?
NXP i.MX 6/7系列支持从ADB应用系统更新。 使用ADB工具升级系统前,请先安装adb驱动,具体安装方法请参考“2 Connectivity->2.2”如何设置计算机以支持恢复模式下的 ADB?”部分。
驱动程序安装和设置完成后,请按照以下步骤操作:
将 OTA 更新包下载到您的计算机,并使用 USB 线将开发板连接到您的 PC。
确保系统已进入恢复模式。请参阅“3.1 如何手动进入 Android 恢复模式”部分。
切换文本菜单,将光标移动到“apply update from ADB”处,UI显示如下:
在您的计算机上执行以下命令
adb sideload $YOUR_UPDATE_PACKAGE.zip
包裹发送后,系统开始使用更新文件更新固件。
3.4 如何使用 android fastboot?
Fastboot 是一个实用程序,可用于将图像从 Windows/Linux PC 下载到目标存储设备。 该实用程序由 Google 发布,可以从 Android 官方网站下载。 Android版本在U-Boot中实现了部分fastboot命令,比如:flash、reboot、getvar。
在使用快速启动之前,应在 Windows HOST 上安装 Google USB 驱动程序,并且目标板应启动到引导加载程序快速启动模式。
注意:fastboot下载的图像大小必须小于相关分区的大小。
目标方:
连接 USB OTG 后打开开发板电源。
确保主板进入快速启动模式。有几种方法可以进入快速启动模式。
选项1:输入 reboot bootloader 启动后在控制台中。
时钟配置2:
将电源连接至电路板。您将看到控制台的以下输出。
U-Boot ... ... 快速启动:正常 按任意键停止自动启动:3
打 任意键 在倒计时完成之前访问引导加载程序提示。输入 fastboot usb 并按 Enter:
快速启动:正常按任意键停止自动启动:0 => fastboot usb
笔记:
1.在主机上,它会提示您发现了一个新设备,需要安装驱动程序。请安装它。 2. 开发板进入U-Boot模式后,在目标端输入mmc部分,获取分区表映像中定义的详细分区名称。有些分区在 u-boot 中是硬编码的,这里就不列出了。
主机端:
确保 fastboot 包含在“PATH”的系统环境变量中。
转到图像文件夹。
下面是使用 fastboot 为 NXP imx8 系列刷写映像的示例。
在使用 fastboot 刷新图像之前,请确保您的主板处于解锁状态。
bootloader0/bootloader 和 gpt 分区在 u-boot 中是硬编码的,它不在分区表文件中。
分区表文件中定义的分区名称和数量可能会随着时间的推移和新功能的启用而发生变化。
$ fastboot flash gpt 分区表.img $ fastboot flash bootloader0 u-boot.imx $ fastboot flash dtbo dtbo.img $ fastboot flash 启动 boot.img $ fastboot flash 系统 system.img $ fastboot flash 供应商 vendor.img $ fastboot flash vbmeta vbmeta.img $ fastboot 重启
下面是使用 fastboot 为 NXP i.MX 6/7 系列刷写映像的示例。
$ fastboot flash gpt 分区表.img $ fastboot flash 引导加载程序 u-boot.imx $ fastboot flash dtbo dtbo.img $ fastboot flash 启动 boot.img $ fastboot flash 系统 system.img $ fastboot flash 供应商 vendor.img $ fastboot flash vbmeta vbmeta.img $ fastboot flash 恢复 recovery.img $ fastboot 重启
3.5 如何对imx6/7进行增量OTA更新?
3.5.1 检查“IncrementalOTA_InstallEnd”函数的定义
Android10之前发布的i.MX6/7代码(不包括Android10)不支持构建增量OTA包。需要在releasetools.py中为特定平台定义一个名为“IncrementalOTA_InstallEnd”的函数,这是${MY_ANDROID} /device/fsl下的文件。以i.MX 7ULP EVK为例,此文件为${MY_ANDROID} /device/fsl/imx7ulp/releasetools.py。如果该函数未定义,请对代码进行以下更改。
其他平台有自己的releasetools.py,根据您自己的要求修改文件。
diff --git a/imx7ulp/releasetools.py b/imx7ulp/releasetools.py
index 8c40905d..d557b23e 100644
--- a/imx7ulp/releasetools.py
+++ b/imx7ulp/releasetools.py
@@ -38,3 +38,25 @@ def FullOTA_InstallEnd(info):
# emit the script code to trigger the dtbo updater on the device
info.script.WriteRawImage("/dtbo", "dtbo.img")
+
+def IncrementalOTA_InstallEnd(info):
+ # copy the vbmeta and dtbo into the package.
+ try:
+ vbmeta_img = common.GetBootableImage(
+ "vbmeta.img", "vbmeta.img", OPTIONS.input_tmp, "VBMETA")
+ dtbo_img = common.GetBootableImage(
+ "dtbo.img", "dtbo.img", OPTIONS.input_tmp, "DTBO")
+ except KeyError:
+ print "no vbmeta or dtbo images in target_files; skipping install"
+ return
+ # copy the vbmeta into the package.
+ common.ZipWriteStr(info.output_zip, "vbmeta.img", vbmeta_img.data)
+
+ # emit the script code to trigger the vbmeta updater on the device
+ info.script.WriteRawImage("/vbmeta", "vbmeta.img")
+
+ # copy the dtbo into the package.
+ common.ZipWriteStr(info.output_zip, "dtbo.img", dtbo_img.data)
+
+ # emit the script code to trigger the dtbo updater on the device
+ info.script.WriteRawImage("/dtbo", "dtbo.img")
${MY_ANDROID} /device/fsl 中的变量“BOARD_PREBUILT_DTBOIMAGE”用于指定要构建到 OTA 包中的 dtbo 图像。根据您的要求修改此变量的值。以 i.MX7ULP EVK 为例,您可能需要进行以下更改以使 OTA 包适用于带有 MIPI 面板显示的电路板
diff --git a/imx7ulp/evk_7ulp/BoardConfig.mk b/imx7ulp/evk_7ulp/BoardConfig.mk
index 0c023ecc..ec1c695f 100644
--- a/imx7ulp/evk_7ulp/BoardConfig.mk
+++ b/imx7ulp/evk_7ulp/BoardConfig.mk
@@ -103,7 +103,7 @@ TARGET_BOARD_DTS_CONFIG := imx7ulp:imx7ulp-evkb.dtb imx7ulp-evk:imx7ulp-evk.dtb
TARGET_BOARD_DTS_CONFIG += imx7ulp-mipi:imx7ulp-evkb-rm68200-wxga.dtb imx7ulp-evk-mipi:imx7ulp-evk-mipi.dtb
TARGET_KERNEL_DEFCONFIG := imx_v7_android_defconfig
# TARGET_KERNEL_ADDITION_DEFCONF := imx_v7_android_addition_defconfig
-BOARD_PREBUILT_DTBOIMAGE := out/target/product/evk_7ulp/dtbo-imx7ulp.img
+BOARD_PREBUILT_DTBOIMAGE := out/target/product/evk_7ulp/dtbo-imx7ulp-mipi.img
# u-boot target used by uuu for imx7ulp_evk
TARGET_BOOTLOADER_CONFIG += imx7ulp-evk-uuu:mx7ulp_evk_defconfig
3.5.2构建目标包文件
您可以使用以下命令在android环境下生成目标包文件:
$ cd ${MY_ANDROID}
$ 源构建/envsetup.sh
$ lunch evk_7ulp-userdebug
$ make 目标文件包 -j4
构建完成后,您可以在以下路径找到目标包文件:
. ${MY_ANDROID} /out/target/product/evk_7ulp/obj/PACKAGING/target_files_intermediates/evk_7ulp-target_files-**.zip
将目标文件复制到${MY_ANDROID}目录,我们将其重命名为evk_7ulp-target.a.zip。然后执行以下命令生成完整的OTA包。
$./build/tools/releasetools/ota_from_target_filesevk_7ulp-target.a.zip evk_ota_full.zip
将此 OTA 包 evk_ota_full.zip 应用到开发板上。例如,使用 adb,在通过 USB 电缆连接到开发板的主机上执行以下命令:
$ sudo adb root $ sudo adb restart sideload # 等待一段时间,直到系统重新启动进入侧载模式 $ sudo adb 侧载 evk_ota_full.zip
上述命令完成后,重新启动系统。板上运行的图像与“evk_7ulp-target.a.zip”中的图像相同
3.5.3构建增量更新包
增量更新包含一组二进制补丁,可应用于设备上已有的数据。这会导致更新包明显变小。
增量OTA包也是由目标包文件构建而成,与完整OTA包的区别在于增量OTA包需要生成两个目标包文件。一个目标包包含已经在板上运行的图像,另一个目标包包含要更新的图像。
例如,我们已经更新了 i.MX 7ULP EVK 板,其上运行的图像与“evk_7ulp-target.a.zip”中的图像相同。此后,对代码进行一些开发工作。我们可以按照“3.5.2 构建目标包文件”中的说明重新构建目标包文件并生成完整的OTA包,我们也可以使用这个新生成的目标包文件与evk_7ulp-target.a.zip一起生成增量OTA包。
假设我们已经生成了一个目标文件,复制到${MY_ANDROID}目录并将其重命名为evk_7ulp-target.b.zip。在主机上执行以下命令生成增量OTA包:
$./build/tools/releasetools/ota_from_target_files-i evk_7ulp-target.a.zip evk_7ulp-target.b.zip evk_7ulp_ota_diff.zip
使用上述命令生成增量OTA包。它应该应用于运行与目标文件 evk_7ulp-target.a.zip 中相同图像的设备。
此增量 OTA 包也可以通过 adb 更新到主板,就像完整 OTA 包所述一样。
应用此 OTA 包后。下次如果需要另一个增量 OTA,则使用新生成的目标包文件和旧的 evk_7ulp-target.b.zip 来生成它。
4 视音频
4.1 如何在视频播放时检查丢帧统计数据?
在播放视频时从控制台输入以下命令以获取实时丢帧统计信息。
dumpsys media.player | grep“num”
然后检查输出,帧丢失统计将显示如下:
总帧数(1892),丢弃帧数(0),丢弃百分比(0.00%)
numFramesTotal:视频文件的总帧数。 numFramesDropped:AV同步丢失的帧数。 percentageDropped:总丢帧百分比。
5 图形
5.1 如何设置GPU最小时钟来平衡性能和功耗?
通常 GPU 以全速工作。 当热驱动器报告芯片过热时,GPU驱动器将调整内部时钟以降低功耗,从而快速冷却芯片。 理论上我们应该将 GPU 时钟设置为 1/64,以便芯片可以更快地冷却下来,但是当 GPU 以如此慢的时钟工作时,尤其是在高分辨率下,您可能会看到黑屏或闪烁问题。 有以下方法可以根据芯片和产品的分辨率定制 GPU 最小时钟的阈值。
客户可以通过更改${MY_ANDROID} /device/fsl/{product}/init.rc 文件中的以下行来设置最小 GPU 时钟,该值可以设置为 1 到 64 之间的任意值。
写入/sys/module/galcore/parameters/gpu3DMinClock 3
当前默认值为 3。 客户应根据自己的测试调整并设置合适的值。
5.2 如何禁用 GPU 加速?
Android上使用GPU加速有三个部分。客户可能需要单独禁用其中一些以缩小问题范围。下面是操作步骤。
1.禁用HWComposer:
您可以在设置 apk 中禁用 HWComposer,设置->系统-> {} 开发人员选项->禁用硬件覆盖
2.禁用 OpenGL 渲染器
您可以通过设置“setprop sys.viewroot.hw false”并终止 surfaceflinger 线程来禁用 OpenGL 渲染器并强制使用 SKIA 进行绘制。
3.禁用OpenGL 3D绘制
禁用 OpenGL 3D 绘制只能在禁用 OpenGL 渲染器之后进行,因为此操作将完全禁用所有 3D OpenGL 加速。 您可以通过“mv /system/lib/egl/libGLES_android.so /system/lib/egl/libGLES.so”来执行此操作并终止 surfaceflinger 线程。
注意:
下面的例子告诉你如何杀死surfaceflinger
root@sabresd_6dq:/# ps | grep surfaceflinger
系统 159 1 168148 7828 ffffffff b6f05834 S /system/bin/surfaceflinger
root@sabresd_6dq:/# 杀死 159
6 启动
6.1 如何从带有 i.MX 8QuadXPlus b0 芯片的主板的 eMMC 不同分区启动?
带有硅片修订版 b0 的 i.MX 8QuadXPlus MEK 芯片可以从 eMMC 启动分区 32KB 偏移启动,但这不是参考手册中指定的行为,因此不能保证它能在您的主板上正常工作。正如参考手册所示,如果引导加载程序映像位于 eMMC 引导分区中,则第一个映像容器偏移量为 0;如果引导加载程序映像位于 eMMC 用户数据区域分区中,则第一个映像容器偏移量为 32KB。如果您的主板无法从 eMMC 启动分区 32KB 偏移启动,可以进行一些更改以符合参考手册中的描述:
1. 位于 eMMC 启动分区且偏移量为 0 的引导加载程序映像
在这种情况下,i.MX 8QuadXPlus 硅修订版 b0 芯片应使用 eMMC 快速启动模式。
eMMC 快速启动模式默认未启用,并且启用该模式是不可逆的。fastboot 命令“fuse prog -y 0 0x13 0x1”可用于启用 eMMC fastboot 模式,这可以添加到 uuu_imx_android_flash 脚本中。uuu_imx_android_flash.sh 上的一个示例:
diff --git a/common/tools/uuu_imx_android_flash.sh b/common/tools/uuu_imx_android_flash.sh 索引 da45518cb..49ee53555 100755 --- a/common/tools/uuu_imx_android_flash.sh +++ b/common/tools/uuu_imx_android_flash.sh @@ -145,6 +145,9 @@ 函数 uuu_load_uboot 如果 [[ ${target_dev} = “emmc” ]]; 然后 echo FB: ucmd mmc partconf ${target_num} 1 1 1 >> /tmp/uuu.lst fi + 如果 [[ ${soc_name} = “imx8qxp” ]] && [[ ${uboot_feature} != *“c0”* ]];然后+回显 FB: ucmd fuse prog -y 0 0x13 0x1 >> /tmp/uuu.lst + fi
如果[[ ${intervene} -eq 1 ]]; 然后回显 FB: 完成 >> /tmp/uuu.lst
此外,i.MX 8QuadXPlus 硅片修订版 b0 的“bootloader0”分区偏移量应从 32K 更改为 0。
diff--git a/drivers/fastboot/fb_fsl/fb_fsl_partitions.cb/驱动程序/快速启动/fb_fsl/fb_fsl_partitions.c 索引 92c978e6c8..7e3679b19a 100644 --- a/驱动程序/fastboot/fb_fsl/fb_fsl_partitions.c +++b/驱动程序/快速启动/fb_fsl/fb_fsl_partitions.c @@ -55,7 +55,7 @@ 静态 ulong bootloader_mmc_offset(void) { 如果(is_imx8mq()|| is_imx8mm()||((is_imx8qm()|| is_imx8qxp())&& is_soc_rev(CHIP_REV_A))) 返回 0x8400; - 否则如果(is_imx8qm()||(is_imx8qxp()&&!is_soc_rev(CHIP_REV_B))){ + 否则,如果 (is_imx8qm() || is_imx8qxp()) { if (MEK_8QM_EMMC == fastboot_devinfo.dev_id) /* 目标设备是 eMMC boot0 分区,引导加载程序偏移量为 0x0 */ 返回 0x0;
2. eMMC 上的引导加载程序映像具有 32KB 偏移量的用户数据区分区。
在这种情况下,应该修改 uboot 中的代码,以在 eMMC 用户数据区域分区中创建“bootloader0”分区。
以下补丁适用于带有 b0 芯片的 i.MX 8QuadXPlus MEK,但显然会影响其他平台,请谨慎应用以下路径。
差异——git a/drivers/fastboot/fb_fsl/fb_fsl_dev.cb/驱动程序/快速启动/fb_fsl/fb_fsl_dev.c 索引 f1c116bea2..c23f0a3e01 100644 --- a/驱动程序/fastboot/fb_fsl/fb_fsl_dev.c +++b/驱动程序/快速启动/fb_fsl/fb_fsl_dev.c @@ -124,7 +124,7 @@ 静态 int get_fastboot_target_dev(char *mmc_dev,struct fastboot_ptentry *ptn) printf("Flash目标是mmc%d\n", dev); 如果(target_mmc->part_config!=MMCPART_NOAVAILABLE) sprintf(mmc_dev, “mmc dev %x %x”, dev, /*槽号*/ -FASTBOOT_MMC_BOOT_PARTITION_ID/*零件编号*/); +FASTBOOT_MMC_USER_PARTITION_ID/*零件编号*/); 别的 sprintf(mmc_dev,“mmc dev%x”,dev); } @@ -559,4 +559,4 @@ void process_erase_mmc(const char *cmdbuf,char *response) sprintf(响应,“OKAY”);
返回; -} \ 文件末尾没有换行符 +} diff--git a/drivers/fastboot/fb_fsl/fb_fsl_partitions.cb/驱动程序/快速启动/fb_fsl/fb_fsl_partitions.c 索引 92c978e6c8..4629060402 100644 --- a/驱动程序/fastboot/fb_fsl/fb_fsl_partitions.c +++b/驱动程序/快速启动/fb_fsl/fb_fsl_partitions.c @@ -231,7 +231,7 @@ 静态 int _fastboot_parts_load_from_ptable(void) bootloader_mmc_offset()/dev_desc->blksz; ptable[PTN_BOOTLOADER_INDEX].长度= ANDROID_BOOTLOADER_SIZE / dev_desc->blksz; -ptable[PTN_BOOTLOADER_INDEX].partition_id = boot_partition; + ptable[PTN_BOOTLOADER_INDEX].分区ID=用户分区; ptable[PTN_BOOTLOADER_INDEX].标志=FASTBOOT_PTENTRY_FLAGS_UNERASEABLE; strcpy(ptable[PTN_BOOTLOADER_INDEX].fstype,"原始");
eMMC 还需要设置为从用户数据区域分区启动,在 uuu_imx_android_flash 脚本中进行设置。 下面是uuu_imx_android_flash.sh的一个示例,注意,这将影响其他平台的刷写,请谨慎使用。
差异 --git a/common/tools/uuu_imx_android_flash.sh b/common/tools/uuu_imx_android_flash.sh 索引 da45518cb..d98844d84 100755 --- a/common/tools/uuu_imx_android_flash.sh +++b/common/tools/uuu_imx_android_flash.sh @@ -143,7 +143,7 @@ 函数 uuu_load_uboot 回显 FB:ucmd mmc 擦除${uboot_env_start} ${uboot_env_len} >> /tmp/uuu.lst
if [[ ${target_dev} = "emmc" ]]; then - echo FB: ucmd mmc partconf ${target_num} 1 1 1 >> /tmp/uuu.lst + echo FB: ucmd mmc partconf ${target_num} 1 7 1 >> /tmp/uuu.lst fi
如果[[ ${intervene} -eq 1 ]]; 那么
7 杂项
7.1 如何在 Android Jelly Bean 及更高版本上启用开发者选项?
自 Jelly Bean 版本以来,Google 已经隐藏了开发者选项 - 以下是恢复它们的方法:
转到“设置”菜单,然后向下滚动到“系统”。点击它。然后点击“关于平板电脑”菜单。
再次向下滚动到底部,您会看到“版本号”。
轻敲七次。第三次点击后,您将看到一个有趣的对话框,提示您只需点击四次即可成为开发人员。继续点击,直到恢复开发人员设置。
7.2 如何启用或禁用总线频率功能?
当需要高总线频率的 IP 不工作时,总线频率驱动器用于降低 SoC 中的 DDR、AHB 和 AXI 总线频率。 这显著节省了 Android earlysuspend 模式(屏幕关闭时播放音频)下的功耗。 总线频率驱动器是 已启用 默认情况下,如果要启用或禁用它,请在控制台中执行以下命令:
禁用: $ echo 0>sys/bus/platform/drivers/imx_busfreq/busfreq/enable 使能够: $ echo 1> sys/bus/platform/drivers/imx_busfreq/busfreq/enable
请注意,如果您使用以太网,则上行操作将启用 FEC 时钟并强制总线频率升高。 这意味着无论以太网电缆是否插入或拔出,您都无法再进入低总线模式。 因此,如果您希望系统进入低总线模式,则必须执行“netcfg eth0 down”来手动关闭 FEC。 如果您想再次使用 FEC,请手动执行“netcfg eth0 up”,当 FEC 使用时钟门控关闭时,PHY 无法检测到您的电缆进/出事件。
7.3 如何使用 memtool?
7.3.1 Android环境下搭建memtool
git克隆https://source.codeaurora.org/external/imx/imx-test/-b imx_5.4.24_2.1.0
cp-r imx测试/测试/memtool ${MY_ANDROID} /外部
光盘${MY_ANDROID}
源构建/envsetup.sh
lunch evk_8mm-userdebug
mmm 外部/memtool
构建的二进制文件存储在${MY_ANDROID} /out/target/product/evk_8mm/vendor/bin/memtool_32 和${MY_ANDROID} /out/target/product/evk_8mm/vendor/bin/memtool_64
7.3.2重建启动映像
添加以下补丁以启用 CONFIG_DEVMEM,然后重建 boot.img 并将其刷入板上:fastboot flash boot_a boot.img
diff --git a/arch/arm64/configs/imx_v8_android_defconfig b/arch/arm64/configs/imx_v8_android_defconfig 索引 ee40b9aa67e6..cdc9a1d56849 100644 --- a/arch/arm64/configs/imx_v8_android_defconfig +++b/arch/arm64/配置/imx_v8_android_defconfig @@ -477,7 +477,6 @@ CONFIG_INPUT_ISL29023=y # CONFIG_SERIO_SERPORT 未设置 CONFIG_SERIO_AMBAKMI=y # CONFIG_LEGACY_PTYS 未设置 -# CONFIG_DEVMEM 未设置 配置串行8250=y 配置串行8250控制台=y CONFIG_SERIAL_8250_EXTENDED=y
7.3.3 使用板上的 memtool
将 memtool 推送到主板的磁盘:
adb push ${MY_ANDROID} /out/target/product/ evk_8 mm /vendor/bin/memtool_32 /data/local/tmp
运行 memtool_32 获取帮助信息:
evk_8mm:/#/数据/本地/tmp/memtool_32 用法:
读取内存:memtool [-8 | -16 | -32] 写入内存:memtool [-8 | -16 | -32] =
7.4 如何使用 systrace?
Systrace 工具可用于分析 Android 设备性能。请参阅以下链接了解 Systrace 是什么以及如何使用它:
https://source.android.com/devices/tech/debug/systrace
https://developer.android.com/topic/performance/tracing/command-line
systrace 工具需要启用“CONFIG_DEBUG_FS”配置,否则生成报告时可能会出现以下错误:
开始跟踪(按回车键停止) 跟踪完成。正在收集输出... /system/bin/sh: [2]:无法创建 /sys/kernel/debug/tracing/trace_marker:没有此文件或目录 正在输出 Systrace 结果...
在一些新的Android版本中,“CONFIG_DEBUG_FS”配置默认是禁用的,您需要自行启用它才能启用systrace功能。例如:
diff --git a/arch/arm64/configs/imx_v8_android_car2_defconfig b/arch/arm64/configs/imx_v8_android_car2_defconfig 索引 9e38bb17d640..bf35ce161d6d 100644 --- a/arch/arm64/configs/imx_v8_android_car2_defconfig +++b/arch/arm64/配置/imx_v8_android_car2_defconfig @@ -509,3 +509,4 @@ CONFIG_PANIC_TIMEOUT=5 CONFIG_DEBUG_LIST=y 配置启用默认跟踪器=y # CONFIG_UPROBE_EVENTS 未设置 +CONFIG_DEBUG_FS=y
8 端口 ISP 摄像头至 Android
这是帮助开发人员将 ISP 摄像头从 Linux 移植到 evk_8mp 上的 Android 的快速指南。假设您已经获得了 Android 源代码并知道如何构建和刷新映像。这些可以从 Android 发布文档中获得。下面只关注ISP摄像头的移植。还假设相机在 Linux 上运行正常。
8.1 驱动代码路径
供应商/nxp-opensource/verisilicon_sw_isp_vvcam
8.2 驱动程序编译
8.2.1编译命令
在 Android 根路径下,按照以下命令操作。
1)源构建/envsetup.sh
2)午餐evk_8mp-userdebug
3) ./imx-make.sh kernel -j8 //只需运行一次即可
4)./imx-make.sh vvcam-j8
如果构建成功,将会在下面路径下生成ko。
fanghui@aps001:~/share_home2/android-11-5.10/out/target/product/evk_8mp$ ls obj/VVCAM_OBJ/
basler-camera-driver-vvcam.ko kernelenv.sh os08a20.ko ov2775.ko vvcam-dwe.ko vvcam-isp.ko vvcam-video.ko
8.2.2编译安排
以下是相关文件
vvcam/vvcam.mk
如果添加了新的传感器。需要在vvcam.mk中添加复制脚本,例如
cp $(VVCAM_SRC_PATH)/传感器/ov2775/ov2775.ko $(VVCAM_OUT);
vvcam/v4l2/Kbuild
它是从 vvcam/v4l2/Makefile 复制而来的,只需进行一些必要的更改即可使其在 Android 上顺利构建。如果 Makefile 中针对新传感器有更改,则应与 Kbuild 保持一致。
设备/nxp/common/build/Makefile
仅供参考。这是将 vvcam 添加到 android 构建系统的地方。你永远不应该改变它。
fanghui@aps001:~/share_home2/android-11-5.10/device/nxp$ grep -rn vvcam.mk
常见/构建/Makefile:20:-包括${VVCAM_PATH} /vvcam/vvcam.mk
8.3 驱动程序更新
在 8mp 上,使用 GKI(通用内核映像)。ISP 相关的 KO 被构建到 vendor_boot.img 中,然后烧写到开发板。请按照以下命令操作。
cd ANDROID_ROOT //假设“ANDROID_ROOT”是android代码的根路径。
./imx-make.sh vendorbootimage -j8
adb 重启引导程序
sudo fastboot flash vendor_boot out/target/product/evk_8mp/vendor_boot.img。
sudo fastboot 重启
重启后,更新的 KO 将被加载
注意:如果添加新的 KO,需要先添加到 device/nxp/imx8m/evk_8mp/SharedBoardConfig.mk 如下所示。
ifeq ($(IMX8MP_USES_GKI),true)
BOARD_VENDOR_RAMDISK_KERNEL_MODULES += \
……
$(TARGET_OUT_INTERMEDIATES)/VVCAM_OBJ/basler-camera-driver-vvcam.ko \
$(TARGET_OUT_INTERMEDIATES)/VVCAM_OBJ/vvcam-video.ko \
$(TARGET_OUT_INTERMEDIATES)/VVCAM_OBJ/vvcam-dwe.ko \
$(TARGET_OUT_INTERMEDIATES)/VVCAM_OBJ/vvcam-isp.ko \
8.4 DTB update
8.4.1 DTB安排
在 device/nxp/imx8m/evk_8mp/BoardConfig.mk 中,将以下内容更改为您的 dtb。
# 默认双 Basler
TARGET_BOARD_DTS_CONFIG := imx8mp:imx8mp-evk-dual-basler.dtb
相关的 dts 文件应该位于
供应商/nxp-opensource/kernel_imx/arch/arm64/boot/dts/飞思卡尔
8.4.2构建DTB镜像
在 ANDROID 根路径下,运行
./imx-make.sh kernel -j8
./imx-make.sh dtboimage -j8
8.4.3 Update DTB image
1) adb reboot bootloader 2) sudo fastboot flash dtbo dtbo-imx8mp.img 3) sudo fastboot reboot
8.5 新的传感器库更新
8.5.1构建传感器库
默认传感器是 basler。如果使用新的传感器,您需要构建自己的 libMySensor.so 来实现 isi_iss.h 中的接口。
您应该通过“wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/isp-imx-4.2.2.15.0.bin ”获取 ISP 代码包。注意:“isp-imx-4.2.2.15.0.bin”应该替换为您使用的版本。
按照 appshell/readme_android.txt 来构建库。
8.5.2更新传感器库
1)adb root
2)adb重新挂载
3)adb pull /vendor/etc/configs/isp/Sensor0_Entry.cfg
4)更改“drv =“/vendor/lib64/DAA3840_30MC_1080P.drv””
到“drv =“/vendor/lib64/libMySensor.so””。
将xml和dwe更改为相关文件。
5)adb推送Sensor0_Entry.cfg/供应商/etc/configs/isp/
另外,您可以推送相关的 xml/dwe 文件。
注意:
即使在“adb remount”之后,“/vendor/etc/configs/isp”可能仍然只读,这是由于覆盖系统造成的。参考“/vendor/etc/init/hw/init.nxp.rc”中的“overlay”。 在默认图像上,“/vendor/etc/configs/isp”被“/vendor/vendor_overlay_sensor/os08a20/vendor/etc/configs/isp”覆盖。
因此需要更新“/vendor/vendor_overlay_sensor/os08a20/vendor/etc/configs/isp”下的文件,然后重启。 重启后,“/vendor/etc/configs/isp”已更新。
9 安全
9.1 如何增强IOMUX安全性?
i.MX 8M 系列 SoC 上的 IOMUX 模块支持灵活的 I/O 复用,允许用户将每个 IO 板配置为可选功能之一。i.MX 8M 上的 CSU(中央安全单元)模块可用于将某些设备配置为仅安全访问,以保护这些设备的安全。但由于 IOMUX 为非安全访问,因此焊盘功能可以动态配置,如果黑客重新配置 IO 焊盘,使设备连接到其他可从非安全访问的控制器,则存在风险。
解决此问题的一个方法是配置 CSU 以限制对 IOMUX 的非安全访问,所有 IOMUX 寄存器写入操作都被路由到 Trusty OS。在 Trusty OS 中,将所有敏感 IO 资源添加到一个黑名单,Trusty OS 中的 IOMUX 驱动程序应检查并拒绝任何来自非安全世界对敏感寄存器的写入尝试。
附加了一个示例补丁集,以展示如何将 IOMUX 分配给安全世界以及如何将 IOMUX 写入操作路由到 Trusty OS。在此示例中,i.MX8MP EVK 上的 USB 主机 pinctrl PAD 被分配到安全世界。示例代码的布局如下:
.
├── atf
│ └── 0001-config-iomux-to-secure-write.patch --> ${MY_ANDROID}/vendor/nxp-opensource/arm-trusted-firmware
├── kernel
│ └── 0001-Use-Trusty-OS-to-handle-iomux-registers-written-oper.patch --> ${MY_ANDROID}/vendor/nxp-opensource/kernel_imx/
├── trusty
│ └── 0001-Add-iomux-pinctrl-TEE-handler.patch --> ${MY_TRUSTY}/trusty/hardware/nxp
└── u-boot
└── 0001-Use-Trusty-OS-to-handle-IOMUX-operation.patch --> ${MY_ANDROID}/vendor/nxp-opensource/uboot-imx
記事全体を表示