Test Display Driver Locally

This commit is contained in:
Lee Lup Yuen 2022-12-08 20:38:24 +08:00
parent dfc136d393
commit 4f99a2433b
9 changed files with 1816 additions and 0 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
zig-cache
*.o
test/test

11
test/arm64_arch.h Normal file
View file

@ -0,0 +1,11 @@
/// Modify the specified bits in a memory mapped register.
/// Based on https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_arch.h#L473
void modreg32(
uint32_t val, // Bits to set, like (1 << bit)
uint32_t mask, // Bits to clear, like (1 << bit)
unsigned long addr // Address to modify
);
uint32_t getreg32(unsigned long addr);
void putreg32(uint32_t data, unsigned long addr);

2
test/debug.h Normal file
View file

@ -0,0 +1,2 @@
#define _err printf
#define _info printf

734
test/expected.log Normal file
View file

@ -0,0 +1,734 @@
nsh> hello 3
task_spawn: name=hello entry=0x4009b4f8 file_actions=0x40a80580 attr=0x40a80588 argv=0x40a806d0
spawn_execattrs: Setting policy=2 priority=100 for pid=3
ABHello, World!!
pd_cfg2_reg=0x77711177
pd_data_reg=0x1c0000
test_render: start, channels=3
backlight_enable: start, percent=90
Configure PL10 for PWM
*0x1f02c04: clear 0x700, set 0x200
*0x1f02c04 = 0x77277
Disable R_PWM
*0x1f03800: clear 0x40, set 0x0
*0x1f03800 = 0x0
Configure R_PWM Period
*0x1f03804 = 0x4af0437
Enable R_PWM
*0x1f03800 = 0x5f
Configure PH10 for Output
*0x1c20900: clear 0x700, set 0x100
*0x1c20900 = 0x7177
Set PH10 to High
*0x1c2090c: clear 0x400, set 0x400
*0x1c2090c = 0x400
backlight_enable: end
tcon0_init: start
Configure PLL_VIDEO0
*0x1c20010 = 0x81006207
Enable LDO1 and LDO2
*0x1c20040 = 0xc00000
Configure MIPI PLL
*0x1c20040 = 0x80c0071a
Set TCON0 Clock Source to MIPI PLL
*0x1c20118 = 0x80000000
Enable TCON0 Clock
*0x1c20064 = 0x8
Deassert TCON0 Reset
*0x1c202c4 = 0x8
Disable TCON0 and Interrupts
*0x1c0c000 = 0x0
*0x1c0c004 = 0x0
*0x1c0c008 = 0x0
Enable Tristate Output
*0x1c0c08c = 0xffffffff
*0x1c0c0f4 = 0xffffffff
Set DCLK to MIPI PLL / 6
*0x1c0c044 = 0x80000006
*0x1c0c040 = 0x81000000
*0x1c0c048 = 0x2cf059f
*0x1c0c0f8 = 0x8
*0x1c0c060 = 0x10010005
Set CPU Panel Trigger
*0x1c0c160 = 0x2f02cf
*0x1c0c164 = 0x59f
*0x1c0c168 = 0x1bc2000a
Set Safe Period
*0x1c0c1f0 = 0xbb80003
Enable Output Triggers
*0x1c0c08c = 0xe0000000
Enable TCON0
*0x1c0c000: clear 0x80000000, set 0x80000000
*0x1c0c000 = 0x80000000
tcon0_init: end
display_board_init: start
Configure PD23 for Output
*0x1c20874: clear 0x70000000, set 0x10000000
*0x1c20874 = 0x17711177
Set PD23 to Low
*0x1c2087c: clear 0x800000, set 0x0
*0x1c2087c = 0x1c0000
Set DLDO1 Voltage to 3.3V
pmic_write: reg=0x15, val=0x1a
rsb_write: rt_addr=0x2d, reg_addr=0x15, value=0x1a
*0x1f0342c = 0x4e
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x15
*0x1f0341c = 0x1a
*0x1f03400 = 0x80
pmic_clrsetbits: reg=0x12, clr_mask=0x0, set_mask=0x8
rsb_read: rt_addr=0x2d, reg_addr=0x12
*0x1f0342c = 0x8b
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x12
*0x1f03400 = 0x80
rsb_write: rt_addr=0x2d, reg_addr=0x12, value=0xd9
*0x1f0342c = 0x4e
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x12
*0x1f0341c = 0xd9
*0x1f03400 = 0x80
Set LDO Voltage to 3.3V
pmic_write: reg=0x91, val=0x1a
rsb_write: rt_addr=0x2d, reg_addr=0x91, value=0x1a
*0x1f0342c = 0x4e
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x91
*0x1f0341c = 0x1a
*0x1f03400 = 0x80
Enable LDO mode on GPIO0
pmic_write: reg=0x90, val=0x3
rsb_write: rt_addr=0x2d, reg_addr=0x90, value=0x3
*0x1f0342c = 0x4e
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x90
*0x1f0341c = 0x3
*0x1f03400 = 0x80
Set DLDO2 Voltage to 1.8V
pmic_write: reg=0x16, val=0xb
rsb_write: rt_addr=0x2d, reg_addr=0x16, value=0xb
*0x1f0342c = 0x4e
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x16
*0x1f0341c = 0xb
*0x1f03400 = 0x80
pmic_clrsetbits: reg=0x12, clr_mask=0x0, set_mask=0x10
rsb_read: rt_addr=0x2d, reg_addr=0x12
*0x1f0342c = 0x8b
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x12
*0x1f03400 = 0x80
rsb_write: rt_addr=0x2d, reg_addr=0x12, value=0xd9
*0x1f0342c = 0x4e
*0x1f03430 = 0x2d0000
*0x1f03410 = 0x12
*0x1f0341c = 0xd9
*0x1f03400 = 0x80
Wait for power supply and power-on init
display_board_init: end
enable_dsi_block: start
Enable MIPI DSI Bus
*0x1c20060: clear 0x2, set 0x2
*0x1c20060 = 0x4742
*0x1c202c0: clear 0x2, set 0x2
*0x1c202c0 = 0x4742
Enable DSI Block
*0x1ca0000 = 0x1
*0x1ca0010 = 0x30000
*0x1ca0060 = 0xa
*0x1ca0078 = 0x0
Set Instructions
*0x1ca0020 = 0x1f
*0x1ca0024 = 0x10000001
*0x1ca0028 = 0x20000010
*0x1ca002c = 0x2000000f
*0x1ca0030 = 0x30100001
*0x1ca0034 = 0x40000010
*0x1ca0038 = 0xf
*0x1ca003c = 0x5000001f
Configure Jump Instructions
*0x1ca004c = 0x560001
*0x1ca02f8 = 0xff
Set Video Start Delay
*0x1ca0014 = 0x5bc7
Set Burst
*0x1ca007c = 0x10000007
Set Instruction Loop
*0x1ca0040 = 0x30000002
*0x1ca0044 = 0x310031
*0x1ca0054 = 0x310031
Set Pixel Format
*0x1ca0090 = 0x1308703e
*0x1ca0098 = 0xffff
*0x1ca009c = 0xffffffff
*0x1ca0080 = 0x10008
Set Sync Timings
*0x1ca000c = 0x0
*0x1ca00b0 = 0x12000021
*0x1ca00b4 = 0x1000031
*0x1ca00b8 = 0x7000001
*0x1ca00bc = 0x14000011
Set Basic Size
*0x1ca0018 = 0x11000a
*0x1ca001c = 0x5cd05a0
Set Horizontal Blanking
*0x1ca00c0 = 0x9004a19
*0x1ca00c4 = 0x50b40000
*0x1ca00c8 = 0x35005419
*0x1ca00cc = 0x757a0000
*0x1ca00d0 = 0x9004a19
*0x1ca00d4 = 0x50b40000
*0x1ca00e0 = 0xc091a19
*0x1ca00e4 = 0x72bd0000
Set Vertical Blanking
*0x1ca00e8 = 0x1a000019
*0x1ca00ec = 0xffff0000
enable_dsi_block: end
dphy_enable: start
Set DSI Clock to 150 MHz
*0x1c20168 = 0x8203
Power on DPHY Tx
*0x1ca1004 = 0x10000000
*0x1ca1010 = 0xa06000e
*0x1ca1014 = 0xa033207
*0x1ca1018 = 0x1e
*0x1ca101c = 0x0
*0x1ca1020 = 0x303
Enable DPHY
*0x1ca1000 = 0x31
*0x1ca104c = 0x9f007f00
*0x1ca1050 = 0x17000000
*0x1ca105c = 0x1f01555
*0x1ca1054 = 0x2
Enable LDOR, LDOC, LDOD
*0x1ca1058 = 0x3040000
*0x1ca1058: clear 0xf8000000, set 0xf8000000
*0x1ca1058 = 0xfb040000
*0x1ca1058: clear 0x4000000, set 0x4000000
*0x1ca1058 = 0xff040000
*0x1ca1054: clear 0x10, set 0x10
*0x1ca1054 = 0x12
*0x1ca1050: clear 0x80000000, set 0x80000000
*0x1ca1050 = 0x97000000
*0x1ca1054: clear 0xf000000, set 0xf000000
*0x1ca1054 = 0xf000012
dphy_enable: end
panel_reset: start
Configure PD23 for Output
*0x1c20874: clear 0x70000000, set 0x10000000
*0x1c20874 = 0x17711177
Set PD23 to High
*0x1c2087c: clear 0x800000, set 0x800000
*0x1c2087c = 0x9c0000
wait for initialization
panel_reset: end
panel_init: start
writeDcs: len=4
b9 f1 12 83
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=4
composeLongPacket: channel=0, cmd=0x39, len=4
packet: len=10
39 04 00 2c b9 f1 12 83
84 5d
*0x1ca0300: clear 0xffffffff, set 0x2c000439
*0x1ca0304: clear 0xffffffff, set 0x8312f1b9
*0x1ca0308: clear 0xffffffff, set 0x5d84
*0x1ca0200: clear 0xff, set 0x9
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=28
ba 33 81 05 f9 0e 0e 20
00 00 00 00 00 00 00 44
25 00 91 0a 00 00 02 4f
11 00 00 37
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=28
composeLongPacket: channel=0, cmd=0x39, len=28
packet: len=34
39 1c 00 2f ba 33 81 05
f9 0e 0e 20 00 00 00 00
00 00 00 44 25 00 91 0a
00 00 02 4f 11 00 00 37
2c e2
*0x1ca0300: clear 0xffffffff, set 0x2f001c39
*0x1ca0304: clear 0xffffffff, set 0x58133ba
*0x1ca0308: clear 0xffffffff, set 0x200e0ef9
*0x1ca030c: clear 0xffffffff, set 0x0
*0x1ca0310: clear 0xffffffff, set 0x44000000
*0x1ca0314: clear 0xffffffff, set 0xa910025
*0x1ca0318: clear 0xffffffff, set 0x4f020000
*0x1ca031c: clear 0xffffffff, set 0x37000011
*0x1ca0320: clear 0xffffffff, set 0xe22c
*0x1ca0200: clear 0xff, set 0x21
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=5
b8 25 22 20 03
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=5
composeLongPacket: channel=0, cmd=0x39, len=5
packet: len=11
39 05 00 36 b8 25 22 20
03 03 72
*0x1ca0300: clear 0xffffffff, set 0x36000539
*0x1ca0304: clear 0xffffffff, set 0x202225b8
*0x1ca0308: clear 0xffffffff, set 0x720303
*0x1ca0200: clear 0xff, set 0xa
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=11
b3 10 10 05 05 03 ff 00
00 00 00
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=11
composeLongPacket: channel=0, cmd=0x39, len=11
packet: len=17
39 0b 00 2c b3 10 10 05
05 03 ff 00 00 00 00 6f
bc
*0x1ca0300: clear 0xffffffff, set 0x2c000b39
*0x1ca0304: clear 0xffffffff, set 0x51010b3
*0x1ca0308: clear 0xffffffff, set 0xff0305
*0x1ca030c: clear 0xffffffff, set 0x6f000000
*0x1ca0310: clear 0xffffffff, set 0xbc
*0x1ca0200: clear 0xff, set 0x10
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=10
c0 73 73 50 50 00 c0 08
70 00
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=10
composeLongPacket: channel=0, cmd=0x39, len=10
packet: len=16
39 0a 00 36 c0 73 73 50
50 00 c0 08 70 00 1b 6a
*0x1ca0300: clear 0xffffffff, set 0x36000a39
*0x1ca0304: clear 0xffffffff, set 0x507373c0
*0x1ca0308: clear 0xffffffff, set 0x8c00050
*0x1ca030c: clear 0xffffffff, set 0x6a1b0070
*0x1ca0200: clear 0xff, set 0xf
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=2
bc 4e
mipi_dsi_dcs_write: channel=0, cmd=0x15, len=2
composeShortPacket: channel=0, cmd=0x15, len=2
packet: len=4
15 bc 4e 35
*0x1ca0300: clear 0xffffffff, set 0x354ebc15
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=2
cc 0b
mipi_dsi_dcs_write: channel=0, cmd=0x15, len=2
composeShortPacket: channel=0, cmd=0x15, len=2
packet: len=4
15 cc 0b 22
*0x1ca0300: clear 0xffffffff, set 0x220bcc15
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=2
b4 80
mipi_dsi_dcs_write: channel=0, cmd=0x15, len=2
composeShortPacket: channel=0, cmd=0x15, len=2
packet: len=4
15 b4 80 22
*0x1ca0300: clear 0xffffffff, set 0x2280b415
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=4
b2 f0 12 f0
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=4
composeLongPacket: channel=0, cmd=0x39, len=4
packet: len=10
39 04 00 2c b2 f0 12 f0
51 86
*0x1ca0300: clear 0xffffffff, set 0x2c000439
*0x1ca0304: clear 0xffffffff, set 0xf012f0b2
*0x1ca0308: clear 0xffffffff, set 0x8651
*0x1ca0200: clear 0xff, set 0x9
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=15
e3 00 00 0b 0b 10 10 00
00 00 00 ff 00 c0 10
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=15
composeLongPacket: channel=0, cmd=0x39, len=15
packet: len=21
39 0f 00 0f e3 00 00 0b
0b 10 10 00 00 00 00 ff
00 c0 10 36 0f
*0x1ca0300: clear 0xffffffff, set 0xf000f39
*0x1ca0304: clear 0xffffffff, set 0xb0000e3
*0x1ca0308: clear 0xffffffff, set 0x10100b
*0x1ca030c: clear 0xffffffff, set 0xff000000
*0x1ca0310: clear 0xffffffff, set 0x3610c000
*0x1ca0314: clear 0xffffffff, set 0xf
*0x1ca0200: clear 0xff, set 0x14
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=6
c6 01 00 ff ff 00
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=6
composeLongPacket: channel=0, cmd=0x39, len=6
packet: len=12
39 06 00 30 c6 01 00 ff
ff 00 8e 25
*0x1ca0300: clear 0xffffffff, set 0x30000639
*0x1ca0304: clear 0xffffffff, set 0xff0001c6
*0x1ca0308: clear 0xffffffff, set 0x258e00ff
*0x1ca0200: clear 0xff, set 0xb
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=13
c1 74 00 32 32 77 f1 ff
ff cc cc 77 77
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=13
composeLongPacket: channel=0, cmd=0x39, len=13
packet: len=19
39 0d 00 13 c1 74 00 32
32 77 f1 ff ff cc cc 77
77 69 e4
*0x1ca0300: clear 0xffffffff, set 0x13000d39
*0x1ca0304: clear 0xffffffff, set 0x320074c1
*0x1ca0308: clear 0xffffffff, set 0xfff17732
*0x1ca030c: clear 0xffffffff, set 0x77ccccff
*0x1ca0310: clear 0xffffffff, set 0xe46977
*0x1ca0200: clear 0xff, set 0x12
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=3
b5 07 07
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=3
composeLongPacket: channel=0, cmd=0x39, len=3
packet: len=9
39 03 00 09 b5 07 07 7b
b3
*0x1ca0300: clear 0xffffffff, set 0x9000339
*0x1ca0304: clear 0xffffffff, set 0x7b0707b5
*0x1ca0308: clear 0xffffffff, set 0xb3
*0x1ca0200: clear 0xff, set 0x8
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=3
b6 2c 2c
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=3
composeLongPacket: channel=0, cmd=0x39, len=3
packet: len=9
39 03 00 09 b6 2c 2c 55
04
*0x1ca0300: clear 0xffffffff, set 0x9000339
*0x1ca0304: clear 0xffffffff, set 0x552c2cb6
*0x1ca0308: clear 0xffffffff, set 0x4
*0x1ca0200: clear 0xff, set 0x8
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=4
bf 02 11 00
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=4
composeLongPacket: channel=0, cmd=0x39, len=4
packet: len=10
39 04 00 2c bf 02 11 00
b5 e9
*0x1ca0300: clear 0xffffffff, set 0x2c000439
*0x1ca0304: clear 0xffffffff, set 0x1102bf
*0x1ca0308: clear 0xffffffff, set 0xe9b5
*0x1ca0200: clear 0xff, set 0x9
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=64
e9 82 10 06 05 a2 0a a5
12 31 23 37 83 04 bc 27
38 0c 00 03 00 00 00 0c
00 03 00 00 00 75 75 31
88 88 88 88 88 88 13 88
64 64 20 88 88 88 88 88
88 02 88 00 00 00 00 00
00 00 00 00 00 00 00 00
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=64
composeLongPacket: channel=0, cmd=0x39, len=64
packet: len=70
39 40 00 25 e9 82 10 06
05 a2 0a a5 12 31 23 37
83 04 bc 27 38 0c 00 03
00 00 00 0c 00 03 00 00
00 75 75 31 88 88 88 88
88 88 13 88 64 64 20 88
88 88 88 88 88 02 88 00
00 00 00 00 00 00 00 00
00 00 00 00 65 03
*0x1ca0300: clear 0xffffffff, set 0x25004039
*0x1ca0304: clear 0xffffffff, set 0x61082e9
*0x1ca0308: clear 0xffffffff, set 0xa50aa205
*0x1ca030c: clear 0xffffffff, set 0x37233112
*0x1ca0310: clear 0xffffffff, set 0x27bc0483
*0x1ca0314: clear 0xffffffff, set 0x3000c38
*0x1ca0318: clear 0xffffffff, set 0xc000000
*0x1ca031c: clear 0xffffffff, set 0x300
*0x1ca0320: clear 0xffffffff, set 0x31757500
*0x1ca0324: clear 0xffffffff, set 0x88888888
*0x1ca0328: clear 0xffffffff, set 0x88138888
*0x1ca032c: clear 0xffffffff, set 0x88206464
*0x1ca0330: clear 0xffffffff, set 0x88888888
*0x1ca0334: clear 0xffffffff, set 0x880288
*0x1ca0338: clear 0xffffffff, set 0x0
*0x1ca033c: clear 0xffffffff, set 0x0
*0x1ca0340: clear 0xffffffff, set 0x0
*0x1ca0344: clear 0xffffffff, set 0x365
*0x1ca0200: clear 0xff, set 0x45
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=62
ea 02 21 00 00 00 00 00
00 00 00 00 00 02 46 02
88 88 88 88 88 88 64 88
13 57 13 88 88 88 88 88
88 75 88 23 14 00 00 02
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 03
0a a5 00 00 00 00
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=62
composeLongPacket: channel=0, cmd=0x39, len=62
packet: len=68
39 3e 00 1a ea 02 21 00
00 00 00 00 00 00 00 00
00 02 46 02 88 88 88 88
88 88 64 88 13 57 13 88
88 88 88 88 88 75 88 23
14 00 00 02 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 03 0a a5 00 00
00 00 24 1b
*0x1ca0300: clear 0xffffffff, set 0x1a003e39
*0x1ca0304: clear 0xffffffff, set 0x2102ea
*0x1ca0308: clear 0xffffffff, set 0x0
*0x1ca030c: clear 0xffffffff, set 0x0
*0x1ca0310: clear 0xffffffff, set 0x2460200
*0x1ca0314: clear 0xffffffff, set 0x88888888
*0x1ca0318: clear 0xffffffff, set 0x88648888
*0x1ca031c: clear 0xffffffff, set 0x88135713
*0x1ca0320: clear 0xffffffff, set 0x88888888
*0x1ca0324: clear 0xffffffff, set 0x23887588
*0x1ca0328: clear 0xffffffff, set 0x2000014
*0x1ca032c: clear 0xffffffff, set 0x0
*0x1ca0330: clear 0xffffffff, set 0x0
*0x1ca0334: clear 0xffffffff, set 0x0
*0x1ca0338: clear 0xffffffff, set 0x3000000
*0x1ca033c: clear 0xffffffff, set 0xa50a
*0x1ca0340: clear 0xffffffff, set 0x1b240000
*0x1ca0200: clear 0xff, set 0x43
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=35
e0 00 09 0d 23 27 3c 41
35 07 0d 0e 12 13 10 12
12 18 00 09 0d 23 27 3c
41 35 07 0d 0e 12 13 10
12 12 18
mipi_dsi_dcs_write: channel=0, cmd=0x39, len=35
composeLongPacket: channel=0, cmd=0x39, len=35
packet: len=41
39 23 00 20 e0 00 09 0d
23 27 3c 41 35 07 0d 0e
12 13 10 12 12 18 00 09
0d 23 27 3c 41 35 07 0d
0e 12 13 10 12 12 18 93
bf
*0x1ca0300: clear 0xffffffff, set 0x20002339
*0x1ca0304: clear 0xffffffff, set 0xd0900e0
*0x1ca0308: clear 0xffffffff, set 0x413c2723
*0x1ca030c: clear 0xffffffff, set 0xe0d0735
*0x1ca0310: clear 0xffffffff, set 0x12101312
*0x1ca0314: clear 0xffffffff, set 0x9001812
*0x1ca0318: clear 0xffffffff, set 0x3c27230d
*0x1ca031c: clear 0xffffffff, set 0xd073541
*0x1ca0320: clear 0xffffffff, set 0x1013120e
*0x1ca0324: clear 0xffffffff, set 0x93181212
*0x1ca0328: clear 0xffffffff, set 0xbf
*0x1ca0200: clear 0xff, set 0x28
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=1
11
mipi_dsi_dcs_write: channel=0, cmd=0x5, len=1
composeShortPacket: channel=0, cmd=0x5, len=1
packet: len=4
05 11 00 36
*0x1ca0300: clear 0xffffffff, set 0x36001105
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
writeDcs: len=1
29
mipi_dsi_dcs_write: channel=0, cmd=0x5, len=1
composeShortPacket: channel=0, cmd=0x5, len=1
packet: len=4
05 29 00 1c
*0x1ca0300: clear 0xffffffff, set 0x1c002905
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
panel_init: end
start_dsi: start
Start HSC
*0x1ca0048 = 0xf02
Commit
*0x1ca0010: clear 0x1, set 0x1
*0x1ca0010 = 0x30001
Instruction Function Lane
*0x1ca0020: clear 0x10, set 0x0
*0x1ca0020 = 0xf
Start HSD
*0x1ca0048 = 0x63f07006
Commit
*0x1ca0010: clear 0x1, set 0x1
*0x1ca0010 = 0x30001
start_dsi: end
de2_init: start
Set High Speed SRAM to DMA Mode
*0x1c00004 = 0x0
Set Display Engine PLL to 297 MHz
*0x1c20048 = 0x81001701
Wait for Display Engine PLL to be stable
Set Special Clock to Display Engine PLL
*0x1c20104: clear 0x87000000, set 0x81000000
*0x1c20104 = 0x81000000
Enable AHB for Display Engine: De-Assert Display Engine
*0x1c202c4: clear 0x1000, set 0x1000
*0x1c202c4 = 0x1008
Enable AHB for Display Engine: Pass Display Engine
*0x1c20064: clear 0x1000, set 0x1000
*0x1c20064 = 0x1008
Enable Clock for MIXER0: SCLK Clock Pass
*0x1000000: clear 0x1, set 0x1
*0x1000000 = 0x1
Enable Clock for MIXER0: HCLK Clock Reset Off
*0x1000008: clear 0x1, set 0x1
*0x1000008 = 0x1
Enable Clock for MIXER0: HCLK Clock Pass
*0x1000004: clear 0x1, set 0x1
*0x1000004 = 0x1
Route MIXER0 to TCON0
*0x1000010: clear 0x1, set 0x0
*0x1000010 = 0x0
Clear MIXER0 Registers: GLB, BLD, OVL_V, OVL_UI
*0x1100000 = 0x0
to *0x1105fff = 0x0
Disable MIXER0 VSU
*0x1120000 = 0x0
Disable MIXER0 Undocumented
*0x1130000 = 0x0
Disable MIXER0 UI_SCALER1
*0x1140000 = 0x0
Disable MIXER0 UI_SCALER2
*0x1150000 = 0x0
Disable MIXER0 FCE
*0x11a0000 = 0x0
Disable MIXER0 BWS
*0x11a2000 = 0x0
Disable MIXER0 LTI
*0x11a4000 = 0x0
Disable MIXER0 PEAKING
*0x11a6000 = 0x0
Disable MIXER0 ASE
*0x11a8000 = 0x0
Disable MIXER0 FCC
*0x11aa000 = 0x0
Disable MIXER0 DRC
*0x11b0000 = 0x0
Enable MIXER0
*0x1100000 = 0x1
de2_init: end
renderGraphics: start
initUiBlender: start
Set Blender Background
*0x1101088 = 0xff000000
Set Blender Pre-Multiply
*0x1101084 = 0x0
initUiBlender: end
initUiChannel: start
Channel 1: Set Overlay (720 x 1440)
*0x1103000 = 0xff000405
*0x1103010 = 0x4012c000
*0x110300c = 0xb40
*0x1103004 = 0x59f02cf
*0x1103088 = 0x59f02cf
*0x1103008 = 0x0
Channel 1: Set Blender Output
*0x110108c = 0x59f02cf
*0x110000c = 0x59f02cf
Channel 1: Set Blender Input Pipe 0 (720 x 1440)
*0x1101008 = 0x59f02cf
*0x1101004 = 0xff000000
*0x110100c = 0x0
*0x1101090 = 0x3010301
Channel 1: Disable Scaler
*0x1140000 = 0x0
initUiChannel: end
initUiChannel: start
Channel 2: Set Overlay (600 x 600)
*0x1104000 = 0xff000005
*0x1104010 = 0x40521000
*0x110400c = 0x960
*0x1104004 = 0x2570257
*0x1104088 = 0x2570257
*0x1104008 = 0x0
Channel 2: Set Blender Input Pipe 1 (600 x 600)
*0x1101018 = 0x2570257
*0x1101014 = 0xff000000
*0x110101c = 0x340034
*0x1101094 = 0x3010301
Channel 2: Disable Scaler
*0x1150000 = 0x0
initUiChannel: end
initUiChannel: start
Channel 3: Set Overlay (720 x 1440)
*0x1105000 = 0x7f000005
*0x1105010 = 0x40681000
*0x110500c = 0xb40
*0x1105004 = 0x59f02cf
*0x1105088 = 0x59f02cf
*0x1105008 = 0x0
Channel 3: Set Blender Input Pipe 2 (720 x 1440)
*0x1101028 = 0x59f02cf
*0x1101024 = 0xff000000
*0x110102c = 0x0
*0x1101098 = 0x3010301
Channel 3: Disable Scaler
*0x1160000 = 0x0
initUiChannel: end
applySettings: start
Set Blender Route
*0x1101080 = 0x321
Enable Blender Pipes
*0x1101000 = 0x701
Apply Settings
*0x1100008 = 0x1
applySettings: end
renderGraphics: end
test_render: end
HELLO ZIG ON PINEPHONE!
test_zig: start
Testing Compose Short Packet (Without Parameter)...
composeShortPacket: channel=0, cmd=0x5, len=1
Result:
05 11 00 36
Testing Compose Short Packet (With Parameter)...
composeShortPacket: channel=0, cmd=0x15, len=2
Result:
15 bc 4e 35
Testing Compose Long Packet...
composeLongPacket: channel=0, cmd=0x39, len=64
Result:
39 40 00 25 e9 82 10 06
05 a2 0a a5 12 31 23 37
83 04 bc 27 38 0c 00 03
00 00 00 0c 00 03 00 00
00 75 75 31 88 88 88 88
88 88 13 88 64 64 20 88
88 88 88 88 88 02 88 00
00 00 00 00 00 00 00 00
00 00 00 00 65 03
test_zig: end

1
test/nuttx/arch.h Normal file
View file

@ -0,0 +1 @@
void up_udelay(unsigned long microseconds);

7
test/nuttx/config.h Normal file
View file

@ -0,0 +1,7 @@
#include <stdbool.h>
#include <stdio.h>
#define DEBUGASSERT assert
#define DEBUGPANIC() assert(false)
#define FAR
#define OK 0

19
test/run.sh Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
## Test Locally
set -e # Exit when any command fails
set -x # Echo commands
clear
## Compile test code
gcc \
-o test \
-I ../../nuttx/arch/arm64/src/a64 \
test.c \
../../nuttx/arch/arm64/src/a64/a64_mipi_dphy.c \
../../nuttx/arch/arm64/src/a64/a64_mipi_dsi.c \
../../nuttx/arch/arm64/src/a64/mipi_dsi.c
## Run the test
./test

519
test/test.c Normal file
View file

@ -0,0 +1,519 @@
#include <nuttx/config.h>
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include <debug.h>
#include <nuttx/arch.h>
#include "arm64_arch.h"
#include "mipi_dsi.h"
#include "a64_mipi_dsi.h"
#include "a64_mipi_dphy.h"
/// MIPI DSI Virtual Channel
#define VIRTUAL_CHANNEL 0
static int panel_init(void);
static int write_dcs(FAR const uint8_t *buf, size_t len);
void dump_buffer(const uint8_t *data, size_t len);
int main()
{
int ret;
// Enable MIPI DSI Block
ret = a64_mipi_dsi_enable();
assert(ret == OK);
// Enable MIPI Display Physical Layer (DPHY)
ret = a64_mipi_dphy_enable();
assert(ret == OK);
// Initialise LCD Controller (ST7703)
ret = panel_init();
assert(ret == OK);
// Start MIPI DSI HSC and HSD
ret = a64_mipi_dsi_start();
assert(ret == OK);
// Test MIPI DSI
void mipi_dsi_test(void);
mipi_dsi_test();
}
/// Initialise the ST7703 LCD Controller in Xingbangda XBD599 LCD Panel.
/// See https://lupyuen.github.io/articles/dsi#initialise-lcd-controller
static int panel_init(void) {
int ret;
_info("panel_init: start\n");
// Most of these commands are documented in the ST7703 Datasheet:
// https://files.pine64.org/doc/datasheet/pinephone/ST7703_DS_v01_20160128.pdf
// Command #1
const uint8_t cmd1[] = {
0xB9, // SETEXTC (Page 131): Enable USER Command
0xF1, // Enable User command
0x12, // (Continued)
0x83 // (Continued)
};
ret = write_dcs(cmd1, sizeof(cmd1));
assert(ret == OK);
// Command #2
const uint8_t cmd2[] = {
0xBA, // SETMIPI (Page 144): Set MIPI related register
0x33, // Virtual Channel = 0 (VC_Main = 0) ; Number of Lanes = 4 (Lane_Number = 3)
0x81, // LDO = 1.7 V (DSI_LDO_SEL = 4) ; Terminal Resistance = 90 Ohm (RTERM = 1)
0x05, // MIPI Low High Speed driving ability = x6 (IHSRX = 5)
0xF9, // TXCLK speed in DSI LP mode = fDSICLK / 16 (Tx_clk_sel = 2)
0x0E, // Min HFP number in DSI mode = 14 (HFP_OSC = 14)
0x0E, // Min HBP number in DSI mode = 14 (HBP_OSC = 14)
0x20, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x44, // Undocumented
0x25, // Undocumented
0x00, // Undocumented
0x91, // Undocumented
0x0a, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x02, // Undocumented
0x4F, // Undocumented
0x11, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x37 // Undocumented
};
ret = write_dcs(cmd2, sizeof(cmd2));
assert(ret == OK);
// Command #3
const uint8_t cmd3[] = {
0xB8, // SETPOWER_EXT (Page 142): Set display related register
0x25, // External power IC or PFM: VSP = FL1002, VSN = FL1002 (PCCS = 2) ; VCSW1 / VCSW2 Frequency for Pumping VSP / VSN = 1/4 Hsync (ECP_DC_DIV = 5)
0x22, // VCSW1/VCSW2 soft start time = 15 ms (DT = 2) ; Pumping ratio of VSP / VSN with VCI = x2 (XDK_ECP = 1)
0x20, // PFM operation frequency FoscD = Fosc/1 (PFM_DC_DIV = 0)
0x03 // Enable power IC pumping frequency synchronization = Synchronize with external Hsync (ECP_SYNC_EN = 1) ; Enable VGH/VGL pumping frequency synchronization = Synchronize with external Hsync (VGX_SYNC_EN = 1)
};
ret = write_dcs(cmd3, sizeof(cmd3));
assert(ret == OK);
// Command #4
const uint8_t cmd4[] = {
0xB3, // SETRGBIF (Page 134): Control RGB I/F porch timing for internal use
0x10, // Vertical back porch HS number in Blank Frame Period = Hsync number 16 (VBP_RGB_GEN = 16)
0x10, // Vertical front porch HS number in Blank Frame Period = Hsync number 16 (VFP_RGB_GEN = 16)
0x05, // HBP OSC number in Blank Frame Period = OSC number 5 (DE_BP_RGB_GEN = 5)
0x05, // HFP OSC number in Blank Frame Period = OSC number 5 (DE_FP_RGB_GEN = 5)
0x03, // Undocumented
0xFF, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00, // Undocumented
0x00 // Undocumented
};
ret = write_dcs(cmd4, sizeof(cmd4));
assert(ret == OK);
// Command #5
const uint8_t cmd5[] = {
0xC0, // SETSCR (Page 147): Set related setting of Source driving
0x73, // Source OP Amp driving period for positive polarity in Normal Mode: Source OP Period = 115*4/Fosc (N_POPON = 115)
0x73, // Source OP Amp driving period for negative polarity in Normal Mode: Source OP Period = 115*4/Fosc (N_NOPON = 115)
0x50, // Source OP Amp driving period for positive polarity in Idle mode: Source OP Period = 80*4/Fosc (I_POPON = 80)
0x50, // Source OP Amp dirivng period for negative polarity in Idle Mode: Source OP Period = 80*4/Fosc (I_NOPON = 80)
0x00, // (SCR Bits 24-31 = 0x00)
0xC0, // (SCR Bits 16-23 = 0xC0)
0x08, // Gamma bias current fine tune: Current xIbias = 4 (SCR Bits 9-13 = 4) ; (SCR Bits 8-15 = 0x08)
0x70, // Source and Gamma bias current core tune: Ibias = 1 (SCR Bits 0-3 = 0) ; Source bias current fine tune: Current xIbias = 7 (SCR Bits 4-8 = 7) ; (SCR Bits 0-7 = 0x70)
0x00 // Undocumented
};
ret = write_dcs(cmd5, sizeof(cmd5));
assert(ret == OK);
// Command #6
const uint8_t cmd6[] = {
0xBC, // SETVDC (Page 146): Control NVDDD/VDDD Voltage
0x4E // NVDDD voltage = -1.8 V (NVDDD_SEL = 4) ; VDDD voltage = 1.9 V (VDDD_SEL = 6)
};
ret = write_dcs(cmd6, sizeof(cmd6));
assert(ret == OK);
// Command #7
const uint8_t cmd7[] = {
0xCC, // SETPANEL (Page 154): Set display related register
0x0B // Enable reverse the source scan direction (SS_PANEL = 1) ; Normal vertical scan direction (GS_PANEL = 0) ; Normally black panel (REV_PANEL = 1) ; S1:S2:S3 = B:G:R (BGR_PANEL = 1)
};
ret = write_dcs(cmd7, sizeof(cmd7));
assert(ret == OK);
// Command #8
const uint8_t cmd8[] = {
0xB4, // SETCYC (Page 135): Control display inversion type
0x80 // Extra source for Zig-Zag Inversion = S2401 (ZINV_S2401_EN = 1) ; Row source data dislocates = Even row (ZINV_G_EVEN_EN = 0) ; Disable Zig-Zag Inversion (ZINV_EN = 0) ; Enable Zig-Zag1 Inversion (ZINV2_EN = 0) ; Normal mode inversion type = Column inversion (N_NW = 0)
};
ret = write_dcs(cmd8, sizeof(cmd8));
assert(ret == OK);
// Command #9
const uint8_t cmd9[] = {
0xB2, // SETDISP (Page 132): Control the display resolution
0xF0, // Gate number of vertical direction = 480 + (240*4) (NL = 240)
0x12, // (RES_V_LSB = 0) ; Non-display area source output control: Source output = VSSD (BLK_CON = 1) ; Channel number of source direction = 720RGB (RESO_SEL = 2)
0xF0 // Source voltage during Blanking Time when accessing Sleep-Out / Sleep-In command = GND (WHITE_GND_EN = 1) ; Blank timing control when access sleep out command: Blank Frame Period = 7 Frames (WHITE_FRAME_SEL = 7) ; Source output refresh control: Refresh Period = 0 Frames (ISC = 0)
};
ret = write_dcs(cmd9, sizeof(cmd9));
assert(ret == OK);
// Command #10
const uint8_t cmd10[] = {
0xE3, // SETEQ (Page 159): Set EQ related register
0x00, // Temporal spacing between HSYNC and PEQGND = 0*4/Fosc (PNOEQ = 0)
0x00, // Temporal spacing between HSYNC and NEQGND = 0*4/Fosc (NNOEQ = 0)
0x0B, // Source EQ GND period when Source up to positive voltage = 11*4/Fosc (PEQGND = 11)
0x0B, // Source EQ GND period when Source down to negative voltage = 11*4/Fosc (NEQGND = 11)
0x10, // Source EQ VCI period when Source up to positive voltage = 16*4/Fosc (PEQVCI = 16)
0x10, // Source EQ VCI period when Source down to negative voltage = 16*4/Fosc (NEQVCI = 16)
0x00, // Temporal period of PEQVCI1 = 0*4/Fosc (PEQVCI1 = 0)
0x00, // Temporal period of NEQVCI1 = 0*4/Fosc (NEQVCI1 = 0)
0x00, // (Reserved)
0x00, // (Reserved)
0xFF, // (Undocumented)
0x00, // (Reserved)
0xC0, // White pattern to protect GOA glass (ESD_DET_DATA_WHITE = 1) ; Enable ESD detection function to protect GOA glass (ESD_WHITE_EN = 1)
0x10 // No Need VSYNC (additional frame) after Sleep-In command to display sleep-in blanking frame then into Sleep-In State (SLPIN_OPTION = 1) ; Enable video function detection (VEDIO_NO_CHECK_EN = 0) ; Disable ESD white pattern scanning voltage pull ground (ESD_WHITE_GND_EN = 0) ; ESD detection function period = 0 Frames (ESD_DET_TIME_SEL = 0)
};
ret = write_dcs(cmd10, sizeof(cmd10));
assert(ret == OK);
// Command #11
const uint8_t cmd11[] = {
0xC6, // Undocumented
0x01, // Undocumented
0x00, // Undocumented
0xFF, // Undocumented
0xFF, // Undocumented
0x00 // Undocumented
};
ret = write_dcs(cmd11, sizeof(cmd11));
assert(ret == OK);
// Command #12
const uint8_t cmd12[] = {
0xC1, // SETPOWER (Page 149): Set related setting of power
0x74, // VGH Voltage Adjustment = 17 V (VBTHS = 7) ; VGL Voltage Adjustment = -11 V (VBTLS = 4)
0x00, // Enable VGH feedback voltage detection. Output voltage = VBTHS (FBOFF_VGH = 0) ; Enable VGL feedback voltage detection. Output voltage = VBTLS (FBOFF_VGL = 0)
0x32, // VSPROUT Voltage = (VRH[5:0] x 0.05 + 3.3) x (VREF/4.8) if VREF [4]=0 (VRP = 50)
0x32, // VSNROUT Voltage = (VRH[5:0] x 0.05 + 3.3) x (VREF/5.6) if VREF [4]=1 (VRN = 50)
0x77, // Undocumented
0xF1, // Enable VGL voltage Detect Function = VGL voltage Abnormal (VGL_DET_EN = 1) ; Enable VGH voltage Detect Function = VGH voltage Abnormal (VGH_DET_EN = 1) ; Enlarge VGL Voltage at "FBOFF_VGL=1" = "VGL=-15V" (VGL_TURBO = 1) ; Enlarge VGH Voltage at "FBOFF_VGH=1" = "VGH=20V" (VGH_TURBO = 1) ; (APS = 1)
0xFF, // Left side VGH stage 1 pumping frequency = 1.5 MHz (VGH1_L_DIV = 15) ; Left side VGL stage 1 pumping frequency = 1.5 MHz (VGL1_L_DIV = 15)
0xFF, // Right side VGH stage 1 pumping frequency = 1.5 MHz (VGH1_R_DIV = 15) ; Right side VGL stage 1 pumping frequency = 1.5 MHz (VGL1_R_DIV = 15)
0xCC, // Left side VGH stage 2 pumping frequency = 2.6 MHz (VGH2_L_DIV = 12) ; Left side VGL stage 2 pumping frequency = 2.6 MHz (VGL2_L_DIV = 12)
0xCC, // Right side VGH stage 2 pumping frequency = 2.6 MHz (VGH2_R_DIV = 12) ; Right side VGL stage 2 pumping frequency = 2.6 MHz (VGL2_R_DIV = 12)
0x77, // Left side VGH stage 3 pumping frequency = 4.5 MHz (VGH3_L_DIV = 7) ; Left side VGL stage 3 pumping frequency = 4.5 MHz (VGL3_L_DIV = 7)
0x77 // Right side VGH stage 3 pumping frequency = 4.5 MHz (VGH3_R_DIV = 7) ; Right side VGL stage 3 pumping frequency = 4.5 MHz (VGL3_R_DIV = 7)
};
ret = write_dcs(cmd12, sizeof(cmd12));
assert(ret == OK);
// Command #13
const uint8_t cmd13[] = {
0xB5, // SETBGP (Page 136): Internal reference voltage setting
0x07, // VREF Voltage: 4.2 V (VREF_SEL = 7)
0x07 // NVREF Voltage: 4.2 V (NVREF_SEL = 7)
};
ret = write_dcs(cmd13, sizeof(cmd13));
assert(ret == OK);
// Command #14
const uint8_t cmd14[] = {
0xB6, // SETVCOM (Page 137): Set VCOM Voltage
0x2C, // VCOMDC voltage at "GS_PANEL=0" = -0.67 V (VCOMDC_F = 0x2C)
0x2C // VCOMDC voltage at "GS_PANEL=1" = -0.67 V (VCOMDC_B = 0x2C)
};
ret = write_dcs(cmd14, sizeof(cmd14));
assert(ret == OK);
// Command #15
const uint8_t cmd15[] = {
0xBF, // Undocumented
0x02, // Undocumented
0x11, // Undocumented
0x00 // Undocumented
};
ret = write_dcs(cmd15, sizeof(cmd15));
assert(ret == OK);
// Command #16
const uint8_t cmd16[] = {
0xE9, // SETGIP1 (Page 163): Set forward GIP timing
0x82, // SHR0, SHR1, CHR, CHR2 refer to Internal DE (REF_EN = 1) ; (PANEL_SEL = 2)
0x10, // Starting position of GIP STV group 0 = 4102 HSYNC (SHR0 Bits 8-12 = 0x10)
0x06, // (SHR0 Bits 0-7 = 0x06)
0x05, // Starting position of GIP STV group 1 = 1442 HSYNC (SHR1 Bits 8-12 = 0x05)
0xA2, // (SHR1 Bits 0-7 = 0xA2)
0x0A, // Distance of STV rising edge and HYSNC = 10*2 Fosc (SPON Bits 0-7 = 0x0A)
0xA5, // Distance of STV falling edge and HYSNC = 165*2 Fosc (SPOFF Bits 0-7 = 0xA5)
0x12, // STV0_1 distance with STV0_0 = 1 HSYNC (SHR0_1 = 1) ; STV0_2 distance with STV0_0 = 2 HSYNC (SHR0_2 = 2)
0x31, // STV0_3 distance with STV0_0 = 3 HSYNC (SHR0_3 = 3) ; STV1_1 distance with STV1_0 = 1 HSYNC (SHR1_1 = 1)
0x23, // STV1_2 distance with STV1_0 = 2 HSYNC (SHR1_2 = 2) ; STV1_3 distance with STV1_0 = 3 HSYNC (SHR1_3 = 3)
0x37, // STV signal high pulse width = 3 HSYNC (SHP = 3) ; Total number of STV signal = 7 (SCP = 7)
0x83, // Starting position of GIP CKV group 0 (CKV0_0) = 131 HSYNC (CHR = 0x83)
0x04, // Distance of CKV rising edge and HYSNC = 4*2 Fosc (CON Bits 0-7 = 0x04)
0xBC, // Distance of CKV falling edge and HYSNC = 188*2 Fosc (COFF Bits 0-7 = 0xBC)
0x27, // CKV signal high pulse width = 2 HSYNC (CHP = 2) ; Total period cycle of CKV signal = 7 HSYNC (CCP = 7)
0x38, // Extra gate counter at blanking area: Gate number = 56 (USER_GIP_GATE = 0x38)
0x0C, // Left side GIP output pad signal = ??? (CGTS_L Bits 16-21 = 0x0C)
0x00, // (CGTS_L Bits 8-15 = 0x00)
0x03, // (CGTS_L Bits 0-7 = 0x03)
0x00, // Normal polarity of Left side GIP output pad signal (CGTS_INV_L Bits 16-21 = 0x00)
0x00, // (CGTS_INV_L Bits 8-15 = 0x00)
0x00, // (CGTS_INV_L Bits 0-7 = 0x00)
0x0C, // Right side GIP output pad signal = ??? (CGTS_R Bits 16-21 = 0x0C)
0x00, // (CGTS_R Bits 8-15 = 0x00)
0x03, // (CGTS_R Bits 0-7 = 0x03)
0x00, // Normal polarity of Right side GIP output pad signal (CGTS_INV_R Bits 16-21 = 0x00)
0x00, // (CGTS_INV_R Bits 8-15 = 0x00)
0x00, // (CGTS_INV_R Bits 0-7 = 0x00)
0x75, // Left side GIP output pad signal = ??? (COS1_L = 7) ; Left side GIP output pad signal = ??? (COS2_L = 5)
0x75, // Left side GIP output pad signal = ??? (COS3_L = 7) ; (COS4_L = 5)
0x31, // Left side GIP output pad signal = ??? (COS5_L = 3) ; (COS6_L = 1)
0x88, // Reserved (Parameter 32)
0x88, // Reserved (Parameter 33)
0x88, // Reserved (Parameter 34)
0x88, // Reserved (Parameter 35)
0x88, // Reserved (Parameter 36)
0x88, // Left side GIP output pad signal = ??? (COS17_L = 8) ; Left side GIP output pad signal = ??? (COS18_L = 8)
0x13, // Left side GIP output pad signal = ??? (COS19_L = 1) ; Left side GIP output pad signal = ??? (COS20_L = 3)
0x88, // Left side GIP output pad signal = ??? (COS21_L = 8) ; Left side GIP output pad signal = ??? (COS22_L = 8)
0x64, // Right side GIP output pad signal = ??? (COS1_R = 6) ; Right side GIP output pad signal = ??? (COS2_R = 4)
0x64, // Right side GIP output pad signal = ??? (COS3_R = 6) ; Right side GIP output pad signal = ??? (COS4_R = 4)
0x20, // Right side GIP output pad signal = ??? (COS5_R = 2) ; Right side GIP output pad signal = ??? (COS6_R = 0)
0x88, // Reserved (Parameter 43)
0x88, // Reserved (Parameter 44)
0x88, // Reserved (Parameter 45)
0x88, // Reserved (Parameter 46)
0x88, // Reserved (Parameter 47)
0x88, // Right side GIP output pad signal = ??? (COS17_R = 8) ; Right side GIP output pad signal = ??? (COS18_R = 8)
0x02, // Right side GIP output pad signal = ??? (COS19_R = 0) ; Right side GIP output pad signal = ??? (COS20_R = 2)
0x88, // Right side GIP output pad signal = ??? (COS21_R = 8) ; Right side GIP output pad signal = ??? (COS22_R = 8)
0x00, // (TCON_OPT = 0x00)
0x00, // (GIP_OPT Bits 16-22 = 0x00)
0x00, // (GIP_OPT Bits 8-15 = 0x00)
0x00, // (GIP_OPT Bits 0-7 = 0x00)
0x00, // Starting position of GIP CKV group 1 (CKV1_0) = 0 HSYNC (CHR2 = 0x00)
0x00, // Distance of CKV1 rising edge and HYSNC = 0*2 Fosc (CON2 Bits 0-7 = 0x00)
0x00, // Distance of CKV1 falling edge and HYSNC = 0*2 Fosc (COFF2 Bits 0-7 = 0x00)
0x00, // CKV1 signal high pulse width = 0 HSYNC (CHP2 = 0) ; Total period cycle of CKV1 signal = 0 HSYNC (CCP2 = 0)
0x00, // (CKS Bits 16-21 = 0x00)
0x00, // (CKS Bits 8-15 = 0x00)
0x00, // (CKS Bits 0-7 = 0x00)
0x00, // (COFF Bits 8-9 = 0) ; (CON Bits 8-9 = 0) ; (SPOFF Bits 8-9 = 0) ; (SPON Bits 8-9 = 0)
0x00 // (COFF2 Bits 8-9 = 0) ; (CON2 Bits 8-9 = 0)
};
ret = write_dcs(cmd16, sizeof(cmd16));
assert(ret == OK);
// Command #17
const uint8_t cmd17[] = {
0xEA, // SETGIP2 (Page 170): Set backward GIP timing
0x02, // YS2 Signal Mode = INYS1/INYS2 (YS2_SEL = 0) ; YS2 Signal Mode = INYS1/INYS2 (YS1_SEL = 0) ; Don't reverse YS2 signal (YS2_XOR = 0) ; Don't reverse YS1 signal (YS1_XOR = 0) ; Enable YS signal function (YS_FLAG_EN = 1) ; Disable ALL ON function (ALL_ON_EN = 0)
0x21, // (GATE = 0x21)
0x00, // (CK_ALL_ON_EN = 0) ; (STV_ALL_ON_EN = 0) ; Timing of YS1 and YS2 signal = ??? (CK_ALL_ON_WIDTH1 = 0)
0x00, // Timing of YS1 and YS2 signal = ??? (CK_ALL_ON_WIDTH2 = 0)
0x00, // Timing of YS1 and YS2 signal = ??? (CK_ALL_ON_WIDTH3 = 0)
0x00, // (YS_FLAG_PERIOD = 0)
0x00, // (YS2_SEL_2 = 0) ; (YS1_SEL_2 = 0) ; (YS2_XOR_2 = 0) ; (YS_FLAG_EN_2 = 0) ; (ALL_ON_EN_2 = 0)
0x00, // Distance of GIP ALL On rising edge and DE = ??? (USER_GIP_GATE1_2 = 0)
0x00, // (CK_ALL_ON_EN_2 = 0) ; (STV_ALL_ON_EN_2 = 0) ; (CK_ALL_ON_WIDTH1_2 = 0)
0x00, // (CK_ALL_ON_WIDTH2_2 = 0)
0x00, // (CK_ALL_ON_WIDTH3_2 = 0)
0x00, // (YS_FLAG_PERIOD_2 = 0)
0x02, // (COS1_L_GS = 0) ; (COS2_L_GS = 2)
0x46, // (COS3_L_GS = 4) ; (COS4_L_GS = 6)
0x02, // (COS5_L_GS = 0) ; (COS6_L_GS = 2)
0x88, // Reserved (Parameter 16)
0x88, // Reserved (Parameter 17)
0x88, // Reserved (Parameter 18)
0x88, // Reserved (Parameter 19)
0x88, // Reserved (Parameter 20)
0x88, // (COS17_L_GS = 8) ; (COS18_L_GS = 8)
0x64, // (COS19_L_GS = 6) ; (COS20_L_GS = 4)
0x88, // (COS21_L_GS = 8) ; (COS22_L_GS = 8)
0x13, // (COS1_R_GS = 1) ; (COS2_R_GS = 3)
0x57, // (COS3_R_GS = 5) ; (COS4_R_GS = 7)
0x13, // (COS5_R_GS = 1) ; (COS6_R_GS = 3)
0x88, // Reserved (Parameter 27)
0x88, // Reserved (Parameter 28)
0x88, // Reserved (Parameter 29)
0x88, // Reserved (Parameter 30)
0x88, // Reserved (Parameter 31)
0x88, // (COS17_R_GS = 8) ; (COS18_R_GS = 8)
0x75, // (COS19_R_GS = 7) ; (COS20_R_GS = 5)
0x88, // (COS21_R_GS = 8) ; (COS22_R_GS = 8)
0x23, // GIP output EQ signal: P_EQ = Yes, N_EQ = No (EQOPT = 2) ; GIP output EQ signal level: P_EQ = GND, N_EQ = GND (EQ_SEL = 3)
0x14, // Distance of EQ rising edge and HYSNC = 20 Fosc (EQ_DELAY = 0x14)
0x00, // Distance of EQ rising edge and HYSNC = 0 HSYNC (EQ_DELAY_HSYNC = 0)
0x00, // (HSYNC_TO_CL1_CNT10 Bits 8-9 = 0)
0x02, // GIP reference HSYNC between external HSYNC = 2 Fosc (HSYNC_TO_CL1_CNT10 Bits 0-7 = 2)
0x00, // Undocumented (Parameter 40)
0x00, // Undocumented (Parameter 41)
0x00, // Undocumented (Parameter 42)
0x00, // Undocumented (Parameter 43)
0x00, // Undocumented (Parameter 44)
0x00, // Undocumented (Parameter 45)
0x00, // Undocumented (Parameter 46)
0x00, // Undocumented (Parameter 47)
0x00, // Undocumented (Parameter 48)
0x00, // Undocumented (Parameter 49)
0x00, // Undocumented (Parameter 50)
0x00, // Undocumented (Parameter 51)
0x00, // Undocumented (Parameter 52)
0x00, // Undocumented (Parameter 53)
0x00, // Undocumented (Parameter 54)
0x03, // Undocumented (Parameter 55)
0x0A, // Undocumented (Parameter 56)
0xA5, // Undocumented (Parameter 57)
0x00, // Undocumented (Parameter 58)
0x00, // Undocumented (Parameter 59)
0x00, // Undocumented (Parameter 60)
0x00 // Undocumented (Parameter 61)
};
ret = write_dcs(cmd17, sizeof(cmd17));
assert(ret == OK);
// Command #18
const uint8_t cmd18[] = {
0xE0, // SETGAMMA (Page 158): Set the gray scale voltage to adjust the gamma characteristics of the TFT panel
0x00, // (PVR0 = 0x00)
0x09, // (PVR1 = 0x09)
0x0D, // (PVR2 = 0x0D)
0x23, // (PVR3 = 0x23)
0x27, // (PVR4 = 0x27)
0x3C, // (PVR5 = 0x3C)
0x41, // (PPR0 = 0x41)
0x35, // (PPR1 = 0x35)
0x07, // (PPK0 = 0x07)
0x0D, // (PPK1 = 0x0D)
0x0E, // (PPK2 = 0x0E)
0x12, // (PPK3 = 0x12)
0x13, // (PPK4 = 0x13)
0x10, // (PPK5 = 0x10)
0x12, // (PPK6 = 0x12)
0x12, // (PPK7 = 0x12)
0x18, // (PPK8 = 0x18)
0x00, // (NVR0 = 0x00)
0x09, // (NVR1 = 0x09)
0x0D, // (NVR2 = 0x0D)
0x23, // (NVR3 = 0x23)
0x27, // (NVR4 = 0x27)
0x3C, // (NVR5 = 0x3C)
0x41, // (NPR0 = 0x41)
0x35, // (NPR1 = 0x35)
0x07, // (NPK0 = 0x07)
0x0D, // (NPK1 = 0x0D)
0x0E, // (NPK2 = 0x0E)
0x12, // (NPK3 = 0x12)
0x13, // (NPK4 = 0x13)
0x10, // (NPK5 = 0x10)
0x12, // (NPK6 = 0x12)
0x12, // (NPK7 = 0x12)
0x18 // (NPK8 = 0x18)
};
ret = write_dcs(cmd18, sizeof(cmd18));
assert(ret == OK);
// Command #19
const uint8_t cmd19[] = {
0x11 // SLPOUT (Page 89): Turns off sleep mode (MIPI_DCS_EXIT_SLEEP_MODE)
};
ret = write_dcs(cmd19, sizeof(cmd19));
assert(ret == OK);
// Wait 120 milliseconds
up_udelay(120 * 1000);
// Command #20
const uint8_t cmd20[] = {
0x29 // Display On (Page 97): Recover from DISPLAY OFF mode (MIPI_DCS_SET_DISPLAY_ON)
};
ret = write_dcs(cmd20, sizeof(cmd20));
assert(ret == OK);
_info("panel_init: end\n");
return OK;
}
/// Write the DCS Command to MIPI DSI
static int write_dcs(FAR const uint8_t *buf, size_t len)
{
int ret = -1;
_info("writeDcs: len=%d\n", (int) len);
dump_buffer(buf, len);
assert(len > 0);
// Do DCS Short Write or Long Write depending on command length
switch (len)
{
// DCS Short Write (without parameter)
case 1:
ret = a64_mipi_dsi_write(VIRTUAL_CHANNEL,
MIPI_DSI_DCS_SHORT_WRITE,
buf, len);
break;
// DCS Short Write (with parameter)
case 2:
ret = a64_mipi_dsi_write(VIRTUAL_CHANNEL,
MIPI_DSI_DCS_SHORT_WRITE_PARAM,
buf, len);
break;
// DCS Long Write
default:
ret = a64_mipi_dsi_write(VIRTUAL_CHANNEL,
MIPI_DSI_DCS_LONG_WRITE,
buf, len);
break;
};
_info("ret=%d\n", ret);
DEBUGASSERT(ret == len);
return OK;
}
/// Modify the specified bits in a memory mapped register.
/// Based on https://github.com/apache/nuttx/blob/master/arch/arm64/src/common/arm64_arch.h#L473
void modreg32(
uint32_t val, // Bits to set, like (1 << bit)
uint32_t mask, // Bits to clear, like (1 << bit)
unsigned long addr // Address to modify
)
{
_info(" *0x%lx: clear 0x%x, set 0x%x\n", addr, mask, val & mask);
assert((val & mask) == val);
}
uint32_t getreg32(unsigned long addr)
{
return 0;
}
void putreg32(uint32_t data, unsigned long addr)
{
_info(" *0x%lx = 0x%x\n", addr, data);
}
void up_udelay(unsigned long microseconds)
{
_info(" up_udelay %ld\n", microseconds);
}

522
test/test.log Normal file
View file

@ -0,0 +1,522 @@
Enable MIPI DSI Bus
*0x1c20060: clear 0x2, set 0x2
*0x1c202c0: clear 0x2, set 0x2
Enable DSI Block
*0x1ca0000 = 0x1
*0x1ca0010 = 0x30000
*0x1ca0060 = 0xa
*0x1ca0078 = 0x0
Set Instructions
*0x1ca0020 = 0x1f
*0x1ca0024 = 0x10000001
*0x1ca0028 = 0x20000010
*0x1ca002c = 0x2000000f
*0x1ca0030 = 0x30100001
*0x1ca0034 = 0x40000010
*0x1ca0038 = 0xf
*0x1ca003c = 0x5000001f
Configure Jump Instructions
*0x1ca004c = 0x560001
*0x1ca02f8 = 0xff
Set Video Start Delay
*0x1ca0014 = 0x5bc7
Set Burst
*0x1ca007c = 0x10000007
Set Instruction Loop
*0x1ca0040 = 0x30000002
*0x1ca0044 = 0x310031
*0x1ca0054 = 0x310031
Set Pixel Format
*0x1ca0090 = 0x1308703e
*0x1ca0098 = 0xffff
*0x1ca009c = 0xffffffff
*0x1ca0080 = 0x10008
Set Sync Timings
*0x1ca000c = 0x0
*0x1ca00b0 = 0x12000021
*0x1ca00b4 = 0x1000031
*0x1ca00b8 = 0x7000001
*0x1ca00bc = 0x14000011
Set Basic Size
*0x1ca0018 = 0x11000a
*0x1ca001c = 0x5cd05a0
Set Horizontal Blanking
*0x1ca00c0 = 0x9004a19
*0x1ca00c4 = 0x50b40000
*0x1ca00c8 = 0x35005419
*0x1ca00cc = 0x757a0000
*0x1ca00d0 = 0x9004a19
*0x1ca00d4 = 0x50b40000
*0x1ca00e0 = 0xc091a19
*0x1ca00e4 = 0x72bd0000
Set Vertical Blanking
*0x1ca00e8 = 0x1a000019
*0x1ca00ec = 0xffff0000
Set DSI Clock to 150 MHz
*0x1c20168 = 0x8203
Power on DPHY Tx
*0x1ca1004 = 0x10000000
*0x1ca1010 = 0xa06000e
*0x1ca1014 = 0xa033207
*0x1ca1018 = 0x1e
*0x1ca101c = 0x0
*0x1ca1020 = 0x303
Enable DPHY
*0x1ca1000 = 0x31
*0x1ca104c = 0x9f007f00
*0x1ca1050 = 0x17000000
*0x1ca105c = 0x1f01555
*0x1ca1054 = 0x2
up_udelay 5
Enable LDOR, LDOC, LDOD
*0x1ca1058 = 0x3040000
up_udelay 1
*0x1ca1058: clear 0xf8000000, set 0xf8000000
up_udelay 1
*0x1ca1058: clear 0x4000000, set 0x4000000
up_udelay 1
*0x1ca1054: clear 0x10, set 0x10
up_udelay 1
*0x1ca1050: clear 0x80000000, set 0x80000000
*0x1ca1054: clear 0xf000000, set 0xf000000
panel_init: start
writeDcs: len=4
b9 f1 12 83
channel=0, cmd=0x39, txlen=4
channel=0, cmd=0x39, txlen=4
packet: pktlen=10
39 04 00 2c b9 f1 12 83
84 5d
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x2c000439
*0x1ca0304: clear 0xffffffff, set 0x8312f1b9
*0x1ca0308: clear 0xffffffff, set 0x5d84
*0x1ca0200: clear 0xff, set 0x9
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=4
writeDcs: len=28
ba 33 81 05 f9 0e 0e 20
00 00 00 00 00 00 00 44
25 00 91 0a 00 00 02 4f
11 00 00 37
channel=0, cmd=0x39, txlen=28
channel=0, cmd=0x39, txlen=28
packet: pktlen=34
39 1c 00 2f ba 33 81 05
f9 0e 0e 20 00 00 00 00
00 00 00 44 25 00 91 0a
00 00 02 4f 11 00 00 37
2c e2
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x2f001c39
*0x1ca0304: clear 0xffffffff, set 0x58133ba
*0x1ca0308: clear 0xffffffff, set 0x200e0ef9
*0x1ca030c: clear 0xffffffff, set 0x0
*0x1ca0310: clear 0xffffffff, set 0x44000000
*0x1ca0314: clear 0xffffffff, set 0xa910025
*0x1ca0318: clear 0xffffffff, set 0x4f020000
*0x1ca031c: clear 0xffffffff, set 0x37000011
*0x1ca0320: clear 0xffffffff, set 0xe22c
*0x1ca0200: clear 0xff, set 0x21
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=28
writeDcs: len=5
b8 25 22 20 03
channel=0, cmd=0x39, txlen=5
channel=0, cmd=0x39, txlen=5
packet: pktlen=11
39 05 00 36 b8 25 22 20
03 03 72
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x36000539
*0x1ca0304: clear 0xffffffff, set 0x202225b8
*0x1ca0308: clear 0xffffffff, set 0x720303
*0x1ca0200: clear 0xff, set 0xa
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=5
writeDcs: len=11
b3 10 10 05 05 03 ff 00
00 00 00
channel=0, cmd=0x39, txlen=11
channel=0, cmd=0x39, txlen=11
packet: pktlen=17
39 0b 00 2c b3 10 10 05
05 03 ff 00 00 00 00 6f
bc
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x2c000b39
*0x1ca0304: clear 0xffffffff, set 0x51010b3
*0x1ca0308: clear 0xffffffff, set 0xff0305
*0x1ca030c: clear 0xffffffff, set 0x6f000000
*0x1ca0310: clear 0xffffffff, set 0xbc
*0x1ca0200: clear 0xff, set 0x10
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=11
writeDcs: len=10
c0 73 73 50 50 00 c0 08
70 00
channel=0, cmd=0x39, txlen=10
channel=0, cmd=0x39, txlen=10
packet: pktlen=16
39 0a 00 36 c0 73 73 50
50 00 c0 08 70 00 1b 6a
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x36000a39
*0x1ca0304: clear 0xffffffff, set 0x507373c0
*0x1ca0308: clear 0xffffffff, set 0x8c00050
*0x1ca030c: clear 0xffffffff, set 0x6a1b0070
*0x1ca0200: clear 0xff, set 0xf
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=10
writeDcs: len=2
bc 4e
channel=0, cmd=0x15, txlen=2
channel=0, cmd=0x15, txlen=2
packet: pktlen=4
15 bc 4e 35
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x354ebc15
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=2
writeDcs: len=2
cc 0b
channel=0, cmd=0x15, txlen=2
channel=0, cmd=0x15, txlen=2
packet: pktlen=4
15 cc 0b 22
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x220bcc15
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=2
writeDcs: len=2
b4 80
channel=0, cmd=0x15, txlen=2
channel=0, cmd=0x15, txlen=2
packet: pktlen=4
15 b4 80 22
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x2280b415
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=2
writeDcs: len=4
b2 f0 12 f0
channel=0, cmd=0x39, txlen=4
channel=0, cmd=0x39, txlen=4
packet: pktlen=10
39 04 00 2c b2 f0 12 f0
51 86
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x2c000439
*0x1ca0304: clear 0xffffffff, set 0xf012f0b2
*0x1ca0308: clear 0xffffffff, set 0x8651
*0x1ca0200: clear 0xff, set 0x9
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=4
writeDcs: len=15
e3 00 00 0b 0b 10 10 00
00 00 00 ff 00 c0 10
channel=0, cmd=0x39, txlen=15
channel=0, cmd=0x39, txlen=15
packet: pktlen=21
39 0f 00 0f e3 00 00 0b
0b 10 10 00 00 00 00 ff
00 c0 10 36 0f
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0xf000f39
*0x1ca0304: clear 0xffffffff, set 0xb0000e3
*0x1ca0308: clear 0xffffffff, set 0x10100b
*0x1ca030c: clear 0xffffffff, set 0xff000000
*0x1ca0310: clear 0xffffffff, set 0x3610c000
*0x1ca0314: clear 0xffffffff, set 0xf
*0x1ca0200: clear 0xff, set 0x14
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=15
writeDcs: len=6
c6 01 00 ff ff 00
channel=0, cmd=0x39, txlen=6
channel=0, cmd=0x39, txlen=6
packet: pktlen=12
39 06 00 30 c6 01 00 ff
ff 00 8e 25
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x30000639
*0x1ca0304: clear 0xffffffff, set 0xff0001c6
*0x1ca0308: clear 0xffffffff, set 0x258e00ff
*0x1ca0200: clear 0xff, set 0xb
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=6
writeDcs: len=13
c1 74 00 32 32 77 f1 ff
ff cc cc 77 77
channel=0, cmd=0x39, txlen=13
channel=0, cmd=0x39, txlen=13
packet: pktlen=19
39 0d 00 13 c1 74 00 32
32 77 f1 ff ff cc cc 77
77 69 e4
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x13000d39
*0x1ca0304: clear 0xffffffff, set 0x320074c1
*0x1ca0308: clear 0xffffffff, set 0xfff17732
*0x1ca030c: clear 0xffffffff, set 0x77ccccff
*0x1ca0310: clear 0xffffffff, set 0xe46977
*0x1ca0200: clear 0xff, set 0x12
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=13
writeDcs: len=3
b5 07 07
channel=0, cmd=0x39, txlen=3
channel=0, cmd=0x39, txlen=3
packet: pktlen=9
39 03 00 09 b5 07 07 7b
b3
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x9000339
*0x1ca0304: clear 0xffffffff, set 0x7b0707b5
*0x1ca0308: clear 0xffffffff, set 0xb3
*0x1ca0200: clear 0xff, set 0x8
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=3
writeDcs: len=3
b6 2c 2c
channel=0, cmd=0x39, txlen=3
channel=0, cmd=0x39, txlen=3
packet: pktlen=9
39 03 00 09 b6 2c 2c 55
04
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x9000339
*0x1ca0304: clear 0xffffffff, set 0x552c2cb6
*0x1ca0308: clear 0xffffffff, set 0x4
*0x1ca0200: clear 0xff, set 0x8
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=3
writeDcs: len=4
bf 02 11 00
channel=0, cmd=0x39, txlen=4
channel=0, cmd=0x39, txlen=4
packet: pktlen=10
39 04 00 2c bf 02 11 00
b5 e9
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x2c000439
*0x1ca0304: clear 0xffffffff, set 0x1102bf
*0x1ca0308: clear 0xffffffff, set 0xe9b5
*0x1ca0200: clear 0xff, set 0x9
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=4
writeDcs: len=64
e9 82 10 06 05 a2 0a a5
12 31 23 37 83 04 bc 27
38 0c 00 03 00 00 00 0c
00 03 00 00 00 75 75 31
88 88 88 88 88 88 13 88
64 64 20 88 88 88 88 88
88 02 88 00 00 00 00 00
00 00 00 00 00 00 00 00
channel=0, cmd=0x39, txlen=64
channel=0, cmd=0x39, txlen=64
packet: pktlen=70
39 40 00 25 e9 82 10 06
05 a2 0a a5 12 31 23 37
83 04 bc 27 38 0c 00 03
00 00 00 0c 00 03 00 00
00 75 75 31 88 88 88 88
88 88 13 88 64 64 20 88
88 88 88 88 88 02 88 00
00 00 00 00 00 00 00 00
00 00 00 00 65 03
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x25004039
*0x1ca0304: clear 0xffffffff, set 0x61082e9
*0x1ca0308: clear 0xffffffff, set 0xa50aa205
*0x1ca030c: clear 0xffffffff, set 0x37233112
*0x1ca0310: clear 0xffffffff, set 0x27bc0483
*0x1ca0314: clear 0xffffffff, set 0x3000c38
*0x1ca0318: clear 0xffffffff, set 0xc000000
*0x1ca031c: clear 0xffffffff, set 0x300
*0x1ca0320: clear 0xffffffff, set 0x31757500
*0x1ca0324: clear 0xffffffff, set 0x88888888
*0x1ca0328: clear 0xffffffff, set 0x88138888
*0x1ca032c: clear 0xffffffff, set 0x88206464
*0x1ca0330: clear 0xffffffff, set 0x88888888
*0x1ca0334: clear 0xffffffff, set 0x880288
*0x1ca0338: clear 0xffffffff, set 0x0
*0x1ca033c: clear 0xffffffff, set 0x0
*0x1ca0340: clear 0xffffffff, set 0x0
*0x1ca0344: clear 0xffffffff, set 0x365
*0x1ca0200: clear 0xff, set 0x45
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=64
writeDcs: len=62
ea 02 21 00 00 00 00 00
00 00 00 00 00 02 46 02
88 88 88 88 88 88 64 88
13 57 13 88 88 88 88 88
88 75 88 23 14 00 00 02
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 03
0a a5 00 00 00 00
channel=0, cmd=0x39, txlen=62
channel=0, cmd=0x39, txlen=62
packet: pktlen=68
39 3e 00 1a ea 02 21 00
00 00 00 00 00 00 00 00
00 02 46 02 88 88 88 88
88 88 64 88 13 57 13 88
88 88 88 88 88 75 88 23
14 00 00 02 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 03 0a a5 00 00
00 00 24 1b
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x1a003e39
*0x1ca0304: clear 0xffffffff, set 0x2102ea
*0x1ca0308: clear 0xffffffff, set 0x0
*0x1ca030c: clear 0xffffffff, set 0x0
*0x1ca0310: clear 0xffffffff, set 0x2460200
*0x1ca0314: clear 0xffffffff, set 0x88888888
*0x1ca0318: clear 0xffffffff, set 0x88648888
*0x1ca031c: clear 0xffffffff, set 0x88135713
*0x1ca0320: clear 0xffffffff, set 0x88888888
*0x1ca0324: clear 0xffffffff, set 0x23887588
*0x1ca0328: clear 0xffffffff, set 0x2000014
*0x1ca032c: clear 0xffffffff, set 0x0
*0x1ca0330: clear 0xffffffff, set 0x0
*0x1ca0334: clear 0xffffffff, set 0x0
*0x1ca0338: clear 0xffffffff, set 0x3000000
*0x1ca033c: clear 0xffffffff, set 0xa50a
*0x1ca0340: clear 0xffffffff, set 0x1b240000
*0x1ca0200: clear 0xff, set 0x43
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=62
writeDcs: len=35
e0 00 09 0d 23 27 3c 41
35 07 0d 0e 12 13 10 12
12 18 00 09 0d 23 27 3c
41 35 07 0d 0e 12 13 10
12 12 18
channel=0, cmd=0x39, txlen=35
channel=0, cmd=0x39, txlen=35
packet: pktlen=41
39 23 00 20 e0 00 09 0d
23 27 3c 41 35 07 0d 0e
12 13 10 12 12 18 00 09
0d 23 27 3c 41 35 07 0d
0e 12 13 10 12 12 18 93
bf
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x20002339
*0x1ca0304: clear 0xffffffff, set 0xd0900e0
*0x1ca0308: clear 0xffffffff, set 0x413c2723
*0x1ca030c: clear 0xffffffff, set 0xe0d0735
*0x1ca0310: clear 0xffffffff, set 0x12101312
*0x1ca0314: clear 0xffffffff, set 0x9001812
*0x1ca0318: clear 0xffffffff, set 0x3c27230d
*0x1ca031c: clear 0xffffffff, set 0xd073541
*0x1ca0320: clear 0xffffffff, set 0x1013120e
*0x1ca0324: clear 0xffffffff, set 0x93181212
*0x1ca0328: clear 0xffffffff, set 0xbf
*0x1ca0200: clear 0xff, set 0x28
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=35
writeDcs: len=1
11
channel=0, cmd=0x5, txlen=1
channel=0, cmd=0x5, txlen=1
packet: pktlen=4
05 11 00 36
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x36001105
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=1
up_udelay 120000
writeDcs: len=1
29
channel=0, cmd=0x5, txlen=1
channel=0, cmd=0x5, txlen=1
packet: pktlen=4
05 29 00 1c
*0x1ca0200 = 0x6000200
*0x1ca0300: clear 0xffffffff, set 0x1c002905
*0x1ca0200: clear 0xff, set 0x3
*0x1ca0048 = 0xf0004
*0x1ca0010: clear 0x1, set 0x0
*0x1ca0010: clear 0x1, set 0x1
ret=1
panel_init: end
Start HSC
*0x1ca0048 = 0xf02
Commit
*0x1ca0010: clear 0x1, set 0x1
Instruction Function Lane
*0x1ca0020: clear 0x10, set 0x0
up_udelay 1000
Start HSD
*0x1ca0048 = 0x63f07006
Commit
*0x1ca0010: clear 0x1, set 0x1
Testing Compose Short Packet (Without Parameter)...
channel=0, cmd=0x5, txlen=1
Result:
05 11 00 36
Testing Compose Short Packet (With Parameter)...
channel=0, cmd=0x15, txlen=2
Result:
15 bc 4e 35
Testing Compose Long Packet...
channel=0, cmd=0x39, txlen=64
Result:
39 40 00 25 e9 82 10 06
05 a2 0a a5 12 31 23 37
83 04 bc 27 38 0c 00 03
00 00 00 0c 00 03 00 00
00 75 75 31 88 88 88 88
88 88 13 88 64 64 20 88
88 88 88 88 88 02 88 00
00 00 00 00 00 00 00 00
00 00 00 00 65 03