您尚未登录。

楼主 # 2026-08-07 21:47:57

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台





离线

楼主 #1 2026-08-07 21:48:10

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

运行的是全志早期的 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




离线

楼主 #2 2026-08-07 21:48:13

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

关于显示屏驱动:

  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 返回值。




离线

楼主 #3 2026-08-07 21:48:18

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

Linux系统如何进入 FEL 烧录模式:

V3S(sun8iw8p1)进入 FEL 的 RTC 参数是:

  RTC 寄存器:0x01c20508
  写入数据:  0x5AA5A55A

  在板端串口 shell 中执行:

  echo "0x01c20508 0x5AA5A55A" > /sys/class/misc/sunxi-reg/rw/write
  sync
  reboot

  重启后主机执行:

  sudo openixcli scan
  sudo openixcli flash -V /opt/s3_v3s_r11_sdk_v1.5/tools/pack/sun8iw8p1_linux_v3s_xinkaipu_menjin_uart0.img

  依据:bootloader/u-boot-2011.09/include/configs/sun8iw8p1_nor.h:107、bootloader/u-boot-2011.09/sunxi_spl/boot0/main/boot0_main.c:94、README.md:134。 boot0 检
  测到该值后会清除标志并跳转 FEL。

原理:

利用 V3S RTC 电源域里的通用寄存器作为“下一次启动模式标志”。

  启动流程大致是:

  系统运行
    |
  写入 RTC GP2 = 0x5AA5A55A
    |
  reboot,CPU 复位
    |
  Boot0 读取 RTC GP2
    |
  值匹配魔数
    |
  清除寄存器
    |
  跳转 FEL 入口 0xFFFF0020
    |
  USB 枚举为 FEL,openixcli 可以烧录

  V3S 的寄存器计算为:

  RTC_BASE = 0x01c20400
  GP2      = RTC_BASE + 0x100 + 2 * 4
           = 0x01c20508

  0x5AA5A55A 是 Allwinner boot0 约定的 FEL magic。RTC 通用寄存器在 CPU 复位后仍能保留值,所以 reboot 后 Boot0 可以看到它。Boot0 检测成功后会立即清零,因此这是一
  次性的,不会导致设备每次都进入 FEL。

  相比 reboot efex 写 misc 分区,这种方式在更早的 Boot0 阶段生效,所以通常更可靠。完全断电后寄存器是否保留则取决于具体 RTC 电源和硬件设计。




离线

楼主 #4 2026-08-07 21:48:21

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

-





离线

楼主 #5 2026-08-07 21:48:24

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

-





离线

楼主 #6 2026-08-07 22:06:25

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

-





离线

楼主 #7 2026-08-07 22:06:30

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

-





离线

#8 2026-08-14 10:16:21

zhaoshaox
会员
注册时间: 2023-04-17
已发帖子: 7
积分: 17

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

晕哥,坐等更新啊:) smile smile smile smile

离线

楼主 #9 2026-08-15 16:18:09

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

  - 新增 UART 二维码接收程序 app/v3s_qr_uart/src/v3s_qr_uart.c
  - 新增开机服务 build/hooks/S45v3s_qr_uart
  - 最多接收 1024 字节,以 30 ms 串口静默作为一条扫码结果的结束
  - 输出文件:
      - /run/v3s_qr/last.raw
      - /run/v3s_qr/last.txt
      - /run/v3s_qr/sequence
      - /tmp/v3s_qr_uart.log

  - 停止加载无效的 H42、VFE、CCI 驱动栈,避免额外内存占用和 OOM
  - 更新中英文 README,说明真实硬件接口和使用方法
  - 主机 PTY 分包与后台服务协同测试通过
  - ARM 程序交叉编译通过,仅依赖目标系统已有的 libc.so.6

  固件已重新构建、进入 FEL、烧录并校验成功:

  - 镜像:tools/pack/sun8iw8p1_linux_v3s_xinkaipu_menjin_uart0.img
  - 大小:31,768,576 字节
  - SHA-256:ac59213c819285dc7d8274afc56a62125c8abcb23e17bbf677ef2a69d967f3f7
  - 烧录结果:Full raw image verified
  - 所有分区烧录成功并自动重启

  板端冷启动验收:

  - /usr/bin/v3s_qr_uart --quiet 正常运行,PID 142
  - /dev/ttyS2:115200、8N1、raw、无软硬流控
  - sequence=0,等待第一次扫码
  - H42/VFE/CCI 均未加载
  - 没有 /dev/video*,符合该硬件设计
  - LCD 驱动初始化成功
  - 无 OOM、kernel panic 或 undefined instruction
  - 当前空闲内存约 17.6 MiB

  真实扫码时使用:

  adb shell 'v3s_qr_uart --once --timeout-ms 30000'

  或查看后台服务保存的结果:

  adb shell 'cat /run/v3s_qr/last.txt'
  adb shell 'cat /run/v3s_qr/sequence'
  adb pull /run/v3s_qr/last.raw

  这次 45 秒真实扫码窗口内没有二维码进入模组视野,所以 sequence 仍为 0;超时和服务协同路径均正常。下次你在机器旁向模组展示二维码即可完成最后的实际载荷确认。

  Git 已提交并推送:

  - 分支:v3s_xinkaipu_menjin
  - 提交:390e7399d3233ef7a18c5101a5bc43082bc30db7
  - 标题:qr: support the Xinkaipu UART decoder
  - 已回读确认远端分支 SHA 与本地完全一致

  工作树中原有的构建库、日志、LCD/诊断工具都保留未提交,没有混入本次提交。

固件下载:sun8iw8p1_linux_v3s_xinkaipu_menjin_uart0.img

二维码放到摄像头前面:

测试方法:
adb shell 'v3s_qr_uart --once --timeout-ms 30000'

查看结果:
adb shell 'cat /run/v3s_qr/last.txt'





离线

楼主 #10 2026-08-16 12:15:56

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

最终确认:门禁机面板是 3×4、共 12 键,不是 4×4,也不是 V3s LRADC 五键。

  ### 实体键映射

   面板丝印     下位机原始值    ccdr 分发值    原厂动作
  ━━━━━━━━━━  ━━━━━━━━━━━━━━━  ━━━━━━━━━━━━━  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   0–9         ASCII '0'–'9'           原值    输入数字;动作由当前窗口决定
  ──────────  ───────────────  ─────────────  ──────────────────────────────
   return         'R' / 0x52           0x85    清除、取消或返回
  ──────────  ───────────────  ─────────────  ──────────────────────────────
   OK             'S' / 0x53           0x83    提交或确认

  物理布局:

  1  2  3  return     -> '1' '2' '3' 'R'
  4  5  6  0          -> '4' '5' '6' '0'
  7  8  9  OK         -> '7' '8' '9' 'S'

  除 '1' 外,其余 11 个原始主值均从原厂 ccdr 内存槽直接捕获。'1' 因槽位被快速清零,只捕获到后续 0xfe 状态值;其 0x31 映射由丝印、其余完整排列以及 ccdr 的连续
  ASCII 数字分支共同确认,没有伪称为直接捕获。

  ### 硬件与软件处理链

  3×4 实体键盘
    -> 外部 Cortex-M 下位控制器扫描、消抖
    -> PB8/PB9 UART
    -> V3s uart0 / IRQ 32
    -> /dev/ttyS1
    -> ccdr fd 13
    -> UartGetKeyProc
    -> 广播 key-down 0x10 + key-up 0x12
    -> MainWindowProc
    -> 当前活动窗口的 0x9f4 / keyProc

  实机证据:

  - 第一行 4 键:IRQ 32 从 2 增到 6。
  - 第二行 4 键:IRQ 32 从 6 增到 10。
  - 第三行 4 键:IRQ 32 从 10 增到 14。
  - 第一列 1 → 4 → 7:IRQ 32 从 14 增到 17。
  - 每次实体操作恰好增加一次 UART IRQ。
  - LRADC IRQ 62 全程保持 0。
  - ccdr 的 fd 13 确认指向 /dev/ttyS1。
  - /dev/ttyS1 -> uart.0 -> IRQ 32 -> PB8/PB9。

  因此 /dev/input/event0 的 MENU/MODE/UP/DOWN/OK 五档 LRADC 只是原厂 V3s 的另一套通用输入能力,不是这块 12 键面板的来源。U/V/X/x/0xfe 也是协议或内部状态值,不是
  额外四个实体键。

  ### 原厂界面动作

  主界面:

  - 数字键:追加到当前数字或 ID 输入缓冲区。
  - OK:提交/确认当前输入,再根据状态查询记录或构造协议。
  - return:根据状态清除输入、取消当前流程或返回上一级。

  菜单:

  - 2:向上移动选择。
  - 8:向下移动选择。
  - OK:执行当前选中项。
  - return:退出、取消或返回。

  具体数字键动作仍由当前活动窗口决定,并非所有窗口都完全相同。

  ### 可修改位置

  若后续真正修改按键功能,最小切入点是:

  - 键值重映射:UartGetKeyProc 的 0x205b4..0x20686
  - 所有窗口的统一分发:0x21384 -> 0x21356
  - 主界面动作:0x22d80
  - 菜单 wrapper:0x1d5fc
  - 菜单 2/8 导航:0x1487c
  - 下位控制器扫描/消抖:zhongkong.bin,但具体 3×4 GPIO 编号尚未可靠恢复,不建议直接修改通用 8 路扫描函数

  本轮没有把任何按键补丁写入 SPI NOR。

  ### 文档与设备状态

  已更新:

  - firmware_backup/README.md:76
  - firmware_backup/20260807_20171020_QRDecode/metadata/button-handling.md:1
  - tools/arm_key_mem_poll.S:1

  验证结果:

  - git diff --check 通过。
  - 只读采集器重新汇编为 ARM EABI5 ELF 成功。
  - 原厂整片 SPI NOR 已恢复并逐字节回读校验。
  - 当前仍运行原厂 NCAP1710C、Linux 3.4.39 #801、/data/ccdr。
  - 门禁机 /dev 中的临时采集器和日志已全部删除。
  - Ubuntu 提示音已改为明确绑定内置扬声器节点,后续测试已由你确认能听到。
• ccdr 是门禁机原厂固件里的主业务程序,路径是 /data/ccdr,不是驱动。

  它负责:

  - /dev/ttyS1:读取 3×4 键盘
  - /dev/ttyS2:读取串口二维码头
  - MiniGUI 界面和门禁业务逻辑
  - 喂硬件看门狗




离线

楼主 #11 2026-08-16 22:23:52

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台

f951_tools_20260816A.tar

通过 调试串口 传输文件:

cd /opt/hardware_hack/v3s_xinkaipu_menjin
  python3 tools/serial_shell_push.py \
    tools/serial_qr_keypad_test.arm \
    /dev/serial_qr_keypad_test
ubuntu@ubuntu-air6:/opt/hardware_hack/v3s_xinkaipu_menjin$   cd /opt/hardware_hack/v3s_xinkaipu_menjin
  python3 tools/serial_shell_push.py \
    tools/serial_qr_keypad_test.arm \
    /dev/serial_qr_keypad_test

sent 2400/5491 compressed bytes
sent 4800/5491 compressed bytes
sent 5491/5491 compressed bytes
pushed 9388 bytes to /dev/serial_qr_keypad_test; gzip CRC and size OK
ubuntu@ubuntu-air6:/opt/hardware_hack/v3s_xinkaipu_menjin$ 

通过串口进入终端:

root@camdroid:/ # 
root@camdroid:/ # 
root@camdroid:/ # /dev/serial_qr_keypad_test --takeover-ccdr --duration 600    
serial_qr_keypad_test starting
[mono 1516.562] TAKEOVER requested: stopping ccdr now
[ 1516.736586] init: service 'ccdr' is being killed
[mono 1516.742] stop ccdr: OK
[ 1516.745430] sunxi_wdt_release: unexpected close, not stopping watchdog!
[ 1516.753142] wdt_set_tmout, write 0x00000031 to mode reg 0xf1c20cb8, actual timeout 3 sec
[ 1516.762383] wdt_enable, write reg 0xf1c20cb8 val 0x00000031
[ 1516.769236] init: waitpid returned pid 249, status = 00000009
[ 1516.775936] init: process 'ccdr', pid 249 exited
[ 1516.781226] wdt_set_tmout, write 0x00000031 to mode reg 0xf1c20cb8, actual timeout 3 sec
[mono 1516.790] watchdog ACTIVE: timeout=3s feed_interval=1000ms fd=3
[mono 1516.790] opened /dev/ttyS1 at 115200 8N1, fd=4
[mono 1516.791] opened /dev/ttyS2 at 115200 8N1, fd=5
[mono 1516.791] READY: keypad + QR capture active; Ctrl-C restores ccdr
[mono 1519.385] KEYPAD frame checksum=OK len=4 HEX=03 01 FE 02 ASCII="\x03\x01\xFE\x02"
[mono 1519.386] KEY event: raw=0xFE name=status/release (FE)
[mono 1521.353] KEYPAD frame checksum=OK len=4 HEX=03 01 34 38 ASCII="\x03\x0148"
[mono 1521.353] KEY event: raw=0x34 name=4
[mono 1522.105] KEYPAD frame checksum=OK len=4 HEX=03 01 37 3B ASCII="\x03\x017;"
[mono 1522.105] KEY event: raw=0x37 name=7

[mono 1556.854] QR raw len=32 HEX=68 74 74 70 73 3A 2F 2F 75 2E 77 65 63 68 61 74 2E 63 6F 6D 2F 4D 41 33 44 68 57 51 39 36 4C 5F ASCII="https://u.wechat.com/MA3DhWQ96L_"
[mono 1556.855] QR raw len=17 HEX=6A 56 34 6E 51 30 62 6F 6E 50 67 4D 3F 73 3D 34 0D ASCII="jV4nQ0bonPgM?s=4\r"
[mono 1556.856] QR frame end=CR len=48 HEX=68 74 74 70 73 3A 2F 2F 75 2E 77 65 63 68 61 74 2E 63 6F 6D 2F 4D 41 33 44 68 57 51 39 36 4C 5F 6A 56 34 6E 51 30 62 6F 6E 50 67 4D 3F 73 3D 34 ASCII="https://u.wechat.com/MA3DhWQ96L_jV4nQ0bonPgM?s=4"




离线

楼主 #12 2026-08-17 10:48:30

晕哥
管理员
所在地: wechat: whycan_cn
注册时间: 2017-09-06
已发帖子: 9,511
积分: 9207

Re: 感谢 本站网友 @zhaoshaox 友情赠送的 V3s方案 新开普 F951 门禁机一台





离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发