玩转STM32MP157- 使用fbtft驱动 lcd st7735r
什么是fbtft
fbtft 在 github 中的介绍是“ Linux Framebuffer drivers for small TFT LCD display modules,翻译过来就是支持小型 TFT LCD 显示器的 Linux FrameBuffer 驱动。也就是专门为小型 TFT LCD 所写的 Framebuffer 驱动。
github 地址为:notro/fbtft
wiki 地址为:notro/wiki
从 fbtft 的 github 上看,fbtft 不再更新到 github 了,迁移到了 Linux kernel staging tree。在https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git/tree/drivers/staging/fbtft?h=staging-testing中看到 fbtft 所支持的设备有:

fbtft 在 STM32MP15X 中
在STM32MP15X 的4.19内核源码中,fbtft 源码在内核根目录的:drivers\staging\fbtft。

如何使用
我手上有 st7735r 跟 Ili9341 的屏,看了下 fbtft 里面的源码正好有 st7735r 跟 Ili9341 驱动,先试下 st7735r 的屏,
在文件 drivers\staging\fbtft\fb_st7735r.c 中:
static struct fbtft_display display = {
.regwidth = 8,
.width = 128,
.height = 160,
.init_sequence = default_init_sequence,
.gamma_num = 2,
.gamma_len = 16,
.gamma = DEFAULT_GAMMA,
.fbtftops = {
.set_addr_win = set_addr_win,
.set_var = set_var,
.set_gamma = set_gamma,
},
};
FBTFT_REGISTER_DRIVER(DRVNAME, "sitronix,st7735r", &display);
FBTFT_REGISTER_DRIVER展开后如下:
#define FBTFT_REGISTER_DRIVER(_name, _compatible, _display) \
\
static int fbtft_driver_probe_spi(struct spi_device *spi) \
{ \
return fbtft_probe_common(_display, spi, NULL); \
} \
\
static int fbtft_driver_remove_spi(struct spi_device *spi) \
{ \
struct fb_info *info = spi_get_drvdata(spi); \
\
return fbtft_remove_common(&spi->dev, info); \
} \
\
static int fbtft_driver_probe_pdev(struct platform_device *pdev) \
{ \
return fbtft_probe_common(_display, NULL, pdev); \
} \
\
static int fbtft_driver_remove_pdev(struct platform_device *pdev) \
{ \
struct fb_info *info = platform_get_drvdata(pdev); \
\
return fbtft_remove_common(&pdev->dev, info); \
} \
\
static const struct of_device_id dt_ids[] = { \
{ .compatible = _compatible }, \
{}, \
}; \
\
MODULE_DEVICE_TABLE(of, dt_ids); \
有这么条语句:
MODULE_DEVICE_TABLE(of, dt_ids);
从这看出要使用该设备,需要修改设备树。
修改源码
首先在make menuconfig中把fbtft加上:

1、修改设备树
由于我的屏是接在 STM32MP157c 的 SPI5,所以在设备树中 spi5 下面添加屏的设备数,CS 脚接到 STM32MP157C 的 GPIOF 6,DC 脚接到 GPIOF 3 脚,RESET 脚接到 GPIOD 13,设备数修改为如下:
&spi5 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&spi5_pins_a>;
pinctrl-1 = <&spi5_sleep_pins_a>;
cs-gpios = <&gpiof 6 GPIO_ACTIVE_HIGH>;
status = "okay";
st7735r@0{
compatible = "jianda,jd-t18003-t01", "sitronix,st7735r";
reg = <0>;
spi-max-frequency = <32000000>;
dc-gpios = <&gpiof 3 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>;
rotation = <270>;
backlight = &backlight;
};
};
编译并把设备树跟内核更新到板子上,启动,看屏没什么反应,/dev下也没有fb设备,查看spi相关信息:
root@stm32mp1:~# dmesg | grep "spi"
[ 1.543185] spi_stm32 44009000.spi: 8 x 8-bit fifo size
[ 1.543206] spi_stm32 44009000.spi: 16-bit maximum data frame
[ 1.543670] spi_stm32 44009000.spi: registered master spi0
[ 1.543900] spi spi0.0: stm32_spi_setup: set gpio86 output high
[ 1.543943] spi spi0.0: setup mode 0, 8 bits/w, 32000000 Hz max --> 0
[ 1.544232] spi_stm32 44009000.spi: registered child spi0.0
[ 1.544245] spi_stm32 44009000.spi: driver initialized
[ 2.097755] fb_st7735r spi0.0: buswidth is not set
[ 2.102334] fb_st7735r: probe of spi0.0 failed with error -22
有错误,上网查了下资料,觉得可能是没有添加 buswidth,在设备树中把 buswitch 加上:
&spi5 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&spi5_pins_a>;
pinctrl-1 = <&spi5_sleep_pins_a>;
cs-gpios = <&gpiof 6 GPIO_ACTIVE_HIGH>;
status = "okay";
st7735r@0{
compatible = "jianda,jd-t18003-t01", "sitronix,st7735r";
reg = <0>;
buswidth = <8>;
spi-max-frequency = <32000000>;
dc-gpios = <&gpiof 3 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpiod 13 GPIO_ACTIVE_HIGH>;
rotation = <270>;
backlight = &backlight;
};
};
重新更新板子上的设备树,上电,可以看到屏幕有白色变黑色,应该是可以了,看下 /dev 目录,下图中上部分是修改前的,下部分是修改后的,可以看到修改后的在/dev下可以看到多了个fb设备:

测试
在屏上显示随机数:
cat /dev/urandom > /dev/fb0

玩转STM32MP157- 使用fbtft驱动 lcd st7735r的更多相关文章
- 玩转STM32MP157- 使用fbtft驱动 lcd ili9341
之前使用了 fbtft 成功驱动了lcd st7735r,现在尝试下驱动 ili9341, 配置 跟之前用 fbtft 驱动 st7735r 一样,先用 make menuconfig 配置内核,添加 ...
- 用普通IO驱动LCD的控制方法-松瀚汇编源程序
/*************************************** 本例程为IO直接驱动LCD的方法 以下是松瀚MCU汇编源程序 **************************** ...
- 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...
- STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器.它与无源TN-LCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性 ...
- STM32驱动LCD实战
前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文章,本文将对STM32驱动LCD进行实战应用.LCD是深圳市拓普微科技开发有限公司的LMT028 ...
- 基于V7的emWin多屏显示方案模板,同时驱动LCD和OLED例程
说明: 1.多屏驱动跟多图层驱动是类似的,可以使用函数GUI_SelectLayer做切换选择. 2.为了避免OLED闪烁问题,创建一个128*64bit的显存空间,然后使用emWin的GUI_TIM ...
- FPGA驱动LCD显示红绿蓝彩条
实验目的:先简单熟悉LCD灯的驱动和时序图的代码实现.设计功能是让LCD显示红绿蓝三种颜色,即三个彩带.本次实验比较容易实现,主要是对LCD驱动时序图的理解和时序参数的配置. 实验条件:1.LCD原理 ...
- 创龙DSP6748开发板驱动LCD屏
1. DSP6748内部有2个LCD控制器,Raster Controller 光栅控制器和the LCD Interface Display Driver (LIDD) controller 控制器 ...
- MSP430常见问题之LCD 显示驱动类
Q1:晶体一般都是接32768,然后使用液晶很正常.我打算将晶体接6M的替换32768,那么液晶还能正常显示吗A1:看你所用的LCM 模块时序极限是多少HZ,然后看6M情况下,MSP430去驱动LCM ...
随机推荐
- Java GUI学习,贪吃蛇小游戏
JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...
- golang:Channel协程间通信
channel是Go语言中的一个核心数据类型,channel是一个数据类型,主要用来解决协程的同步问题以及协程之间数据共享(数据传递)的问题.在并发核心单元通过它就可以发送或者接收数据进行通讯,这在一 ...
- [其他] vscode 快速教程
概述 vs:集成开发环境,包括软件生命周期中需要的大部分工具,如UML,代码管控,IDE等 vs code:代码编辑器,支持插件扩展,对网页和云端开发做了优化 快捷键 F1/ctrl+shift+p: ...
- [刷题] 77 Combinations
要求 给出两个整数n和k,在n个数字中选出k个数字的所有组合 示例 n=4 , k=2 [ [ 1, 2 ] , [ 1, 3 ] , [ 1, 4 ] , [ 2, 3 ] , [ 2, 4 ] , ...
- 小米华为vivooppo手机记录隐私证据查询
1.在拨号界面输入:*#*#4636#*#* 2.在输入代码之后 手机会自动跳转到下面这个页面 就可以查看她到底拿着手机在干嘛 2 输入下面代码可以检测小米手机的各种信息 *#*#64663#*#*
- jmeter线程组扩展空间——Stepping Thread Group
安装方法跟安装其他插件一样,不复赘述 各个配置含义: 举个例子:一个线程组下包含了登陆和抽奖两个接口 1.继续:如果登陆接口失败,会继续执行抽奖接口 2.start next thread loop: ...
- MyBatis 高级查询之多对多查询(十一)
高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...
- MyBatis 高级查询之一对多查询(十)
高级查询之一对多查询 查询条件:根据游戏名称,查询游戏账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据游戏名查询游戏账号 * @param ...
- minikube与kubectl版本不一致问题
在使用minikube学习的时候,会出现你在mac上安装的minikube默认是最新版本,但是实际情况是需要安装低一些版本.可以按照k8s官方文档安装的时候指定不同安装版本,如果很慢或者无法访问直接走 ...
- unity inputfield 过滤emoji输入
unity版本:unity2017.1.5f1 复现步骤:InputField在安卓手机InputField连续输入两个emoji会报错 报错内容: 2020-01-08 19:56:38.366 2 ...