Jump to content

Samsung Galaxy S5 (samsung-klte)

From postmarketOS Wiki
Revision as of 09:38, 1 September 2021 by Alexeymin (talk | contribs) (Installation: there is no choice between mainline/downstream. only mainline)
Samsung Galaxy S5
Samsung Galaxy S5
Samsung Galaxy S5
Manufacturer Samsung
Name Galaxy S5
Codename samsung-klte
Released 2014
Hardware
Chipset Qualcomm MSM8974PRO-AC Snapdragon 801
CPU Quad-core 2.5 GHz Krait 400
GPU Adreno 330
Display 1080 x 1920 AMOLED
Storage 16/32 GB
Memory 2 GB
Architecture armv7
Software
Original software Android 4.4.2 (KitKat)
postmarketOS
Category testing
Pre-built images no
Mainline yes
postmarketOS kernel 5.12.13
Unixbench Whet/Dhry score 884.3
Features
Flashing
Works
USB Networking
Partial
Internal storage
No data
SD card
No data
Battery
Partial
Screen
Works
Touchscreen
Works
Multimedia
3D Acceleration
Partial
Audio
Broken
Camera
Broken
Camera Flash
No data
Connectivity
WiFi
Works
Bluetooth
Works
GPS
Broken
NFC
Broken
Modem
Calls
Broken
SMS
Works
Mobile data
Works
Miscellaneous
FDE
No data
USB OTG
Broken
HDMI/DP
No data
Sensors
Accelerometer
Broken
Magnetometer
No data
Ambient Light
No data
Proximity
No data
Hall Effect
No data
Haptics
No data
Barometer
No data


Contributors

Maintainer(s)

Users owning this device


Status table explanation

This table explains more in detail why some features are marked as partial (P). Generally it's because feature works with some limitations, or is a "work-in-progress":

Component Status notes
USB Networking P Only first cable attach works, doesn't work after detaching (missing cable detection support)
3D Accel (GPU) P GPU works for simple use cases, but can't render complex GUIs/shaders. If you run Phosh or Plasma Mobile, you'll "crash" the display. Phosh works more steadily though. The phone continues to work, so this shouldn't be too hard to figure out. This is most likely due to lack of GPU IOMMU support or bugs in mesa/freedreno.

SXMO may be more wise UI choice for now.

Battery P Percentage reporting works; no charging status reported, but it is charging fine

How to enter flash mode

Press and hold Volume Down + Home + Power simultaneously. Then click Volume Up to confirm.

How to enter recovery mode

Press and hold Volume Up + Home + Power simultaneously.

Installation

First, install pmbootstrap.

Setup device to be used:

$ pmbootstrap init
Channel [edge]:
Vendor [samsung]: samsung       <- enter this
Device codename [i9100]: klte   <- enter this
Enable this package? (y/n) [y]  <- you probably want non-free firmware
User interface [sxmo]:          <- choose any UI by your preference. fbkeyboard and sxmo work well :)
...

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!

Mainlining Notes

Power IC

The phone uses max77804k MFD (Multi Function Device), which is also a Micro-USB_Interface_Controller 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.

USB

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.

Graphics/Display

There is mainline support for the GPU with 3D Acceleration. kmscube works.

If you run Phosh or Plasma Mobile, you'll "crash" the display. Phosh works more steadily though. The phone continues to work, so this shouldn't be too hard to figure out. This is most likely due to lack of GPU IOMMU support or bugs in mesa/freedreno.

SXMO may be more wise UI choice for now.

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

Running on pure mainline

At the moment (5.6) (this is still needed in 5.13-rc), if you want to use real mainline (from torvalds tree), you'd need this patch:

Patch:

I won't be surprised if more issues pop up in the future, as nobody is really testing for regressions on phones.

Getting early kernel logs using UART

Craft a cable using Serial_debugging:Cable_schematics#microUSB.2FCarkit_debug_cable with 619kΩ resistor (see also MUIC)

Read help for CONFIG_DEBUG_QCOM_UARTDM kernel konfig. Enable CONFIG_DEBUG_LL + CONFIG_DEBUG_QCOM_UARTDM + correct addresses for CONFIG_DEBUG_UART_PHYS and CONFIG_DEBUG_UART_VIRT. The ones listed in a help for CONFIG_DEBUG_QCOM_UARTDM option for MSM8974 work fine:

CONFIG_DEBUG_LL=y
CONFIG_DEBUG_QCOM_UARTDM=y
CONFIG_DEBUG_UART_PHYS=0xf991e000
CONFIG_DEBUG_UART_VIRT=0xfa71e000
CONFIG_EARLY_PRINTK=y

And add earlyprintk to kernel command line. This allows to receive debug messages from such early stages so you can even debug kernel self-decompressor.

If the phone becomes too hot

Use this to check temperatures:

$ for i in $(ls --color=never /sys/devices/virtual/thermal/); do cat /sys/devices/virtual/thermal/$i/type /sys/devices/virtual/thermal/$i/temp; done

Example output:

Partition layout

Partition layout:

Component support table

Component Codename Mainline kernel Since when
Debug serial msm_serial /dev/ttyMSM0 Working v4.17-rc1
Volume & home buttons gpio-keys Working 5.8
Regulator nodes pma8084, Maxim max77826 Working 5.8
Internal storage sdhci-msm Working 5.8
SD card storage sdhci-msm Working 5.11-rc1
USB Networking usb_dwc3_qcom Working 5.8
Display subsystem MSM MDSS MDP5 Working Since forever; mdp5 appeared in kernel in 3.14-rc1, mdp4 was there even before that
LCD Panels Samsung S6E3FA2 AMOLED cmd mode panel, MagnaChip(?) EA8064G AMOLED cmd mode panel Working In pmOS kernel fork, as panel-simple. In WIP branch as full-featured panel driver
Touchscreen synaptics rmi4-i2c Working 5.11-rc1
Touchkeys Cypress tm2-touchkey Working 5.11-rc1
Vibration motor max77804k-vibrator Not working
Notification LED Panasonic AN30259A Working 5.11-rc1
WiFi Broadcom BCM4354 (brcmfmac) + PCAL6416A GPIO Expander Working 5.11-rc1
Bluetooth Broadcom BCM4354 (hci_uart_bcm), needs GPIO expander too Working 5.13
USB OTG Maxim max77804k-extcon Not working
Battery charger Maxim max77804k-charger Not working
Battery fuelgauge Maxim max17048 Working 5.11-rc1
GPU drm_msm Working 5.12
HDMI out Silicon Image Sil8240 MHL Not working
Audio WCD9320 (+Audience eS704 voice) Audio Codecs Not working
Modem qcom-q6v5-mss Working in WIP branch
Accelerometer, Gyroscope Invensense MP65M (mpu6500) 6-axis gyro/accel Has mainline driver, CONFIG_INV_MPU6050_IIO
Magnetometer Asahi Kasei Microdevices AK09911C 3-axis compass Has mainline driver, CONFIG_AK09911
Ambient light / Proximity AMS TMG399X Optical Sensor Not working
Sensor HUB STM32 A5006V0 hub Seamless Sensor Platform (SSP) Not working
NFC NXP pn547 Has mainline driver, CONFIG_NFC_NXP_NCI
Cameras s5k2p2xx, s5k8b1yx Not working

Links

postmarketOS packages:

Extra:

Photos