FrameBuffer驱动st7789v的一点补充

Milkv-duo关于st7789v的驱动的一些补充

本文是这篇文章的补充
请先阅读此文,了解基本流程与步骤

一 . 先看一下硬件管脚

PS: 图 1 的管脚按照 GPIOA,B,C 标注,也是最常用的;图 2 的GPIO 指代原理图中的临时网络
图1

图2

QFN68 GPIO Signal name Pin name 复用寄存器 属性配置寄存器 常用名
38 9 SPI2_CS SD1_D3 0x0300_108c 0x0502_7038 CS
43 6 SPI2_SCK SD1_CLK 0x0300_10a0 0x0502_704c CLK/SCL
41 8 SPI2_DI SD1_D0 0x0300_1098 0x0502_7044 MISO
42 7 SPI2_DO SD1_CMD 0x0300_109c 0x0502_7048 MOSI/SDA

image.png

二 . 看一下默认是什么样子

2.1 Uboot

  1. 读一下复用寄存器
    image.png

2.2 Linux

  1. 读一下复用寄存器
    image.png

  2. 看一下 pin excel
    image.png

  3. 看一下配置代码,有两处

build/boards/cv180x/cv1800b_milkv_duo_sd/u-boot/cvi_board_init. c
u-boot-2021.10/board/cvitek/cv180x/board. c

image.png

实际上是在一个文件里调用的,这里配置 cvi_board_init (),上方的那句话无所谓打不打开注释。(P.S.我不是很理解为什么管脚复用在 uboot 里配置,这玩意不就是裸机引导程序吗,内核运行又不依赖uboot)

三. 修改

先看看 PINMUX_CONFIG 的参数在哪定义的

Linux_5.10/drivers/pinctrl/cvitek/cv180x_pinlist_swconfig.h

这是函数定义
image.png

预定义的宏如下:
image.png
4. 可以得出结果,两个参数由双’_'连接,组成一个复用参数
此处我使用如下管脚

//build/boards/cv180x/cv1800b_milkv_duo_sd/u-boot/cvi_board_init. c
    // sd1
    PINMUX_CONFIG(SD1_D3, SPI2_CS_X);  //cs
    PINMUX_CONFIG(SD1_D2, PWR_GPIO_19);
    PINMUX_CONFIG(SD1_D1, PWR_GPIO_20);
    PINMUX_CONFIG(SD1_D0, PWR_GPIO_21);
    PINMUX_CONFIG(SD1_CMD, SPI2_SDO); //cmd
    PINMUX_CONFIG(SD1_CLK, SPI2_SCK);  //clk
    // PINMUX_CONFIG(SD1_D3, PWR_GPIO_18);
    // PINMUX_CONFIG(SD1_D2, PWR_GPIO_19);
    // PINMUX_CONFIG(SD1_D1, PWR_GPIO_20);
    // PINMUX_CONFIG(SD1_D0, PWR_GPIO_21);
    // PINMUX_CONFIG(SD1_CMD, PWR_GPIO_22);
    // PINMUX_CONFIG(SD1_CLK, PWR_GPIO_23);

    PINMUX_CONFIG(IIC0_SCL, XGPIOA_28);  //dc 28
    PINMUX_CONFIG(SPK_EN, XGPIOA_15);  //rst 15
  1. 设备树改法
&spi2 {
    status = "okay";
    /delete-node/ spidev@0; //两个选择,要么写这个,要么改st7789里的reg
    st7789v: st7789v@0{
        compatible = "sitronix,st7789v"; //驱动名
        reg = <0>;
        status = "okay";
        spi-max-frequency = <48000000>;
        spi-cpol;
        spi-cpha;
        rotate = <90>; //旋转,我不转就竖屏
        fps = <60>;
        rgb;
        buswidth = <8>;
        dc = <&porta 28 GPIO_ACTIVE_HIGH>; //配置连接dc线的管脚,对应上一节的pinmux配置 ,注意 port a 14
        reset = <&porta 15 GPIO_ACTIVE_HIGH>; //配置连接reset线的管脚
        debug = <0x0>;
    };
};

注意 dc 与 rst 的 15,16 行,含义是 paot a 28 管脚,port a 15 管脚。对应复用时定义的 XGPIOA_28XGPIOA_15,因此改用其他引脚只需要如下步骤:

  • 在 pin excel (CV180xB_QFN68_PINOUT_V0.1_CN. xlsx)里,功能信号表 tab 里找到 GPIO 那一组,找个看似没被占用的不重要管脚。
  • 按照上述逻辑去修改

至此,复用结束,管脚属性先保持默认


总结

声明

我对 linux 驱动部分包括整个应用层都不熟悉,只是知道皮毛,所以必然会有谬误与纰漏,麻烦指出,共同进步。

建议

  1. 配置好编译打包完启动,建议使用串口,看看是否有 fb 相关 log,有则说明对内核的修改生效了,进系统后,首先看看/dev/fb0 出现没有;然后用 lsmod 检查;然后用 devmem 等命令检查所用到的几个管脚复用的寄存器值,eg. devmem 0x0300108c 看看值是不是需要的详见(2.2),这个寄存器需要 0x3 这个值。如果全部正常,一般就调通了。
  2. milkv 的配置比较怪,一般都在 SDK 的根目录下的 build 里配置,而不是常规的配内核就去内核下 make menuconfig ,这个板子的配置更像是外部定义完后,编译时由脚本去读取自定义配置项,而且还有隐藏命令,太麻烦了。反倒不如直接在外边配。不得不说,脑回路清奇,像常规 SDK 那种清清楚楚,简简单单,配谁就去谁那里,顶多加个打包脚本多好。

Q&A

Q1:/dev 下没出现 fb0 节点
A: fbtft-core.c 那里的 gpio_request 那里没改好

Q2: fb0 节点也有了,lsmod 也看到 fb_st7789v.ko 了,但是屏幕没反应
A:按照 “建议” 中的顺序检查。实在不行就换个 dc 或 rst 的管脚,我就是 GPIOA15 用不了才换的。

Q3: 输入命令 cat /dev/zero > /dev/fb0 出现报错 cat: write error: No space left on device
A:这个报错不影响效果,该有的效果还是会显示,如果屏幕无动于衷,是驱动没配好,不是指令有问题。

3 Likes