rockbox/utils/hwstub/tools/lua/fiiox1.lua
Amaury Pouly 4fd9400458 hwstub/tools/shell: add JZ4760B and Fiio X1 code
The jz code can do several useful things like dumping the IPL and SPL.
The Fiio code can play with backlight and has code do dump the IPL
and SPL with the correct parameters (extracted by reverse engineering).

Change-Id: I317b3174f5db8d38c9a56670c1d45565142ec208
2017-01-24 15:17:46 +01:00

145 lines
3.4 KiB
Lua

--
-- 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