开篇引言
安卓设备的引导需要boot.img镜像,其中含有内核镜像,设备树,boot配置文件,initrd.img根文件系统镜像,开发板因为是开发用途,系统引导基本没有限制,而成品安卓手机往往有各种限制,我们需要通过刷入postmarketOS进行确认手机是否可以启动第三方系统,从中获取引导启动的相关信息以及文件,并仿照postmarketOS的引导镜像创建我们自己的引导镜像。
1,准备postmarketOS编译环境
参照pmbootstrap - postmarketOS 中的 Installation -- From git 准备编译环境
- $ git clone https://git.sr.ht/~postmarketos/pmbootstrap
- $ mkdir -p ~/.local/bin
- $ ln -s "$PWD/pmbootstrap/pmbootstrap.py" ~/.local/bin/pmbootstrap
- $ pmbootstrap --version
- 1.50.1
2,执行初始化
- 1. pmbootstrap init

或者替换使用镜像源,不然会有网络问题,需要替换两个镜像源地址,postmarketOS镜像,和Alpine Linux镜像
使用以下命令设置设置成清华源进行初始化,也可以根据镜像源列表找自己喜欢的设置
- 1. pmbootstrap --mirror-pmOS https://mirrors.tuna.tsinghua.edu.cn/postmarketOS/ --mirror-alpine https://mirrors.tuna.tsinghua.edu.cn/alpine/
postmarketOS镜像源列表:postmarketOS // Official postmarketOS Mirrors
Alpine Linux镜像源列表:Mirror health (alpinelinux.org)
3,编译安卓格式的刷机包
- 1. pmbootstrap install --android-recovery-zip
编译时间会比较长,中间会提示创建进入手机系统的新密码
如果中途出现错误,可以重试几次,仍然不行的话删除整个work目录,重新执行初始化再编译刷机包,最终结果如下

4,导出刷机包
- 1. pmbootstrap export

执行以下命令找到刷机包位置
cd $(dirname $(readlink /tmp/postmarketOS-export/pmos-*.zip))

至此拿到刷机包

查找资料的时候有参考这篇文章的方案二部分,在此贴出
手机运行Docker: 从修改内核到刷入原生Linux | yzddMr6's Blog
5,刷入手机验证并获取芯片控制器名称
音量上+电源开机进入twrp(twrp的安装是搞机必备,网上教程很多,在此不再重复)
小米(Mi) 6小米(Mi) 6 手机刷 TWRP 方法,刷三方Recovery方法(解决卡米问题)刷机解锁 (onfix.cn)
点击安装

点击刷机包

确认刷入

刷机会出现错误,不用管

刷完重启,等待一段时间直到显示welcome信息

输入用户名:user,密码:自己之前设置的,进入系统

至此确认手机正常运行Linux系统,显示,触摸等正常工作。
6,解包获取移植需要的资料
解包获取的资料:
bootimg.cfg:boot分区配置信息,内核启动参数
config:默认内核编译配置,后续适配内核在此基础进行变更
firmware:启动加载必须的驱动固件文件
右键解压缩pmos-xiaomi-sagit.zip得到pmos-xiaomi-sagit

同样使用右键解压缩rootfs.tar.gz得到rootfs,在rootfs/boot文件夹拿到boot.img和内核编译的config配置

安装安卓boot打包解包工具:
- sudo apt update
- sudo apt install abootimg
把boot.img复制到任意的文件夹,然后使用以下命令解包:
- 1. abootimg -x boot.img
得到boot分区配置bootimg.cfg

查看initrd.img文件格式为gzip压缩文件

使用gzip解压,发现解压失败,原因为后缀名不支持,我们使用mv命令复制initrd.img为initrd.img.gz,然后使用解压命令就可以成功解压了,解压后原来的initrd.img会被解压出的文件替换掉,这时initrd.img的格式为cpio镜像文件

使用cpio解压initrd.img镜像
- 1. cpio -idmv < initrd.img
得到我们需要的boot阶段所必须的固件firmware,后面要编译进OH的ramdisk镜像中

7,获取正常启动的log
参考上面手机运行docker那篇文章,用usb连接电脑,设置好驱动
打开命令提示符,使用ssh连接Linux,ip是固定的172.16.42.1
- 1. ssh user@172.16.42.1

输入dmesg打印输出内核log,这个是正常的内核启动log,复制下来保存好以便移植时启动出错或者驱动有问题时方便进行对照
- 1. dmesg

8,获取设备名,分区信息
连接Linux,输入以下命令获取信息
获取USB控制器名称,后面移植hdc连接程序会用到
- ls /sys/class/udc/
- a800000.usb
获取存储控制器名称,后面配置分区会用到
- ls /sys/devices/platform/soc
暂时判断1da4000.ufshc为存储控制器名称

重启,进入twrp,输入以下命令进入recovery的shell
- 1. adb shell

输入以下命令可以交叉确认1da4000.ufshc为存储控制器名称
- 1. ls dev/block/platform/soc/

获取分区信息
- 1. ls -al /dev/block/platform/soc/1da4000.ufshc/by-name/



、
手机上勾选挂载vendor分区

- 1. df -h

、
确认vendor分区对应到sde42 -> cust
system分区因为安装pmOS的缘故无法挂载,但是可以确定分区映射关系是,
/dev/block/platform/soc/1da4000.ufshc/by-name/cust ---> sde42 ---> vendor
/dev/block/platform/soc/1da4000.ufshc/by-name/system ---> sde43 ---> system
/dev/block/platform/soc/1da4000.ufshc/by-name/userdata --->sda17 ---> data
至此移植需要提前准备的信息基本讲完,下篇开始讲解OpenHarmony编译的部分,敬请期待
-
开发板
+关注
关注
26文章
6507浏览量
121361 -
OpenHarmony
+关注
关注
33文章
3984浏览量
21458
发布评论请先 登录
实战 | 睿擎平台 zlib: 嵌入式数据压缩方案,从移植到应用一文打通
实战 | 睿擎平台SQLite:嵌入式设备上的数据持久化方案,从移植到应用一文打通
BLDC 驱动板 FOC 矢量控制算法移植与参数调试(工程实用版)
直播预告 | 开源软件包移植适配专题(第1期):SQLite 从入门到精通
RT-Thread 中设备树的适配方法 | 技术集结
基于极海APM32F4的Azure RTOS ThreadX移植过程分享
ElfBoard技术贴|如何在【RK3588】ELF 2开发板移植LVGL8.2
请问STM32如何移植Audio框架?
恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植
如何移植 RT-Thread Nano 并创建 2 个线程?
RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱动适配 | 技术集结
高效开发 | 瑞迅基于瑞芯微系列主板QT移植部署(上)
移植 ZephyrRTOS 到思澈 SF32LB58 过程笔记 一
机智云配网教程第三期:单片机代码移植实战
OpenHarmony富设备移植指南(2)从postmarketOS获取移植资源
评论