Files

基于ATLAS200DK SPI接口LCD的fbtft驱动适配

1 概述

1.1 概要描述

适配SPI接口的LCD的fbtft驱动使LCD可以显示ATLAS200DK上传输过来的MPU6050解算出的数据。

1.2 适配流程图

2 设备属性

2.1 ATLAS200DK 40PIN连接器定义

管脚 名称 电平 管脚 名称 电平
1 +3.3V 3.3V 2 +5.0V 5V
3 I2C2-SDA 3.3V 4 +5.0V 5V
5 I2C2-SCL 3.3V 6 GND -
7 GPIO0 3.3V 8 TXD0 3.3V
9 GND - 10 RXD0 3.3V
11 GPIO1 3.3V 12 NC -
13 NC - 14 GND -
15 GPIO2 3.3V 16 TXD1 3.3V
17 +3.3V 3.3V 18 RXD1 3.3V
19 SPI-MOSI 3.3V 20 GND -
21 SPI-MISO 3.3V 22 NC -
23 SPI-CLK 3.3V 24 SPI-CS 3.3V
25 GND - 26 GPIO10 3.3V
27 GPIO8 3.3V 28 GPIO9 3.3V
29 GPIO3 3.3V 30 GND -
31 GPIO4 3.3V 32 NC -
33 GPIO5 3.3V 34 GND -
35 GPIO6 3.3V 36 +1.8V 1.8V
37 GPIO7 3.3V 38 TXD-3559 3.3V
39 GND - 40 RXD-3559 3.3V

2.2 LCD

2.2.1 产品参数

工作电压3.3V/5V

通信接口SPI

屏幕类型TFT

控制芯片ST7789V

分辨率240(V) x 320(H)RGB

显示尺寸23.4Hx 23.4Vmm

像素大小0.0975Hx 0.0975Vmm

产品尺寸58 x 35(mm)

2.2.2 功能引脚

功能引脚 描述
VCC 3.3V/5V电源正
GND 电源地
DIN SPI数据输入
CLK SPI时钟输入
CS 片选,低电平有效
DC 数据/命令选择
RST 复位
BL 背光

3 操作流程

3.1 ATLAS200DK环境搭建

见Atlas200dk-MindXSDK 开发环境搭建一站式导航 https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/ascend_community_projects/tutorials/200dk%E5%BC%80%E5%8F%91%E6%9D%BF%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md

环境依赖软件和版本如下表:

软件名称 版本
固件与驱动版本 1.0.12
CANN版本 5.0.5alpha001
Ubuntu 18.04.4 LTS

3.2 设备接线

见下表

LCD 200DK管脚编号 200DK管脚名称
VCC 17 +3.3V
GND 20 GND
DIN 19 SPI-MOSI
CLK 23 SPI-CLK
CS 24 SPI-CS
DC 29 GPIO3
RST 31 GPIO4
BL 33 GPIO5

3.3 修改内核配置和驱动文件

步骤1 下载内核源码,下载地址: https://www.hiascend.com/hardware/firmware-drivers?tag=community

在AI加速模块中选择对应的固件与驱动版本

选择Atlas-200-sdk_21.0.3.1.zip下载

解压后将Ascend310-source-minirc.tar.gz上传至200DK任一目录下例如/opt。

步骤2 200DK上执行如下命令切换至root用户。

su root

步骤3 通过如下命令进行安装依赖此步200DK需要联网。

apt-get install -y python make gcc unzip bison flex libncurses-dev squashfs-tools bc

步骤4 执行如下命令,进入源码包所在目录,例如/opt。

cd /opt

步骤5 执行如下命令解压源码包“Ascend310-source-minirc.tar.gz”。

tar -xzvf Ascend310-source-minirc.tar.gz

步骤6 执行如下命令进入source目录。

cd source

步骤7 修改fbtft驱动文件。

1.执行如下命令打开文件fbtft_device.c。

vim kernel/linux-4.19/drivers/staging/fbtft/fbtft_device.c

2.在结构体fbtft_device_display displays[]里面添加对应设备节点此步要按照实际接线和LCD属性填写例如

{
    .name = "atlas200dk",	//设备名
    .spi = &(struct spi_board_info) {
        .modalias = "fb_st7789v",	//匹配驱动名
        .max_speed_hz = 32000000,	//最大spi速率
        .mode = SPI_MODE_3,	//spi模式
        .bus_num=0,	//所使用的总线号
        .chip_select=0,	//所使用的片选号
        .platform_data = &(struct fbtft_platform_data) {
            .display = {
                .buswidth = 8,	//总线宽度
                .backlight = 1,	//背光
            },
            .gpios = (const struct fbtft_gpio []) {	//对应gpio引脚编号
                { "reset", 430 },
                { "dc", 429 },
                { "led", 431 },
                {},
            },
        }
    }
},

开发者板40pin接口中存在5个通过PCA6416扩展的GPIO原理图如下所示

管脚29、31、33、35、37分别对应PCA6416扩展出来的GPIO3-GPIO7。 PCA6416的对应连接图如下

PCA6416是通过I2C进行GPIO扩展的芯片其通过I2C1扩展出16个GPIO其中GPIO3-GPIO7连接到40pin接口供开发者使用开发者可以在用户层程序中直接通过I2C1操作PCA6416从而控制GPIO3-GPIO7的输入输出。

输入命令cat /sys/kernel/debug/gpio可以查看gpio的状态如下图。Atlas 200 DK 开发者套件(型号 3000有两种主板分别为IT21DMDA旧主板和IT21VDMB新主板。旧主板在执行该命令时检测不到gpiochip4PCA6416拓展出的GPIO需要改变接线和配置详见下文的安装和运行驱动模块部分。根据PCA6416连接图和gpio状态可以看出PCA6416的P00-P17对应gpio编号为417-432因此200DK的GPIO3、GPIO4、GPIO5、GPIO6、GPIO7对应的编号分别为429、430、431、432、428。

添加设备属性完成后如下所示:

3.按“Esc”键再执行如下命令保存修改并按“Enter”键退出。

:wq

4.执行如下命令打开文件fb_st7789v.c。

vim kernel/linux-4.19/drivers/staging/fbtft/fb_st7789v.c

5.参考LCD数据手册对文件fb_st7789v.c进行修改。

i.修改DEFAULT_GAMMA。

#define DEFAULT_GAMMA	"1F 1A 18 0A 0F 06 45 87 32 0A 07 02 07 05 00\n" \
                        "00 25 27 05 10 09 3A 78 4D 05 18 0D 38 3A 1F"

ii.修改屏幕初始化函数init_display。

static int init_display(struct fbtft_par *par)
{
    par->fbtftops.reset(par);
    mdelay(120);
    write_reg(par, 0x36,0x00);
    write_reg(par, 0x3A,0x05);
    write_reg(par, 0xB2,0x0C,0x0C,0x00,0x33,0x33);
    write_reg(par, 0xB7,0x35);
    write_reg(par, 0xBB,0x1F);
    write_reg(par, 0xC0,0x2C);
    write_reg(par, 0xC2,0x01);
    write_reg(par, 0xC3,0x12);
    write_reg(par, 0xC4,0x20);
    write_reg(par, 0xC6,0x0F);
    write_reg(par, 0xD0,0xA4,0xA1);
    write_reg(par, 0xE0,0xD0,0x08,0x11,0x08,0x0C,0x15,0x39,0x33,0x50,0x36,0x13,0x14,0x29,0x2D);
    write_reg(par, 0xE1,0xD0,0x08,0x10,0x08,0x06,0x06,0x39,0x44,0x51,0x0B,0x16,0x14,0x2F,0x31);
    //write_reg(par, 0x21); //反色
    write_reg(par, 0x11);
    write_reg(par, 0x29);
    return 0;
}

iii.删除enum类型的st7789v_command和函数set_gamma。

iv.修改fbtft初始化函数fbtft_display。将gamma_len改成15删去fbtftops中的“.set_gamma = set_gamma,”。

6.按“Esc”键再执行如下命令保存修改并按“Enter”键退出。

:wq

步骤8 配置内核。

1.执行如下命令,进入内核目录。

cd kernel/linux-4.19

2.执行如下命令,读取内核默认配置。

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- mini_defconfig

3.执行如下命令,并使能相关配置。

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
a.按以下选项配置内核“Y”键选择*编译进内核“M”键选择M编译成模块。
    Device Drivers  --->
        Graphic support  --->
            Frame buffer Devices  --->
                <*> Support for frame buffer devices  --->
                    --- Support for frame buffer devices
                    [*] Enable firmware EDID
                    [*] Framebuffer foreign endianness support  --->
                    [*] Enable Video Mode Handling Helpers
                    [*] Enable Tile Blitting Support
            Console display driver support  --->
                [*] Framebuffer Console support
        [*] Staging drivers  --->
            <*> Support for small TFT LCD display modules  --->
                <M> FB driver for the ST7789V LCD Controller
                <M> Module to for adding FBTFT devices
b.选择“Save”保存配置系统默认配置文件为.config。

4.执行如下命令,保存配置。

cp -f .config arch/arm64/configs/mini_defconfig

5.返回source目录。

cd /opt/source

3.4 编译内核和驱动模块

步骤1 执行如下命令,编译内核。

bash build.sh kernel

出现如下回显,表示编译内核成功。

编译出的内核文件在文件source/output/out_header中。

步骤2 执行如下命令,编译模块。

bash build.sh modules

编译出的模块在文件source/output中。

3.5 升级内核

步骤1 下载Atlas200DK驱动包下载地址 https://www.hiascend.com/hardware/firmware-drivers?tag=community

在AI开发者套件中选择对应的CANN版本和固件与驱动版本

选择A200dk-npu-driver-21.0.3.1-ubuntu18.04-aarch64-minirc.tar下载

将A200dk-npu-driver-21.0.3.1-ubuntu18.04-aarch64-minirc.tar上传至200DK目录/opt/mini。

步骤2 执行如下命令,进入/opt/mini目录。

cd /opt/mini

步骤3 执行如下命令,解压驱动包。

tar -xzvf A200dk-npu-driver-21.0.3.1-ubuntu18.04-aarch64-minirc.tar.gz

步骤4 执行如下命令将“minirc_install_phase1.sh”拷贝至目标版本驱动包所在目录。

cp driver/scripts/minirc_install_phase1.sh /opt/mini

步骤5 执行如下命令,用重新编译后的内核替换驱动包的内核。

cp /opt/source/output/out_header/Image driver

步骤6 执行如下命令,压缩新的驱动包。

tar -zcvf A200dk-npu-driver-21.0.3.1-ubuntu18.04-aarch64-minirc.tar.gz driver

步骤7 执行如下命令,升级脚本。

./minirc_install_phase1.sh

步骤8 执行如下命令重启Atlas 200 AI加速模块。

reboot

3.6 安装驱动

步骤1 执行如下命令,进入到驱动模块所在目录,例如/opt/source/output。

cd /opt/source/output

步骤2 执行如下命令依次安装模块fbtft_device.ko和fb_st7789v.ko。

新主板insmod fbtft_device.ko name=atlas200dk txbuflen=128

参数根据设备参数调整参数txbuflen为发送缓冲帧的大小若txbuflen的值过大可能会发生显示屏幕不全且传输内容错误的现象过小则屏幕刷新会慢一些。此外常用参数还有rotate值取0,90,180,270控制屏幕旋转角度、busnum总线号、cs片选、speedSPI速率、modeSPI模式、gpiosgpio列表格式reset:23,dc:24、fps、debug0-7值越高返回越多属性、customcustom=1时可以修改width、height、buswidth。全部属性可以输入modinfo fbtft_device.ko查看。

鉴于旧主板的200DK不能直接通过管脚编号控制PCA6416拓展的出GPIO可以将dc改接从昇腾AI处理器上引出的GPIO必须外置上拉电阻增加驱动能力建议上拉电阻的值为1K10K。reset和bl根据lcd的数据手册或接地或接高电平GPIO3-7默认是高电平即不对reset和bl进行控制。本实验所使用的的LCD reset和bl皆接高电平。从昇腾AI处理器上引出的GPIO有GPIO0、GPIO1gpio编号分别为504、444在ATLAS200DK上管脚编号分别为7、11。注意安装模块时需要重载gpios属性例如

旧主板dc接GPIO0insmod fbtft_device.ko name=atlas200dk txbuflen=128 gpios=dc:504

insmod fb_st7789v.ko

此时LCD屏应被成功驱动并显示控制台tty1的内容同时/dev目录下出现设备fb0。输入如下命令可以看到LCD屏中显示Hello Linux。

echo Hello Linux > /dev/tty1

3.7 LCD显示数据

步骤1 假如需要显示6个随机数编写脚本display.sh脚本内容如下

#!/bin/bash
a=$RANDOM
b=$RANDOM
c=$RANDOM
d=$RANDOM
e=$RANDOM
f=$RANDOM
echo -e "\n\n\ta="$a > /dev/tty1
echo -e "\n\n\tb="$b > /dev/tty1
echo -e "\n\n\tc="$c > /dev/tty1
echo -e "\n\n\td="$d > /dev/tty1
echo -e "\n\n\te="$e > /dev/tty1
echo -e "\n\n\tf="$f > /dev/tty1
echo > /dev/tty1

LCD屏分辨率为240x320字体大小为8x16所以显示字符共20行30列。运行一次此脚本刚好可以刷新一次屏幕。

步骤2 执行如下命令运行脚本display.shLCD显示效果如下

bash display.sh

4 参考链接

Atlas 200 AI加速模块 1.0.12 软件安装与维护指南RC场景 https://support.huawei.com/enterprise/zh/doc/EDOC1100221707/426cffd9

Atlas 200 DK开发者套件(1.0.12.alpha) https://support.huaweicloud.com/environment-deployment-Atlas200DK1012/atlased_04_0001.html

Atlas200dk-MindXSDK 开发环境搭建一站式导航: https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/ascend_community_projects/tutorials/200dk%E5%BC%80%E5%8F%91%E6%9D%BF%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md

2inch LCD Modulehttps://wiki.diustou.com/cn/2inch_LCD_Module

嵌入式Linux fbtftSPI TFT屏驱动移植 https://blog.csdn.net/weixin_38137947/article/details/107087468?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165899758516781683910008%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165899758516781683910008&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-107087468-null-null.142^v35^new_blog_pos_by_title&utm_term=%E5%B5%8C%E5%85%A5%E5%BC%8FLINUX%20FBTFT%EF%BC%88SPI%20TFT%E5%B1%8F%EF%BC%89%E9%A9%B1%E5%8A%A8%E7%A7%BB%E6%A4%8D%E5%8F%8A%E8%B0%83%E8%AF%95&spm=1018.2226.3001.4187