OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18459|回复: 31

干货来了!!如何让你的正点原子IMX6ULL开发板支持TFT系列小屏幕(SPI接口的ST7789为例)

[复制链接]

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2020-12-5 22:04:24 | 显示全部楼层 |阅读模式
本帖最后由 it_do_just 于 2020-12-18 08:30 编辑

最近终于有时间把吃了一年灰的阿尔法开发板拿出来擦拭一下了。至于为什么有这块开发板主要是对原子哥的支持,以前STM32一直就是跟着正点原子走过来的,终于出了linux开发板没有理由不支持下啊,但由于之前一直在忙就没拿出来折腾,说实话板子外观还是一如既往的好看。在下载完原子哥的所有资料后就开始折腾,先花了点时间把整个文档教程都过了一遍,还是非常有用的,补充了之前的一些知识盲区。在把所有环境和教程都过完后当然是先装个漂亮的UI界面来欣赏下。
1.png

开发板使用的是QT5.5的环境,我是先在windows下用QT5.15先进行编译再放到ubuntu的QT5.5进行交叉编译最后移到开发板上,至于显示的温度为什么不出来是因为我的wifi获取不到url的信息,换成4G网络就正常了。我买的板子的是全套,带有7寸的大屏,所以显示的效果非常nice。但玩板子总得有点输出,不然循规蹈矩的学完就结束好像少点什么。于是决定自己为开发板驱动块屏,IMX的平台我之前一直没接触过,主要都是全志和瑞芯微的平台,所以从头驱动块屏还是有点学习价值的。翻了一下家底找出了一块满是灰尘的2.8寸小屏幕,这块屏是以前玩全志的时候用的,上板子厂家网站还能找到资料,如下:

2.png

芯片是ST7789,分辨率是240*320。外引接口是SPI。原子哥提供的源码不支持SPI接口的屏,所以需要花点功夫进行移植,第一步当然还是直接网络搜索查找相应的代码,但都没有找到在IMX上移植这款SPI屏的例子,只有在全志上的源码,所以下面就基于这份源码开始移植工作。这里需要提一下mainline内核自带“staging tree”,后面的工作都是基于staging tree开展的,staging tree解释如下“Greg Kh在2008年6月10号在Linux内核邮件列表里宣布建立了另外一棵kernel tree,没错,就是Linux staging tree。根据Greg的解释,staging tree建立之目的是用来放置一些未充分测试或者因为一些其他原因未能进入内核的新增驱动程序和新增文件系统。”而这棵树下就放有一个“fbtft”文件夹,原子哥提供的源码当然也有,如下:

3.png


此框架下支持的TFT屏幕列表:
4.png

你没看错,实际上IMX提供的这份源码里已经支持这么多TFT的屏幕,其中不乏原子哥在STM32 MINI开发板上用的“fb_ili9341”,意味着只要你想使用,只需花费少量的配置工作就可以直接使用上述的所有TFT屏幕,可谓开发利器,在实际工程项目中,在选购小屏低成本方案时可以优先考虑上述芯片,又省钱又省力。上述并没有我手上这块“ST7789”的支持,但是我找到的资料中刚好有基于staging tree的“ST7789”驱动文件,直接配置使用当然是不行的。基于“SPI”接口的屏需要先配置好设备树使能SPI,调通SPI驱动之后再调试Framebuffer,最后是测试。由于我是杜邦线连接的开发板,也不确定屏幕硬件是好是坏(毕竟有年份了),所以我先写了个简单的SPI驱动(不带FB)测试屏幕是否能正常显示,首先根据屏幕的接口配置设备树:

28.png
27.png
26.png
25.png

配置好设备树后参考正点原子的SPI代码进行修改,主要是框架部分的代码和发送部分,剩下的就是芯片的寄存器配置,寄存器配置我是参考找到的staging驱动代码进行修改的,提供的代码中write_reg函数是使用stging提供的fbtft框架实现的,所以需要自己写一个write函数来实现SPI的传输,由于篇幅限制,这里把不带FB的SPI驱动代码放到附件中(附件中的:st7789(no fb).c),需要的自行下载,编写好后看一下实验效果如下:

5.png

到了这一步,就说明屏幕的硬件接口,以及设备树的配置都是没问题,这样在后面移植staging下的fbtft驱动就可以排除硬件和设备树上的问题,这个过程也不是一步成功的,上面的驱动的代码我也调试了一阵子才实现这个效果,中途遇到的问题是通过逻辑分析仪和ST7789的芯片手册解决的,可以先抓波形看下实际输出是没问题的再接上屏幕,如下:

6.png

理论上在以往的MCU上,驱动就到此结束了,可以正常显示画点画线,但是在linux下这只是第一步,接下来就是重头的在staging下fbtft移植。需要把spi的这段驱动和framebuffer结合起来才能作为linux系统的显示设备使用,中间涉及很多操作函数和参数的设置,如果自己实现这段代码的话需要耗费比较长的时间去调试测试,但是staging的fbtft好就好在帮我们实现了这个过程,先把我从网上找到的staging驱动“fb_st7789s.c”直接放到fbtft这个文件夹下。根据plarform框架,这个“fb_st7789s.c”驱动文件只是driver驱动层,并不包含device设备层代码,所以需要在fbtft文件夹里面的“fbtft_device.c”添加上st7789的设备信息,相关的两个文件如下:

7.png

有关“fbtft_device.c”修改设备信息是从前面全志的资料中找到的,但是并不能直接使用,其中很多配置项是有问题的,经过调试最终需要在“fbtft_device.c”添加及修改的内容如下:

8.png
9.png

最后再次修改设备树,前面的测试代码验证完后就可以把设备树的spi节点删掉了,后面这些spi信息将由“fbtft_device.c”提供,修改前面的设备树配置去掉节点,如下:

10.png

这些都修改好后,就是添加到内核中,修改fbtft目录下Makefile和Kconfig(这一步主要为了集成到系统去),Makfile如下:

11.png

Kconfig如下:

12.png
13.png

在linux内核目录下使用make menuconfig找到相关配置项并勾选,如下:

14.png
15.png
16.png

把原来的lcd驱动去掉:

17.png
18.png

重新编译内核并启动,然而还是翻车了,系统已经生成了/dev/fb节点,并且可以往fb的缓存区写数据,然而屏幕就是一直白屏,什么都不显示,最后花了两天时间看了spi的源码和staging自带的tftfb框架源码后把问题定位到了源码的“fbtft_write_spi”函数,在里面居然没发现拉高拉低片选脚的操作,原先自己写SPI驱动屏幕的时候是需要先拉高,写完再拉低的,否则屏幕无法显示,也许其他屏幕不需要这个操作,但我手上的屏幕是需要的,这个函数在“fbtft-io.c”里面,添加如下代码:

19.png

修改完以后,再次烧录到内核,可以正常显示了。但在此之前,由于移植原来的device文件中brg参数为true,出现了颜色显示不对,导致启动的linux小企鹅变异,如下:

20.png

把“fbtft_device.c”中的st7789s设备信息的brg参数改为true即可,这一步也是检查了一天的代码,最后通过st7789的数据手册发现问题所在,修改后颜色显示正常,如下:

21.png

至此整个移植过程就结束了,虽然是移植,但是过程并不顺利,修改了很多原来在网络上找到的源码,主要是属性参数的配置部分,另外还修改了原本觉得不会有问题的内核源码部分,整个调试过程,看源码->看手册->逻辑分析仪,一步步调试。把过程放上来主要觉得很多项目处于成本考虑,还是很大概率会使用TFT的这种小屏,这个过程不仅适用了这款屏幕,其他TFTFB下的屏幕按照这个步骤,多少会有点帮助,甚至有些自带的tft屏幕只需要简单的改改设备树就可以直接使用了,因为这款是自带不支持的,所以麻烦比较多。最后驱动好了当然要放几个小应用来欣赏下,首先是正点原子官方自带的APP:

22.png

修改源码还可以实现屏幕旋转功能:

23.png

最后再放一个自己写的QT界面:

24.png

以上涉及需要修改的文件我都放在了附件中,有需要驱动tft屏幕的可以自行下载,整个过程不局限于驱动这块屏,其他屏的大致流程大同小异,如果直接选择fbtft目录下的屏幕还可以节省更多的工作量,所以建议选型时优先考虑fbtft目录的屏幕。

imx_fbtft.zip

23.32 KB, 下载次数: 197

我的博客:http://blog.csdn.net/itdo_just
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2019-9-27
在线时间
72 小时
发表于 2020-12-22 10:47:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

9

主题

767

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5274
金钱
5274
注册时间
2019-9-25
在线时间
433 小时
发表于 2020-12-22 13:00:11 | 显示全部楼层
好贴必须顶一下
想思考的时候,有时还可以用屁股,QQ 1252699831
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2020-5-4
在线时间
15 小时
发表于 2020-12-28 18:42:23 | 显示全部楼层
@it_do_just   根据您的步骤,在做到 “把原来的lcd驱动去掉“”这一步的时候,原子的内核里面并没有MXS_LCD_framebuff_support 并没有这一项,源码使用的是这个,linux-imx-4.1.15-2.1.0-gb78e551-v1.4.tar,由于发不上来图,就没有截图。 请指教
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
 楼主| 发表于 2021-1-1 12:12:25 | 显示全部楼层
zk5437 发表于 2020-12-28 18:42
@it_do_just   根据您的步骤,在做到 “把原来的lcd驱动去掉“”这一步的时候,原子的内核里面并没有MXS_LC ...

这个可以根据你板载的屏幕,查看下对应目录的Kconfig和Makefile,然后在menuconfig去掉就可以了
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

0

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2019-11-1
在线时间
49 小时
发表于 2021-1-3 14:01:26 | 显示全部楼层
厉害!!!
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2020-9-22
在线时间
14 小时
发表于 2021-2-28 15:59:02 | 显示全部楼层
楼主的帖子有原子教程那味儿了。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-12-26
在线时间
5 小时
发表于 2021-3-3 09:06:08 | 显示全部楼层
感谢楼主!图文并茂,楼主费心了。
回复 支持 反对

使用道具 举报

6

主题

200

帖子

0

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
1063
金钱
1063
注册时间
2019-9-19
在线时间
194 小时
发表于 2021-3-17 09:55:36 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

6

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2020-6-24
在线时间
24 小时
发表于 2021-4-13 23:33:40 | 显示全部楼层
"先把我从网上找到的staging驱动“fb_st7789s.c”",请问LZ如果内核中缺驱动一般怎么去找这个的linux驱动源码
回复 支持 反对

使用道具 举报

11

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2015-10-26
在线时间
125 小时
发表于 2021-4-15 11:17:30 | 显示全部楼层
楼主太牛了
我想好好学习RTOS,不管哪一种,学会一种就行
回复 支持 反对

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2021-4-16 09:54:08 | 显示全部楼层
可以 可以
森罗万象
回复 支持 反对

使用道具 举报

0

主题

50

帖子

0

精华

高级会员

Rank: 4

积分
984
金钱
984
注册时间
2019-7-3
在线时间
185 小时
发表于 2021-4-20 14:47:47 | 显示全部楼层
牛逼。!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-9-9
在线时间
7 小时
发表于 2021-4-30 17:18:52 | 显示全部楼层
楼主牛逼啊
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2020-10-18
在线时间
18 小时
发表于 2021-5-5 20:43:35 | 显示全部楼层
不行啊,正点原子自带驱动去掉内核就启动不了了
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2020-8-11
在线时间
53 小时
发表于 2021-6-18 15:07:50 | 显示全部楼层
楼主你好,我看你这个屏是有触摸的,你这个移植成功之后可以支持触摸吗?
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
 楼主| 发表于 2021-6-22 13:37:06 | 显示全部楼层
lijiatu 发表于 2021-6-18 15:07
楼主你好,我看你这个屏是有触摸的,你这个移植成功之后可以支持触摸吗?

触摸需要另外的驱动
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-7-22
在线时间
1 小时
发表于 2021-9-7 16:38:51 | 显示全部楼层
楼主我想知道的是你这个刷新速率怎么样?快吗?
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2021-9-18 17:33:34 | 显示全部楼层
啥时候才能有楼主的水平啊。。。
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-10-20
在线时间
31 小时
发表于 2022-7-12 01:48:45 | 显示全部楼层
大佬 我根据你那里brg =flase  颜色还是不对 不是色彩只有黑白。。
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2019-10-20
在线时间
31 小时
发表于 2022-7-12 02:13:52 | 显示全部楼层
你好 根据你的步骤 能显示 ,我的是240*240的ST7789V中景园的屏幕,但是进入系统,那个企鹅的颜色好像不太对,背景也只有白底黑字
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-4-8
在线时间
14 小时
发表于 2022-7-14 17:35:54 | 显示全部楼层
本帖最后由 flgee 于 2022-7-26 16:26 编辑

学完了正点原子linux驱动的教程,总觉得理解的不透彻,也正有楼主的想法想自己换一个屏试试自己学习的成果,弄了好久没弄出来,直到看到了LZ的贴子,果断干货240*240的ST7789V的屏出现黑白显示的可能的原因是时钟方向和有效沿还有初始化寄存器的值和LZ的不一样,可以这么改改试试
在LZ的基础上
1. fbtft_device.c 中的st7789s段内的 SPI_MODE_0 改为SPI_MODE_3
2.fb_st7789s.c中的 #define WIDTH                240 //这里改下分辨率240
    #define HEIGHT                240 //这里改下分辨率240
static int init_display(struct fbtft_par *par)这个初始化函数改成下面这样
static int init_display(struct fbtft_par *par)
{

        fbtft_par_dbg(DEBUG_INIT_DISPLAY, par, "%s()\n", __func__);
        printk("zephyr: init_display\r\n");

        par->fbtftops.reset(par);

        /* startup sequence for MI0283QT-9A */
        write_reg(par, 0x01); /* software reset */
        mdelay(10);
        write_reg(par, 0x11); /* software reset */
        mdelay(120);        
        write_reg(par, 0x36,0x00); /* display off */
        write_reg(par, 0x3A,0x06);
        write_reg(par, 0xB2, 0x1F, 0x1F, 0x00, 0x33,0x33);        
        write_reg(par, 0xB7,0x12);
        write_reg(par, 0xBB,0x35);
        write_reg(par, 0xC0,0x2C);
        write_reg(par, 0xC2,0x01);
        write_reg(par, 0xC3,0x15);
        write_reg(par, 0xC4,0x20);
        write_reg(par, 0xC6,0x13);        
        write_reg(par, 0xD0,0xA4,0xA1);        
        write_reg(par, 0xD6,0xA1);        
        write_reg(par, 0xE0,0xF0,0x06,0x0D,0x0B,0x0A,0x07,0x2E,0x43,0x45,0x38,0x14,0x13,0x25,0x29);
        write_reg(par, 0xE1,0xF0,0x07,0x0A,0x08,0x07,0x23,0x2E,0x33,0x44,0x3A,0x16,0x17,0x26,0x2C);               
        write_reg(par, 0xE4,0x1D,0x00,0x00);        
        write_reg(par, 0x21);
        write_reg(par, 0x29);
        write_reg(par, 0x2A,0x00,0x00,0x00,0xEF);
        write_reg(par, 0x2B,0x00,0x00,0x00,0xEF);        
        write_reg(par, 0x2C);        
        write_reg(par, 0x3A,0x05);        
        write_reg(par, 0x29);
        mdelay(50);        
        write_reg(par, 0x2C);        
        mdelay(20);        
        write_reg(par, 0x21,0x36,0x00);               

        return 0;
}

改好后编译试试,应该能成,另外求助下各位,我想试试播放个视频测试下这个屏的效果,请问下如何才能播放视频文件啊
[url=]图片[/url]
微信图片_20220726161059.jpg
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-10-17
在线时间
1 小时
发表于 2022-10-17 23:19:39 | 显示全部楼层
牛批,大佬啊,博主 2022/10/17
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-10-17
在线时间
1 小时
发表于 2022-10-17 23:21:12 | 显示全部楼层
牛批,博主,,,点赞1w下
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-12-8
在线时间
14 小时
发表于 2022-11-1 23:16:40 | 显示全部楼层
你好,我用正点原子开发板驱动st7789v,分辨率为135X240,不带fb的显示成功,可带fb的怎么都显示不成功,找不到/dev/fb0,请问这是怎么回事呢?
回复 支持 反对

使用道具 举报

6

主题

43

帖子

0

精华

高级会员

Rank: 4

积分
820
金钱
820
注册时间
2021-6-20
在线时间
87 小时
发表于 2022-11-8 10:42:28 | 显示全部楼层
支持干货,大佬nb
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2019-6-5
在线时间
29 小时
发表于 2022-11-24 09:42:34 | 显示全部楼层
厉害厉害
回复 支持 反对

使用道具 举报

49

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1182
金钱
1182
注册时间
2020-5-13
在线时间
202 小时
发表于 2023-6-3 17:03:36 | 显示全部楼层
mark一下,有时间来学习;
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-9-28
在线时间
7 小时
发表于 2023-12-30 00:33:26 | 显示全部楼层
212313
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2017-10-26
在线时间
6 小时
发表于 2024-4-23 15:59:40 | 显示全部楼层
划破天际的光 发表于 2021-5-5 20:43
不行啊,正点原子自带驱动去掉内核就启动不了了

我的也是,启动不了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-9-26
在线时间
4 小时
发表于 2024-7-23 23:13:52 | 显示全部楼层
您好 按你说的在fbtft-io.c文件内添加上拉高拉低片选的代码后内核不能启动 报错大意说是使用了未定义的指针一类的 意思可能时还每没申请到io就使用了 请问这有办法解决吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2024-6-29
在线时间
5 小时
发表于 2024-8-30 14:28:45 | 显示全部楼层
mark收藏,谢谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表