运行的是全志早期的 camdroid 系统
sys_config.fex
[product]
version = "100"
machine = "ncap-Entrance"
[platform]
eraseflag = 0
[target]
boot_clock = 912
storage_type = -1
[boot_spi_board0]
boot_spi_speed_hz = 60000000
speed_mod = 1
[power_sply]
dcdc2_vol = 1100
dcdc3_vol = 3300
aldo2_vol = 2500
aldo3_vol = 3000
ldo1_vol = 3300
ldo2_vol = 3000
ldo3_vol = 3000
[card_boot]
logical_start = 40960
spinor_verify = 1
sprite_gpio0 =
[card0_boot_para]
card_ctrl = 0
card_high_speed = 1
card_line = 4
sdc_d1 = port:PF00<2><1><default><default>
sdc_d0 = port:PF01<2><1><default><default>
sdc_clk = port:PF02<2><1><default><default>
sdc_cmd = port:PF03<2><1><default><default>
sdc_d3 = port:PF04<2><1><default><default>
sdc_d2 = port:PF05<2><1><default><default>
[twi_para]
twi_port = 0
twi_scl = port:PB06<2><default><default><default>
twi_sda = port:PB07<2><default><default><default>
[uart_para]
uart_debug_port = 2
uart_debug_tx = port:PB00<2><1><default><default>
uart_debug_rx = port:PB01<2><1><default><default>
[jtag_para]
jtag_enable = 0
jtag_ms = port:PF00<3><default><default><default>
jtag_ck = port:PF05<3><default><default><default>
jtag_do = port:PF03<3><default><default><default>
jtag_di = port:PF01<3><default><default><default>
[clock]
pll3 = 297
pll4 = 300
pll6 = 600
pll8 = 360
pll9 = 480
pll10 = 297
pll_ve = 360
pll_isp = 360
[pm_para]
standby_mode = 1
[sys_pwr_dm_para]
vdd_cpua = 1
vdd_sys = 1
[dynamic_standby_para]
enable = 0
dram_selfresh_flag = 1
vdd_cpua_vol = 1200
vdd_sys_vol = 1200
[dram_para]
dram_clk = 360
dram_type = 2
dram_zq = 0x39bb
dram_odt_en = 0
dram_para1 = 283246592
dram_para2 = 0
dram_mr0 = 6208
dram_mr1 = 4
dram_mr2 = 24
dram_mr3 = 4
dram_tpr0 = 0x832087
dram_tpr1 = 0x1c24085
dram_tpr2 = 0x2a01d
dram_tpr3 = 0x0
dram_tpr4 = 0x0
dram_tpr5 = 0x0
dram_tpr6 = 0x0
dram_tpr7 = 0x0
dram_tpr8 = 0x0
dram_tpr9 = 0x0
dram_tpr10 = 0x0
dram_tpr11 = 0x220000
dram_tpr12 = 0x78
dram_tpr13 = 0xd000000
[pm_para]
standby_mode = 0
[wakeup_src_para]
cpu_en = 0
cpu_freq = 48
pll_ratio = 273
dram_selfresh_en = 1
dram_freq = 36
wakeup_src_wl = port:PL07<4><default><default><0>
wakeup_src_bt = port:PL09<4><default><default><0>
bb_wake_ap = port:PL02<4><default><default><0>
[twi0]
twi_used = 1
twi_scl = port:PB06<2><default><default><default>
twi_sda = port:PB07<2><default><default><default>
[twi1]
twi_used = 0
twi_scl = port:PB08<2><default><default><default>
twi_sda = port:PB09<2><default><default><default>
[uart0]
uart_used = 1
uart_port = 1
uart_type = 2
uart_tx = port:PB08<3><1><default><default>
uart_rx = port:PB09<3><1><default><default>
[uart1]
uart_used = 1
uart_port = 2
uart_type = 2
uart_tx = port:PE21<4><1><default><default>
uart_rx = port:PE22<4><1><default><default>
[uart2]
uart_used = 1
uart_port = 0
uart_type = 2
uart_tx = port:PB00<2><1><default><default>
uart_rx = port:PB01<2><1><default><default>
[spi0]
spi_used = 1
spi_cs_bitmap = 1
spi_mosi = port:PC03<3><default><default><default>
spi_miso = port:PC00<3><default><default><default>
spi_sclk = port:PC01<3><default><default><default>
spi_cs0 = port:PC02<3><1><default><default>
[spi_devices]
spi_dev_num = 1
[spi_board0]
modalias = "W25q128"
max_speed_hz = 60000000
bus_num = 0
chip_select = 0
mode = 0
sflash_size = 16
[ctp_para]
ctp_used = 0
ctp_name = "gt911_m785q6"
ctp_twi_id = 1
ctp_twi_addr = 0x5d
ctp_screen_max_x = 800
ctp_screen_max_y = 480
ctp_revert_x_flag = 0
ctp_revert_y_flag = 0
ctp_exchange_x_y_flag = 1
ctp_int_port =
ctp_wakeup =
[ctp_list_para]
ctp_det_used = 0
gt911_ts = 1
ft5x_ts = 1
gt82x = 1
gslX680 = 1
gt9xx_ts = 1
gt811 = 1
zet622x = 1
aw5306_ts = 1
[tkey_para]
tkey_used = 0
tkey_twi_id =
tkey_twi_addr =
tkey_int =
[motor_para]
motor_used = 0
motor_shake = port:power3<1><default><default><1>
[cooler_table]
cooler_count = 4
cooler0 = "1340000 4 4294967295 0"
cooler1 = "1200000 4 4294967295 0"
cooler2 = "1008000 4 4294967295 0"
cooler3 = "648000 4 4294967295 0"
[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 1
screen0_output_mode = 4
screen1_output_type = 1
screen1_output_mode = 4
fb0_format = 0
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 0
fb0_width = 0
fb0_height = 0
fb1_format = 0
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0
fb1_width = 0
fb1_height = 0
lcd0_backlight = 200
lcd1_backlight = 50
lcd0_bright = 50
lcd0_contrast = 50
lcd0_saturation = 57
lcd0_hue = 50
lcd1_bright = 50
lcd1_contrast = 50
lcd1_saturation = 57
lcd1_hue = 50
[lcd0_para]
lcd_used = 1
lcd_driver_name = "default_lcd"
lcd_if = 0
lcd_x = 320
lcd_y = 240
lcd_width = 49
lcd_height = 37
lcd_dclk_freq = 12
lcd_pwm_used = 0
lcd_pwm_ch = 0
lcd_pwm_freq = 50000
lcd_pwm_pol = 1
lcd_pwm_max_limit = 255
lcd_hbp = 30
lcd_ht = 500
lcd_hspw = 10
lcd_vbp = 10
lcd_vt = 300
lcd_vspw = 4
lcd_frm = 1
lcd_hv_clk_phase = 0
lcd_hv_sync_polarity = 0
lcd_gamma_en = 0
lcd_bright_curve_en = 1
lcd_cmap_en = 0
lcdgamma4iep = 22
lcd_bl_en = port:PB04<1><0><default><1>
lcd_power = ""
lcdd2 = port:PE04<3><0><default><default>
lcdd3 = port:PE05<3><0><default><default>
lcdd4 = port:PE06<3><0><default><default>
lcdd5 = port:PE07<3><0><default><default>
lcdd6 = port:PE08<3><0><default><default>
lcdd7 = port:PE09<3><0><default><default>
lcdd10 = port:PE10<3><0><default><default>
lcdd11 = port:PE11<3><0><default><default>
lcdd12 = port:PE12<3><0><default><default>
lcdd13 = port:PE13<3><0><default><default>
lcdd14 = port:PE14<3><0><default><default>
lcdd15 = port:PE15<3><0><default><default>
lcdd18 = port:PE16<3><0><default><default>
lcdd19 = port:PE17<3><0><default><default>
lcdd20 = port:PE18<3><0><default><default>
lcdd21 = port:PE19<3><0><default><default>
lcdd22 = port:PE23<3><0><default><default>
lcdd23 = port:PE24<3><0><default><default>
lcdclk = port:PE00<3><0><3><default>
lcdde = port:PE01<3><0><3><default>
lcdhsync = port:PE02<3><0><3><default>
lcdvsync = port:PE03<3><0><3><default>
[spi_mn_para]
spin_scl = port:PB06<1><default><default><default>
spin_sdo = port:PB03<0><default><default><default>
spin_sdi = port:PB07<1><default><default><default>
spin_cs = port:PB05<1><default><default><default>
spin_reset = port:PG04<1><default><default><default>
[pwm0_para]
pwm_used = 1
pwm_positive = port:PB04<2><0><default><default>
[pwm1_para]
pwm_used = 0
pwm_positive = port:PH01<2><0><default><default>
: If set gamc_phy to use = 2
[gmac0]
gmac_used = 2
gmac_power1 =
[csi0]
vip_used = 0
vip_mode = 0
vip_dev_qty = 1
vip_define_sensor_list = 0
vip_csi_mck = port:PE20<3><default><default><default>
vip_csi_sck = port:PE21<2><default><default><default>
vip_csi_sda = port:PE22<2><default><default><default>
vip_dev0_mname = "h42_mipi"
vip_dev0_pos = "rear"
vip_dev0_lane = 1
vip_dev0_twi_id = 0
vip_dev0_twi_addr = 96
vip_dev0_isp_used = 1
vip_dev0_fmt = 1
vip_dev0_stby_mode = 0
vip_dev0_vflip = 1
vip_dev0_hflip = 1
vip_dev0_iovdd = ""
vip_dev0_iovdd_vol = 3000000
vip_dev0_avdd = ""
vip_dev0_avdd_vol = 2800000
vip_dev0_dvdd = ""
vip_dev0_dvdd_vol = 2800000
vip_dev0_afvdd = ""
vip_dev0_afvdd_vol = 2800000
vip_dev0_power_en =
vip_dev0_reset = port:PG00<1><default><default><0>
vip_dev0_pwdn =
vip_dev0_flash_en =
vip_dev0_flash_mode =
vip_dev0_af_pwdn =
vip_dev0_act_used = 0
vip_dev0_act_name = "dw9714_act"
vip_dev0_act_slave = 24
vip_dev1_mname = ""
vip_dev1_pos = "front"
vip_dev1_lane = 1
vip_dev1_twi_id = 0
vip_dev1_twi_addr =
vip_dev1_isp_used = 0
vip_dev1_fmt = 1
vip_dev1_stby_mode = 0
vip_dev1_vflip = 0
vip_dev1_hflip = 0
vip_dev1_iovdd = ""
vip_dev1_iovdd_vol = 2800000
vip_dev1_avdd = ""
vip_dev1_avdd_vol = 2800000
vip_dev1_dvdd = ""
vip_dev1_dvdd_vol = 1500000
vip_dev1_afvdd = ""
vip_dev1_afvdd_vol = 2800000
vip_dev1_power_en =
vip_dev1_reset =
vip_dev1_pwdn =
vip_dev1_flash_en =
vip_dev1_flash_mode =
vip_dev1_af_pwdn =
[csi1]
vip_used = 0
vip_mode = 0
vip_dev_qty = 1
vip_define_sensor_list = 0
vip_csi_pck =
vip_csi_mck =
vip_csi_hsync =
vip_csi_vsync =
vip_csi_d0 =
vip_csi_d1 =
vip_csi_d2 =
vip_csi_d3 =
vip_csi_d4 =
vip_csi_d5 =
vip_csi_d6 =
vip_csi_d7 =
vip_csi_d8 =
vip_csi_d10 = port:PE14<2><default><default><default>
vip_csi_d11 = port:PE15<2><default><default><default>
vip_csi_sck = port:PE21<2><default><default><default>
vip_csi_sda = port:PE22<2><default><default><default>
vip_dev0_mname = "ov5640"
vip_dev0_pos = "front"
vip_dev0_twi_id = 4
vip_dev0_twi_addr = 120
vip_dev0_isp_used = 0
vip_dev0_fmt = 0
vip_dev0_stby_mode = 0
vip_dev0_vflip = 0
vip_dev0_hflip = 0
vip_dev0_iovdd = ""
vip_dev0_iovdd_vol = 2800000
vip_dev0_avdd = ""
vip_dev0_avdd_vol = 2800000
vip_dev0_dvdd = ""
vip_dev0_dvdd_vol = 1500000
vip_dev0_afvdd = ""
vip_dev0_afvdd_vol = 2800000
vip_dev0_power_en =
vip_dev0_reset = port:PE23<1><default><default><default>
vip_dev0_pwdn = port:PE24<1><default><default><default>
vip_dev0_flash_en =
vip_dev0_flash_mode =
vip_dev0_af_pwdn =
vip_dev0_act_used = 0
vip_dev0_act_name = "ad5820_act"
vip_dev0_act_slave = 24
vip_dev1_mname = "gc2035"
vip_dev1_pos = "front"
vip_dev1_lane = 1
vip_dev1_twi_id = 4
vip_dev1_twi_addr = 120
vip_dev1_isp_used = 0
vip_dev1_fmt = 1
vip_dev1_stby_mode = 0
vip_dev1_vflip = 0
vip_dev1_hflip = 0
vip_dev1_iovdd = ""
vip_dev1_iovdd_vol = 2800000
vip_dev1_avdd = ""
vip_dev1_avdd_vol = 2800000
vip_dev1_dvdd = ""
vip_dev1_dvdd_vol = 1500000
vip_dev1_afvdd = ""
vip_dev1_afvdd_vol = 2800000
vip_dev1_power_en =
vip_dev1_reset =
vip_dev1_pwdn =
vip_dev1_flash_en =
vip_dev1_flash_mode =
vip_dev1_af_pwdn =
[mmc0_para]
sdc_used = 1
sdc_detmode = 3
sdc_buswidth = 4
sdc_d1 = port:PF00<2><1><2><default>
sdc_d0 = port:PF01<2><1><2><default>
sdc_clk = port:PF02<2><1><2><default>
sdc_cmd = port:PF03<2><1><2><default>
sdc_d3 = port:PF04<2><1><2><default>
sdc_d2 = port:PF05<2><1><2><default>
#sdc_det =
sdc_use_wp = 0
sdc_wp =
sdc_isio = 1
sdc_regulator = "none"
[mmc1_para]
sdc_used = 0
sdc_detmode = 4
sdc_buswidth = 4
sdc_clk = port:PG00<2><1><1><default>
sdc_cmd = port:PG01<2><1><1><default>
sdc_d0 = port:PG02<2><1><1><default>
sdc_d1 = port:PG03<2><1><1><default>
sdc_d2 = port:PG04<2><1><1><default>
sdc_d3 = port:PG05<2><1><1><default>
sdc_det =
sdc_use_wp = 0
sdc_wp =
sdc_isio = 1
sdc_regulator = "none"
[mmc2_para]
sdc_used = 0
sdc_detmode = 3
sdc_buswidth = 8
sdc_clk = port:PC00<2><1><2><default>
sdc_cmd = port:PC01<2><1><2><default>
sdc_d0 = port:PC03<2><1><2><default>
sdc_d1 = port:PC04<2><1><2><default>
sdc_d2 = port:PC05<2><1><2><default>
sdc_d3 = port:PC06<2><1><2><default>
sdc_d4 = port:PC07<2><1><2><default>
sdc_d5 = port:PC08<2><1><2><default>
sdc_d6 = port:PC09<2><1><2><default>
sdc_d7 = port:PC10<2><1><2><default>
emmc_rst = port:PC02<2><1><2><default>
sdc_det =
sdc_use_wp = 0
sdc_wp =
sdc_isio = 0
sdc_regulator = "none"
[usbc0]
usb_used = 1
usb_port_type = 0
usb_detect_type = 0
usb_id_gpio =
usb_det_vbus_gpio =
usb_drv_vbus_gpio =
usb_restrict_gpio =
usb_host_init_state = 0
usb_restric_flag = 0
usb_restric_voltage = 3550000
usb_restric_capacity = 5
usb_regulator_io = "nocare"
usb_regulator_vol = 0
usb_not_suspend = 0
[usb_feature]
vendor_id = 6353
mass_storage_id = 1
adb_id = 2
manufacturer_name = "USB Developer"
product_name = "QRDecoder"
serial_number = "20171020"
[msc_feature]
vendor_name = "USB 2.0"
product_name = "USB Flash Driver"
release = 100
luns = 1
[serial_feature]
serial_unique = 0
[gsensor_para]
gsensor_used = 0
gsensor_twi_id = 1
gsensor_twi_addr = 0x27
gsensor_int1 =
gsensor_int2 =
[gsensor_list_para]
gsensor_det_used = 0
bma250 = 1
da380 = 1
mma8452 = 1
mma7660 = 1
mma865x = 1
afa750 = 1
lis3de_acc = 1
lis3dh_acc = 1
kxtik = 1
dmard10 = 0
dmard06 = 1
mxc622x = 1
fxos8700 = 1
lsm303d = 1
[gps_para]
[wifi_para]
wifi_used = 0
wifi_sdc_id = 1
wifi_usbc_id = 1
wifi_usbc_type = 1
wifi_mod_sel = 2
wifi_power = ""
ap6xxx_wl_regon = port:PL06<1><default><default><0>
ap6xxx_wl_host_wake = port:PL07<4><default><default><0>
ap6xxx_bt_regon = port:PL08<1><default><default><0>
ap6xxx_bt_wake = port:PL10<1><default><default><0>
ap6xxx_bt_host_wake = port:PL09<4><default><default><0>
ap6xxx_lpo_use_apclk = 1
[ls_para]
ls_used = 0
ls_twi_id = 1
ls_twi_addr = 35
ls_int = port:PB07<4><1><default><default>
[ls_list_para]
ls_det_used = 0
ltr_501als = 1
jsa1212 = 1
[compass_para]
compass_used = 0
compass_twi_id = 1
compass_twi_addr = 13
compass_int =
[tdm0]
daudio_used = 0
daudio_master = 4
daudio_select = 1
audio_format = 1
signal_inversion = 1
mclk_fs = 512
sample_resolution = 16
slot_width_select = 16
pcm_lrck_period = 32
pcm_lrckr_period = 1
msb_lsb_first = 0
sign_extend = 0
slot_index = 0
slot_width = 16
frame_width = 1
tx_data_mode = 0
rx_data_mode = 0
i2s_bclk = port:PG11<2><1><default><default>
i2s_lrclk = port:PG10<2><1><default><default>
i2s_dout0 = port:PG12<2><1><default><default>
i2s_dout1 =
i2s_dout2 =
i2s_dout3 =
i2s_din = port:PG13<2><1><default><default>
[audio0]
headphone_vol = 63
cap_vol = 7
Differential_output = 1
pa_single_vol = 63
pa_double_used = 0
pa_double_vol = 31
headphone_direct_used = 0
phone_mic_vol = 6
version_v3_used = 0
headphone_mute_used = 0
audio_hp_ldo = "none"
audio_pa_ctrl = port:PB05<1><default><default><0>
adcagc_used = 0
adcdrc_used = 1
dacdrc_used = 0
adchpf_used = 1
dachpf_used = 0
[s_ir0]
ir_used = 0
ir_rx = port:PL04<2><1><default><default>
[pmu1_para]
pmu_used = 0
pmu_id = 1
pmu_twi_addr = 52
pmu_twi_id = 0
pmu_irq_id = 0
pmu_irq_gpio = port:PG05<6><default><default><default>
pmu_battery_rdc = 249
pmu_battery_cap = 183
pmu_batdeten = 1
pmu_runtime_chgcur = 150
pmu_earlysuspend_chgcur = 150
pmu_suspend_chgcur = 150
pmu_shutdown_chgcur = 150
pmu_init_chgvol = 4200
pmu_init_chgend_rate = 15
pmu_init_chg_enabled = 1
pmu_init_adc_freq = 100
pmu_init_chg_pretime = 50
pmu_init_chg_csttime = 720
pmu_battery_warning1 = 3650
pmu_battery_warning2 = 3600
pmu_bat_para1 = 0
pmu_bat_para2 = 0
pmu_bat_para3 = 0
pmu_bat_para4 = 0
pmu_bat_para5 = 8
pmu_bat_para6 = 16
pmu_bat_para7 = 25
pmu_bat_para8 = 37
pmu_bat_para9 = 47
pmu_bat_para10 = 55
pmu_bat_para11 = 61
pmu_bat_para12 = 68
pmu_bat_para13 = 79
pmu_bat_para14 = 87
pmu_bat_para15 = 94
pmu_bat_para16 = 100
pmu_usbvol_limit = 1
pmu_usbcur_limit = 0
pmu_usbvol = 4000
pmu_usbcur = 0
pmu_usbvol_pc = 4000
pmu_usbcur_pc = 0
pmu_pwroff_vol = 3300
pmu_pwron_vol = 2900
pmu_pekoff_time = 6000
pmu_pekoff_en = 1
pmu_peklong_time = 1500
pmu_pekon_time = 1000
pmu_pwrok_time = 64
pmu_pwrnoe_time = 2000
pmu_hot_shutdown = 1
pmu_suspendpwroff_vol = 3500
power_start = 1
[pmu1_regu]
regulator_count = 7
regulator1 = "axp20_dcdc2 none vdd-sys vdd-cpu vdd-ephy"
regulator2 = "axp20_dcdc3 none vcc-io hpvcc vcc-pd vcc-usb vcc-ephy vcc-mcsi vcc-lcd vcc-wifi vcc-device vcc-csi vcc-ctp"
regulator3 = "axp20_ldo1 none vcc-rtc"
regulator4 = "axp20_ldo2 none vcc-avcc vcc-pll"
regulator5 = "axp20_ldo3 none vcc-pe csi-avdd"
regulator6 = "axp20_ldo4 none csi-dvdd"
regulator7 = "axp20_ldoio0 none"
[dvfs_table]
extremity_freq = 912000000
max_freq = 912000000
min_freq = 60000000
LV_count = 8
LV1_freq = 912000000
LV1_volt = 1100
LV2_freq = 912000000
LV2_volt = 1100
LV3_freq = 912000000
LV3_volt = 1100
LV4_freq = 912000000
LV4_volt = 1100
LV5_freq = 912000000
LV5_volt = 1100
LV6_freq = 648000000
LV6_volt = 1040
LV7_freq = 0
LV7_volt = 1040
LV8_freq = 0
LV8_volt = 1040
[Vdevice]
Vdevice_used = 1
Vdevice_0 = port:PA01<5><1><2><default>
Vdevice_1 = port:PA02<5><1><2><default>
[dram_dvfs_table]
LV_count = 3
LV1_freq = 552000000
LV1_volt = 1100
LV2_freq = 360000000
LV2_volt = 1000
LV3_freq = 0
LV3_volt = 1000
[fel_key]
fel_key_used = 0
fel_key_min = 255
fel_key_max = 255
[leds_para]
led_1 = port:PG01<1><default><default><0>
led_1_active_low = 1
led_2 = port:PG02<1><default><default><0>
led_2_active_low = 1离线
关于显示屏驱动:
1. sys_config.fex 直接配置
firmware_backup/20260807_20171020_QRDecode/metadata/sys_config_runtime.fex:291:
spin_scl = PB06
spin_sdo = PB03
spin_sdi = PB07
spin_cs = PB05
spin_reset = PG04
2. GPIO 编号换算与内核反汇编一致
全志 GPIO 每个端口 32 个编号:
PB05 = 1*32+5 = 37
PB07 = 1*32+7 = 39
PB03 = 1*32+3 = 35
PB06 = 1*32+6 = 38
PG04 = 6*32+4 = 196
目标内核的 spi_gpio_request() 中实际出现:
37 -> LCD_CS
39 -> LCD_SDI
35 -> LCD_SDO
38 -> LCD_SCL
196 -> reset
对应内核函数也固定使用这些编号:
CS() -> 37
DIN() -> 39
Read32Bit()-> 35
CLK() -> 38
RST() -> 196
3. 确实用于 LCD 初始化
目标内核的 displayinit():
- 加载字符串 spi_mn_para
- 调用 spi_gpio_request()
- 调用 SPI_WriteComm() / SPI_WriteData()
- 发送面板寄存器初始化命令
- LCD_panel_init() 和 LCD_bl_open() 都会调用它
所以最终映射是:
面板信号 GPIO
━━━━━━━━━━ ━━━━━━
SCL/CLK PB06
────────── ──────
SDO/读回 PB03
────────── ──────
SDI/写入 PB07
────────── ──────
CS PB05
────────── ──────
RESET PG04
这里 SDI/SDO 是面板端命名:SoC 写入面板的是 PB07,从面板读回的是 PB03。这只证明固件配置和内核使用关系;PCB 上是否实际连到对应 LCD 管脚,还需要原理图或万用表连
通性确认。等价调用链是:
LCD_panel_init()
-> displayinit()
-> SPI_WriteComm() / SPI_WriteData()
-> WriteByte()
-> CS() / CLK() / DIN()
目标内核地址:
LCD_panel_init c015e9e8
displayinit c0161360
WriteByte c01611a8
SPI_WriteComm c0161330
SPI_WriteData c0161348
SPI_WriteComm() 和 SPI_WriteData() 只是传入不同标志位:
void SPI_WriteComm(u8 value)
{
WriteByte(value, 0); // command
}
void SPI_WriteData(u8 value)
{
WriteByte(value, 1); // data
}
WriteByte() 的等价伪代码:
void WriteByte(u8 value, int is_data)
{
CLK(1);
CS(0);
CLK(0);
DIN(is_data); // 第 1 位:命令/数据标志
CLK(1);
CLK(0);
for (int bit = 7; bit >= 0; bit--) {
CLK(0);
DIN((value >> bit) & 1);
CLK(1);
}
DIN(1);
CS(1);
}
也就是 GPIO bit-bang 的 9-bit 协议:
1 个命令/数据标志位 + 8 个 MSB-first 数据位
LCD_panel_init() 自身不直接调用 SPI_WriteComm(),而是在 c015e9f4 跳转到 displayinit()。LCD_bl_open() 也会在背光打开流程中调用同一个 displayinit()。
displayinit() 的实际顺序大致是:
spi_gpio_request()
RST(1) -> RST(0) -> RST(1)
SPI_WriteComm(01)
SPI_WriteComm(11)
Read32Bit(04, &LCD_ID)
SPI_WriteComm(36); Data(A8)
SPI_WriteComm(2A); Data(00 00 01 3F)
SPI_WriteComm(2B); Data(00 00 00 EF)
SPI_WriteComm(3A); Data(66)
SPI_WriteComm(B2); Data(0C 0C 00 33 33)
SPI_WriteComm(B7); Data(75)
SPI_WriteComm(BB); Data(2C)
SPI_WriteComm(C0); Data(2C)
SPI_WriteComm(C2); Data(01 FF)
SPI_WriteComm(C3); Data(20)
SPI_WriteComm(C4); Data(20)
SPI_WriteComm(C6); Data(0F)
SPI_WriteComm(D0); Data(A4 A1)
SPI_WriteComm(E0); 发送正伽马表
SPI_WriteComm(E1); 发送负伽马表
SPI_WriteComm(E9); Data(11 11 08)
SPI_WriteComm(B1); Data(42 05 13)
SPI_WriteComm(B0); Data(11 F0)
SPI_WriteComm(21)
SPI_WriteComm(29)
spi_gpio_free()
其中:
- 0x01:软件复位
- 0x11:退出睡眠
- 0x04:读取 LCD ID
- 0x2A/0x2B:设置窗口
- 0x3A:像素格式
- 0x21:显示反色
- 0x29:开启显示
Read32Bit() 使用 PB03/SDO 读回 32 位 ID,所以启动日志中的:
LCD_ID:00000000
displayinit over
说明初始化函数确实执行,但本次没有读到有效面板 ID。• 最像的是 Sitronix ST7789 系列,优先候选:
1. ST7789V
2. ST7789V2 / ST7789H2 类兼容型号
3. 某种 ST7789 兼容克隆芯片
判断依据是初始化命令族高度吻合:
0x36 MADCTL
0x3A COLMOD
0x2A/0x2B CASET/RASET
0xB2 PORCTRL
0xB7 GCTRL
0xBB VCOMS
0xC0 LCMCTRL
0xC2/C3/C4 电压设置
0xC6 帧率控制
0xD0 电源控制
0xE0/E1 正负伽马表,各 14 字节
另外:
- 0x2A 设置 0..319
- 0x2B 设置 0..239
- 0x3A = 0x66 表示 18-bit 像素模式
- 0x21、0x29 分别是反色和开显示
这组顺序和本地全志 SDK 的 st7789v.c、st7789v_cpu.c 使用的寄存器族基本一致,只是目标固件采用了针对该 320x240 面板调整过的参数。
相比之下:
- ST7796S 常见初始化包含 F0 C3/F0 96 解锁和多字节 E8 配置,目标中没有。
- ILI9341 常见的是 CF/ED/CB/F7 等电源配置,目标序列也不匹配。
但目前不能确认到具体型号,因为:
LCD_ID:00000000
目标内核虽然执行了 Read32Bit(0x04),但没有读回有效 ID。最终需要修复/确认 SDO 回读、查看 LCD 排线丝印,或用逻辑分析仪读取 0x04/0x09 返回值。离线