aosp 学习记录
debug 串口参数
默认 115200, 8,n, 1, xon/xoff
查看 tty 驱动
cat /proc/tty/drivers
...
msm_serial_hs /dev/ttyHS 240 0-255 serial
msm_serial /dev/ttyMSM 241 0-2 serial
...
serial 对应 ttyMSM, 这个是普通速度串口。 serial_hs 对应 ttyHS,这个是高速串口。
uart 设置为 console
/kernel/msm-4.9/arch/arm64/boot/dts/qcom/msm8917-mtp.dtsi
里面设置:
&blsp1_uart2 {
status = "ok";
pinctrl-names = "default";
pinctrl-0 = <&uart_console_active>;
};
adb 提升 root 权限
- adb shell 进去后,
su
可以提升root - adb root 直接提升为 root
查看开机时 uart 设置情况
adb root
adb shell dmesg >log.txt
然后在 log.txt
中查找 uart
和 tty
发现:
...
[ 0.000000] Kernel command line: sched_enable_hmp=1 console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 androidboot.hardware=qcom user_debug=30 msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci lpm_levels.sleep_disabled=1 earlycon=msm_hsl_uart,0x78B0000 vmalloc=300M androidboot.usbconfigfs=true loop.max_part=7 buildvariant=userdebug androidboot.emmc=true androidboot.verifiedbootstate=orange androidboot.keymaster=1 dm="1 vroot none ro 1,0 6192024 verity 1 PARTUUID=11fae9bd-cd78-deb6-4780-ff6ae8fae2dd PARTUUID=11fae9bd-cd78-deb6-4780-ff6ae8fae2dd 4096 4096 774003 774003 sha1 661f201a0b51513e175aef53da958ddf76abe55d a83a8e4530863e4ec1ef23d12f2912c52efa0dcc 10 ignore_zero_blocks ignore_zero_blocks use_fec_from_device PARTUUID=11fae9bd-cd78-deb6-4780-ff6ae8fae2dd fec_roots 2 fec_blocks 780099 fec_start 780099" root=/dev/dm-0 androidboot.vbmeta.device=PARTUUID=661b41df-a63e-849c-2db3-ea63cf2b34be androidboot.vbmeta.avb_version=1.0 androidboot.vbmeta.device_state=unlo
...
[ 0.000000] Kernel command line: sched_enable_hmp=1 console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 androidboot.hardware=qcom user_debug=30 msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7824900.sdhci lpm_levels.sleep_disabled=1 earlycon=msm_hsl_uart,0x78B0000 vmalloc=300M androidboot.usbconfigfs=true loop.max_part=7 buildvariant=userdebug androidboot.emmc=true androidboot.verifiedbootstate=orange androidboot.keymaster=1 dm="1 vroot none ro 1,0 6192024 verity 1 PARTUUID=11fae9bd-cd78-deb6-4780-ff6ae8fae2dd PARTUUID=11fae9bd-cd78-deb6-4780-ff6ae8fae2dd 4096 4096 774003 774003 sha1 661f201a0b51513e175aef53da958ddf76abe55d a83a8e4530863e4ec1ef23d12f2912c52efa0dcc 10 ignore_zero_blocks ignore_zero_blocks use_fec_from_device PARTUUID=11fae9bd-cd78-deb6-4780-ff6ae8fae2dd fec_roots 2 fec_blocks 780099 fec_start 780099" root=/dev/dm-0 androidboot.vbmeta.device=PARTUUID=661b41df-a63e-849c-2db3-ea63cf2b34be androidboot.vbmeta.avb_version=1.0 androidboot.vbmeta.device_state=unlo
...
[ 1.021788] msm_serial 78b0000.serial: msm_serial: detected port #0
[ 1.021827] msm_serial 78b0000.serial: uartclk = 7372800
[ 1.021885] 78b0000.serial: ttyMSM0 at MMIO 0x78b0000 (irq = 80, base_baud = 460800) is a MSM
[ 1.021901] msm_serial: console setup on port #0
[ 3.798478] console [ttyMSM0] enabled
[ 3.803742] msm_serial 78af000.serial: msm_serial: detected port #1
[ 3.806721] msm_serial 78af000.serial: uartclk = 19200000
[ 3.812839] 78af000.serial: ttyMSM1 at MMIO 0x78af000 (irq = 81, base_baud = 1200000) is a MSM
[ 3.818790] msm_serial 7aef000.serial: msm_serial: detected port #2
[ 3.826891] msm_serial 7aef000.serial: uartclk = 19200000
[ 3.833054] 7aef000.serial: ttyMSM2 at MMIO 0x7aef000 (irq = 82, base_baud = 1200000) is a MSM
[ 3.839441] msm_serial: driver initialized
[ 3.848483] msm_serial_hs module loaded
...
上面有地址和 MSM 的具体对应,可以和下面的设备树里面的进行对应。而且还能看到 console 和 MSM 的对应情况。
查看设备树 uart 相关
/kernel/msm-4.9/arch/arm64/boot/dts/qcom/msm8917-mtp.dtsi
里面可以看到:
blsp1_uart2: serial@78b0000 {
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
reg = <0x78b0000 0x200>;
interrupts = <0 108 0>;
clocks = <&clock_gcc clk_gcc_blsp1_uart2_apps_clk>,
<&clock_gcc clk_gcc_blsp1_ahb_clk>;
clock-names = "core", "iface";
status = "disabled";
};
blsp1_uart1: serial@78af000 {
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
reg = <0x78af000 0x200>;
interrupts = <0 107 0>;
clocks = <&clock_gcc clk_gcc_blsp1_uart1_apps_clk>,
<&clock_gcc clk_gcc_blsp1_ahb_clk>;
clock-names = "core", "iface";
status = "disabled";
};
blsp2_uart1: serial@7aef000 {
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
reg = <0x7aef000 0x200>;
interrupts = <0 306 0>;
clocks = <&clock_gcc clk_gcc_blsp2_uart1_apps_clk>,
<&clock_gcc clk_gcc_blsp2_ahb_clk>;
clock-names = "core", "iface";
status = "disabled";
};
可以通过这个地址和上面的 dmesg 里面的地址进行对应,从而知道 MSM 和uart 的具体对应方式。
uart 设备树参考文档
kernel/msm-4.9/Documentation/devicetree/bindings/serial
目录下面有很多厂家的文档,比如 qcom 的就有3个文档,qcom,msm-geni-uart.txt
, qcom,msm-uartdm.txt
, qcom,msm-uart.txt
从这些文档里面可以看出,普通模式是不用 DMA 的,高速模式才用 DMA。
policy 查看
adb pull /sys/fs/selinux/policy
adb logcat -b all -d | audit2allow -p policy
win 平台只能 adb logcat -b all -d >log.txt
然后查看 log.txt
了。
修改 logo
- logo 所在位置是
device/qcom/common/display/logo/
下面放一张 png 文件即可。 - 使用工具把 png 文件生成为
splash.img
也放在 logo 这个目录下。
修改 第二个 logo
第二个 logo 位置在 frameworks/base/core/res/assets/images/
下面的 android-logo-mask.png
获取 android 的 log
adb logcat -c
清除所有 log 记录
adb logcat >log.txt
开启记录,然后运行 apk,操作完成之后,打断 logcat,就可以 log 了。
串口失败,有可能是 tty 权限不对
ls -l dev/tty*
chmod 777 dev/tty*
aosp 中编译模块使用 mmm ./
adb pull, push 文件
adb pull <手机路径> <本机路径> 从手机中拉取信息到本地电脑上
adb push <本机路径> <手机路径> 从本地电脑推送信息到手机上
参考: https://blog.csdn.net/beautyxiang/article/details/81067233
adb push 文件到设备上
adb push SC60_Android9_R05_r029\out\target\product\msm8953_64\system\bin\UartTest system/bin/
有可能会提示权限不够。- 那么就
adb root
,之后再 push。 - 如果还是提示不能创建,那么就
adb remount
,挂载 system 分区为可读写分区。 - 如果还是权限不够,那么就
adb disable-verity
先关闭检测,然后adb reboot
重启机器,然后adb root
,再adb remount
,最后再 push.
aosp 中需要 编译单独的镜像
make snod
用来单独编译 system.imgmake vnod
用来单独编译 vendor.img
参考:
https://stackoverflow.com/questions/27925810/make-snod-didnt-work-with-waring-like-thisno-rule-to-make-target-out-target#:~:text=make%20snod%20is%20used%20to%20build%20the%20system,snod%20to%20include%20those%20changes%20in%20system%20image.
https://blog.csdn.net/gaoguoxin2/article/details/53369918
https://blog.csdn.net/qq_33611327/article/details/104700616
在 system 区域添加系统属性
device/qcom/msm8937_32/system.prop
里面添加ro.pure.version=1.0
- 查看
out/target/product/pure/system/build.prop
里面有我们定义的属性,重新编译并烧录 adb shell
,getprop ro.pure.version
就可以看到前面定义的数值了。
自定义模块,可执行文件
mkdir -p device/qcom/msm8937_32/hello
创建文件夹- c 文件
vim hello.cpp
#include <cstdio>
#include <android/log.h>
#define LOG_TAG "qiushao"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG ,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG ,__VA_ARGS__)
int main() {
printf("hello qiushao\n");
LOGD("hello qiushao");
return 0;
}
- 构建文件
vim Android.bp
cc_binary { //模块类型为可执行文件
name: "hello", //模块名hello
srcs: ["hello.cpp"], //源文件列表
vendor: true, //编译出来放在/vendor目录下(默认是放在/system目录下)
shared_libs: [ //编译依赖的动态库
"liblog",
],
}
mm -j
试试看编译能不能过device/qcom/msm8937_32/msm8937_32.mk
中添加PRODUCT_PACKAGES += hello
- 重新编译系统。
adb root
,adb shell
,hello
就可以看到输出了,which hello
能找到位置。
查看设备树
cd kernel/msm-4.9/arch/arm64/
复制DeviceTreeMap.py
到这个目录下面,并且增加执行权限cd boot/dts/qcom/
../../../DeviceTreeMap.py qcm2150.dts
就可以看到相应的设备树了
添加预编译模块二进制文件
- 在
device/qcom/msm8937_32
目录下创建prebuilt
文件夹 mkdir -p device/qcom/msm8937_32/prebuilt/vendor/bin
创建二进制文件夹- 把
busybox-i686
复制到prebuilt/vendor/bin
文件夹下面。 - 在
device/qcom/msm8937_32
创建product_copy_files.mk
文件
### prebuilt copy files
LOCAL_PREBUILD_DIR := device/qiushao/pure/prebuilt
PRODUCT_COPY_FILES += \
$(LOCAL_PREBUILD_DIR)/vendor/bin/busybox-i686:vendor/bin/busybox
- 在
msm8937_32.mk
里面添加include device/qiushao/pure/product_copy_files.mk
adb root
,adb shell
,busybox
就可以了。
删除原生 app
device/qcom/msm8937_32
下的Android.mk
里面添加
include $(CLEAR_VARS)
LOCAL_MODULE := remove_unused_module
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := FAKE
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_OVERRIDES_PACKAGES += \
Contacts \
Email
include $(BUILD_SYSTEM)/base_rules.mk
$(LOCAL_BUILT_MODULE):
$(hide) echo "Fake: $@"
$(hide) mkdir -p $(dir $@)
$(hide) touch $@
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
这里需要注意的是
msm8937_32.mk
里面添加PRODUCT_PACKAGES += remove_unused_module
- 删除
out/target/product/msm8937_32
下面的system
文件夹,然后重新编译系统,重新烧录,就能看到没有通讯录和邮件。
Contacts
, Email
被指向到 out/target/product/msm8937_32/fake_packages
。因为 LOCAL_MODULE_CLASS := FAKE
所以对应的是 fake_packages
。
img 作用
aboot / emmc_appsboot.mbn is the Primary Bootloader sbl1.mbn is the Secondary Boot Loader modem / NON-HLOS.bin is the phone's cellular radio (3G/LTE) boot.img is the kernel recovery.img is the recovery partition (stock/TWRP etc) system.img is the main ROM logo.bin is just the logo image when starting up the phone cache.img is the cache partition (empty when flashing) userdata / userdata_64G.img is the space where all the user's files and apps are stored (empty when flashing)
参考: https://forums.oneplus.com/threads/anyone-knows-what-each-fastboot-partition-is-for.449048/