自行为一加6编译Postmarket os内核

火影  金牌会员 | 2025-3-15 10:51:28 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 979|帖子 979|积分 2937



在为本身的一加6刷上PostmarketOS后忽然某一天想利用它的照相机功能。原因是想到利用pmos拍照后笔者可以直接利用scp指令来传输手机相片到本身运行着GNU/Linux的电脑上,就感到相对便捷。但是在官方维基百科上看来OP6(一加6)的摄像功能还未进入release[0],由于想看一下目前的摄像功能已经到哪一步了,也可能是由于想折腾些东西了,于是花了些时间研究怎么才气本身编译内核然后丢到OP6中。完成编译后总结就是摄像头不完善,是可以拍照的但有些许问题,但笔者认为这依然是一个很大的成就。在这里也感谢pmos的开发者的奉献,让人们能利用上相对更加free(自由)的软件。由于编译过程感觉比力有趣,遂有了这篇漫笔。
留意

由于本漫笔介绍的是如何编译最新的源码,因此这意味着编译出来的内核是不稳固的,风险需要个人承担。要想安装稳固的PostmarketOS请检察别的教程,大概到官方维基页面检察[7]。
参考资料

对于想本身捣鼓的读者笔者在这里放了自认为有用的链接以供参考:
https://wiki.postmarketos.org/wiki/Compiling_kernels_with_envkernel.sh
https://wiki.postmarketos.org/wiki/Pmbootstrap
https://wiki.postmarketos.org/wiki/OnePlus_6_(oneplus-enchilada)#Camera
https://wiki.postmarketos.org/wiki/SDM845_Mainlining
https://wiki.postmarketos.org/wiki/User:Magdesign#Compile_Kernel
pmbootstrap

正如官方所说的[1],pmboostrap是一个专为PostmarketOS开发利用的命令行应用。笔者利用的是Arch遂用如下指令下载:
  1. sudo pacman -S pmbootstrap
复制代码
然后需要初始化一下:
  1. pmbootstrap init
复制代码
然后要回答一些问题:
问得是work和pmaports的路径,笔者直接Enter选择默认
  1. [09:46:02] Location of the 'work' path. Multiple chroots (native, device arch, device rootfs) will be created in there.
  2. [09:46:02] Work path [/home/user/.local/var/pmbootstrap]:
  3. [09:46:48] Location of the 'pmaports' path, containing package definitions.
  4. [09:46:48] pmaports path [/home/user/.local/var/pmbootstrap/cache_git/pmaports]:
复制代码
官方说除非你的设备在main或community的范围内,否则应该选edge[2]。笔者由于本来就是为了体验最新的东西的,遂选择edge:
  1. [09:46:51] Choose the postmarketOS release channel.
  2. [09:46:51] Available (11):
  3. [09:46:51] * edge: Rolling release / Most devices / Occasional breakage: https://postmarketos.org/edge
  4. [09:46:51] * v24.12: Latest release / Recommended for best stability
  5. [09:46:51] * v24.06: Old release (unsupported)
  6. [09:46:51] Channel [edge]:
复制代码
然后是设备,笔者的是一加遂选oneplus:
  1. [09:52:52] Choose your target device vendor (either an existing one, or a new one for porting).
  2. [09:52:52] Available vendors (94): acer, alcatel, amazon, amediatech, amlogic, apple, ark, arrow, asus, ayn, bananapi, beelink, bq, clockworkpi, cubietech, cutiepi, dongshanpi, epson, essential, fairphone, finepower, fly, fxtec, generic, goclever, google, gp, hisense, htc, huawei, inet, infocus, jolla, khadas, klipad, kobo, lark, leeco, lenovo, lg, librecomputer, linksys, mangopi, medion, meizu, microsoft, mobvoi, motorola, nextbit, nobby, nokia, nvidia, odroid, oneplus, oppo, ouya, pine64, planet, pocketbook, postmarketos, powkiddy, purism, qcom, qemu, qualcomm, radxa, raspberry, realme, samsung, semc, sharp, shift, sipeed, solidrun, sony, sourceparts, surftab, t2m, thundercomm, tokio, tolino, trekstor, valve, vernee, vivo, volla, wexler, wiko, wileyfox, xiaomi, xunlong, yu, zte, zuk
复制代码
代码名由于是一加6遂选enchilada[3]:
  1. [09:54:02] Available codenames (16): bacon, billie2, cheeseburger, dumpling, enchilada, fajita, guacamole, hotdogb, instantnoodlep, kebab, lemonade, lemonadep, oneplus2, oneplus3, oneplus3t, onyx
复制代码
用户名和Wifi后端就直接Enter选择默认了:
  1. [09:56:44] Username [user]:
  2. [09:56:46] Available providers for postmarketos-base-ui-wifi (2):
  3. [09:56:46] * wpa_supplicant: Use wpa_supplicant as the WiFi backend. (default)
  4. [09:56:46] * iwd: Use iwd as the WiFi backend (but may not work with all devices)
  5. [09:56:46] Provider [default]:
复制代码
用户界面的话由于笔者的一加6已经是一个带Phosh的pmos了,由于我们这次只是为了kernel,遂选择console:
  1. ...
  2. [09:58:06] User interface [console]:
复制代码
接下来的问题就直接Enter选择默认应该不会有什么问题的[4]。
看到如下就完成初始化了。
  1. [10:03:11] DONE!
复制代码
用envkernel.sh编译内核

由于大多数电脑的芯片架构跟手机的芯片架构不一样,好比笔者的电脑是amd64而一加6的是aarch64,因此会涉及到交叉编译的内容。而交叉编译简单来说就是在计算机上编译能在另一个架构不同的计算机上运行的软件。而pmos社区必然会遇到这类问题,而正如官方所言,envkernel.sh就是为了让编译更加方便而诞生的。它能在电脑上设置一个Alpine Linux环境然后通过改变环境变量以及利用alias来使make指令利用交叉编译器(cross compiler)[5]。
接下来就先把要用的内核源码clone一下,一加6的是sdm845,所以是这个链接
在命令行跑:
  1. git clone https://gitlab.com/sdm845-mainline/linux.git
复制代码
由于envkernel.sh在pmbootstrap的git里,我们也要clone下来:
  1. git clone https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
复制代码
进入linux源码文件夹,而且source envkernel.sh:
  1. cd linux
  2. source ../pmbootstrap/helpers/envkernel.sh
复制代码
然后就会开始初始化Alpine chroot:
  1. [10:29:34] Update package index for x86_64 (4 file(s))
  2. [10:29:38] (native) Creating chroot
  3. [10:29:42] (native) % apk -q add abuild bash bc binutils bison binutils-aarch64 gcc-aarch64 diffutils elfutils-dev findutils flex g++ gcc gmp-dev linux-headers openssl-dev make mpc1-dev mpfr-dev musl-dev ncurses-dev perl py3-dt-schema sed yamllint yaml-dev xz
  4. [10:30:27] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
  5. [10:30:27] DONE!
  6. [10:30:28] (native) % su pmos -c mkdir /tmp/envkernel; touch /tmp/envkernel/gcc_setup_done
  7. [10:30:28] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
  8. [10:30:28] DONE!
  9. [10:30:28] (native) % chown -R pmos:pmos /mnt/linux/.output
  10. [10:30:28] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
  11. [10:30:28] DONE!
  12. pmbootstrap envkernel.sh activated successfully.
  13. * kernel source:  /home/user/Coding/linux-sdm845
  14. * output folder:  /home/user/Coding/linux-sdm845/.output
  15. * architecture:   arm64 (oneplus-enchilada is aarch64)
  16. * cross compile:  aarch64-alpine-linux-musl-gcc (Alpine 14.2.0)
  17. * aliases: make, kernelroot, pmbootstrap, pmbroot, run-script (see 'type make' etc.)
  18. * run 'deactivate' to revert all env changes
复制代码
接下来我们就会看到prompt前面都会有一个[envkernel] 那就代表我们正在chroot中。在chroot时我们的make指令都会利用交叉编译器。想从chroot中退出直接打deactivate就行。
接下来我们先打deactivate退出来,运行这条指令:
  1. git log --oneline
复制代码
我们会看到:
  1. 299e39119dcc (HEAD -> sdm845/6.14-dev, origin/sdm845/6.14-dev, origin/HEAD) arch: arm64: dts: qcom: sdm845-lg-judyln: update devicetree
  2. 6f43125d5129 arch: arm64: dts: qcom: sdm845-lg-common: enable debug uart
  3. a4a685e21b3a (tag: sdm845-6.14-rc5-r2) arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
  4. 568f590acb40 (tag: sdm845-6.14-rc5-r1) media: qcom: camss: Power pipeline only when streaming
  5. 778bda201c57 fixup media: i2c: Add imx371 image sensor driver
  6. da7241698e70 fixup media: i2c: Add imx376 image sensor driver
  7. 84a296902d70 fixup! arm64: dts: qcom: sdm845-oneplus: camera bringup
  8. ...
复制代码
请留意这一条:
  1. ...
  2. a4a685e21b3a (tag: sdm845-6.14-rc5-r2) arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
  3. ...
复制代码
这个IMX519就是一加6的摄像头传感器,把它关掉的原因可以看到是:
  1. git log a4a685e21b3a
  2. commit a4a685e21b3a97d5b2ee39ac612929c1a868fd20 (tag: sdm845-6.14-rc5-r2)
  3. Author: Joel Selvaraj <foss@joelselvaraj.com>
  4. Date:   Thu Mar 6 16:56:30 2025 -0600
  5.     arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
  6.     Since it doesnt currently work.
  7.     Signed-off-by: Joel Selvaraj <foss@joelselvaraj.com>
复制代码
嗯目前用不了,不外由于笔者好奇用不了到什么程度所以我们用以下指令把这个commit给revert掉:
  1. git revert a4a685e21b3a
复制代码
然后我们再检察一下git log --oneline:
  1. 868f3493560c (HEAD -> sdm845/6.14-dev) Revert "arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor"
  2. 299e39119dcc (origin/sdm845/6.14-dev, origin/HEAD) arch: arm64: dts: qcom: sdm845-lg-judyln: update devicetree
  3. 6f43125d5129 arch: arm64: dts: qcom: sdm845-lg-common: enable debug uart
复制代码
可以看到多了一个revert的commit。然后我们用刚刚的source指令再次进入chroot。利用如下指令来搞定默认设置先:
  1. make defconfig sdm845.config
复制代码
这样子就会用sdm845.config把defconfig给覆写掉,接下来运行make menuconfig然后按/搜索IMX519,我们会看到IMX519被设置为模块了:
  1. Symbol: VIDEO_IMX519 [=m]
  2.   │ Type  : tristate
  3.   │ Defined at drivers/media/i2c/Kconfig:297
  4.   │   Prompt: Sony IMX519 sensor support
  5.   │   Depends on: MEDIA_SUPPORT [=m] && VIDEO_CAMERA_SENSOR [=y] && I2C [=y] && VIDEO_DEV [=m]
  6.   │   Location:
  7.   │     -> Device Drivers
  8.   │       -> Multimedia support (MEDIA_SUPPORT [=m])
  9.   │         -> Media ancillary drivers
  10.   │           -> Camera sensor devices (VIDEO_CAMERA_SENSOR [=y])
  11.   │ (1)         -> Sony IMX519 sensor support (VIDEO_IMX519 [=m])
  12.   │ Selects: MEDIA_CONTROLLER [=y] && VIDEO_V4L2_SUBDEV_API [=y] && V4L2_CCI_I2C [=m] && V4L2_FWNODE [=m]
复制代码
接下来就可以开始编译啦!运行:
  1. make
复制代码
想快一些可以运行 (n是线程数目):
  1. make -jn
复制代码
然后是等待...
编译完成后,用下面的指令打包内核[6]:
  1. pmbootstrap build --envkernel  linux-postmarketos-qcom-sdm845
复制代码
在~/.local/var/pmbootstrap/packages/edge/aarch64/中可以看到打包好的内核,笔者的内核包文件名是:
  1. linux-postmarketos-qcom-sdm845-6.14.0_p20250312121930-r0.apk
复制代码
将一加6用数据线跟电脑连接,确保手机的sshd已经打开:
  1. sudo service sshd start
复制代码
运行下面的指令将我们本身编译的pmos内核包安装上去:
  1. pmbootstrap sideload linux-postmarketos-qcom-sdm845
复制代码
接下来就是确认安装是否乐成,ssh得手机里跑下面的命令:
  1. apk info --who-owns /boot/vmlinuz
复制代码
笔者这边显示的是:
  1. /boot/vmlinuz is owned by linux-postmarketos-qcom-sdm845-6.14.0_p20250312121930-r0
复制代码
也就是刚刚打包好的内核,这就说明乐成了!
成果

由于笔者的目标是观摩一下Postmarket OS对一加6摄像功能最新进展如何,以下是一些照片演示与截屏
前置摄像头:
最明显的问题应该是拍出来是自带紫色的。

后置摄像头:
后置摄像头就自带一种怀旧的颜色了。

总结

运作正常的摄像功能见多了后看到运作不正常的摄像感觉有些有趣。编译过程还是比力有趣的,pmbootstrap资助开发者淘汰了很多交叉编译的麻烦。在这里向pmos的开发者们致敬。
作者:chenw1
链接:https://www.cnblogs.com/chenw1/p/18766766
本文来自博客园,接待转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表