diff options
Diffstat (limited to 'utils/hwstub/tools/lua/fiiox1.lua')
-rw-r--r-- | utils/hwstub/tools/lua/fiiox1.lua | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/utils/hwstub/tools/lua/fiiox1.lua b/utils/hwstub/tools/lua/fiiox1.lua new file mode 100644 index 0000000000..c038f4077b --- /dev/null +++ b/utils/hwstub/tools/lua/fiiox1.lua @@ -0,0 +1,145 @@ +-- +-- Fiio X1 +-- +FIIOX1 = {} + +-- 0 is PF3, 1 is PE1 +function FIIOX1.get_backlight_type() + return FIIOX1.bl_type +end + +-- 0 is V2, 1 is V1 +function FIIOX1.get_hw_type() + return FIIOX1.hw_type +end + +function FIIOX1.hw_detect() + -- PA12 is used to detect hardware version + JZ.gpio.pin(0, 12).std_gpio_out(1) + FIIOX1.hw_type = JZ.gpio.pin(0, 12).read() + -- PA13 is used to detect backlight type + JZ.gpio.pin(0, 13).std_gpio_out(1) + FIIOX1.bl_type = JZ.gpio.pin(0, 13).read() + + if FIIOX1.hw_type == 1 then + print("Fiio X1: hardware version: V01") + else + print("Fiio X1: hardware version: V02") + end + print(string.format("Fiio X1: backlight type: %s", FIIOX1.bl_type)) +end + +function FIIOX1.get_backlight_pin() + if FIIOX1.get_backlight_type() == 0 then + -- PF3 + return JZ.gpio.pin(5, 3) + else + -- PE1 + return JZ.gpio.pin(4, 1) + end +end + +function FIIOX1.init_backligt() + -- setup as output, high level to make no change + FIIOX1.get_backlight_pin().std_gpio_out(1) +end + +function FIIOX1.enable_backlight(en) + local pin = FIIOX1.get_backlight_pin() + pin.clr() + hwstub.mdelay(1) + if en then + pin.set() + end +end + +function FIIOX1.test_backlight() + print("backlight test") + print("enable backlight") + FIIOX1.enable_backlight(true) + print("sleep for 1 sec") + hwstub.mdelay(1000) + print("disable backlight") + FIIOX1.enable_backlight(false) + print("sleep for 1 sec") + hwstub.mdelay(1000) + print("enable backlight") + FIIOX1.enable_backlight(true) +end + +function FIIOX1.setup_fiio_lcd_pins() + -- PE4: reset pin + JZ.gpio.pin(4, 4).std_gpio_out(1) + -- PC9: unknown + JZ.gpio.pin(2, 9).std_gpio_out(0) + -- PC2: unknown + JZ.gpio.pin(2, 2).std_gpio_out(1) + -- PF0: unknown + JZ.gpio.pin(5, 0).std_gpio_out(1) +end + +function FIIOX1.lcd_reset() + local pin = JZ.gpio.pin(4, 4) + pin.set() + hwstub.mdelay(50) + pin.clr() + hwstub.mdelay(50) + pin.set() + hwstub.mdelay(150) +end + +function FIIOX1.init_lcd() + -- setup Fiio X1 specific pins + FIIOX1.setup_fiio_lcd_pins() + -- reset lcd + JZ.lcd_reset() +end + +-- call with nil to get automatic name +function FIIOX1.dump_ipl(file) + FIIOX1.hw_detect() + if file == nil then + file = "fiiox1_ipl_hw_v" .. FIIOX1.hw_type .. ".bin" + end + print("Dumping IPL to " .. file .." ...") + JZ.nand.rom.init() + JZ.nand.rom.read_flags() + local ipl = JZ.nand.rom.read_bootloader() + JZ.nand.rom.write_to_file(file, ipl) +end + +-- call with nil to get automatic name +function FIIOX1.dump_spl(file) + FIIOX1.hw_detect() + if file == nil then + file = "fiiox1_spl_hw_v" .. FIIOX1.hw_type .. ".bin" + end + print("Dumping SPL to " .. file .." ...") + -- hardcoded parameters are specific to the Fiio X1 + local nand_params = { + bus_width = 16, + row_cycle = 2, + col_cycle = 2, + page_size = 2048, + page_per_block = 64, + oob_size = 64, + badblock_pos = 0, + badblock_page = 0, + ecc_pos = 4, + ecc_size = 13, + ecc_level = 8, + addr_setup_time = 4, + addr_hold_time = 4, + write_strobe_time = 4, + read_strobe_time = 4, + recovery_time = 13, + } + local spl = JZ.nand.rom.read_spl(nand_params, 0x400, 0x200) + JZ.nand.rom.write_to_file(file, spl) +end + +function FIIOX1.init() + FIIOX1.init_backligt() + FIIOX1.test_backlight() + FIIOX1.init_lcd() +end |