4fd9400458
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
145 lines
3.4 KiB
Lua
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
|