在Raspberry Pi Zero W中配置TFT LCD Framebuffer驱动

TFT LCD Framebuffer驱动配置

文章目录

  • TFT LCD Framebuffer驱动配置
    • 1、硬件准备
    • 2、软件配置
      • 2.1 启用SPI驱动
      • 2.2 TFT LCD设备驱动树配置

本文将以ILI9341 LCD为例,将详细介绍如何配置TFT LCD的Framebuffer驱动。

1、硬件准备

  • Raspberry Pi Zero W开发板一个(镜像Linux内核版本为5.18.84+)
  • TFT LCD 模块一个(ILI9341驱动IC)
  • 连接线
  • 数据线
  • 面包板

TFT LCD与Raspberry Pi Zero W接线如下:

序号TFT LCDRaspberry PI
1VCC3.3V或5V
2GNDGND
3SCKGPIO 11 SCLK (SPI0)
4SDAGPIO10 MOSI (SPI0)
5RSTGPIO 6
6DCGPIO 5
7CSGPIO8 Chip-Enable-CE0(SPI0)

Raspberry PI Zero W的引脚如下:

在这里插入图片描述

2、软件配置

2.1 启用SPI驱动

在命令行中输入:

sudo raspi-config

在这里插入图片描述

选择3 Interface Options进入接口驱动配置页面:

在这里插入图片描述

选择I4 SPI Enable/disable automatic loading of SPI kernel module开启或关闭SPI驱动。

另外,如果不想在命令中配置,也可以在图形界面中配置。还可以修改/boot/config.txt文件:

在这里插入图片描述

#符号删除即可启用spi。

2.2 TFT LCD设备驱动树配置

下面将创建自定义的DTS文件。下面将创建一个名称为ili9341.dts的文件。其内容如下:

/dts-v1/;
/plugin/;

/ {
	compatible = "brcm,bcm2835";

	// Enable the SPI controller
	fragment@0 {
		target = <&spi0>;
		__overlay__ {
			status = "okay";
		};
	};

	// Enabling the SPI controller also enables spidev on cs0, so we have disable it
	fragment@1 {
		target = <&spidev0>;
		__overlay__ {
			status = "disabled";
		};
	};

	fragment@2 {
		target = <&spi0>;
		__overlay__ {
			/* needed to avoid dtc warning */
			#address-cells = <1>;
			#size-cells = <0>;

			display: display@0{
				// MIPI DBI compatible driver
				// This driver is used because it can ignore an illegal rotate value
				// and doesn't have a set_gamma() function.
				compatible = "ilitek,ili9341";
				reg = <0>; // Chip Select 0

				spi-max-frequency = <32000000>; // 32MHz

				reset-gpios = <&gpio 6 1>; // reset is active low hence the 1
				dc-gpios = <&gpio 5 0>;

				width = <320>;
				height = <240>;
				buswidth = <8>; // Most controllers use this value

				// This is a hack to prevent fb_s6d02a1.c:set_var() from issuing
				// command 0x36 after the init sequence has been applied and thus
				// changing the config.
				rotate = <1>;

				// see drivers/staging/fbtft/fb_ili9341.c:init_display() for how this looks in the driver
				// Command 0x36 is taken from the fb_ili9341.c:set_var() function.
				init = <0x1000001
					0x2000005
					0x1000028
					0x10000cf 0x00 0x83 0x30
					0x10000ed 0x64 0x03 0x12 0x81
					0x10000e8 0x85 0x01 0x79
					0x10000cb 0x39 0x2c 0x00 0x34 0x02
					0x10000f7 0x20
					0x10000ea 0x00 0x00
					0x10000c0 0x26
					0x10000c1 0x11
					0x10000c5 0x35 0x3e
					0x10000c7 0xbe
					0x100003a 0x55
					0x1000036 0x28
					0x10000b1 0x00 0x1b
					0x1000026 0x01
					0x10000f2 0x08
					0x1000026 0x01
					0x10000e0 0x1f 0x1a 0x18 0x0a 0x0f 0x06 0x45 0x87 0x32 0x0a 0x07 0x02 0x07 0x05 0x00
					0x10000e1 0x00 0x25 0x27 0x05 0x10 0x09 0x3a 0x78 0x4d 0x05 0x18 0x0d 0x38 0x3a 0x1f
					0x10000b7 0x07
					0x10000b6 0x0a 0x82 0x27 0x00
					0x1000011
					0x2000064
					0x1000029
					0x2000064>;

				debug = <0x4000000>; // print init commands to the kernel log
			};
		};
	};
};

请根据自己的接线修改引脚:

  • reset-gpios:LCD 的RES引脚
  • dc-gpios:LCD的DC引脚

init为LCD的初始化指令。

编译DTS

在命令行中,执行如下命令:

dtc -o ili9341.dtbo ili9341.dts

将编译好的dtbo文件复制到/boot/overlays/

sudo cp ili9341.dtbo /boot/overlays/

配置overlays

打开/boot/config.txt文件,在文件末尾添加如下内容:

dtoverlay=ili9341

保存并重新启动系统。在系统启动完成后,在命令行执行命令:

dmesg

可以看到TFT的Framebuffer内核日志信息:

[   40.657276] fbtft: module is from the staging directory, the quality is unknown, you have been warned.
[   40.911475] fb_ili9341: module is from the staging directory, the quality is unknown, you have been warned.
[   41.314042] SPI driver fb_ili9341 has no spi_device_id for ilitek,ili9341
[   41.314487] fb_ili9341 spi0.0: fbtft_property_value: width = 320
[   41.314532] fb_ili9341 spi0.0: fbtft_property_value: height = 240
[   41.314562] fb_ili9341 spi0.0: fbtft_property_value: buswidth = 8
[   41.314594] fb_ili9341 spi0.0: fbtft_property_value: debug = 67108864
[   41.314620] fb_ili9341 spi0.0: fbtft_property_value: rotate = 1
[   41.457358] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[   41.515507] fb_ili9341 spi0.0: init: write_register:
[   41.515554] fb_ili9341 spi0.0: buf[0] = 01
[   41.515705] fb_ili9341 spi0.0: init: msleep(5)
[   41.547050] fb_ili9341 spi0.0: init: write_register:
[   41.547097] fb_ili9341 spi0.0: buf[0] = 28
[   41.549533] fb_ili9341 spi0.0: init: write_register:
[   41.549576] fb_ili9341 spi0.0: buf[0] = CF
[   41.549607] fb_ili9341 spi0.0: buf[1] = 00
[   41.549628] fb_ili9341 spi0.0: buf[2] = 83
[   41.549649] fb_ili9341 spi0.0: buf[3] = 30
[   41.550784] fb_ili9341 spi0.0: init: write_register:
[   41.550821] fb_ili9341 spi0.0: buf[0] = ED
[   41.550848] fb_ili9341 spi0.0: buf[1] = 64
[   41.550868] fb_ili9341 spi0.0: buf[2] = 03
[   41.550888] fb_ili9341 spi0.0: buf[3] = 12
[   41.550907] fb_ili9341 spi0.0: buf[4] = 81
[   41.551978] fb_ili9341 spi0.0: init: write_register:
[   41.552019] fb_ili9341 spi0.0: buf[0] = E8
[   41.552045] fb_ili9341 spi0.0: buf[1] = 85
[   41.552067] fb_ili9341 spi0.0: buf[2] = 01
[   41.552088] fb_ili9341 spi0.0: buf[3] = 79
[   41.556254] fb_ili9341 spi0.0: init: write_register:
[   41.556350] fb_ili9341 spi0.0: buf[0] = CB
[   41.556382] fb_ili9341 spi0.0: buf[1] = 39
[   41.556404] fb_ili9341 spi0.0: buf[2] = 2C
[   41.556424] fb_ili9341 spi0.0: buf[3] = 00
[   41.556444] fb_ili9341 spi0.0: buf[4] = 34
[   41.556464] fb_ili9341 spi0.0: buf[5] = 02
[   41.558014] fb_ili9341 spi0.0: init: write_register:
[   41.558055] fb_ili9341 spi0.0: buf[0] = F7
[   41.558083] fb_ili9341 spi0.0: buf[1] = 20
[   41.559167] fb_ili9341 spi0.0: init: write_register:
[   41.559208] fb_ili9341 spi0.0: buf[0] = EA
[   41.559236] fb_ili9341 spi0.0: buf[1] = 00
[   41.559257] fb_ili9341 spi0.0: buf[2] = 00
[   41.561600] fb_ili9341 spi0.0: init: write_register:
[   41.561643] fb_ili9341 spi0.0: buf[0] = C0
[   41.561672] fb_ili9341 spi0.0: buf[1] = 26
[   41.561848] fb_ili9341 spi0.0: init: write_register:
[   41.561904] fb_ili9341 spi0.0: buf[0] = C1
[   41.561935] fb_ili9341 spi0.0: buf[1] = 11
[   41.566661] fb_ili9341 spi0.0: init: write_register:
[   41.566706] fb_ili9341 spi0.0: buf[0] = C5
[   41.566736] fb_ili9341 spi0.0: buf[1] = 35
[   41.566757] fb_ili9341 spi0.0: buf[2] = 3E
[   41.569197] fb_ili9341 spi0.0: init: write_register:
[   41.569236] fb_ili9341 spi0.0: buf[0] = C7
[   41.569267] fb_ili9341 spi0.0: buf[1] = BE
[   41.569440] fb_ili9341 spi0.0: init: write_register:
[   41.569465] fb_ili9341 spi0.0: buf[0] = 3A
[   41.569489] fb_ili9341 spi0.0: buf[1] = 55
[   41.571529] fb_ili9341 spi0.0: init: write_register:
[   41.571572] fb_ili9341 spi0.0: buf[0] = 36
[   41.571600] fb_ili9341 spi0.0: buf[1] = 28
[   41.580923] fb_ili9341 spi0.0: init: write_register:
[   41.580969] fb_ili9341 spi0.0: buf[0] = B1
[   41.580998] fb_ili9341 spi0.0: buf[1] = 00
[   41.581019] fb_ili9341 spi0.0: buf[2] = 1B
[   41.588734] fb_ili9341 spi0.0: init: write_register:
[   41.588781] fb_ili9341 spi0.0: buf[0] = 26
[   41.588811] fb_ili9341 spi0.0: buf[1] = 01
[   41.633770] fb_ili9341 spi0.0: init: write_register:
[   41.633816] fb_ili9341 spi0.0: buf[0] = F2
[   41.633847] fb_ili9341 spi0.0: buf[1] = 08
[   41.636043] fb_ili9341 spi0.0: init: write_register:
[   41.636086] fb_ili9341 spi0.0: buf[0] = 26
[   41.636116] fb_ili9341 spi0.0: buf[1] = 01
[   41.669646] fb_ili9341 spi0.0: init: write_register:
[   41.669691] fb_ili9341 spi0.0: buf[0] = E0
[   41.669720] fb_ili9341 spi0.0: buf[1] = 1F
[   41.669740] fb_ili9341 spi0.0: buf[2] = 1A
[   41.669759] fb_ili9341 spi0.0: buf[3] = 18
[   41.669779] fb_ili9341 spi0.0: buf[4] = 0A
[   41.669800] fb_ili9341 spi0.0: buf[5] = 0F
[   41.669819] fb_ili9341 spi0.0: buf[6] = 06
[   41.669838] fb_ili9341 spi0.0: buf[7] = 45
[   41.669857] fb_ili9341 spi0.0: buf[8] = 87
[   41.669877] fb_ili9341 spi0.0: buf[9] = 32
[   41.669897] fb_ili9341 spi0.0: buf[10] = 0A
[   41.669918] fb_ili9341 spi0.0: buf[11] = 07
[   41.669938] fb_ili9341 spi0.0: buf[12] = 02
[   41.669958] fb_ili9341 spi0.0: buf[13] = 07
[   41.669977] fb_ili9341 spi0.0: buf[14] = 05
[   41.669997] fb_ili9341 spi0.0: buf[15] = 00
[   41.683625] fb_ili9341 spi0.0: init: write_register:
[   41.683670] fb_ili9341 spi0.0: buf[0] = E1
[   41.683788] fb_ili9341 spi0.0: buf[1] = 00
[   41.683815] fb_ili9341 spi0.0: buf[2] = 25
[   41.683838] fb_ili9341 spi0.0: buf[3] = 27
[   41.683859] fb_ili9341 spi0.0: buf[4] = 05
[   41.683879] fb_ili9341 spi0.0: buf[5] = 10
[   41.683899] fb_ili9341 spi0.0: buf[6] = 09
[   41.683919] fb_ili9341 spi0.0: buf[7] = 3A
[   41.683939] fb_ili9341 spi0.0: buf[8] = 78
[   41.683958] fb_ili9341 spi0.0: buf[9] = 4D
[   41.683977] fb_ili9341 spi0.0: buf[10] = 05
[   41.683998] fb_ili9341 spi0.0: buf[11] = 18
[   41.684019] fb_ili9341 spi0.0: buf[12] = 0D
[   41.684038] fb_ili9341 spi0.0: buf[13] = 38
[   41.684059] fb_ili9341 spi0.0: buf[14] = 3A
[   41.684079] fb_ili9341 spi0.0: buf[15] = 1F
[   41.693430] fb_ili9341 spi0.0: init: write_register:
[   41.693474] fb_ili9341 spi0.0: buf[0] = B7
[   41.693504] fb_ili9341 spi0.0: buf[1] = 07
[   41.707164] fb_ili9341 spi0.0: init: write_register:
[   41.707209] fb_ili9341 spi0.0: buf[0] = B6
[   41.707240] fb_ili9341 spi0.0: buf[1] = 0A
[   41.707261] fb_ili9341 spi0.0: buf[2] = 82
[   41.707283] fb_ili9341 spi0.0: buf[3] = 27
[   41.707303] fb_ili9341 spi0.0: buf[4] = 00
[   41.719204] fb_ili9341 spi0.0: init: write_register:
[   41.719250] fb_ili9341 spi0.0: buf[0] = 11
[   41.721594] fb_ili9341 spi0.0: init: msleep(100)
[   41.833878] fb_ili9341 spi0.0: init: write_register:
[   41.833925] fb_ili9341 spi0.0: buf[0] = 29
[   41.834076] fb_ili9341 spi0.0: init: msleep(100)

在设备目录中,我们将可以看到有两个framebuffer设备文件,fb0,fb1,其中fb1就是我们的TFT LCD的Framebuffer设备。

在这里插入图片描述

从内核日志输出可以知道,fb_ili9341已经启动。结果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/300514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

密码学中的Hash函数

目录 一. 介绍 二. hash函数的五个基本性质 &#xff08;&#xff11;&#xff09;压缩性 &#xff08;&#xff12;&#xff09;正向计算简单性 &#xff08;&#xff13;&#xff09;逆向计算困难性 &#xff08;&#xff14;&#xff09;弱无碰撞性 &#xff08;&…

(九)One-Wire总线-DS18B20

文章目录 One-Wire总线篇复位和应答读/写0&#xff0c;1 DS18B20篇原理图概述最主要特性几个重要的寄存器&#xff08;部分要掌握&#xff09;存储有数字温度结果的2个字节宽度的温度寄存器寄存器描述&#xff1a;寄存器说明&#xff1a; 一个字节的过温和一个字节的低温&#…

[嵌入式AI从0开始到入土]10_yolov5在昇腾上应用

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

window使用cpolar实现内网穿透

文章目录 cpolar下载和安装启动和配置cpolar卸载 cpolar下载和安装 进入spolar官网&#xff0c;完成注册&#xff0c;下载相应的cploar版本解压和运行安装文件 配置安装路径&#xff0c;然后选择next&#xff0c;完成即可 启动和配置 点击首页的快捷图标打开网页&#xf…

python学习:实现猜数游戏和汉诺塔问题的解决

实现猜数游戏 规则&#xff1a; 计算机随机产生一个0~100的预设数字&#xff0c;让用户通过键盘输入所猜的数&#xff0c;如果大于预设的数&#xff0c;显示“遗憾&#xff0c;太大了“&#xff1b;小于预设的数&#xff0c;显示”遗憾&#xff0c;太小了“&#xff0c;如此循…

【MySQL】数据库之MMM高可用

目录 一、什么是MMM 二、关于MMM架构的说明 三、实操MMM的高可用 步骤一&#xff1a;完成主主复制、主从复制 步骤二&#xff1a;所有节点服务器都安装mysql-mmm,并完成mmm_common.conf文件的配置 步骤三&#xff1a;完成monitor节点服务器的配置文件修改mmm_mon.conf 步…

基于SSM的基金投资交易管理网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

K210基础实验系列

CanMV K210 开发板: CanMV K210 是由 01Studio 设计研发&#xff0c;基于嘉楠科技边缘计算芯片 K210 &#xff08; RSIC V 架构&#xff0c; 64 位双核&#xff09;方案的一款开发板&#xff0c;采用硬件一体化设计&#xff08; K210 核心板、 摄像头、 LCD 集成在一个…

mysql进阶-重构表

目录 1. 原因 2. 如何重构表呢&#xff1f; 2.1 命令1&#xff1a; 2.2 命令2&#xff1a; 2.3 命令3&#xff1a; 1. 原因 正常的业务开发&#xff0c;为什么需要重构表呢&#xff1f; 原因1&#xff1a;某张表存在大量的新增和删除操作&#xff0c;导致表经历过大量的…

深入了解Snowflake雪花算法:分布式唯一ID生成器

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

JVM中对象的创建

一.JVM运行流程 JVM向操作系统申请内存&#xff0c;初始化运行时数据区&#xff0c;接下来装载使用的类&#xff0c;执行类里面相应方法的时候为当前虚拟机栈压入一个栈帧&#xff0c;方法执行完成后栈帧出栈&#xff0c;进行垃圾回收。 二.JVM中对象的创建过程 符号引用&…

MySQL数据库进阶-事务

事务 事务由单独单元的一个或多个SQL语句组成&#xff0c;在这 个单元中&#xff0c;每个MySQL语句是相互依赖的。而整个单独单 元作为一个不可分割的整体&#xff0c;如果单元中某条SQL语句一 旦执行失败或产生错误&#xff0c;整个单元将会回滚。所有受到影 响的数据将返回到…

端云协同,Akamai 与快手联合落地 QUIC 提升海外用户视频体验

10月10日&#xff0c;负责支持和保护数字化体验且深受全球企业信赖的解决方案提供商阿卡迈技术公司( Akamai Technologies, Inc.&#xff0c;以下简称&#xff1a;Akamai )( NASDAQ&#xff1a;AKAM )携手全球领先的短视频记录和分享平台快手(HK&#xff1a;1024)通过全面落地 …

【LeetCode】150. 逆波兰表达式求值(ASCII码)

今日学习的文章链接和视频链接 leetcode题目地址&#xff1a;150. 逆波兰表达式求值 代码随想录题解地址&#xff1a;代码随想录 题目简介 即将后缀表达式转换成中缀表达式并计算。 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 …

【无线通信专题】NFC通信模式及可能的应用方式

在文章【无线通信专题】NFC基本原理中我们讲到了NFC工作模式。其中NFC工作模式主要有三种,读写模式、卡模拟模式、点对点模式。 NFC通信模式丰富,NFC Forum定义了三种NFC设备:通用NFCForum设备、读写器设备和标签设备。这些NFC设备可以在三种通信模式下运行,并对应用案例进…

【DevOps-05】Integrate工具

一、简要说明 持续集成、持续部署的工具很多,其中Jenkins是一个开源的持续集成平台。 Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务,并且还涉及到了构建项目等任务。 Jenkins需要大量的插件保证工作,安装成本较高,下面会基于Docker搭建Jenkins。 二、Jenk…

Java Base64简单介绍

1. Base64工具 工具链接 2. Base64示例代码 public class Base64Demo {// 请注意&#xff0c;在处理二进制数据时&#xff08;例如图片或文件&#xff09;&#xff0c;不需要将字节数组转换为字符串再进行编码或解码&#xff0c;// 可以直接对字节数组进行Base64操作。上述…

【前端设计】文字聚光灯

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 案例 文字聚光灯效果可以用于网站标题 html <!DOCTYPE html> <html lang"en&quo…

File与Io流

IO&#xff08;Input/Output&#xff09;是指计算机与外部世界进行数据交换的过程。在程序中&#xff0c;IO通常用于读取输入数据或将输出数据写入到外部设备或文件中。 Java的IO库主要分为两种类型&#xff1a;字节流和字符流。 字节流&#xff08;Byte Stream&#xff09;&a…

FreeRTOS移植详解

一、前言 本文旨在讲解FreeRTOS在STM32单片机上的移植步骤&#xff0c;对于FreeRTOS在其他单片机上的移植已具有一定的参考意义。相信读者在看完这篇文章后&#xff0c;一定会有所收获&#xff01; 文末附有相关资料连接&#xff0c;有需要的读者可以自行下载。 二、FreeRTOS源…
最新文章