&spi0 {
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins_a>;
status = "okay";
flash@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "winbond,w25q128", "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <40000000>;
};
};
&spi1 {
pinctrl-names = "default";
pinctrl-0 = <&spi1_pins_a>;
status = "okay";
st7789v@0 {
status = "okay";
compatible = "sitronix,st7789v";
reg = <0>;
spi-max-frequency = <32000000>;
rotate = <90>;
spi-cpol;
spi-cpha;
rgb;
fps = <30>;
buswidth = <8>;
reset-gpios = <&pio 4 3 GPIO_ACTIVE_LOW>;
dc-gpios = <&pio 4 5 GPIO_ACTIVE_LOW>;
debug = <0>;
};
};
reset-gpios = <&pio 4 3 GPIO_ACTIVE_LOW>;
dc-gpios = <&pio 4 5 GPIO_ACTIVE_LOW>;
st7789V中指定了rst与dc引脚,pio 4 3 对应PE3,pio 4 5对应PE5;
详细配置方式见链接:全志 :gpio使用
需要根据自身硬件配置。
Tips:更改 spi-max-frequency = <32000000> -> spi-max-frequency = <100000000>; 和 fps = <30>; 改为 fps = <60>; 感谢楼下老哥提示。
rotate = <90>;根据屏幕方向更改。
只需要更改下面的三个地方即可,因为新下载的内核已经做了升级
static int init_display(struct fbtft_par *par)
{
par->fbtftops.reset(par);
mdelay(50);
write_reg(par,0x11);//Sleep exit
mdelay(12);
write_reg(par,0x11);
mdelay(10);
write_reg(par,0x3A,0x05); //65k mode
write_reg(par,0xc5,0x1a);
write_reg(par,0x36,0x70); // 屏幕显示方向设置
//-------------ST7789V Frame rate setting-----------//
write_reg(par,0xb2,0x05,0x05,0x00,0x33,0x33);
write_reg(par,0xb7,0x35);
//--------------ST7789V Power setting---------------//
write_reg(par,0xbb,0x3f);
write_reg(par,0xc0,0x2c);
write_reg(par,0xc2,0x01);
write_reg(par,0xc3,0x0f);
write_reg(par,0xc4,0x20);
write_reg(par,0xc6,0x11);
write_reg(par,0xd0,0xa4,0xa1);
write_reg(par,0xe8,0x03);
write_reg(par,0xe9,0x09,0x09,0x08);
write_reg(par,0xe0,0xd0,0x05,0x09,0x09,0x08,0x14,0x28,0x33,0x3f,0x07,0x13,0x14,0x28,0x30);
write_reg(par,0xe1,0xd0,0x05,0x09,0x09,0x08,0x03,0x24,0x32,0x32,0x3b,0x14,0x13,0x28,0x2f);
write_reg(par,0x21);
write_reg(par,0x11);
mdelay(120); //Delay 120ms
write_reg(par,0x29);
mdelay(200);
return 0;
}
static struct fbtft_display display = {
.regwidth = 8,
.width = 135,
.height = 240,
.gamma_num = 2,
.gamma_len = 14,
.gamma = DEFAULT_GAMMA,
.fbtftops = {
.init_display = init_display,
.set_var = set_var,
.set_gamma = set_gamma,
.blank = blank,
},
};
对于1.14寸液晶屏而言,其屏幕有偏移,这里需要修改fbtft-core.c文件中的fbtft_set_addr_win函数
static void fbtft_set_addr_win(struct fbtft_par *par, int xs, int ys, int xe,
int ye)
{
write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS,(xs+40) >> 8, xs+40, ((xe+40) >> 8) & 0xFF, (xe+40) & 0xFF);
write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS,((ys+52) >> 8) & 0xFF, (ys+52) & 0xFF, ((ye+52) >> 8) & 0xFF, (ye+52) & 0xFF);
write_reg(par, MIPI_DCS_WRITE_MEMORY_START);
}
现在所有的修改都完成了,剩下的就是编译内核了,在内核根目录下执行
make menuconfig
2.5 内核配置
由于FC1000S的SPI中有一个BUG,因此我们在开启SPI驱动的时候必须选择A31(Device Drivers -> SPI support)
如图所示
现在选择ST7789V驱动并编译进内核中,如下:
Device Drivers —>
[] Staging drivers —>
<> Support for small TFT LCD display modules —>
<*> FB driver for the ST7789V LCD Controller
保存退出,然后执行make命令编译内核,然后将镜像拷贝到tf卡第一分区中,此时可以看到屏幕已经可以驱动起来了,并且/dev目录下有fb0设备。
编译 make -j2
将设备树和zimage复制到tf卡中 重启可以看到光标闪烁
说明移植成功
此时可以看到屏幕刷新了,然后编程了黑色背景,同时出现了光标,从终端的 log 可以看到,当
fb 挂载成功后,控制台驱动检测到 fb 设备后会自动将 fb0 映射到 tty0 上,这样 tty0 实际上就是 fb0 ttys0则是串口
设备。现在我们向屏幕输入一个 hello frame buffer,如下:
#echo hello frame buffer > /dev/tty0
可以看到此时液晶屏上显示了该文字,我们也可以将当前目录输出到液晶屏上:
ls / > /dev/tty0
实际上很就简单
在uboot启动 倒计时内按任意键进入uboot命令行,设置bootargs 添加console=tty0最前面即可
注意不要输入错误 一定要确保是在英文输入法下面输入的,有时不小心按到shift 进入中文输入字符就会不对,我就是这样 导致我格式化了多次tf卡
上面的步骤只能使Linux的启动信息显示到LCD上面,
要将LCD作为终端控制台还需要一下步骤
修改/etc/inittab文件,添加一行:
vi /etc/inittab
tty0::askfirst:-/bin/sh
修改完成以后保存/etc/inittab 并退出,然后重启开发板,重启以后开发板 LCD 屏幕最后一行会显示下面一行语句
Please press Enter to activate this console.
按下回车键,即可进入终端,使用USB外接键盘,正常交互(按下回车键,前题是已经完成好F1C100S的USB驱动增加)。
下面这个方法是另一个博客里提到的方法,待测试
将原有的console注释掉,改为ttyS0和tty0,ttyS0是USB键盘输入,tty0就是正常输出输入
#console::respawn:-/bin/sh
ttyS0::respawn:-/bin/sh
tty0::respawn:-/bin/sh
大部分操作参考https://blog.csdn.net/weixin_45652444/article/details/119756079
实际操作有几率无法编译过
一般卡在c99编译上
解决办法 在顶层Makefile CFLAGS 后增加 -std=c99选项
搞了很久才解决
CFLAGS := -O0 -g $(WARNINGS) -std=c99
最简单的模拟器使用方法是安装Vs Studio 2019,打开模拟器工程;编译即可。