summaryrefslogtreecommitdiff
path: root/utils/hwstub/tools/lua
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwstub/tools/lua')
-rw-r--r--utils/hwstub/tools/lua/atj.lua3
-rw-r--r--utils/hwstub/tools/lua/atj/gpio.lua65
-rw-r--r--utils/hwstub/tools/lua/atj/lcm.lua31
-rw-r--r--utils/hwstub/tools/lua/irivere150.lua116
4 files changed, 214 insertions, 1 deletions
diff --git a/utils/hwstub/tools/lua/atj.lua b/utils/hwstub/tools/lua/atj.lua
index de725f4a5d..1f59a141fc 100644
--- a/utils/hwstub/tools/lua/atj.lua
+++ b/utils/hwstub/tools/lua/atj.lua
@@ -5,4 +5,5 @@
5ATJ = {} 5ATJ = {}
6 6
7hwstub.soc:select("atj213x") 7hwstub.soc:select("atj213x")
8 8require "atj/gpio"
9require "atj/lcm"
diff --git a/utils/hwstub/tools/lua/atj/gpio.lua b/utils/hwstub/tools/lua/atj/gpio.lua
new file mode 100644
index 0000000000..970d271187
--- /dev/null
+++ b/utils/hwstub/tools/lua/atj/gpio.lua
@@ -0,0 +1,65 @@
1ATJ.gpio = {}
2
3function ATJ.gpio.muxsel(dev)
4 if type(dev) == "string" then
5 if dev == "LCM" then dev = 0
6 elseif dev == "SD" then dev = 1
7 elseif dev == "NAND" then dev = 2
8 else error("Invalid mux string " .. dev)
9 end
10 end
11
12 local mfctl0 = HW.GPIO.MFCTL0.read()
13 if dev == 0 then
14 -- LCM (taken from WELCOME.BIN)
15 mfctl0 = bit32.band(mfctl0, 0xfe3f3f00)
16 mfctl0 = bit32.bor(mfctl0, 0x00808092)
17 elseif dev == 1 then
18 -- SD (taken from CARD.DRV)
19 mfctl0 = bit32.band(mfctl0, 0xff3ffffc)
20 mfctl0 = bit32.bor(mfctl0, 0x01300004)
21 elseif dev == 2 then
22 -- NAND (taken from BROM dump)
23 mfctl0 = bit32.band(mfctl0, 0xfe3ff300)
24 mfctl0 = bit32.bor(mfctl0, 0x00400449)
25 end
26
27 -- enable multifunction mux
28 HW.GPIO.MFCTL1.write(0x80000000)
29
30 -- write multifunction mux selection
31 HW.GPIO.MFCTL0.write(mfctl0)
32end
33
34function ATJ.gpio.outen(port, pin, en)
35 if type(port) == "string" then
36 if port == "PORTA" then
37 HW.GPIO.AOUTEN.write(bit32.replace(HW.GPIO.AOUTEN.read(), en, pin, 1))
38 elseif port == "PORTB" then
39 HW.GPIO.BOUTEN.write(bit32.replace(HW.GPIO.BOUTEN.read(), en, pin, 1))
40 else error("Invalid port string " .. port)
41 end
42 end
43end
44
45function ATJ.gpio.inen(port, pin)
46 if type(port) == "string" then
47 if port == "PORTA" then
48 HW.GPIO.AINEN.write(bit32.replace(HW.GPIO.AINEN.read(), en, pin, 1))
49 elseif port == "PORTB" then
50 HW.GPIO.BINEN.write(bit32.replace(HW.GPIO.BINEN.read(), en, pin, 1))
51 else error("Invalid port string " .. port)
52 end
53 end
54end
55
56function ATJ.gpio.set(port, pin, val)
57 if type(port) == "string" then
58 if port == "PORTA" then
59 HW.GPIO.ADAT.write(bit32.replace(HW.GPIO.ADAT.read(), val, pin, 1))
60 elseif port == "PORTB" then
61 HW.GPIO.BDAT.write(bit32.replace(HW.GPIO.BDAT.read(), val, pin, 1))
62 else error("Invalid port string " .. port)
63 end
64 end
65end
diff --git a/utils/hwstub/tools/lua/atj/lcm.lua b/utils/hwstub/tools/lua/atj/lcm.lua
new file mode 100644
index 0000000000..feaa8b7158
--- /dev/null
+++ b/utils/hwstub/tools/lua/atj/lcm.lua
@@ -0,0 +1,31 @@
1ATJ.lcm = {}
2
3function ATJ.lcm.wait_fifo_empty()
4 while (bit32.band(HW.YUV2RGB.CTL.read(), 0x04) == 0) do
5 end
6end
7
8function ATJ.lcm.rs_command()
9 ATJ.lcm.wait_fifo_empty()
10 HW.YUV2RGB.CTL.write(0x802ae)
11end
12
13function ATJ.lcm.rs_data()
14 ATJ.lcm.wait_fifo_empty()
15 HW.YUV2RGB.CTL.write(0x902ae)
16end
17
18function ATJ.lcm.fb_data()
19 ATJ.lcm.rs_command()
20 HW.YUV2RGB.FIFODATA.write(0x22)
21 HW.YUV2RGB.CTL.write(0xa02ae)
22end
23
24function ATJ.lcm.init()
25 HW.CMU.DEVCLKEN.write(bit32.bor(HW.CMU.DEVCLKEN.read(), 0x102))
26 ATJ.gpio.muxsel("LCM")
27 hwstub.udelay(1)
28 ATJ.lcm.rs_command()
29 HW.YUV2RGB.CLKCTL.write(0x102)
30end
31
diff --git a/utils/hwstub/tools/lua/irivere150.lua b/utils/hwstub/tools/lua/irivere150.lua
new file mode 100644
index 0000000000..e5a0d26686
--- /dev/null
+++ b/utils/hwstub/tools/lua/irivere150.lua
@@ -0,0 +1,116 @@
1E150 = {}
2
3function E150.lcd_reg_write(reg, val)
4 ATJ.lcm.rs_command()
5 HW.YUV2RGB.FIFODATA.write(reg)
6 ATJ.lcm.rs_data()
7 HW.YUV2RGB.FIFODATA.write(val)
8end
9
10function E150.lcd_init()
11 ATJ.lcm.init()
12
13 ATJ.gpio.outen("PORTA", 16, 1)
14 ATJ.gpio.set("PORTA", 16 , 1)
15 hwstub.mdelay(10)
16 ATJ.gpio.set("PORTA", 16, 0)
17 hwstub.mdelay(10)
18 ATJ.gpio.set("PORTA", 16, 1)
19 hwstub.mdelay(10)
20
21 -- lcd controller init sequence matching HX8347-D
22 E150.lcd_reg_write(0xea, 0x00)
23 E150.lcd_reg_write(0xeb, 0x20)
24 E150.lcd_reg_write(0xec, 0x0f)
25 E150.lcd_reg_write(0xed, 0xc4)
26 E150.lcd_reg_write(0xe8, 0xc4)
27 E150.lcd_reg_write(0xe9, 0xc4)
28 E150.lcd_reg_write(0xf1, 0xc4)
29 E150.lcd_reg_write(0xf2, 0xc4)
30 E150.lcd_reg_write(0x27, 0xc4)
31 E150.lcd_reg_write(0x40, 0x00) -- gamma block start
32 E150.lcd_reg_write(0x41, 0x00)
33 E150.lcd_reg_write(0x42, 0x01)
34 E150.lcd_reg_write(0x43, 0x13)
35 E150.lcd_reg_write(0x44, 0x10)
36 E150.lcd_reg_write(0x45, 0x26)
37 E150.lcd_reg_write(0x46, 0x08)
38 E150.lcd_reg_write(0x47, 0x51)
39 E150.lcd_reg_write(0x48, 0x02)
40 E150.lcd_reg_write(0x49, 0x12)
41 E150.lcd_reg_write(0x4a, 0x18)
42 E150.lcd_reg_write(0x4b, 0x19)
43 E150.lcd_reg_write(0x4c, 0x14)
44 E150.lcd_reg_write(0x50, 0x19)
45 E150.lcd_reg_write(0x51, 0x2f)
46 E150.lcd_reg_write(0x52, 0x2c)
47 E150.lcd_reg_write(0x53, 0x3e)
48 E150.lcd_reg_write(0x54, 0x3f)
49 E150.lcd_reg_write(0x55, 0x3f)
50 E150.lcd_reg_write(0x56, 0x2e)
51 E150.lcd_reg_write(0x57, 0x77)
52 E150.lcd_reg_write(0x58, 0x0b)
53 E150.lcd_reg_write(0x59, 0x06)
54 E150.lcd_reg_write(0x5a, 0x07)
55 E150.lcd_reg_write(0x5b, 0x0d)
56 E150.lcd_reg_write(0x5c, 0x1d)
57 E150.lcd_reg_write(0x5d, 0xcc) -- gamma block end
58 E150.lcd_reg_write(0x1b, 0x1b)
59 E150.lcd_reg_write(0x1a, 0x01)
60 E150.lcd_reg_write(0x24, 0x2f)
61 E150.lcd_reg_write(0x25, 0x57)
62 E150.lcd_reg_write(0x23, 0x86)
63 E150.lcd_reg_write(0x18, 0x36) -- 70Hz framerate
64 E150.lcd_reg_write(0x19, 0x01) -- osc enable
65 E150.lcd_reg_write(0x01, 0x00)
66 E150.lcd_reg_write(0x1f, 0x88)
67 hwstub.mdelay(5)
68 E150.lcd_reg_write(0x1f, 0x80)
69 hwstub.mdelay(5)
70 E150.lcd_reg_write(0x1f, 0x90)
71 hwstub.mdelay(5)
72 E150.lcd_reg_write(0x1f, 0xd0)
73 hwstub.mdelay(5)
74 E150.lcd_reg_write(0x17, 0x05) -- 16bpp
75 E150.lcd_reg_write(0x36, 0x00)
76 E150.lcd_reg_write(0x28, 0x38)
77 hwstub.mdelay(40)
78 E150.lcd_reg_write(0x28, 0x3c)
79
80 E150.lcd_reg_write(0x02, 0x00) -- column start MSB
81 E150.lcd_reg_write(0x03, 0x00) -- column start LSB
82 E150.lcd_reg_write(0x04, 0x00) -- column end MSB
83 E150.lcd_reg_write(0x05, 0xef) -- column end LSB
84 E150.lcd_reg_write(0x06, 0x00) -- row start MSB
85 E150.lcd_reg_write(0x07, 0x00) -- row start LSB
86 E150.lcd_reg_write(0x08, 0x01) -- row end MSB
87 E150.lcd_reg_write(0x09, 0x3f) -- row end LSB
88
89 ATJ.lcm.fb_data() -- prepare for write to fifo
90
91 -- clear lcd gram
92 for y=0, 319 do
93 for x=0, 239/2 do
94 HW.YUV2RGB.FIFODATA.write(0)
95 end
96 end
97
98end
99
100function E150.set_backlight(val)
101 local fmclk = HW.CMU.FMCLK.read()
102 fmclk = bit32.band(fmclk, bit32.bnot(0x1c))
103 fmclk = bit32.bor(fmclk, 0x22)
104 HW.CMU.FMCLK.write(fmclk)
105
106 HW.PMU.CTL.write(bit32.bor(HW.PMU.CTL.read(), 0x8000))
107 local chg = HW.PMU.CHG.read()
108 chg = bit32.band(chg, bit32.bnot(0x1f00))
109 chg = bit32.bor(chg, bit32.bor(0xc000, bit32.lshift(val, 8)))
110 HW.PMU.CHG.write(chg)
111end
112
113function E150.init()
114 E150.lcd_init()
115 E150.set_backlight(24);
116end