summaryrefslogtreecommitdiff
path: root/utils/hwstub/tools/lua/fiiox1.lua
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwstub/tools/lua/fiiox1.lua')
-rw-r--r--utils/hwstub/tools/lua/fiiox1.lua145
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