Milkv-duo关于st7789v的驱动的一些补充
本文是这篇文章的补充
请先阅读此文,了解基本流程与步骤
一 . 先看一下硬件管脚
PS: 图 1 的管脚按照 GPIOA,B,C 标注,也是最常用的;图 2 的GPIO 指代原理图中的临时网络
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 |
二 . 看一下默认是什么样子
2.1 Uboot
- 读一下复用寄存器
2.2 Linux
-
读一下复用寄存器
-
看一下 pin excel
-
看一下配置代码,有两处
build/boards/cv180x/cv1800b_milkv_duo_sd/u-boot/cvi_board_init. c
u-boot-2021.10/board/cvitek/cv180x/board. c
实际上是在一个文件里调用的,这里配置 cvi_board_init (),上方的那句话无所谓打不打开注释。(P.S.我不是很理解为什么管脚复用在 uboot 里配置,这玩意不就是裸机引导程序吗,内核运行又不依赖uboot)
三. 修改
先看看 PINMUX_CONFIG
的参数在哪定义的
Linux_5.10/drivers/pinctrl/cvitek/cv180x_pinlist_swconfig.h
这是函数定义
预定义的宏如下:
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
- 设备树改法
&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_28
与 XGPIOA_15
,因此改用其他引脚只需要如下步骤:
- 在 pin excel (CV180xB_QFN68_PINOUT_V0.1_CN. xlsx)里,功能信号表 tab 里找到 GPIO 那一组,找个看似没被占用的不重要管脚。
- 按照上述逻辑去修改
至此,复用结束,管脚属性先保持默认
总结
声明
我对 linux 驱动部分包括整个应用层都不熟悉,只是知道皮毛,所以必然会有谬误与纰漏,麻烦指出,共同进步。
建议
- 配置好编译打包完启动,建议使用串口,看看是否有 fb 相关 log,有则说明对内核的修改生效了,进系统后,首先看看/dev/fb0 出现没有;然后用
lsmod
检查;然后用devmem
等命令检查所用到的几个管脚复用的寄存器值,eg.devmem 0x0300108c
看看值是不是需要的详见(2.2),这个寄存器需要 0x3 这个值。如果全部正常,一般就调通了。 - 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:这个报错不影响效果,该有的效果还是会显示,如果屏幕无动于衷,是驱动没配好,不是指令有问题。