[linux]全志H3 nanopi 点亮ST7789VW IPS屏

7 篇文章 5 订阅
1 篇文章 0 订阅

NanoPi-NEO-Air 入门

记录一下第一次尝试用linux点亮spi屏幕的过程,一共尝试了0.96 ST7735S(80160) \1.8 st7735R(128160) \1.14 st7789v(135240) \1.3 st7789vw (240240)这几个屏幕,有个奇怪的现象就是必须要接SPI0的CS引脚到显示屏上才能正常显示。

Nnaopi的IO

设备树(sun8i-h3-nanopi-neo-air.dts)中禁用其他SPI节点和使能ST7789VW节点:

在最后加上以下代码,st7735r和st7735s也调试过可用,7735超过48M显示的颜色就不正常了,7789vw可以96M正常显示,原始的IO口是
DC PA1 RESET PG11 BL PA0
我改成了
DC PA1 RESET PA2 BL PA0
同时禁用hdmi,防止开机从hdmi显示

&spi0{
	spidev0:spi@0{
	  status="disable";
	};
	st7789vw: st7789vw@0{
	compatible = "sitronix,st7789vw";
	reg = <0>;
	status = "okay";
	spi-max-frequency = <96000000>;
	buswidth = <8>;   
	rotate = <0>;
	fps = <60>;
	rgb;
	dc-gpios = <&pio 0 1 GPIO_ACTIVE_HIGH>;  /* PA1 */
	reset-gpios = <&pio 0 2 GPIO_ACTIVE_HIGH>; /* PA2*/
	led-gpios = <&pio 0 0 GPIO_ACTIVE_LOW>;  /* PA0 */
	debug = <0x00>;
	};

	// st7735r: st7735r@0{
	// 	compatible = "sitronix,st7735r";
	// 	reg = <0>;
	// 	status = "okay";
	// 	spi-max-frequency = <36000000>;
	// 	spi-cpol;
	// 	spi-cpha;
	// 	rotate = <90>;
	// 	fps = <60>;
	// 	buswidth = <8>;
	// 	dc-gpios = <&pio 0 1 GPIO_ACTIVE_HIGH>;  /* PA1 */
	// 	reset-gpios = <&pio 0 2 GPIO_ACTIVE_HIGH>; /* PA2*/
	// 	led-gpios = <&pio 0 0 GPIO_ACTIVE_LOW>;  /* PA0 */
	// 	debug = <0x0>;
	// 	};
	// st7735s: st7735s@0{
	// 		compatible = "sitronix,st7735s";
	// 		reg = <0>;
	// 		status = "okay";
	// 		spi-max-frequency = <36000000>;
	// 		spi-cpol;
	// 		spi-cpha;
	// 		rotate = <0>;
	// 		fps = <60>;
	// 		buswidth = <8>;
	// 		dc-gpios = <&pio 0 1 GPIO_ACTIVE_HIGH>;  /* PA1 */
	// 		reset-gpios = <&pio 0 2 GPIO_ACTIVE_HIGH>; /* PA2 */
	// 		led-gpios = <&pio 0 0 GPIO_ACTIVE_LOW>;  /* PA0 */
	// 		debug = <0x0>;
	// 		};
};

&hdmi {
  status = "disable";
};

修改初始化函数

原始的初始化没有复位显示屏,在初始化中添加

par->fbtftops.reset(par);
write_reg(par, PVGAMCTRL, 0xD0, 0x04, 0x0D, 0x11, 0x13, 0x2B, 0x3F, 0x54, 0x4C, 0x18, 0x0D, 0x0B, 0x1F, 0x23);
write_reg(par, NVGAMCTRL, 0xD0, 0x04, 0x0C, 0x11, 0x13, 0x2C, 0x3F, 0x44, 0x51, 0x2F, 0x1F, 0x1F, 0x20, 0x23);

static int init_display(struct fbtft_par *par)
{
	par->fbtftops.reset(par);

	// /* turn off sleep mode */
	write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE);
	mdelay(120);

	write_reg(par, MIPI_DCS_SET_ADDRESS_MODE, 0x0);
	write_reg(par, MIPI_DCS_SET_PIXEL_FORMAT, MIPI_DCS_PIXEL_FMT_16BIT);
	write_reg(par, PORCTRL, 0x0C, 0x0C, 0x00, 0x33, 0x33);
	write_reg(par, GCTRL, 0x35);
	write_reg(par, VCOMS, 0x19);
	write_reg(par, LCMCTRL, 0x2C);
	write_reg(par, VDVVRHEN, 0x01);
	write_reg(par, VRHS, 0x12);
	write_reg(par, VDVS, 0x20);
	write_reg(par, FRCTRL2, 0x0F);
	write_reg(par, PWCTRL1, 0xA4, 0xA1);
	write_reg(par, PVGAMCTRL, 0xD0, 0x04, 0x0D, 0x11, 0x13, 0x2B, 0x3F, 0x54, 0x4C, 0x18, 0x0D, 0x0B, 0x1F, 0x23);
	write_reg(par, NVGAMCTRL, 0xD0, 0x04, 0x0C, 0x11, 0x13, 0x2C, 0x3F, 0x44, 0x51, 0x2F, 0x1F, 0x1F, 0x20, 0x23);
	write_reg(par, MIPI_DCS_ENTER_INVERT_MODE);
	write_reg(par, MIPI_DCS_SET_DISPLAY_ON);
	mdelay(120);
     return 0;

}

使用1.14(135*240)ips屏幕的注意修改函数set_addr_win

原始的函数没有纠正偏移量,增加以下代码(只有135*240的需要增加,其他的屏不需要):

switch(par->info->var.rotate)
	{
		case   0: xs+=53;xe+=53;ys+=40;ye+=40;
				 break;
		case  90: xs+=40;xe+=40;ys+=53;ye+=53;
				 break;
		case 180: xs+=53;xe+=53;ys+=40;ye+=40;
				 break;
		case 270: xs+=40;xe+=40;ys+=53;ye+=53;
				 break;
		default :
				 break;
	}

在这里插入图片描述

把驱动编译进内核

最原始的内核没有ST7789VW,只有ST7789V,所以把st7789v.c复制粘贴改名为st7789vw.c,相应驱动做一下修改,并且修改fbtft目录下的Kconfig和Makefile,这里我增加了ST7789VW和ST7735S的驱动

config FB_TFT_ST7789VW
	tristate "FB driver for the ST7789VW LCD Controller"
	depends on FB_TFT
	help
	  This enables generic framebuffer support for the Sitronix ST7789VW
	  display controller. The controller is intended for small color
	  displays with a resolution of up to 240x240 pixels.

	  Say Y if you have such a display that utilizes this controller.

Makefile:
在这里插入图片描述
Kconfig:
在这里插入图片描述
再到menuconfig使能此驱动,

make menuconfig ARCH=arm CROSS_COMPILE=arm-linux- -j80

Device Drivers  --->  
	[*] Staging drivers  --->  
		<*>   Support for small TFT LCD display modules  --->
			<*>   FB driver for the ST7789VW LCD Controller 

编译内核 设备树 下载重启看效果

make zImage dtbs ARCH=arm CROSS_COMPILE=arm-linux- -j80
网络更新内核
scp arch/arm/boot/zImage root@192.168.137.83:/boot
网络更新设备树
scp arch/arm/boot/dts/sun8i-h3-nanopi-neo-air.dtb root@192.168.137.83:/boot
在这里插入图片描述

实际效果

1.3寸 240*240 IPS效果:
在这里插入图片描述

播放视频

mplayer badapple_320_240_15fps.avi -vo fbdev

在这里插入图片描述

运行QT

apt-get update && apt-get install git
git clone https://github.com/friendlyarm/matrix.git
cd matrix/demo/nanopi-status
./build.sh
./run.sh /dev/fb_st7789vw

在这里插入图片描述

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
为了在全志H3开发板上驱动ST7789显示,你可以按照以下步骤进行操作: 1. 准备开发环境:确保你的全志H3开发板上已经安装了Linux系统,并安装了相关的开发工具链。 2. 获取驱动代码:首先,你需要获取适用于H3平台的ST7789驱动代码。你可以在全志官方提供的开发者论坛或其他资源中找到相关的代码。或者,你还可以尝试搜索GitHub等代码托管平台上的开源项目。 3. 编译驱动代码:将获取到的驱动代码拷贝到开发板上,并使用适当的编译工具链进行编译。通常,你需要阅读驱动代码中的README或其他说明文件,以了解如何正确配置和编译该驱动。 4. 加载驱动模块:编译成功后,将生成的驱动模块加载到全志H3开发板的Linux系统中。你可以使用`insmod`命令加载模块,例如: ``` insmod st7789.ko ``` 这将加载名为`st7789.ko`的驱动模块。 5. 配置设备树:根据你的硬件连接和需求,需要在全志H3开发板的设备树(Device Tree)文件中配置ST7789显示。设备树是描述硬件设备和资源分配的文件,在Linux内核启动时被加载和解析。 打开设备树文件(通常位于`/boot/dtb/allwinner/sun8i-h3-xxx.dts`),找到SPI节点,并添加ST7789显示的相关配置。 以下是一个示例代码片段,用于在设备树中配置ST7789显示: ``` spi@0x1c0b000 { compatible = "allwinner,sun8i-h3-spi"; reg = <0x01c0b000 0x1000>; interrupts = <0 31 1>; #address-cells = <1>; #size-cells = <0>; display@0 { compatible = "st,st7789"; reg = <0>; spi-max-frequency = <24000000>; reset-gpios = <&pio 6 1>; dc-gpios = <&pio 7 1>; backlight-gpios = <&pio 8 1>; // 其他配置参数 }; } ``` 注意:以上示例中的GPIO引脚编号(如6、7、8)以及其他参数需要根据你的具体硬件连接和需求进行调整。 6. 重新编译设备树:在全志H3开发板上,使用设备树编译工具(如`dtc`)将修改后的设备树文件编译为二进制格式。例如: ``` dtc -I dts -O dtb -o sun8i-h3-xxx.dtb sun8i-h3-xxx.dts ``` 这将生成名为`sun8i-h3-xxx.dtb`的设备树二进制文件。 7. 重新启动开发板:将重新编译后的设备树二进制文件(`sun8i-h3-xxx.dtb`)替换掉开发板上的原始设备树文件,并重新启动开发板。 ``` cp sun8i-h3-xxx.dtb /boot/dtb/allwinner/ reboot ``` 开发板将使用新的设备树文件启动,并加载ST7789驱动。 请确保按照驱动代码的要求进行正确的配置和编译,同时参考开发板和ST7789显示的文档以获取更多详细信息。希望这些步骤对你有所帮助!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值