petalinxu 在zynq的FPGA下的ST7735S的驱动配置
spi的接线:
【TFT模块排针8】 【开发板spi,gpio】【antminers9】
VCC ----------- 3.3V ----------- 3.3V
GND ----------- GND ----------- GND
BLK(背光)-------GPIO----------- BANK34_L4N_RXD2(w13; j2.12; gpio[2])
RST(复位)-------GPIO----------- BANK34_L3N_RST2(v13; j2.15; gpio[3])
DC-------GPIO 四线SPI中的命令/数据选择 ----- BANK34_L4P_TXD2(v12; j2.11; gpio[1])
SDA------- MOSI(SPI)-----------BANK34_L6P_TXD3(P14; j3.11)
SCL------- SCK(SPI) ----------- BANK34_L5N_RST3(T15; j3.15)
CS ------- ss(SPI) -----BANK34_0_PLUG2(R19; j2.5; gpio[0]) 直接垃低
CS ------- ss(SPI) 接地??因为这个SPI接口只接收数据,所以直接接地没问题。
CS的实际接线我用的是BANK34_0_PLUG2(R19; j2.5; gpio[0])这个GPIO去控制。
4个GPIO用的是AXI_gpio的IP模块。这个模块的vivado配置先配好测好。
petalinux的编译用HYPER-V的虚拟机,在写入SD时不方便用EXT4分区。用SD的单一FAT 分区。initrd 的根文作系统就好。但单独的EXT4分区好更改一些内容。虚拟硬盘一开如就用300G以上的,否则后面加容量,很麻烦。要生成SDK时编译过程中会用到相当大的硬盘容量,150多吧。
petalinux默认用的是drm的显示驱动框架。FP的框架,默认没配置。/st7735 找到并配置好。6.4的内核的驱动是ST7735R的,这个用于ST7735S没问题。/backlight可能要配一下。驱动源码不需要动,主要工作在配置DTS 。对petalinxu主要就是system-user.dtsi。内容如下:
/include/ "system-conf.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
//#define GPIO_ACTIVE_HIGH 0
//#define GPIO_ACTIVE_LOW 1
//gpio.h就是如上这种反逻辑定义,但下面的语义反而正确。
/{
model="AntMiner S9";
compatible = "zynq7010,zynq-7020","xlnx,zynq-7000";
leds {
compatible="gpio-leds";
gpio-led1{
label="led1";
gpios=<&gpio0 58 GPIO_ACTIVE_LOW>;
default-state="off";
};
};
keys {
compatible="gpio-keys";
autorepeat;
gpio-key1{
label="key1";
gpios=<&gpio0 51 GPIO_ACTIVE_LOW>;
//linux,code=<105>;//right
linux,code=<KEY_RIGHT>;
gpio-key,wakeup;
debounce-interval=<10>;
};
};
backlight:backlight {
compatible="gpio-backlight";
gpios=<&axi_gpio_0 2 GPIO_ACTIVE_LOW>;
default-on;
};
};
&sdhci1 {
disable-wp;
no-1-8-v;
};
&spi0 {
status="okay";
//cs-gpios=<0>,<&axi_gpio_0 0 0>;//<0> for reg=<0>
cs-gpios=<&axi_gpio_0 0 GPIO_ACTIVE_LOW>;
tft_lcd@0 {
status="okay";
compatible="sitronix,st7735r";
reg=<0x0>;
spi-max-frequency=<15000000>;
spi-cpol;
spi-cpha;
fps=<20>;
buswidth=<8>;
dc-gpios=<&axi_gpio_0 1 GPIO_ACTIVE_HIGH>;
reset-gpios=<&axi_gpio_0 3 GPIO_ACTIVE_LOW>;
bl-gpio=<&backlight>;
};
};
FB的测试网上下载了一个fb-test-app的源码,这个在petalinu下编译不难,长时间没做,花了单开时间才把它编译出来,主要是要看明的Makefile,并改正确。也补在下面吧。
先要构建sdk:
petalinux-build --sdk
安装sdk:安装路径下/opt/Xilinx/Petalinux/2022.2/,是没有sdk这个文件夹的.
petalinux-package --sysroot -s -d /opt/pkg/petalinux2024.2/sdk
编译前:
source /opt/pkg/petalinux2024.2/sdk/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi
fb-test-app改后Makefile如下:
APP = myfbtest
#这些定义是fb-test源码中引用,不定义报错,这个程写的。
VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 0
EXTRAVERSION = .git
NAME = rosetta
override CFLAGS += -DVERSION=$(VERSION)
override CFLAGS += -DPATCHLEVEL=$(PATCHLEVEL)
override CFLAGS += -DSUBLEVEL=$(SUBLEVEL)
override CFLAGS += -DVERSION_NAME=\"$(NAME)\"
#
# CC=$(CROSS_COMPILE)gcc
# CXX=$(CROSS_COMPILE)g++
# Common options
#CFLAGS= -g -O3
CFLAGS=-O2 -Wall
LIBS =
# Options for extra libraries
#下面是一个目录下,用多个源文件编一个应用程序的定义方式。因为这个目录下多个源文件编多个应用,需要注去。
#CFLAGS_OPENCV = `pkg-config opencv --cflags`
#LIBS_OPENCV = `pkg-config opencv --libs`
# Find all C files and create object file list
#C_SRC = $(wildcard *.c)
#C_OBJ = $(patsubst %c, %o, $(C_SRC))
# Find all Cpp files and create object file list
#CPP_SRC = $(wildcard *.cpp)
#CPP_OBJ = $(patsubst %cpp, %o, $(CPP_SRC))
#下需才是主要配置
# Include directory
INC_PATH=-I. -I./include -I../include
PROGS=perf rect offset fb-test fb-string
all: $(PROGS)
.c.o: common.h font.h
$(CC) -c $(CFLAGS) $(INC_PATH) -o $@ $< $(LIBS)
fb-test: fb-test.o common.o font_8x8.c
$(CC) -o $@ fb-test.o common.o font_8x8.c $(LDFLAGS) $(LDLIBS)
fb-string: fb-string.o common.o font_8x8.c
# $(CXX) -o $@ $(C_OBJ) $(CPP_OBJ) $(LDFLAGS) $(LDLIBS)
$(CC) -o $@ fb-string.o common.o font_8x8.c $(LDFLAGS) $(LDLIBS)
clean:
rm -f $(PROGS) *.o