差别
这里会显示出您选择的修订版和当前版本之间的差别。
— |
zh:ips [2019/10/06 23:07] (当前版本) |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | ==== SPI驱动液晶屏(framebuffer方式) ==== | ||
+ | 这个页面讲述如何使用MT7688A驱动液晶屏幕。 8-) ,据了解,在MT7688上用FB方法驱动彩屏,WIDORA首当其冲。 | ||
+ | 教程做好的固件: {{ ::openwrt-ramips-mt7688-widora32m-9341.bin |}} | ||
+ | |||
+ | ===准备=== | ||
+ | - iLi9341控制器的SPI液晶,也可以其他控制器,例如ST7735r,保证留出来SPI接口。 | ||
+ | - openwrt_widora代码,保证最新的master即可。 | ||
+ | - NEO一块,杜邦线若干。 | ||
+ | |||
+ | ===硬件连接=== | ||
+ | 拿我手里的液晶屏为例,是一块240*320分辨率的IPS液晶,液晶屏原理图: | ||
+ | {{ ::2.4横屏扣式_tk024f3041.pdf |}} | ||
+ | {{::屏幕快照_2018-01-20_上午9.56.10.png|}} | ||
+ | |||
+ | 需要连接的信号如下表: | ||
+ | ^ NEO ^ 液晶屏 ^ | ||
+ | | GND 电源地 | GND 电源地 | | ||
+ | | 3V3 电源 | 3V3 电源 | | ||
+ | | CK SPI时钟 | RS(SCK) | | ||
+ | | MO SPI数据输出 | MOSI SPI从机输入 | | ||
+ | | CS1 SPI片选1 | CS SPI片选 | | ||
+ | | VF FLASH电源 | RST 低电平复位,正常时保持高电平 | | ||
+ | | GPIO0 GPIO11脚 | WR(D/C) 数据/命令选择端 | | ||
+ | | 3V3 电源 | BL 背光控制,高电平点亮 | | ||
+ | |||
+ | {{ ::wechatimg42.jpeg?600 |}} | ||
+ | |||
+ | ===修改代码=== | ||
+ | 首先,保证有openwrt_widora的代码并且编译过,因为涉及到内核代码修改,不编译是找不到内核源码的。 | ||
+ | |||
+ | 1 进入内核视频驱动目录:cd build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.29/drivers/video/ | ||
+ | |||
+ | 2 使用git下载fbtft工程到这里:git clone https://github.com/notro/fbtft.git ,下载完后文件列表如下: | ||
+ | mangodeMacBook-Pro:video mango$ ls | ||
+ | Kconfig built-in.o fbdev logo of_display_timing.c videomode.c | ||
+ | Makefile console fbtft modules.builtin of_videomode.c | ||
+ | backlight display_timing.c hdmi.c modules.order vgastate.c | ||
+ | mangodeMacBook-Pro:video mango$ | ||
+ | |||
+ | 3 运行如下两句,让内核知道你这里添加了驱动 | ||
+ | * 在video/Makefile最后添加了一行 obj-y += fbtft | ||
+ | * {{::屏幕快照_2018-01-20_上午10.28.16.png|}} | ||
+ | * 在video/Kconfig 中source "drivers/video/fbdev/Kconfig"行下添加一行:source "drivers/video/fbtft/Kconfig" | ||
+ | * {{::屏幕快照_2018-01-20_上午10.29.14.png|}} | ||
+ | |||
+ | 4 回到openwrt_widora根目录,运行make kernel_menuconfig,找 | ||
+ | Device Drivers ---> | ||
+ | Character devices ---> | ||
+ | |||
+ | {{::屏幕快照_2018-01-20_上午11.18.18.png|}} | ||
+ | |||
+ | Graphics support ---> | ||
+ | | ||
+ | {{::屏幕快照_2018-01-20_上午11.19.04.png|}} | ||
+ | |||
+ | 分别展开看: | ||
+ | Direct Rendering Manager ---> | ||
+ | < > Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) ---- | ||
+ | | ||
+ | Frame buffer Devices ---> | ||
+ | <*> Support for small TFT LCD display modules ---> | ||
+ | <*> FB driver for the ILI9341 LCD Controller | ||
+ | |||
+ | | ||
+ | | ||
+ | -*- Backlight & LCD device support ---> 这一项无需关心 | ||
+ | |||
+ | Console display driver support ---> | ||
+ | {{::屏幕快照_2018-01-20_上午11.21.39.png|}} | ||
+ | |||
+ | Bootup logo ---> | ||
+ | [ ] Standard black and white Linux logo (NEW) | ||
+ | [*] Standard 16-color Linux logo (NEW) | ||
+ | [*] Standard 224-color Linux logo (NEW) | ||
+ | |||
+ | 配置完后,推出时保存配置。 | ||
+ | {{::屏幕快照_2018-01-20_上午10.38.07.png|}} | ||
+ | |||
+ | 5 修改DTS,这里对应NEO,我们修改Widora32M.dts,路径是:target/linux/ramips/dts/Widora32M.dts | ||
+ | 从105行,spidev@1这一段整体换成: | ||
+ | ili9341@1 { | ||
+ | #address-cells = <1>; | ||
+ | #size-cells = <1>; | ||
+ | status = "okay"; | ||
+ | compatible = "ilitek,ili9341"; | ||
+ | reg = <1 0>; | ||
+ | spi-max-frequency = <32000000>; | ||
+ | txbuflen = <16>; | ||
+ | rotate = <0>; | ||
+ | bgr; | ||
+ | fps = <15>; | ||
+ | buswidth = <8>; | ||
+ | dc-gpios = <&gpio0 11 1>; | ||
+ | }; | ||
+ | |||
+ | 改好的DTS在此: {{ ::widora32m.dts.zip |}} | ||
+ | |||
+ | 回到openwrt_widora根目录开始编译,make V=s | ||
+ | 由于配置内核后,会和openwrt里个别选项冲突,例如有如下需要手动选择的情况,按照正常平台选择即可。 | ||
+ | {{::屏幕快照_2018-01-20_上午10.44.21.png|}} | ||
+ | |||
+ | ===颜色反了=== | ||
+ | 修改fb_ili9341.c,在0x11前增加一条0x21指令: | ||
+ | write_reg(par, 0x21); | ||
+ | write_reg(par, 0x11); /* sleep out */ | ||
+ | 修改后编译,刷入NEO。 | ||
+ | |||
+ | ===自动关屏幕问题=== | ||
+ | 在drivers/tty/vt.c中设定了自动关屏时间为10分钟,LCD在执行了关屏动作后可能出现错误,不能再恢复正常. 找到其中 static int blankinterval = 10*60; 这一句, 将数值改为0,自动关屏功能就会失效. | ||
+ | |||
+ | ===测试=== | ||
+ | |||
+ | 不出意外,可以看到启动logo了: | ||
+ | |||
+ | {{::wechatimg43.jpeg?600|}} | ||
+ | |||
+ | 终端,可以看到/dev/下有了fb0设备: | ||
+ | |||
+ | {{::屏幕快照_2018-01-20_上午11.29.02.png|}} | ||
+ | |||
+ | 把随机数打印到屏幕,不出意外看到花屏,root@Widora:~# cat /dev/urandom > /dev/fb0 | ||
+ | |||
+ | {{::wechatimg44.jpeg|}} | ||
+ | |||
+ | 把屏幕例化成了很多tty设备,所以也可以往屏幕打印字符了: | ||
+ | root@Widora:~# echo hello > /dev/tty0 | ||
+ | root@Widora:~# echo hello > /dev/tty0 | ||
+ | root@Widora:~# echo hello > /dev/tty0 | ||
+ | root@Widora:~# echo hello > /dev/tty0 | ||
+ | root@Widora:~# echo hello > /dev/tty0 | ||
+ | | ||
+ | 效果: | ||
+ | |||
+ | {{::wechatimg45.jpeg|}} |