一、概述

项目涉及到kernel配置、DTB设备树、fbtft屏驱动更改移植,驱动模块手动加载、屏幕调试。

二、准备工作1、64bitLinux系统,我用的是VMware+ubuntu16.4。2、嵌入式开发板,我用的是NanoPi-NEO,全志H3芯片,256MRAM。3、TFT屏一块,我用的是ST77357735S,128X128帧率。4、网线一根、数据线一根,5V2A电源一个(一定要2A以上)。三、开始干活1、搭建开发环境

开发环境的搭建、BSP包下载及编译参照全志H2/H3LinuxMainline介绍及下载,须要关心的是,全志原厂BSP和LinuxMainline的区别,全志BSP没有涉及到设备树linux查看端口占用,而LinuxMainline除了用到了设备树,并且在uboot配置都采用类似kernel那样的图形界面,之前用全志原厂BSP,资料比较少,走了好多弯路,所以现今使用的是LinuxMainline。

2、修改设备树文件

在linux/arch/arm/boot/dts目录下,目录中有好多dts文件和dtsi文件,找到sun8i-h3-nanopi.dtsi,因为nanopi引出了spi0的引脚,所以我们在spi0节点下添加fbtft相关代码(matrix:matrix@0),同时disable其他spi0设备:

&spi0 {
	/* needed to avoid dtc warning */
	#address-cells = ;
	#size-cells = ;
	status = "okay";
	pinctrl-names = "default";
	//pinctrl-0 = ;
	pinctrl-0 = ;//
	cs-gpios = ;//, ;
	spidev0: spi@0 {
		compatible = "nanopi,spidev";
		reg = ;
		status = "disabled";
		spi-max-frequency = ;
	};
    matrix: matrix@0{
        compatible =  "fa,st7735s";
         reg = ; 
         status = "okay";
 

嵌入式linux驱动开发教程_嵌入式 linux驱动_嵌入式linux驱动程序详解

spi-max-frequency = ; fps = ; rotate = ; buswidth = ; dc-gpios = ; /* PA17 */ reset-gpios = ; /* PA3 */ led-gpios = ; /* PA1 */ debug = ; }; }

按照代码中的cs-gpios=;推测spi的cs引脚为PG9(ABCD…对应01234…),更改文件中的IO配置

&pio {
	leds_npi: led_pins {
		pins = "PA10";
		function = "gpio_out";
	};
	spi0_cs_pins: spi0_cs_pins {
		//pins = "PC3", "PA6";
		pins = "PG9";
		function = "gpio_out";
	};
};

关掉HDMI,否则设备默认HDMI输出,tft死机

&hdmi {
	//status = "okay";
	status = "disable";
};
&hdmi_out {
	hdmi_out_con: endpoint {
		remote-endpoint = ;
	};
};
&sound_hdmi {
	//status = "okay";
	status = "disable";
};

在设备数表中添加节点

aliases {
		serial0 = &uart0;
		serial1 = &uart1;
		serial2 = &uart2;
		serial3 = &uart3;
		i2c0 = &i2c0;
		i2c1 = &i2c1;
		i2c2 = &i2c2;
		spi0 = &spi0;
		spi1 = &spi1;
		pwm0 = &pwm;
		mmc0 = &mmc0;
		mmc2 = &mmc2;
		ethernet0 = &emac;
		i2s0 = &i2s0;
		pcm5102a = &pcm5102a;
		spidev0 = &spidev0;
		matrix = &matrix;
		kewang = &kewang;
		spiflash = &spiflash;
		pitft = &pitft;
		pitft_ts = &pitft_ts;
		ir = &ir;
	};

3、移植tft驱动

因为LinuxMainline的BSP包上面没有st77357735s的驱动文件,并且在全志原厂的BSP上面有见到过st7735s.c的驱动文件,所以直接复制过来,因为源文件是160x80的帧率,所以须要在st7735s.c文件中改两个地方:

1:更改帧率

2、由于驱动和dtsi文件设置的屏幕参数旋转的90°嵌入式 linux驱动,按照手中屏幕的帧率128X128,更改起始点位置,否则屏幕下部会有黑条:

更改fbtft_device.c文件,在设备列表上面降低ft_st7735s设备节点

增加st7735s设备节点

{
        .name = "matrix-st7735s",
        .spi = &(struct spi_board_info) {
            .modalias = "fb_st7735s",
            .max_speed_hz = 32000000,
            .bus_num                = 0,
            .chip_select            = 1,        // third spi dev
            .mode = SPI_MODE_0,
			//.controller_data= &spi_config,
            .platform_data = &(struct fbtft_platform_data) {
                .display = {                
                    .buswidth = 8,
                    .backlight = 1,
                },

嵌入式 linux驱动_嵌入式linux驱动开发教程_嵌入式linux驱动程序详解

.gpios = (const struct fbtft_gpio []) { { "reset", 3 }, { "dc" , 17 }, { "led", 1 }, { "cs" , 201 }, }, } } }

4、修改st7735s.c和fbtft_device.c目录(linuxdriversstagingfbtft)下的Makefile和Kconfig文件

makefile中添加一行

Kconfig文件中添加代码,否则kernel图形界面配置选项未能找到

Kconfig文件修改

5、主makefile更改,路径在linux目录下

倘若不更改则每次make都须要带ARCH=armCROSS_COMPILE=arm-linux-,由于系统默认构架是arm64,为了便捷,所以干脆直接改主makefile,其中CROSS_COMPILE要填交叉编译工具所在路径

6、配置kernel

1、执行makesunxi_defconfig,这个配置文件是BSP自带的

2、makemenuconfig步入图形配置界面

3、按照次序依次选择DeviceDriver->Stagingdrivers->SupportforsmallTFTLCDdisplaymodules

4,、按右图,将st77357735s和tbtft_device选择成模块

5、编译kernel、dtbs、驱动模块,执行makezImagedtbsmodules,时间比较长

6、更新SD卡kernel、dtbs、驱动模块,将驱动模块复制到根文件系统目录linux查看硬件信息,具体为rootfs/lib/modules/4.x.x/kernel/driver/staging/fbtft

7、连接硬件

tft屏幕不仅VCC和GND之外,还有

SDA:传输的数据,即RGB数据;

SCL:SPI通讯时钟;

嵌入式linux驱动开发教程_嵌入式 linux驱动_嵌入式linux驱动程序详解

RES:复位,模块上电时拉低,一般情况下置1;

D/C:芯片的数据/控制引脚,当DC=0时写,当DC=1时写数据;

CS:从机片选,仅当CS为低电平时,芯片才能被使能;

BLK(led):背光灯,通常直接接高电平即可;

按照代码和联接好

屏幕连接

nanopi硬件引脚定义

8、开机上电调试

成功启动后,步入st7735s,kofbtft_device.ko驱动文件所在径/lib/modules/4.x.x/kernel/driver/staging/fbtft

执行:

sudo insmod fbtft_device.ko name=matrix-st7735s busnum=0 gpios="reset:3,dc:17" rotate=90 custom=1 height=128 width=128
sudo insmod fb_st7735s.ko

执行成功的话屏幕应当照亮了,通过lsmod才能看见模块已被加载,在/dev目录下,会形成fb0设备,倘若执行失败,可以通过dmesg|grep"fb"来查看内核日志,剖析具体缘由,通常都是因为参数错了造成;

9、设置开机手动加载模块

1、在st7735s.kofbtft_device.ko驱动模块目录下(/lib/modules/4.x.x/kernel/driver/staging/fbtft)执行sudodepmod-A生成map文件。

2、编辑文件/etc/modules嵌入式 linux驱动,添加如下:

fb_st7735s
fbtft_device

3、新建配置文件/etc/modprobe.d/fbtft.conf,内容如下:

options fbtft_device name=matrix-st7735s busnum=0 gpios=reset:3,dc:17 rotate=90 custom=1 height=128 width=128

4、上面3步完成后重启,应当就可以看见屏幕被照亮并显示了console,说明驱动被手动加载了

10、参考链接:

ZYNQ移植fbtft屏

nanopi-neo照亮spitft

11、添加图形界面

本文原创地址://lrxjmw.cn/kpzydsbsxgnq.html编辑:刘遄,审核员:暂无