Samsung Galaxy S5 (samsung-klte)
Users owning this device
- Alexeymin (Notes: Old phone, but in good shape, with new battery. Current mainlining playground)
- Drebrez (Notes: Power IC dead)
- EnderNightLord (Notes: great condition)
- Ichernev (Notes: Working on mainline kernel support)
- Maccraft123 (Notes: i also got a bunch of random parts)
- Magic RB
- No112 (Notes: dont remember buying this, but it seems to work. might play around with it later)
- Unrznbl (Notes: mainline, many issues exist, shelli works as well as possible)
- Flash Kernel (
pmbootstrap flasher flash_kernel)
- Flash Rootfs (
pmbootstrap flasher flash_rootfs)
- Initramfs boot
- USB Network
- Framebuffer graphics (Splash screens)
- SSH Connectivity
- Weston on framebuffer [broken with latest weston]
- Plasma Mobile on framebuffer [untested with last update]
- X11 based UIs on framebuffer work fine
- Android container starts
- audio works with nonfree-userland (with Android container)
What does not work
- Audio playback without nonfree-userland
- Bluetooth adapter is visible in rfkill list, but does not work
- Everything else
How to enter flash mode
Press and hold+ + simultaneously. Then click to confirm.
How to enter recovery mode
Press and hold+ + simultaneously.
First, install pmbootstrap.
Setup device to be used:
$ pmbootstrap init ... Vendor [samsung]: samsung <- enter this Device codename [i9100]: klte <- enter this Kernel [downstream]: downstream <- you probably want downstream for now User interface [weston]: <- choose any UI by your preference ...
Build the rootfs image:
$ pmbootstrap install
Then in order to flash it put your device in download mode, and plug it in USB. Then do:
$ pmbootstrap flasher flash_rootfs Hold "Volume down" + "Home" buttons at the end of the process, so that when phone reboots put it in flashing mode again $ pmbootstrap flasher flash_kernel This time, don't hold any button, let it reboot to Linux!
Nonfree-userland (halium) installation
To make full use of nonfree-userland intallation, which involves running Android in lxc container to make all hardware work (read more at Hybris wiki page), you need to to manually download and install custom device-specific Android/Halium system image. Building it manually takes a lot of time and free space on HDD, so I've prepared prebuilt image: https://androidfilehost.com/?fid=6006931924117913010
You need to download it, un-sparse and place in to root of userdata partition:
$ simg2img halium-klte-2019-07-09-system.img halium-klte-2019-07-09-system.img.raw
If it says "invalid sparse format or header magic" it means that the image is already unsparsed. Proceed to next step
Reboot phone to TWRP recovery and push image using ADB:
$ adb push halium-klte-2019-07-09-system.img.raw /data/system.img
Boot to a running postmarketOS system and login with SSH using USB_Network. Next commands are executed on the phone. Make sure that you have a
/data mounted (check output of
mount command). Ensure that Android is fully running inside an lxc container (on device, install
htop, run it and switch into tree mode by pressing t) (see the picture on the right). If it does not, check if
lxc-android is running (see output of
rc-status command). Run logcat and see if it is printing some error logs on the screen.
Before (re)starting lxc-android, remember to remove file
/tmp/lxc-android-once if it exists.
Useful helper scripts
Default installation includes a couple of useful scripts to be used from a terminal:
battery-status allows you to check for battery charge level, and
set-brightness allows to view/set lcd backlight brightness in range 0-255.
samsung-klte:~$ battery-status 25 samsung-klte:~$ set-brightness 255 samsung-klte:~$ sudo set-brightness 20 20
The phone uses max77804k MFD (Multi Function Device) IC to handle charging, extcon (cable detect), vibrator, flash led. This device is not in mainline, but it is very similar (i.e the same) to max77693 in register layout. In the next paragraph I'll refer to max77804k code as downstream and max77693 code as upstream.
- Charging : downstream charging code is scary. Mainline code only reads info, and doesn't charge, so a brave soul might be able to figure out a minimal setup that does charge the phone.
- Extcon : downstream extcon is not too bad, and it is trivial to follow the basic use cases and ensure they are ported correctly. Mainline code is different and writes different values for diffrent use cases, but following a similar structure it can be made to behave.
- Flash Leds : these are pretty straight forward, the existing mainline code is a bit weird, but I wrote a port of downstream and it does work for the most part.
- Vibrator : the mainline code is for a different kind of vibrator. It shouldn't be too hard to port the downstream code.
At the moment usb-networking works only the first time it is plugged, and only if the (experimental) max77804k is not enabled.
There are 2 different blocks for USB on the klte. One has a good driver, and manages the somewhat working usb networking -- let's call it simple. But if the max77804k driver is enabled, it switches to the other IP block which does not have mainline drivers -- let's call it complex. Downstream only has code for the complex block.
Drivers for the complex block are present on newer SoCs from qualcomm, but at least to me, they look different than the downstream code (downstream doesn't have the notion of phy's, and this is a pretty big deal). So this could be a simple fix, but likely isn't.
Another possible approach will be to somehow let the simple block handle all the USB, but without documentation on max77804k/usb blocks this is pretty hard.
There is mainline support for the GPU with 3D Acceleration. kmscube works.
If you run phosh or plamo, you'll "crash" the display. The phone continues to work, so this shouldn't be too hard to figure out. Check this issue: https://gitlab.com/postmarketOS/pmaports/-/issues/424
If you just let the phone sit, even with no ui (terminal cursor blinking) the whole phone hard freezes, including usb networking, wifi networking, uart console. And there is no warning in dmesg.
Parts Bin code
max77693 to max77804k port (incl some usb work): https://gitlab.com/ichernev/linux-postmarketos/-/tree/max77693-update
max77804k with leds only: https://gitlab.com/ichernev/linux-postmarketos/-/tree/max77804k
~ # fdisk -l /dev/block/mmcblk0 Found valid GPT with protective MBR; using GPT Disk /dev/block/mmcblk0: 30777344 sectors, 2740M Logical sector size: 512 Disk identifier (GUID): 98101b32-bbe2-4bf2-a06e-2bb33d000c20 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 30777310 Number Start (sector) End (sector) Size Code Name 1 8192 38911 15.0M 0700 apnhlos 2 38912 156543 57.4M 0700 modem 3 156544 157567 512K 0700 sbl1 4 157568 157695 65536 0700 dbi 5 157696 157759 32768 0700 ddr 6 157760 161855 2048K 0700 aboot 7 161856 162879 512K 0700 rpm 8 162880 163903 512K 0700 tz 9 163904 170047 3072K 0700 fsg 10 170048 184319 7136K 0700 pad 11 184320 204799 10.0M 0700 param 12 204800 233471 14.0M 0700 efs 13 233472 239615 3072K 0700 modemst1 14 239616 245759 3072K 0700 modemst2 15 245760 272383 13.0M 0700 boot 16 272384 303103 15.0M 0700 recovery 17 303104 329727 13.0M 0700 fota 18 329728 344045 7159K 0700 backup 19 344046 344047 1024 0700 fsc 20 344048 344063 8192 0700 ssd 21 344064 360447 8192K 0700 persist 22 360448 378879 9216K 0700 persdata 23 378880 5498879 2500M 0700 system 24 5498880 5908479 200M 0700 cache 25 5908480 6010879 50.0M 0700 hidden 26 6010880 30777310 11.8G 0700 userdata
Component support table
|Component||Codename||Mainline kernel||Since when||Downstream 3.4 kernel|
|Debug serial||msm_serial /dev/ttyMSM0||Working||v4.17-rc1||yes, /dev/ttyHSL0|
|Volume & home buttons||gpio-keys||Working||5.8||yes|
|Regulator nodes||pma8084, Maxim max77826||Working||5.8||yes|
|SD card storage||sdhci-msm||Working||In pmOS kernel fork||yes|
|Display||panel-simple||Working||In pmOS kernel fork||yes|
|Touchscreen||synaptics rmi4-i2c||Working||In pmOS kernel fork||yes|
|Touchkeys||Cypress tm2-touchkey||Working||In pmOS kernel fork||yes|
|Vibration motor||Not working||yes|
|Notification LED||Panasonic AN30259A||Working||In pmOS kernel fork||yes|
|WiFi||brcmfmac + PCAL6416A GPIO Expander||Working||In pmOS kernel fork||yes|
|USB OTG||Not working||yes|
|Battery charger||Maxim max77804k||Not working||yes|
|Battery fuelgauge||Maxim max17048||Working||In pmOS kernel fork||yes|
|GPU||drm_msm||Working||in pmOS kernel fork||works with libhybris (test_hwcomposer_7_1_caf)|
|Audio||Not working||with libhybris (pulseaudio-modules-droid)|
|Modem||qcom-q6v5-mss||Not working||powers up with libhybris|
|Sensors||Not working||yes (libhybris's test_sensors)|
Mainline kernel patches:
- initial dts https://patchwork.kernel.org/patch/10150807/
- usb-net, storage, hwkeys dts https://lore.kernel.org/patchwork/project/lkml/list/?series=438265
- max77826 driver https://lore.kernel.org/patchwork/project/lkml/list/?series=438450
- max17048 fuelgauge driver https://patchwork.kernel.org/project/linux-pm/list/?series=299767
- https://gitlab.com/postmarketOS/linux-postmarketos/tree/old-4.17.0-rc3/qcom , old 4.17 kernel, commits by drebrez
- https://github.com/drebrez/linux/tree/samsung-klte (old repo)
- Full phone specifications
- Samsung Galaxy S5 Teardown
- UART guide
- Demo of Samsung klte running Plasma Mobile
- Plasma Mobile Kirigami Gallery demo on samsung-klte