天天看點

[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

入門linux之全志H3 nanopi 點亮ST7789VW IPS屏

  • NanoPi-NEO-Air 入門
    • Nnaopi的IO
    • 裝置樹(sun8i-h3-nanopi-neo-air.dts)中禁用其他SPI節點和使能ST7789VW節點:
    • 修改初始化函數
    • 使用1.14(135*240)ips螢幕的注意修改函數set_addr_win
    • 把驅動編譯進核心
    • 編譯核心 裝置樹 下載下傳重新開機看效果
    • 實際效果
    • 播放視訊
    • 運作QT

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

[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

裝置樹(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:[email protected]{
	  status="disable";
	};
	st7789vw: [email protected]{
	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: [email protected]{
	// 	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: [email protected]{
	// 		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;
	}
           
[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

把驅動編譯進核心

最原始的核心沒有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:

[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

Kconfig:

[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

再到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 [email protected]:/boot

網絡更新裝置樹

scp arch/arm/boot/dts/sun8i-h3-nanopi-neo-air.dtb [email protected]:/boot

[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

實際效果

1.3寸 240*240 IPS效果:

[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

播放視訊

mplayer badapple_320_240_15fps.avi -vo fbdev
[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

運作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
           
[linux]全志H3 nanopi 點亮ST7789VW IPS屏NanoPi-NEO-Air 入門

繼續閱讀