T113S3使用NCS8801 LVDS转EDP芯片,需要LCD驱动里面通过I2C初始化NCS8801,但是实际测试发现,tina linux的i2c晚于disp驱动加载,这样disp驱动里面获取不到有效的i2c适配器。有什么方法让i2c在disp前加载?另外看别的帖子说不建议在disp里面用硬件i2c初始化,推荐用GPIO模拟,看了SDK里面ST7789V也是用GPIO模拟SPI,但是SPI write的时候,引脚的输入输出是固定的,不用切换引脚状态,但是I2C的SDA引脚在发送完数据后需要切换为input模式来接收ACK信号的,这样如果用lcd设备树里面的这种方式是不行的吧?这个还可以在disp驱动里面通过代码切换lcd_gpio_X的参数吗?如输入改为输出。
lcd_gpio_0 = <&pio PG 12 1 0 3 0>;
lcd_gpio_1 = <&pio PG 13 1 0 3 0>;
如果直接在disp驱动使用下面这种方式:
#define I2C_SCL 204
#define I2C_SDA 205
#define I2C_SCL_LOW() gpio_set_value(I2C_SCL, 0)
#define I2C_SDA_HIGH() gpio_direction_output(I2C_SDA, 1)
开机会有一堆报错
[ 0.650948] 8<--- cut here ---
[ 0.650952] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 0.650960] pgd = (ptrval)
[ 0.658090] uart3: ttyS3 at MMIO 0x2500c00 (irq = 35, base_baud = 1500000) is a SUNXI
▒▒ 0.660901] [00000000] *pgd=00000000
[ 0.669008] sw_console_setup()1807 - console setup baud 115200 parity n bits 8, flow n
[ 0.671684] Internal error: Oops: 5 [#1] PREEMPT SMP ARM
[ 0.696238] Modules linked in:
[ 0.696238] Modules linked in:
[ 0.696249] CPU: 0 PID: 21 Comm: kworker/0:1 Not tainted 5.4.61 #159
[ 0.696249] CPU: 0 PID: 21 Comm: kworker/0:1 Not tainted 5.4.61 #159
[ 0.696256] Hardware name: Generic DT based system
[ 0.696256] Hardware name: Generic DT based system
[ 0.702736] printk: console [ttyS3] enabled
[ 0.702736] printk: console [ttyS3] enabled
[ 0.716144] Workqueue: events start_work
[ 0.716144] Workqueue: events start_work
[ 0.716154] PC is at LCD_panel_init+0x44/0x13c
[ 0.716154] PC is at LCD_panel_init+0x44/0x13c
[ 0.716162] LR is at LCD_panel_init+0x40/0x13c
[ 0.716162] LR is at LCD_panel_init+0x40/0x13c
[ 0.726281] printk: bootconsole [earlycon0] disabled
[ 0.726281] printk: bootconsole [earlycon0] disabled
[ 0.735110] pc : [<c03962cc>] lr : [<c03962c8>] psr: 60000013
[ 0.735110] pc : [<c03962cc>] lr : [<c03962c8>] psr: 60000013
[ 0.735114] sp : c714de20 ip : 00000000 fp : 00000000
[ 0.735114] sp : c714de20 ip : 00000000 fp : 00000000
[ 0.735117] r10: 00000001 r9 : 00000000 r8 : c0b1bb66
[ 0.735117] r10: 00000001 r9 : 00000000 r8 : c0b1bb66
[ 0.735124] r7 : c0b1bb50 r6 : 00000000 r5 : 0000000b r4 : c714c000
[ 0.735124] r7 : c0b1bb50 r6 : 00000000 r5 : 0000000b r4 : c714c000
[ 0.821770] r3 : 50ca96b2 r2 : 50ca96b2 r1 : 06c7e000 r0 : 00000026
[ 0.821776] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
[ 0.821783] Control: 10c5387d Table: 4000406a DAC: 00000051
[ 0.829589] sun8iw20-pinctrl 2000000.pinctrl: 2000000.pinctrl supply vcc-pb not found, using dummy regulator
[ 0.837001] Process kworker/0:1 (pid: 21, stack limit = 0x(ptrval))
[ 0.837006] Stack: (0xc714de20 to 0xc714e000)
[ 0.837017] de20: 00000000 50ca96b2 c730fa00 c7391000 c7390000 00000001 c0c5d028 c0373c88
[ 0.837032] de40: c08272ba c730fa00 c714de98 c07248e0 00000000 00000000 00000000 c036dcf4
[ 0.843742] uart uart4: uart4 supply uart not found, using dummy regulator
[ 0.854390] de60: 00000000 00000000 00020002 c714de6c c714de6c 50ca96b2 c7070c00 c06ea2ac
[ 0.854399] de80: c714c000 00000001 00000000 00000000 c0c596e8 c036df5c 00000001 00000000
[ 0.854407] dea0: 00000000 00000000 00000004 00000000 00000002 00000002 00000000 00000008
[ 0.854416] dec0: 00000000 50ca96b2 00000000 c714c000 c0c59350 00000002 c0c596e8 c0369d10
[ 0.861637] uart4: ttyS4 at MMIO 0x2501000 (irq = 36, base_baud = 1500000) is a SUNXI
[ 0.866247] dee0: 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 0.866256] df00: 00000000 00000000 00000000 50ca96b2 00000000 c0c591e0 00000001 c0369e28
[ 0.866269] df20: c7040100 c76b6880 c0c594b8 c76b9900 00000000 00000000 c0c594bc c012f0ac
[ 0.876002] uart uart5: uart5 supply uart not found, using dummy regulator
[ 0.884498] df40: c7040100 c0c594b8 c7040100 c7040114 c76b6880 c714c000 c76b6898 c0b02d00
[ 0.884508] df60: c0b0b27c c012f6d0 00000000 c701e880 c714c000 c701e840 c7040100 c012f49c
[ 0.884517] df80: c704bec4 c701e89c 00000000 c0133f24 c701e840 c0133e04 00000000 00000000
[ 0.884527] dfa0: 00000000 00000000 00000000 c01010e8 00000000 00000000 00000000 00000000
[ 0.892457] uart5: ttyS5 at MMIO 0x2501400 (irq = 37, base_baud = 1500000) is a SUNXI
[ 0.901302] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 0.901310] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000
[ 0.901333] [<c03962cc>] (LCD_panel_init) from [<c0373c88>] (disp_lcd_enable+0x2a4/0x2e0)
[ 0.901349] [<c0373c88>] (disp_lcd_enable) from [<c036dcf4>] (disp_device_attached_and_enable+0x140/0x260)
[ 0.911201] misc dump reg init
[ 0.919574] [<c036dcf4>] (disp_device_attached_and_enable) from [<c036df5c>] (bsp_disp_device_switch+0x8c/0xec)
[ 0.919586] [<c036df5c>] (bsp_disp_device_switch) from [<c0369d10>] (disp_device_set_config+0xd8/0x100)
[ 0.919597] [<c0369d10>] (disp_device_set_config) from [<c0369e28>] (start_work+0xf0/0x174)
[ 0.919610] [<c0369e28>] (start_work) from [<c012f0ac>] (process_one_work+0x144/0x20c)
[ 0.919626] [<c012f0ac>] (process_one_work) from [<c012f6d0>] (worker_thread+0x234/0x2d8)
[ 1.108057] [<c012f6d0>] (worker_thread) from [<c0133f24>] (kthread+0x120/0x12c)
[ 1.116309] [<c0133f24>] (kthread) from [<c01010e8>] (ret_from_fork+0x14/0x2c)
[ 1.124361] Exception stack(0xc714dfb0 to 0xc714dff8)
[ 1.129992] dfa0: 00000000 00000000 00000000 00000000
[ 1.139112] dfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 1.148231] dfe0: 00000000 00000000 00000000 00000000 00000013 00000000
[ 1.155610] Code: e2878016 e5cd3003 ebf6fd7c e3a06000 (e5963000)
[ 1.162481] ---[ end trace a3d10cdfd74119e3 ]---
最后就是官方LCD调试PDF文档里面提到过SPI,I2C初始化的方式,是通过读取设备树信息probe设备的方式,那理论上这种也是需要i2c在disp之前加载吧,而且他T113S3的设备树貌似无法匹配手册上的方法。