在为自己的一加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遂用如下指令下载:

sudo pacman -S pmbootstrap

然后需要初始化一下:

pmbootstrap init

然后要回答一些问题:

问得是workpmaports的路径,笔者直接Enter选择默认

[09:46:02] Location of the 'work' path. Multiple chroots (native, device arch, device rootfs) will be created in there.
[09:46:02] Work path [/home/user/.local/var/pmbootstrap]:
[09:46:48] Location of the 'pmaports' path, containing package definitions.
[09:46:48] pmaports path [/home/user/.local/var/pmbootstrap/cache_git/pmaports]:

官方说除非你的设备在maincommunity的范围内,否则应该选edge[2]。笔者因为本来就是为了体验最新的东西的,遂选择edge:

[09:46:51] Choose the postmarketOS release channel.
[09:46:51] Available (11):
[09:46:51] * edge: Rolling release / Most devices / Occasional breakage: https://postmarketos.org/edge
[09:46:51] * v24.12: Latest release / Recommended for best stability
[09:46:51] * v24.06: Old release (unsupported)
[09:46:51] Channel [edge]:

然后是设备,笔者的是一加遂选oneplus

[09:52:52] Choose your target device vendor (either an existing one, or a new one for porting).
[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]:

[09:54:02] Available codenames (16): bacon, billie2, cheeseburger, dumpling, enchilada, fajita, guacamole, hotdogb, instantnoodlep, kebab, lemonade, lemonadep, oneplus2, oneplus3, oneplus3t, onyx

用户名和Wifi后端就直接Enter选择默认了:

[09:56:44] Username [user]:
[09:56:46] Available providers for postmarketos-base-ui-wifi (2):
[09:56:46] * wpa_supplicant: Use wpa_supplicant as the WiFi backend. (default)
[09:56:46] * iwd: Use iwd as the WiFi backend (but may not work with all devices)
[09:56:46] Provider [default]:

用户界面的话因为笔者的一加6已经是一个带Phosh的pmos了,因为我们这次只是为了kernel,遂选择console

...
[09:58:06] User interface [console]:

接下来的问题就直接Enter选择默认应该不会有什么问题的[4]。

看到如下就完成初始化了。

[10:03:11] DONE!

用envkernel.sh编译内核

因为大多数电脑的芯片架构跟手机的芯片架构不一样,比如笔者的电脑是amd64而一加6的是aarch64,因此会涉及到交叉编译的内容。而交叉编译简单来说就是在计算机上编译能在另一个架构不同的计算机上运行的软件。而pmos社区必然会遇到这类问题,而正如官方所言,envkernel.sh就是为了让编译更加方便而诞生的。它能在电脑上设置一个Alpine Linux环境然后通过改变环境变量以及利用alias来使make指令使用交叉编译器(cross compiler)[5]。

接下来就先把要用的内核源码clone一下,一加6的是sdm845,所以是这个链接

在命令行跑:

git clone https://gitlab.com/sdm845-mainline/linux.git

因为envkernel.sh在pmbootstrap的git里,我们也要clone下来:

git clone https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git

进入linux源码文件夹,并且source envkernel.sh:

cd linux
source ../pmbootstrap/helpers/envkernel.sh

然后就会开始初始化Alpine chroot:

[10:29:34] Update package index for x86_64 (4 file(s))
[10:29:38] (native) Creating chroot
[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
[10:30:27] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[10:30:27] DONE!
[10:30:28] (native) % su pmos -c mkdir /tmp/envkernel; touch /tmp/envkernel/gcc_setup_done
[10:30:28] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[10:30:28] DONE!
[10:30:28] (native) % chown -R pmos:pmos /mnt/linux/.output
[10:30:28] NOTE: chroot is still active (use 'pmbootstrap shutdown' as necessary)
[10:30:28] DONE!
pmbootstrap envkernel.sh activated successfully.
* kernel source: /home/user/Coding/linux-sdm845
* output folder: /home/user/Coding/linux-sdm845/.output
* architecture: arm64 (oneplus-enchilada is aarch64)
* cross compile: aarch64-alpine-linux-musl-gcc (Alpine 14.2.0)
* aliases: make, kernelroot, pmbootstrap, pmbroot, run-script (see 'type make' etc.)
* run 'deactivate' to revert all env changes

接下来我们就会看到prompt前面都会有一个[envkernel] 那就代表我们正在chroot中。在chroot时我们的make指令都会使用交叉编译器。想从chroot中退出直接打deactivate就行。

接下来我们先打deactivate退出来,运行这条指令:

git log --oneline

我们会看到:

299e39119dcc (HEAD -> sdm845/6.14-dev, origin/sdm845/6.14-dev, origin/HEAD) arch: arm64: dts: qcom: sdm845-lg-judyln: update devicetree
6f43125d5129 arch: arm64: dts: qcom: sdm845-lg-common: enable debug uart
a4a685e21b3a (tag: sdm845-6.14-rc5-r2) arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
568f590acb40 (tag: sdm845-6.14-rc5-r1) media: qcom: camss: Power pipeline only when streaming
778bda201c57 fixup media: i2c: Add imx371 image sensor driver
da7241698e70 fixup media: i2c: Add imx376 image sensor driver
84a296902d70 fixup! arm64: dts: qcom: sdm845-oneplus: camera bringup
...

请注意这一条:

...
a4a685e21b3a (tag: sdm845-6.14-rc5-r2) arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor
...

这个IMX519就是一加6的摄像头传感器,把它关掉的原因可以看到是:

git log a4a685e21b3a

commit a4a685e21b3a97d5b2ee39ac612929c1a868fd20 (tag: sdm845-6.14-rc5-r2)
Author: Joel Selvaraj <foss@joelselvaraj.com>
Date: Thu Mar 6 16:56:30 2025 -0600 arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor Since it doesnt currently work. Signed-off-by: Joel Selvaraj <foss@joelselvaraj.com>

嗯目前用不了,不过因为笔者好奇用不了到什么程度所以我们用以下指令把这个commitrevert掉:

git revert a4a685e21b3a

然后我们再查看一下git log --oneline:

868f3493560c (HEAD -> sdm845/6.14-dev) Revert "arm64: dts: qcom: sdm845-oneplus-common: disable the imx519 sensor"
299e39119dcc (origin/sdm845/6.14-dev, origin/HEAD) arch: arm64: dts: qcom: sdm845-lg-judyln: update devicetree
6f43125d5129 arch: arm64: dts: qcom: sdm845-lg-common: enable debug uart

可以看到多了一个revertcommit。然后我们用刚刚的source指令再次进入chroot。使用如下指令来搞定默认配置先:

make defconfig sdm845.config

这样子就会用sdm845.configdefconfig给覆写掉,接下来运行make menuconfig然后按/搜索IMX519,我们会看到IMX519被配置为模块了:

Symbol: VIDEO_IMX519 [=m]
│ Type : tristate
│ Defined at drivers/media/i2c/Kconfig:297
│ Prompt: Sony IMX519 sensor support
│ Depends on: MEDIA_SUPPORT [=m] && VIDEO_CAMERA_SENSOR [=y] && I2C [=y] && VIDEO_DEV [=m]
│ Location:
│ -> Device Drivers
│ -> Multimedia support (MEDIA_SUPPORT [=m])
│ -> Media ancillary drivers
│ -> Camera sensor devices (VIDEO_CAMERA_SENSOR [=y])
│ (1) -> Sony IMX519 sensor support (VIDEO_IMX519 [=m])
│ Selects: MEDIA_CONTROLLER [=y] && VIDEO_V4L2_SUBDEV_API [=y] && V4L2_CCI_I2C [=m] && V4L2_FWNODE [=m]

接下来就可以开始编译啦!运行:

make

想快一些可以运行 (n是线程数量):

make -jn

然后是等待...

编译完成后,用下面的指令打包内核[6]:

pmbootstrap build --envkernel  linux-postmarketos-qcom-sdm845

~/.local/var/pmbootstrap/packages/edge/aarch64/中可以看到打包好的内核,笔者的内核包文件名是:

linux-postmarketos-qcom-sdm845-6.14.0_p20250312121930-r0.apk

将一加6用数据线跟电脑连接,确保手机的sshd已经打开:

sudo service sshd start

运行下面的指令将我们自己编译的pmos内核包安装上去:

pmbootstrap sideload linux-postmarketos-qcom-sdm845

接下来就是确认安装是否成功,ssh到手机里跑下面的命令:

apk info --who-owns /boot/vmlinuz

笔者这边显示的是:

/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

本文来自博客园,欢迎转载,但请注明原文链接,并保留此段声明,否则保留追究法律责任的权利。

自行为一加6编译Postmarket os内核的更多相关文章

  1. 从cpu加电到加载OS内核的详细过程(清华大学ucore-lab1总结一)

    结合最近学习清华的OS课,先用“人话”来高度抽象的描述一下我自己的理解.CPU在系统加电也就是我们按下电源开关后,开始初始化他的寄存器,主要是cs和eip(本文基于x86架构),然后在ROM中找到一个 ...

  2. 编译安装linux内核步骤

    编译安装linux内核步骤: 一.获取内核源码 源码网址:www.kernel.org 二.解压内核源码 首先以root帐号登录,然后进入/usr/src子目录.如果用户在安装Linux时,安装了内核 ...

  3. Linux课程实践二:编译模块实现内核数据操控

    一.内核模块原理 1. Linux内核增加功能 Linux内核整体结构很庞大,包含了很多的组件,现在有两种方法将需要的功能包含进内核当中: - 静态加载:将所有的功能都编译进Linux内核. - 动态 ...

  4. 编译Android4.3内核源代码

     --------------------------------------------------------------------------------------------------- ...

  5. 将MPLS编译进linux内核中

    系统环境:linux kernel 2.6.35.(此环境是上一篇文章中将ubuntu内核替换后的环境) 编译过程如下: 1)首先需要下载patch文件:linux-kernel-v2.6.35-mp ...

  6. centos源码编译安装新版本内核

      在工作中,很多时候由于需要使用新的技术方案,需要较新版本的内核来支持新的功能,而centos系统自带的内核版本普遍都比较旧,因此我们需要对系统的内核进行升级,安装新版的内核.本文以centos7系 ...

  7. 【转】如何下载并编译Android4.0内核源码goldfish(图文)

    原文网址:http://blog.csdn.net/flydream0/article/details/7070392 关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程 ...

  8. linux内核系列(一)编译安装Linux内核 2.6.18

    1.配置环境 操作系统:CentOS 5.2 下载linux-2.6.18版本的内核,网址:http://www.kernel.org 说明:该编译文档适合2.6.18以上的Linux内核版本,只需所 ...

  9. 【转】6.4.6 将驱动编译进Linux内核进行测试

    原文网址:http://www.apkbus.com/android-98520-1-1.html 前面几节都是将Linux驱动编译成模块,然后动态装载进行测试.动态装载驱动模块不会随着Android ...

  10. VirtualBox虚拟机安装RedHat7.3编译Linux0.01内核

    引子 由于需要编译linux0.01内核,而目前的linux版本太高需要降低gcc版本等等,需要做不少调整非常不方便. 所以,直接安装RedHat7.3,这样就好编译linux0.01的内核了. 但是 ...

随机推荐

  1. macOS 终端可用的 Hex 查看与编辑器

    在 Windows 下我们可以使用 WinHex,而在 macOS 平台上,有什么不错的十六进制查看器.编辑器呢? 准备首先,我们创建一个文件用于测试. echo 'welcome' > fil ...

  2. Qt音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)

    一.前言 本地摄像头推流和本地桌面推流类似,无非就是采集的设备源头换成了本地摄像头设备而不是桌面,其他代码完全一样.采集本地摄像头实时视频要注意的是如果设置分辨率和帧率,一定要是设备本身就支持的,如果 ...

  3. Qt可视化大屏电子看板系统全平台效果图

  4. Qt音视频开发49-通用截图截屏

    一.前言 采用了回调方式的视频通道,截图只需要对解析好的QImage对象直接保存即可,而对于句柄的形式,需要调用不同的处理策略,比如vlc需要用它自己提供的api接口函数libvlc_video_ta ...

  5. Qt音视频开发8-ffmpeg保存裸流

    一.前言 最开始做的ffmpeg保存视频文件,就是直接保存的裸流数据,裸流数据一般是H264格式的数据,这种数据文件可以用部分播放器播放,由于不是标准的格式,很多播放器其实不支持的,需要安装对应的解码 ...

  6. 多语言越狱很棒!😊MULTILINGUAL JAILBREAK CHALLENGES IN🧜‍♀️LARGE LANGUAGE MODELS

    写这篇的时候第一次认识到了附录内容的重要性(bushi只是这篇读了全部的附录),它可以让你明确文章全部的实验,并且其中包含很多辅助你对正文理解的表格 禁止盗用,侵权必究!!!欢迎大家积极举报

  7. [转]OpenLayers基于Vue项目的搭建

    主要内容上次介绍了什么是OpenLayers以及其他的可以GIS工具,这次说说如何基于Vue搭建OpenLayers的项目,并且实现地图的加载. 一.vue项目搭建1.全局安装vue-cil npm ...

  8. golang两个协程交替打印出1-100

    基于channel实现的,两个协程交替打印出1-100 package main import ( "fmt" "sync" ) var ( toOdd = m ...

  9. [.NET] 单位转换实践:深入解析 Units.NET

    单位转换实践:深入解析 Units.NET 摘要 在现代软件开发中,准确处理不同单位的转换是一个常见而复杂的需求.无论是处理温度.长度.重量还是其他物理量,都需要可靠的单位转换机制.本文将深入介绍 U ...

  10. 把.netcore console 安装到Windows 系统服务。

    用个工具:NSSM 下载:最新的那个pre版本 http://www.nssm.cc/download 测试.netcore 的一个控制台程序(Console),仅仅用来定时写入一些日志, 代码如下: ...