文章目录
- 前言
- 血的教训:没有CS引脚是没法运行的!
- 一、原理图
- 二、uboot
- U-Boot编译配置文件
- 编译uboot
- 三、Linux Kernel
- 四、设备树
- 第一步:注释掉自带的视频输出
- 第二步:增加屏幕驱动节点
- 五、烧录
- 荔枝派是怎么启动的
- TF卡上需要有什么
- 实际烧录
- 六、连线
- 七、Qt测试
- 八、使用Qt无法显示字体
- 配置 /etc/profile
前言
经过几番折磨,终于搞好了。
三个屏幕都是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>; // PB6led-gpios = <&pio 1 7 GPIO_ACTIVE_LOW>; // PB7width = <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 |
---|---|
GND | GND |
VCC | 3v3 |
SCL | SCL(PC1) |
SDA | MOSI(PC3) |
RES | SCK(PB6) |
DC | PWM1(PB5) |
CS | CS(PC2) |
BLK | SDA(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/sbinif [ "$PS1" ]; thenif [ "`id -u`" -eq 0 ]; thenexport PS1='# 'elseexport PS1='$ 'fi
fiexport PAGER='/bin/more '
export EDITOR='/bin/vi'# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; doif [ -r "$i" ]; then. $ifiunset i
doneexport 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.soexport 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