天天看点

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是否正常

二、设备树节点描述

: 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节点如下:

: 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. 问题解决

->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. 驱动源码

  • ​​Mculover666/linux_driver_study: linux驱动学习源码 (github.com)​​

2. 编译

设置编译环境:

source      

Makefile中设置linux编译目录:

KERNEL_DIR =      

编译:

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!      

屏幕会清屏为白色:

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

继续阅读