Ketika meng-compile kernel sendiri dari source resmi setelah capek kutak-katik sana sini ternyata setelah selesai dan di test untuk boot ternyata tidak mau masuk, malahan tersangkut di logo bootanimation. Usut punya usut, ternyata Source code kernel dari xiaomi tidak lengkap, namun hal ini juga bisa disebabkan karena source yang kita gunakan berbeda dengan ROM firmware yang sedang digunakan.

Kalau ditanya kenapa repot-repot membuat kernel sendiri? masing masing orang memiliki tujuan yang berbeda, tapi disini tujuannya untuk menambahkan fitur getar / rumble / vibration / force feedback untuk stik PS 4 (DS4) dan stik PS2 + Converter + OTG, mengingat tidak ada vendor handphone yang perduli soal ini, begitupun juga di Android TV. Fitur ini sangat dibutuhkan untuk memainkan game di Emulator seperti Dolphin (WII/Gamecube), duckstation (PSX), dan AetherSX2 (PS2) untuk menambahkan sensasi bermain.

Berikut ini adalah pengalaman meng-compile kernel untuk POCO X3 Pro / vayu dari Source code yang disediakan Xiaomi di github. *Diperlukan Unlock Bootloader untuk melakukan flashing kernel boot.img

Jika mengikuti cara compile di wiki [Xiaomi Github] nya, langkahnya seperti berikut: 

  • Di ubuntu install dependency lewat terminal:
        sudo apt-get install git ccache automake flex lzop bison \
        gperf build-essential zip curl zlib1g-dev zlib1g-dev:i386 \
        g++-multilib python-networkx libxml2-utils bzip2 libbz2-dev \
        libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush \
        schedtool dpkg-dev liblz4-tool make optipng maven libssl-dev \
        pwgen libswitch-perl policycoreutils minicom libxml-sax-base-perl \
        libxml-simple-perl bc libc6-dev-i386 lib32ncurses5-dev \
        x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev xsltproc unzip
        
  • Clone kernel untuk vayu
  • Clone toolchain gcc
  • Download SDCLANG LLVM
  • Download DTC
Baru sampai sini masalah sudah muncul, diantaranya :
  • Toolchain untuk gcc 4.9 sudah dihapus oleh google sejak januari 2020 [GCC 4.9 DEPRECATION] jika di cloning kita hanya akan mendapatkan file "OWNERS".
  • Qualcomm LLVM clang link nya membutuhkan akses / access restricted / alias tidak bisa di download.
  • DTC tidak diberikan penjelasan didapatkan darimana.
Solusinya tentu mencari link alternatif untuk file yang dibutuhkan. Disini saya menggunakan Ubuntu 20.04, di windows bisa menggunakan cygwin atau di Windows 10 dengan Windows Subsystem for Linux bisa dicari gi google.

Sebelum melangkah lebih jauh, kita cek dulu boot.img dari firmware yang kita gunakan saat ini. Disini saya menggunakan Firmware Vayu Indonesia MIUI V13.0.1.0.SJUIDXM, temukan folder yang ada file boot.img buka terminal lalu ketik strings boot.img | grep 'Linux version' hasilnya akan keluar seperti ini
$ strings boot.img | grep 'Linux version'
Linux version 4.14.180-perf-g5d6f377 (builder@c4-miui-ota-bd133.bj) (clang version 10.0.6 for Android NDK, GNU ld (binutils-2.27-bd24d23f) 2.27.0.20170315) #1 SMP PREEMPT Mon Mar 14 23:33:05 WIB 2022
Dari info tersebut terlihat versi kernel 4.14, clang 10.0.6 dari Qualcomm LLVM, binutils-2.27-bd24d23f.

MEMBUAT TOOLCHAIN

- Mencari Snapdragon LLVM Compiler
Untuk mendapatkan clang dari Qualcomm, kita diharuskan menggunakan QPM (Qualcomm Package Manager) dan harus registrasi dulu serta menunggu akun kita disetujui, namum kita bisa cari di Github barangkali ada yang post, dan ternyata ada versi 10.0.9 milik xiangfeidexiaohuo - Snapdragon LLVM

- Mencari GCC 4.9
Disini kita cari gcc yg sudah di jadi, alias prebuilt. Untuk gcc dengan binutils yang versinya sama (bd24d23f) kita coba lihat di situs source code milik google untuk Android phone yang dikeluarkan di aarch64-linux-android-4.9 lalu pilih salah satu link branch dan lihat isi file repo.prop cari yg versi binutils nya 7 karakter didepannya sama, dan ketemu di branch Pixel 6 msm-coral-4.14-android12L dengan properti binutils bd24d23f081feb4eb1438c56ace4ae91778ae6be

-Mencari file DTC
Masih di android.googlesource kita bisa menemukan dtc di android.googlesource.com/platform/external/dtc sementara versinya bisa dilihat didalam file version_non_gen.h dan dikarenakan versi dtc di vayu_kernel/script/dtc/version_gen.h menunjukkan DTC 1.4.4-g756ffc4f maka dari itu saya cari yang versinya kurang lebih sama atau diatasnya, atas dasar itu kemudian saya ambil dari branch android11-release lalu di compile dengan perintah make dtc di Terminal. Namun ternyata ada error tidak ditemukannya file dtc-parser.h. Setelah meng-eksekusi perintah tadi, akan ada file yang tergenerate nama filenya dtc-parser.tab.h padahal kita perlu file dengan tama tanpa kata 'tab', jadi kita hanya perlu merubah nama dari file tersebut menjadi dtc-parser.h lalu ulangi meng-eksekusi perintah yang tadi. Setelah selesai maka akan ada file dtc, nah file ini yang akan kita gunakan nantinya.

DTC atau Device Tree Compiler ini digunakan untuk memproses Device Tree Structure / dts / dtsi (include), jika file DTC tidak sesuai, bisa jadi ada beberapa fungsi yang tidak akan berjalan di android, misalnya touchscreen, atau malah error saat melakukan proses build kernel. Linux sendiri punya dtc tapi yg kita gunakan adalah dtc yg untuk android.

- Mendownload Kernel Source
Cara mendownload di Github bisa dengan cara melaui git command lewat terminal atau bisa langsung download Zip. Kalau sekedar cuma ingin mengkompile dan tidak mengupload atau membutuhkan git, disarankan download dengan metode zip karena lebih hemat kuota.
-Dengan Git Command:
git clone --depth=1 https://github.com/MiCode/Xiaomi_Kernel_OpenSource.git -b target-tree save-folder
target-tree vayu = vayu-r-oss
save-folder = lokasi dan nama folder untuk di simpan di pc.

-Dengan cara download Zip:
Di github temukan tombol Code kemudian pilih Download Zip.

Poco X3 Pro kernel / Vayu kernel bisa di ambil dari MiCode Github
Untuk handphone lain keluaran Xiaomi bisa juga di download di Xiaomi_Kernel_OpenSource jika tersedia.

Setelah semua file siap, pindahkan semua kedalam satu folder supaya rapih. Struktur folder yang saya buat terlihat seperti diagram dibawah ini:
$(home)
	|- toolchain
	|	|- clang
	|	|	|- LLVM-10.0.9
	|	|- dtc
	|	|	|- dtc-1.4.4
	|	| 		|- prebuilt
	|	|- gcc
	|		|- aarch64-linux-android-4.9
	|- vayu_kernel

Untuk memastikan struktur sudah benar atau tidak salah extract, kita cek lokasi file:
*${HOME} = /home/nama_user_login
clang++ : ${HOME}/toolchain/clang/LLVM-10.0.9/bin/clang++
binutils / gcc : ${HOME}/toolchain/gcc/aarch64-linux-android-4.9/bin/aarch64-linux-android-gcc
dtc : ${HOME}/toolchain/dtc/dtc-1.4.4/prebuilt/dtc
Vayu kernel Source : ${HOME}/vayu_kernel
Vayu Kernel Makefile : ${HOME}/vayu_kernel/Makefile

Selanjutnya kita buat Script .sh dengan nama file build.sh supaya memudahkan proses, simpan di tempat Source kernel vayu satu lokasi dengan Makefilenya:
#!/bin/bash

Start=$(date +"%s")
export ARCH=arm64
export SUBARCH=arm64
export DTC_EXT=${HOME}/toolchain/dtc/dtc-1.4.4/prebuilt/dtc
export KBUILD_BUILD_USER="blakbin.blogspot.com"
export KBUILD_BUILD_HOST="Project-Rumble"
make O=${HOME}/vayux/out ARCH=arm64 vayu_rumble_defconfig

make -j$(nproc --all)  O=${HOME}/vayux/out \
PATH="${HOME}/toolchain/clang/LLVM-10.0.9/bin:${HOME}/toolchain/gcc/aarch64-linux-android-4.9//bin:${PATH}" \
                                ARCH=arm64 \
                                REAL_CC=clang \
                                CROSS_COMPILE=aarch64-linux-android- \
                                CLANG_TRIPLE=aarch64-linux-gnu- | tee ${HOME}/vayux/out/kernel.log
End=$(date +"%s")
Diff=$(($End - $Start))
echo -e "$gre << Build completed in $(($Diff / 60)) minutes and $(($Diff % 60)) seconds >> \n $white"

Nilai dari KBUILD_BUILD_USER dan KBUILD_BUILD_HOST bisa diganti sesuai keinginan. Jika nilai dari pengecekan 'Linux version' tadi (builder@c4-miui-ota-bd133.bj) maka sama dengan (KBUILD_BUILD_USER@KBUILD_BUILD_HOST).
Sampai sini kita bisa langsung mengesekusi file build.sh dengan mengetikan perintah ./build.sh di terminal dan ternyata compiler ada protes warning yg perlu diatasi lalu proses akan stop alias berhenti, hal ini wajar karena berbeda compiler dan makro makefile. Warning mennjukan error pada file gsi.c, gsi.h di lokasi drivers/platform/msm/gsi dan string.c di filder lib. Setelah melakukan sedikit modifikasi pada file yang bermasalah tersebut dan meng-eksekusi kembali script build, setelah selesai maka outputnya akan ada di folder ${HOME}/vayux/out dan kernel akan berada di ${HOME}/vayux/out/arch/arm64/boot dengan file bernam Image sebagai kernelnya. Disini jika kita mengunpack boot.img dan mengganti kernelnya dengan yang baru kita buat, jika nama dari versi kernel sama dan konfigurasi sama maka Android akan booting dan semua module / driver file dengan extensi .ko di dalam firmware /vendor/lib/modules akan ter load semua, tapi dikarenakan Sourcenya tidak lengkap yang mengharuskan kita merubah config, maka ini tidak akan berjalan lancar, dikarenakan akan berbeda layout meskiput version magic sama. Jadi perjuangan membuat kernel masih terus berlanjut.

Di dalam proses ini juga saya melakukan modifikasi Makefile untuk otomatis mendapatkan file dtbo.img, meskipun di vayu kernel official ini opsional. File yang dimodifikasi berada di 'arch/arm64/Makefile', 'arch/arm64/boot/Makefile, scripts/Makefile.lib' dan menmbahkan script mkdtboimg.py di scripts/dtc/libfdt, lalu merubah file arch/arm64/boot/dts/qcom/Makefile hanya untuk memproses file dts yang dibutuhkan untuk x3pro saja. Proses ini melakukan pengepack-an file di dengan extensi *.dtbo di folder 'vayux/out/arch/arm64/boot/dts/qcom', meskipun pengepakan juga bisa dengan cara manual dengan bantuan script libufdt yang mana X3pro hanya butuh file vayu-sm8150-overlay.dtbo untuk kemudian di flash menggantikan partisi dtbo.img yang lama.

PROSES PENCARIAN DRIVER.

Didalam config file vayu_user_defconfig ada beberapa konfig dengan nilai =m ini artinya setelah selesai di compile nanti akan ada file .ko yang nantinya akan dimasukan kedalam firmware. Di vayu file ini dimasukan ke firmware di folder /vendor/lib/modules.

Di source kernel ini kita masih membutuhkan Driver untuk Audio untuk suara, dan WLAN untuk wifi / hotspot dan RMNET untuk data. Xiaomi juga menyediakan file ini di githubnya tapi dikarenakan dalam pelaksanaan build nya Xiaomi meng compile driver sebagai Module [=m] yang dimana file ini tidak di sertakan ke firmware maka tidak akan di load saat booting, hasilnya akan gagal booting.

Kita akan mengcompile Driver ini sebagai static / builtin (=y di defconfig) jadi langsung di load saat booting, tujuannya juga agar kita tidak perlu meng-utak atik isi dari firmware. Maka dari itu diperlukan beberapa modifikasi pada source driver dan config file.

Di kernel Vayu Poco X3 Pro yang dari Xiaomi ini, diketahui bahwa android tidak akan booting ketika driver/codec suara tidak terpasang, ini ditandai ketika proses booting tidak ada suara keluar saat boot animation di mainkan.

- Wifi / WLAN Driver
Driver Wlan bisa di yang disediakan Xiaomi bisa ditemukan di vendor_qcom_opensource_wlan tapi setelah di tes WIFI toggle dan Hotspotnya tidak mau nyala. Ternyata jika di config bukan sebagai module , fungsi dari hdd_driver_load() di dalam file file qcacld-3.0/core/hdd/src/wlan_hdd_main.c tidak tereksekusi, jadi saya merubah kodenya sedikit.

- Data / USB Tether Driver
Driver ini dengan nama Rmnet diambil dari vendor_qcom_opensource_data-kernel tidak ada masalah.

- Audio Driver
Di vayu, jika tidak ada driver audio, device tidak mau masuk ke homescreen alias hanya mentok di bootanimation yg tanpa suara, tapi adb shell masih berfungsi, maka dari itu driver ini sangat diperlukan.

Driver audio yang disediakan Xiaomi vendor_qcom_opensource_audio-kernel tidak ada masalah jika di compile dalam bentuk module, masalahnya source itu digabungkan untuk beberapa tipe HP Xiaomi. Vayu hanya butuh codec tas256x tapi disitu juga terdapat codec lain yang tidak dibutuhkan diantaranya TAS2557 , CS35L41, TFA9874, MSM_CSPL jika di confignya sm8150auto.conf dan sm8150auto.conf.h di disable pun (=n , define 0) ada masalah suaranya putus-putus. Jadi diperlukan penyesuaian untuk membuat driver audio sebagai builtin mode, daripada melihat ulang source codenya dan merubah Source yang dari Xiaomi lebih baik mencari source lain yang hanya ada codec untuk vayu dengan alasan meringankan beban, disini saya ambil dari LineageOS18 untuk Kernel Nabu, dan melakukan sedikit modifikasi. Sekedar info Poco X3 Pro ini spek nya mirip-mirip dengan Xiaomi Nabu (Mi Pad 5).

Darimana kita tau kalau driver di vayu itu tas256x ? Proses pengecekan butuh akses root, gampangnya lewat aplikasi pihak ke 3 "Device Info HW" atau jika tidak punya akses root bisa lihat di database di situsnya deviceinfohw.ru lalu lihat pada bagian AUDIO.

File Audio dan Data driver ini kemudian disatukan kedalam satu folder dengan nama techpack, hasilnya bisa lihat di blakbin - vayu_audio_rmnet_driver

INTEGRASI DRIVER

File dari WLAN driver ada tiga main folder: fw_main, qcacld-3.0, dan qca-wifi-host-cmn 3 folder ini pindahkan ke dapam kernel vayu di folder /vayu_kernel/drivers/staging. Masih didalam folder staging, lihat file Makefile dan buka dengan text editor, lalu tambahkan di baris paling ahir code dibawah ini
obj-$(CONFIG_QCA_CLD_WLAN)	+= qcacld-3.0/

File driver Audio dan RMNET yang telah disatukan ke folder techpack kemuadian pindahkan untuk menimpa folder techpack didalam vayu_kernel, lalu buka folder /drivers di vayu_kernel dan edit file Kconfig lalu tambahkan baris di ahir dengan code dibawah ini dan jagan lupa di save:
source "techpack/audio/Kconfig"
source "techpack/data/drivers/Kconfig"

CONFIGURASI

Di tahap ini kita akan merubah file vayu_user_defconfig yang dimana salinanya saya buat dan beri nama vayu_rumble_defconfig yang dimana nantinya config dari file ini yang akan kita gunakan. Buka dengan text editor, untuk melakukan beberapa penyesuaian. Yang perlu diperhatikan adalah nilai dari config berikut:
CONFIG_BUILD_ARM64_DT_OVERLAY=y
Nilai dari config tersebut harus =y karena kita butuh file sm8150-v2.dtb untuk menemani kernel.
CONFIG_QCA_CLD_WLAN=y
CONFIG_RMNET_PERF=y
Tambahkan config diatas kebaris paling bawah dari vayu_rumble_defconfig. ini untuk driver Wifi dan data nya.
Tambahkan juga config dibawah ini sebagai driver audionya
CONFIG_SND_SOC_TAS256X=y
CONFIG_TAS256X_CODEC=y
CONFIG_TAS256X_REGMAP=y
CONFIG_TAS25XX_ALGO=y
karena tujuan saya hanya menambah fitur supaya stik DS4 yang saya punya bisa terdeteksi getarnya di emulator ataupun game yang support rumble, maka tambahkan config
CONFIG_SONY_FF=y
lalu saya juga punya stik PS2 KW yang terhubung melalui converter PS2 ke USB + OTG, kalau di pc terdeteksi dengan nama Twin USB Gamepad. Jadi di config tambahkan nilai:
CONFIG_HID_PANTHERLORD=y
CONFIG_PANTHERLORD_FF=y
Kebanyakan vendor Android hanya enable config Gamepadnya saja tetapi tidak di enable untuk vibrationnya, Config vibrasi yg digunakan adalah CONFIG_INPUT_FF_MEMLESS (Force Feedback Memoryless) ff-memles.ko file akan terbuat jika dengan mode module =m, misal DS4 CONFIG_HID_SONY=y hanya di enable tapi tidak di enable Force Feedback nya.

PROSES BUILD KERNEL

Didalam folder vayu_kernel di area yang kosong, klik kanan lalu 'open in terminal', setelah terminal terbuka kita tinggal mengetik perintah ./build.sh lalu tekan enter. Proses build akan berjalan dan memakan waktu tergantung dari seberapa kuat spek PC yang digunakan, untuk PC generasi 2011 kira-kira butuh waktu 20menitan

Setelah proses selesai, didalam folder vayux/arch/arm64/boot ada file dengan nama Image yang dimana itu adalah kernel untuk vayu, dan dtb ada di subfolder dts dengan nama sm8150-v2.dtb, serta file dtbo.img

MEMBUAT BOOT.IMG

Proses ini bisa dilakukan dengan meng-unpack - repack boot.img atau juga dengan anykernel3 dengan cara me-rename sm8150-v2.dtb menjadi dtb , lalu file dengan nama dtb tersebut dan file Image dimasukan kedalam folder anykernel3 kemudian di zip tanpa file dtbo.img tapi saya tidak menggunakan itu karena tidak praktis untuk pengetesan dikarenakan harus masuk ke recovery twrp untung melakukan flashing.

Untuk meng-unpack dan repack boot img di linux kita butuh AIK-Linux download di draekko repo dan stepnya sebagai berikut, dengan asumsi AIK-Linux ada di folder ${HOME} :
  • Ambil boot.img dari firmware vayu yg kita gunakan dan taruh di folder AIK-Linux.
  • Buka terminal dengan klik kanan open in terminal
  • Ketik perintah (masukan password login ubuntu jika diminta) :
    ./unpackimg.sh boot.img
  • Copy sm8150-v2.dtb dan Image ke folder split_img dengan perintah (satu perintah perbaris) :
    cp ${HOME}/vayux/out/arch/arm64/boot/dts/qcom/sm8150-v2.dtb ${HOME}/AIK-Linux/split_img/boot.img-dtb
    cp ${HOME}/vayux/out/arch/arm64/boot/Image ${HOME}/AIK-Linux/split_img/boot.img-kernel
  • Repack kernel dengan perintah :
    ./repackimg.sh
  • Selesai maka kan ada file dengan nama image-new.img

MELAKUKAN TEST BOOTING KERNEL BARU

Proses ini membutuhkan setelan developer option > usb debugging enable di Vayu dan adb terinstall di ubuntu.
Install Adb dengan mengetik perintah berikut di terminal yang sama dengan AIK jika belum terinstall :
sudo apt install android-tools-adb android-tools-fastboot

Setelah terinstall, hubungkan usb ke Poco x3 Pro ke PC lalu ketikan perintah
adb reboot bootloader
Dengan perintah diatas, nanti X3Pro akan masuk ke mode fastboot. lalu kembali ke terminal dan ketik perintah :
fastboot boot image-new.img
Perintah diatas hanya akan melakukan booting dengan kernel yang baru kita buat, dalam arti setelah restart akan kembali ke boot.img atau kernel yang lama. Cek versi kernel di Android About Phone Apakah versi kernel sudah sesuai dengan yang kita buat.
*Jika ingin melakukan flashing menjadikan boot img yg kita buat menjadi permanen dengan mengetikan perintah:
fastboot flash boot image-new.img

EXTRA

*dtbo.img file diperlukan jika file dtb dan dtb overlay tidak sama strukturnya, hal ini bisa menyebankan gagal booting. Dalam proses ini karena dtb dan dtbonya masih dapat diterima, maka kita tidak perlu melakukan flashing dtbo.img, flashing dtbo.img dilakukan dengan perintah fastboot flash dtbo dtbo.img

*Fix Fastcharging. Dari source code yg diberikan xiaomi ini ada sedikit masalah authentifikasi baterai yang mana menyebabkan fastcharging tidak berfungsi selayaknya. Untuk mengetahui fastcharging aktif bisa melalui dial *#*#6485#*#* untuk penjelasannya lihat detail info Catchlog Xiaomi App. Jadi meskipun status yg ditampilkan sudah Turbo charge akan tetap lama proses chargingnya, yang biasanya 1jam hampir penuh ini membutuhkan waktu sampai 2jam. untuk itu diperlukan baypass value tersebut menjadi 1. Di dalam file drivers/power/supply/qcom/qpnp-fg-gen4-vayu.c ganti nilai fg->fake_authentic = -EINVAL; menjadi fg->fake_authentic = 1; lengkapnya bisa lihat history github di qpnp-fg-gen4-vayu.c

*Untuk mengcompile kernel dari source selain xiaomi, kita mesti lihat makefile nya di source dari Xiaomi ini menggunakan REAL_CC , sementara rata - rata hanya menggunakan CC, dan juga ada yang membutuhkan gcc ARM32 (arm-linux-androideabi-) di googlesource bisa didownload di arm-linux-androideabi-4.9.tar.gz
Jika masalahnya seperti itu maka Contoh Scriptnya akan seperti ini
#!/bin/bash

Start=$(date +"%s")
export ARCH=arm64
export SUBARCH=arm64
export DTC_EXT=${HOME}/toolchain/dtc/dtc-1.4.4/prebuilt/dtc
export KBUILD_BUILD_USER="blakbin.blogspot.com"
export KBUILD_BUILD_HOST="Project-Rumble"
make O=${HOME}/vayux/out ARCH=arm64 vayu_rumble_defconfig

make -j$(nproc --all)  O=${HOME}/vayux/out \
PATH="${HOME}/toolchain/clang/LLVM-10.0.9/bin:${HOME}/toolchain/gcc/aarch64-linux-android-4.9/bin:${HOME}/toolchain/gcc/arm-linux-androideabi-4.9/bin:${PATH}" \
                                ARCH=arm64 \
                                CC=clang \
                                CROSS_COMPILE=aarch64-linux-android- \
								CROSS_COMPILE_ARM32=arm-linux-androideabi- \
                                CLANG_TRIPLE=aarch64-linux-gnu- | tee ${HOME}/vayux/out/kernel.log
End=$(date +"%s")
Diff=$(($End - $Start))
echo -e "$gre << Build completed in $(($Diff / 60)) minutes and $(($Diff % 60)) seconds >> \n $white"

*Proses History perubahan yang tertulis disini, lengkapnya bisa dilihat Github repo yg saya buat
- Poco X3 Pro Kernel Mod : vayu-r-oss-mod
Repo diatas merupakan hasil lengkap dari penggabungan semua driver dan patch yang diperlukan, jadi jika toolchain sudah lengkap bisa langsung mengeksekusi file ./build.sh
- Boot.img yang sudah siap di flash untuk test : Project-Rumble-Release
- Toolchain lengkap Untuk Poco x3 Pro : vayu_toolchain
- DTC : DTC 1.4.4
- WLAN driver : vendor_qcom_opensource_wlan
- Audio & Data Driver : Techpack
Loading comments...
Misc