- B9A: read-only audit of stock LK/DT: the panel is an ST7735S 128x128 on SPI (BLSP1 QUP4, 16 MHz, mode 3, D/C GPIO116, RESET GPIO118), backlight = PM8916 MPP4 current sink 40 mA. - B9B: upstream panel-mipi-dbi with the stock init sequence as firmware; MPP4 sink via pinctrl + gpio-backlight; first light with correct colours/orientation/offsets. - B9C: fbcon (6x8, 21x16) on tty1 + getty, UART console kept, aurora-display service; cache B9C b9ce13c9 written and verified, cold boots with LTE + Wi-Fi + display. - B9L (RAM only): lk2nd second stage with an msm8916 SPI panel port shows a picture before Linux. - Sanitizer: whitelist for b8/ and b9/.
42 lines
3.2 KiB
Text
42 lines
3.2 KiB
Text
# B9A — backlight mechanism. READ-ONLY.
|
|
|
|
## Answer: PM8916 MPP4 used as a constant CURRENT SINK (40 mA) for the LED backlight. On/off only in LK; no PWM, no WLED, no DCS, no GPIO,
|
|
## no separate LED-driver IC seen in any stock source.
|
|
|
|
== Stock LK (bootchain/aboot-analysis/lk.bin, target_backlight_ctrl @0x8f600b54; details in b9a-stock-lk.txt)
|
|
pm8x41 MPP struct base = 0xa300 (MPP4), mode byte = 1
|
|
write SID0 0xa340 MODE_CTL = 0x61 (mode 6 = current sink <<4, source sel 0, bit0 = 1 'on')
|
|
write SID0 0xa34c SINK_CTL = 0x07 (7 -> 40 mA; PM8916 MPP sink steps 5 mA * (n+1))
|
|
write SID0 0xa346 EN_CTL = 0x80 (master enable)
|
|
mdelay(20)
|
|
backlight descriptor: bl_interface_type 1 ("BL_WLED" label), min 1, max 0xfff, pmic 'PMIC_8941' (CAF template values)
|
|
Order in LK: panel power/reset -> SPI init -> 19 init cmds (DISPON, RAMWR) -> logo frame -> backlight ON (msm_display_init order:
|
|
panel power_func, panel on, then bl_func) -> continuous splash (left on for the kernel).
|
|
|
|
== Stock Android kernel (dt/dtb_01.dts)
|
|
qcom,leds@a300 (compatible qcom,leds-qpnp, label "mpp"):
|
|
qcom,led_mpp_4: linux,name "lcd-bl", default-trigger "bkl-trigger", default-state off,
|
|
qcom,max-current 40, qcom,current-setting 40 (mA), qcom,id 6 (QPNP_ID_LED_MPP), qcom,mode "manual",
|
|
qcom,source-sel 1, qcom,mode-ctrl 0x60 (current sink)
|
|
panel: qcom,mdss-spi-bl-pmic-control-type "bl_ctrl_wled", bl-min 1, bl-max 255 -> mdss_fb "lcd-backlight" led triggers "bkl-trigger"
|
|
-> lcd-bl (MPP4). No pwm node referenced.
|
|
Android sysfs (android/leds.txt): /sys/class/leds/lcd-backlight (mdss_fb_primary) and /sys/class/leds/lcd-bl (leds-qpnp-de736200)
|
|
Android userspace: com.qualcomm.display running; ro.sf.lcd_density 114; persist.sys.juzhen.soft.version JZ_MIFI_LCD_COM_20260709.
|
|
|
|
== Who powers / who sets brightness
|
|
- Supply of the LED string: not visible in any stock source (MPP4 only sinks current; anode presumably from VPH_PWR/VBAT — unproven, board-level).
|
|
- Enable + "brightness": MPP4 SINK_CTL (5..40 mA, 8 steps) and EN. Stock uses 40 mA fixed. Fine brightness would need MPP4 DTEST/LPG PWM
|
|
(not used by stock).
|
|
- Order: backlight AFTER panel init + first frame (avoids showing GRAM garbage).
|
|
|
|
== Current Linux (live, b9a-linux-display.txt)
|
|
MPP4: MODE_CTL 00, EN_CTL 00, SINK_CTL 00 -> OFF; /sys/class/backlight empty; /sys/class/leds has no lcd-bl.
|
|
DT: pm8916_mpps@a000 present (qcom,pm8916-mpp, gpio-controller, 4 MPPs), no pinctrl state for mpp4, pm8916_pwm disabled.
|
|
Kernel: PINCTRL_QCOM_SPMI_PMIC=y, BACKLIGHT_CLASS_DEVICE=y, BACKLIGHT_GPIO=y, LEDS_CLASS=y.
|
|
|
|
== Upstream mapping (read-only check of /home/q/aurora-kbuild/src)
|
|
drivers/pinctrl/qcom/pinctrl-spmi-mpp.c: function "sink" => MODE_CTL mode 6; "drive-strength" written RAW to SINK_CTL (0x4c) -> use 7
|
|
for 40 mA; "output-high"/gpio value => MODE_CTL bit0. EN_CTL = master enable. => DT:
|
|
&pm8916_mpps { lcd_bl_default: mpp4-state { pins = "mpp4"; function = "sink"; drive-strength = <7>; output-low; }; };
|
|
backlight: backlight { compatible = "gpio-backlight"; gpios = <&pm8916_mpps 4 GPIO_ACTIVE_HIGH>; pinctrl... };
|
|
This reproduces LK's 0x61/0x07/0x80 exactly when on (to be verified in B9B by reading back the 3 registers).
|