i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)

Posted Mculover666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)相关的知识,希望对你有一定的参考价值。

获取更干净清爽的阅读体验,可以访问我的个人博客网站:i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)

一、驱动编写思路

(1)编写spi驱动框架,检查probe是否可以正常挂载;

(2)在probe设备中,解析设备树gpio信息、屏幕参数信息;

(3)操作gpio,检查背光控制是否正常

(4)基于linux spi框架适配spi写接口,看lcd_init是否正常

二、设备树节点描述

	spilcd: st7789@1 
		compatible = "spilcd,st7789";
		spi-max-frequency = <8000000>;
		reg = <1>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_st7789>;

		//unuse
		//cs-gpio = <&gpio1 0 GPIO_ACTIVE_LOW>;
		reset-gpio = <&gpio1 1 GPIO_ACTIVE_LOW>;
		dc-gpio = <&gpio1 2 GPIO_ACTIVE_LOW>;
		bl-gpio = <&gpio1 4 GPIO_ACTIVE_LOW>;

		width = <240>;
		height = <240>;
		// 0: normal, 1: left 90, 2: 180, 3: right 90.
		direction = <0>;
	;

pinctrl节点如下:

		pinctrl_st7789: st7789grp 
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO01__GPIO1_IO01		0x10b0
				MX6UL_PAD_GPIO1_IO02__GPIO1_IO02		0x10b0
				MX6UL_PAD_GPIO1_IO04__GPIO1_IO04		0x10b0
			>;
		;

三、驱动调试中遇到的问题

1. lcd_init初始化之后屏幕没反应

1.1. 问题分析

该问题是由于SPI总线模式设置错误,导致spi无法正常通信,所以屏幕无反应。

1.2. 问题解决

    spi->mode = SPI_MODE_3;

2. lcd清屏需要10s

2.1. 问题分析

通过打桩排查到lcd_clear执行需要10s,肯定是spi传输函数写的太慢了。

2.2. 问题解决

清屏的时候,不要逐个字节调用API写入,考虑整块内存先构建好,然后一次性调用API写入。

static int lcd_write_bytes(uint8_t *data, int size)

    int ret;

    struct spi_transfer t = 
        .tx_buf = data,
        .len = size,
    ;

    struct spi_message msg;
    spi_message_init(&msg);
    spi_message_add_tail(&t, &msg);
    ret = spi_sync(lcd.spi, &msg);
    if (ret < 0) 
        printk(KERN_ERR "lcd_write_bytes fail, ret is %d\\n", ret);
        return -1;
    
    return 0;

四、驱动源码及测试

1. 驱动源码

2. 编译

设置编译环境:

source build_env.sh

Makefile中设置linux编译目录:

KERNEL_DIR = /home/mculover666/develop/imx6ull/linux-imx6ull/output

编译:

make

基于我自己移植的Linux 4.1.15内核编译好的驱动模块在ko_release中。

3. 测试

加载模块:

insmod fb_st7789_spi.ko

加载会有如下日志:

[  269.299961] ------ st7789 spi lcd probe in ------
[  269.300102] reset-gpio:1, dc-gpio:2, bl-gpio:4 cs-gpio:-2
[  269.300147] width:240, height:240, direction:0
[  269.300171] ------ st7789 spi lcd init in ------
[  269.538824] lcd hard reset finish!
[  269.668841] lcd sleep out finish!
[  269.676788] lcd init finish!
[  269.681107] lcd_fill_rect: lcd_write_color start!
[  269.769301] lcd_fill_rect: lcd_write_color finish!
[  269.769339] lcd clear finish!
[  269.769358] ------ st7789 spi lcd init in ------
[  269.769377] ------ st7789 spi lcd probe out ------
[  269.773910] st7789_driver register ok!

屏幕会清屏为白色:

卸载模块:

rmmod fb_st7789_spi

卸载后屏幕背光会关闭。

以上是关于i.MX6ULL驱动开发 | 34 - 基于SPI框架驱动spi lcd(st7789)的主要内容,如果未能解决你的问题,请参考以下文章

i.MX6ULL驱动开发 | 13 - Linux SPI 驱动框架

i.MX6ULL驱动开发 | 13 - Linux SPI 驱动框架

i.MX6ULL驱动开发 | 14 - 基于 Linux SPI 驱动框架读取ICM-20608传感器

i.MX6ULL驱动开发 | 36 - 注册spilcd为framebuffer设备并使用lvgl测试

i.MX6ULL驱动开发 | 36 - 注册spilcd为framebuffer设备并使用lvgl测试

i.MX6ULL驱动开发 | 08 -基于pinctrl子系统和gpio子系统点亮LED