嵌入式Linux--荔枝派Zero--V3s--ST7789v

19 篇文章 57 订阅
3 篇文章 0 订阅

前言

 经过几番折磨,终于搞好了。

在这里插入图片描述

三个屏幕都是ST7789v驱动芯片:

  • 2.0寸分辨率是240x320:GND,VCC,SCL,SDA,RES,DC,CS,BLK
  • 1.54寸分辨率是240x240:GND,VCC,SCL,SDA,RES,DC,CS,BLK
  • 1.3寸分辨率是240x240:GND,VCC,SCL,SDA,RES,DC,BLK

就1.3寸的那个屏少了一个CS引脚死活亮不起来。

血的教训:没有CS引脚是没法运行的!

一、原理图

在这里插入图片描述

二、uboot

步骤如下:

  • (1)清除:make clean
  • (2)配置编译文件:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig
  • (3)编译:time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log

U-Boot编译配置文件

荔枝派有三个编译配置文件

  • LicheePi_Zero_480x272LCD_defconfig
  • LicheePi_Zero_800x480LCD_defconfig
  • LicheePi_Zero_defconfig

LicheePi_Zero_800x480LCD_defconfig

CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
# CONFIG_ARMV7_NONSEC is not set
CONFIG_MACH_SUN8I_V3S=y
CONFIG_DRAM_CLK=360
CONFIG_DRAM_ZQ=14779
CONFIG_VIDEO_LCD_MODE="x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0"
CONFIG_VIDEO_LCD_BL_PWM="PB4"
# CONFIG_VIDEO_LCD_BL_PWM_ACTIVE_LOW is not set
CONFIG_DEFAULT_DEVICE_TREE="sun8i-v3s-licheepi-zero"
# CONFIG_CONSOLE_MUX is not set
CONFIG_SPL=y
CONFIG_CMD_BOOTMENU=y
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_MEMINFO=y
# CONFIG_CMD_FLASH is not set
CONFIG_CMD_SF=y
CONFIG_CMD_SPI=y
# CONFIG_CMD_FPGA is not set
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_WINBOND=y
CONFIG_SPL_SPI_SUNXI=y
# CONFIG_NETDEVICES is not set
CONFIG_DM_SPI=y
CONFIG_SUNXI_SPI=y
CONFIG_OF_LIBFDT_OVERLAY=y

参考LicheePi_Zero_800x480LCD_defconfig模仿它的编译配置文件我也写一个:
LicheePi_Zero_240x240TFT_defconfig

CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
# CONFIG_ARMV7_NONSEC is not set
CONFIG_MACH_SUN8I_V3S=y
CONFIG_DRAM_CLK=360
CONFIG_DRAM_ZQ=14779
CONFIG_VIDEO_LCD_MODE="x:240,y:240,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0"
CONFIG_VIDEO_LCD_BL_PWM="PB4"
# CONFIG_VIDEO_LCD_BL_PWM_ACTIVE_LOW is not set
CONFIG_DEFAULT_DEVICE_TREE="sun8i-v3s-licheepi-zero"
# CONFIG_CONSOLE_MUX is not set
CONFIG_SPL=y
CONFIG_CMD_BOOTMENU=y
# CONFIG_CMD_IMLS is not set
CONFIG_CMD_MEMINFO=y
# CONFIG_CMD_FLASH is not set
CONFIG_CMD_SF=y
CONFIG_CMD_SPI=y
# CONFIG_CMD_FPGA is not set
CONFIG_DM_SPI_FLASH=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_WINBOND=y
CONFIG_SPL_SPI_SUNXI=y
# CONFIG_NETDEVICES is not set
CONFIG_DM_SPI=y
CONFIG_SUNXI_SPI=y
CONFIG_OF_LIBFDT_OVERLAY=y

编译uboot

步骤如下:

  • (1)清除:make clean
  • (2)配置编译文件:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_240x240TFT_defconfig
  • (3)编译:time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log

三、Linux Kernel

  • 首先进入目录并配置编译选项文件:make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm licheepi_zero_defconfig

  • 配置自己需要的驱动比如网卡驱动或者小屏幕显示驱动:make ARCH=arm menuconfig

Device Drivers  --->
     【*】 Staging drivers  --->
              <*>   Support for small TFT LCD display modules  --->
                        <*>   FB driver for the ST7789V LCD Controller
  • 编译内核:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

至此,kernel算是配置OK了,接下来需要改下设备树。

四、设备树

第一步:注释掉自带的视频输出

vim arch/arm/boot/dts/sun8i-v3s.dtsi

sun8i-v3s.dtsi

...
    chosen {
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;

//      simplefb_lcd: framebuffer@0 {
//          compatible = "allwinner,simple-framebuffer",
//                   "simple-framebuffer";
//          allwinner,pipeline = "de0-lcd0";
//          clocks = <&ccu CLK_BUS_TCON0>, <&ccu CLK_BUS_DE>,
//               <&ccu CLK_DE>, <&ccu CLK_TCON0>;
//          status = "disabled";
//      };
    };
...

第二步:增加屏幕驱动节点

注意–血的教训:reset-gpios = <&pio 1 6 GPIO_ACTIVE_HIGH>; // PB6一定要设置为GPIO_ACTIVE_HIGH

vim arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts

sun8i-v3s-licheepi-zero-dock.dts

&spi0{
    status = "okay";
    st7789v: st7789v@0{
        compatible = "sitronix,st7789v";
        reg = <0>;
        status = "okay";
        spi-max-frequency = <36000000>;
        spi-cpol;
        spi-cpha;
        rotate = <0>;
        fps = <60>;
        buswidth = <8>;
        rgb;
        dc-gpios    = <&pio 1 5 GPIO_ACTIVE_HIGH>;  // PB5 
        reset-gpios = <&pio 1 6 GPIO_ACTIVE_HIGH>;  // PB6
        led-gpios   = <&pio 1 7 GPIO_ACTIVE_LOW>;   // PB7
        width = <240>;
        height= <320>;
        debug = <0>;
    };
};

更新设备树:

vim arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts

单独编译设备树:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

五、烧录

 这里使用最简单的SD卡启动,以上的那些都会烧录到SD卡里面去。

荔枝派是怎么启动的

 启动的第一步是片内的32KB启动ROM(BROM)。大部分的ARM处理器,为了免去用户外置NOR Flash,通常都在片内集成了这样一个BROM。BROM会尝试从外部存储设备(首先是SD/MMC,接着是SPI NOR,最后是SPI NAND)读取程序。这个程序被全志成为boot0,这里就是SPL。如果BROM没有顺利载入这个程序,则会进入USB启动模式。

 第二步是SPL。SPL其实就是一个精简版的u-boot,只能执行一些特定的任务。SPL会被载入到V3s的内部SRAM中,然后SPL会进行以下操作:

  • 初始化时钟、串口、DRAM和启动设备(SD/MMC/SPI Flash)
  • 把完整的u-boot从启动设备复制到DRAM
  • 跳转到完整的u-boot

 第三步就是u-boot了。u-boot会负责载入内核。在一般情况下,u-boot会尝试从SD卡的第一分区读取并执行“boot.scr”脚本。一般来说boot.scr包括三条指令:把内核载入到SDRAM,把设备树二进制载入到SDRAM,(解压并)运行内核。

TF卡上需要有什么

以下是一个典型的可启动TF卡的结构:

在这里插入图片描述
基本上来说,要创建一个可启动TF卡,需要分区表(通过fdisk)、u-boot with SPL、启动脚本、设备树二进制、内核和根文件系统镜像。

实际烧录

 一张从未用过的TF卡,首先在Windows平台下使用SD Formatter软件进行格式化。
格式化的TF卡如果要烧录一个一体式镜像:

  • 在Windows环境下使用Win32DiskImager软件烧录
  • 在Ubuntu环境下:未使用过

还是那张已经格式化了的TF卡,在Ubuntu下面使用GParted分区编辑器软件对该TF卡进行分区:主要分为两个区如上图,在进行分区时要空出前1MByte的空间放U-Boot,也就是说BOOT区是在1MByte地址之后的。前面的1MByte其实是没有文件系统格式的RAW数据区域。

  • BOOT区:文件系统格式是FAT16用于存放设备树文件和Kernel文件
  • rootfs区:文件系统格式是EXT4用于存放根文件系统

在Ubuntu环境下一般是分开各个文件:

  • U-Boot文件:u-boot-sunxi-with-spl.bin
  • Linux Kernel镜像文件:zImage
  • 设备树二进制文件:sun8i-v3s-licheepi-zero-dock.dtb
  • 根文件系统:rootfs

六、连线

SPI屏lichee pi zero
GNDGND
VCC3v3
SCLSCL(PC1)
SDAMOSI(PC3)
RESSCK(PB6)
DCPWM1(PB5)
CSCS(PC2)
BLKSDA(PB7)
  • 必须要连接的线:MOSI,CLK,CS,DC,VCC,GND。
  • BLK不需要调光可以接3v3
  • RES不需要可以接GND

七、Qt测试

Qt文件夹是之前编译好的。
命令行输入命令出现雪花:

cat /dev/urandom > /dev/fb0
/opt/qt5.12.9-arm/examples/widgets/widgets/analogclock

八、使用Qt无法显示字体

按照我的经验,生成的Qt文件夹里面是没有fonts文件夹的,所以需要额外将字体放在Qt的lib里面目录为:/opt/qt5.12.9-arm/lib/fonts

# pwd
/opt/qt5.12.9-arm/lib/fonts
# ls
DejaVuSans-Bold.ttf             helvetica_100_75.qpf
DejaVuSans-BoldOblique.ttf      helvetica_100_75i.qpf
DejaVuSans-Oblique.ttf          helvetica_120_50.qpf
DejaVuSans.ttf                  helvetica_120_50i.qpf
DejaVuSansMono-Bold.ttf         helvetica_120_75.qpf
DejaVuSansMono-BoldOblique.ttf  helvetica_120_75i.qpf
DejaVuSansMono-Oblique.ttf      helvetica_140_50.qpf
DejaVuSansMono.ttf              helvetica_140_50i.qpf
DejaVuSerif-Bold.ttf            helvetica_140_75.qpf
DejaVuSerif-BoldOblique.ttf     helvetica_140_75i.qpf
DejaVuSerif-Oblique.ttf         helvetica_180_50.qpf
DejaVuSerif.ttf                 helvetica_180_50i.qpf
Vera.ttf                        helvetica_180_75.qpf
VeraBI.ttf                      helvetica_180_75i.qpf
VeraBd.ttf                      helvetica_240_50.qpf
VeraIt.ttf                      helvetica_240_50i.qpf
VeraMoBI.ttf                    helvetica_240_75.qpf
VeraMoBd.ttf                    helvetica_240_75i.qpf
VeraMoIt.ttf                    helvetica_80_50.qpf
VeraMono.ttf                    helvetica_80_50i.qpf
VeraSe.ttf                      helvetica_80_75.qpf
VeraSeBd.ttf                    helvetica_80_75i.qpf
fixed_120_50.qpf                japanese_230_50.qpf
fixed_70_50.qpf                 micro_40_50.qpf
helvetica_100_50.qpf            unifont_160_50.qpf
helvetica_100_50i.qpf

配置 /etc/profile

# cat profile
export PATH=/bin:/sbin:/usr/bin:/usr/sbin

if [ "$PS1" ]; then
        if [ "`id -u`" -eq 0 ]; then
                export PS1='# '
        else
                export PS1='$ '
        fi
fi

export PAGER='/bin/more '
export EDITOR='/bin/vi'

# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
        if [ -r "$i" ]; then
                . $i
        fi
        unset i
done

export TSLIB_ROOT=/opt/tslib
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so

export QT_ROOT=/opt/qt5.12.9-arm
export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event0
export QT_QPA_FONTDIR=$QT_ROOT/lib/fonts
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
export QT_PLUGIN_PATH=$QT_ROOT/plugins
export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms
export QML2_IMPORT_PATH=$QT_ROOT/qml
export QT_QPA_FB_TSLIB=1

  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值