Nanopi-NEO点亮SPI-TFT

本文详细介绍嵌入式Linux系统从U-boot和内核的编译烧录,到配置根文件系统并安装Debian,再到驱动TFT屏显示的过程。涉及设备节点、内核配置、启动脚本、SPI屏配置、设备树修改、根文件系统生成及网络配置等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、uboot和内核的编译烧录

主要参考:《Building U-boot and Linux for H5/H3/H2+/zh》
3.1-3.3节,这里就不复制了,说一下遇到的几个问题:

1.“NanoPi H3/H2+开发板的启动设备的设备节点总是/dev/mmcblk0”。这个话是个坑,我这边不知咋回事就是/dev/mmcblk1

2.内核编译时,如想修改配置需要把ARCH=加上

make menuconfig ARCH=arm

否则你修改的就是默认x86的配置,事实上为了不必要的麻烦,你做任何动作都应该加上ARCH=。

3.boot分区里,dtb、zImage、boot.scr可以放在根目录,也可以自己任意放,再设置路径,其中前两个路径再boot.cmd里面设置,boot.scr路径要在uboot里配置,我都放根目录的。
boot.scr是启动脚本,作用是指导uboot该怎么加载内核。怎么产生这个文件?首先新建一个cmd文件,比如boot.cmd

vim boot.cmd

这个文件里面写入的命令会被uboot逐条执行。这里给出我的模板,可在此基础上修改

setenv bootargs console=tty0 console=ttyS0,115200  root=/dev/mmcblk1p2   rootwait panic=10 
load mmc 0:1 0x43000000 sun8i-h3-nanopi-neo.dtb
load mmc 0:1 0x42000000 zImage
bootz 0x42000000 - 0x43000000

第一行是设置启动参数,比如设置用哪个设备作为控制台,指定根文件系统,设置ip等。这里为何有两个console呢,后面会讲。
第二三行设置设备树、内核映像位置,以及载入到哪一段空间
最后是boot指令

然后通过cmd文件生成scr文件:

mkimage -C none -A arm -T script -d boot.cmd boot.scr 

二、手上有个闲置的3.2寸TFT,支持SPI,HX8357C主控,看了下原理图正好nanopi neo引出了一个SPI0接口,果断走起!

我的屏幕配置的是SPI0四线制,除了SPI0四个脚,还要接个RS,BL,RST,可以接到任意三个GPIO口,在DTS文件里配置他们。

首先添加内核对SPITFT的支持:
Device Driver->Staging drivers->Support for small TFT LCD display modules
第一项:
Support sysfs for small 。。。

然后再选一个跟自己主控一样或者差不多型号的,正好有个HX8357D。

找到它的驱动文件,

drivers/staging/fbtft/fb_hx8357d.c

做一下修改,主要就是初始化参数,也可以先不改,跑起来看一下有没有异常,再针对异常找改参数。
我跑起来有红色和蓝色反了,于是根据datasheet改了一行就OK了:

write_reg(par, HX8357D_SETCOM, 0x21);

接下来是修改设备树:

nano arch/arm/boot/dts/sun8i-h3-nanopi-neo.dts

设备数类型为dtsi的文件最好别动它,因为是公用的,但是这些公用的文件必须打开来看一下,因为dts默认是继承公用dtsi的设置,对于想修改的地方必须搬过来改,如本例的spidev0默认是开启的,我们就要搬过来禁用掉。

添加SPI0节点,直接&spi0就行,不用写具体地址,因为地址已经在相关文件里(sun开头的那几个)定义好了,类似于C语言预定义

在spi0节点下添加8357节点,并将其他SPI0子节点禁用(status=disabled):

&spi0{
      	spidev0:spi@0{
        	status="disabled";
      	};
	hx8357d: hx8357d@0{
		compatible = "himax,hx8357d";
		reg = <0>;
		status = "okay";
		spi-max-frequency = <48000000>;
		rotate = <90>;
		fps = <33>;
		buswidth = <8>;
		dc-gpios = <&pio 0 1 GPIO_ACTIVE_HIGH>;  /* PA1 */
		reset-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
		led-gpios = <&pio 0 0 GPIO_ACTIVE_LOW>;  /* PA0 */
		debug = <0x0>;
		};
};

&hdmi {
        status = "disable";
};

hx835这部分代码复制了dtsi文件里的pitft,略加修改。
compatible 里面的厂商和型号去对应的驱动文件找,比如我的是fb_hx8357d.c,最下面有一行:

FBTFT_REGISTER_DRIVER(DRVNAME, "himax,hx8357d", &display);

最后有定义三个引脚dc-gpios,reset-gpios,led-gpios,分别是对应RS、RST、BL,可直接接到复制过来的位置,也可以自己指定,但是指定的话又要搬一些dtsi里的代码过来改。
pio 0 对应GPIOA
pio 1 对应GPIOB
……
另外把HDMI关掉,否则系统启动时默认把HDMI作为输出设备,FBTFT是黑屏。当然毫无疑问也能不禁用,可设置输出设备,暂时没时间去研究。

最后更改启动参数,之前提到为什么要有两个console,因为我要串口和屏幕都打印启动信息,第一个console=tty0指定的就是屏幕,如果不加,屏幕只显示企鹅。

三、配置根文件系统
busybox的根文件太简约,可以用于项目,但是缺胳膊少腿的不好玩,咱们还是搞个Debian吧,丰富稳定。

1.先安装工具,debootstrap是debian官方的生成rootfs的工具,可制作debian或者ubuntu的根目录,非常方便

apt-get install debootstrap multistrap binfmt-support

2.生成debian根目录,包括丰富的工具和命令。其中:

foreign表示只把软件包下载解压,其余安装配置的工作暂时不做,当目标主机与宿主机不同架构时,这个命令是必须的,否则会配置失败精神错乱

arch选择目标板

stable表示目前最新的稳定版

rootfs是自己指定的当前目录的文件夹,下载生成的根目录会保存在此

至于 ftp.cndebian.org/debian 其实就是中科大镜像http://mirrors.ustc.edu.cn/debian/

mkdir ~/debRoot
cd ~/debRoot
debootstrap --foreign --arch armhf stable rootfs http://ftp.cn.debian.org/debian/

然后去洗个澡换身干净的衣服,等他下完。

结束后再运行一次同样的命令:

debootstrap --foreign --arch armhf stable rootfs http://ftp.cn.debian.org/debian/

这是因为这个命令偶尔会有下载失败的软件包,重新运行会把失败的包再下载一次,这次别去洗澡了,盯着屏幕等命令结束

3.稍作修改

cd rootfs
nano ./etc/fstab

加入以下内容:

proc   /proc   proc   defaults   0   0
/dev/mmcblk1p2   /   ext3   errors=remount-ro   0   1
#/swapfile   swap   swap   defaults   0   0

这个文件决定了系统系统后如何挂载文件系统,默认空白情况下是登不进系统的。其字段意义依次为:

<file system> <dir> <type> <options> <dump> <pass>

详情看官方文档
/dev/mmcblk1p2替换成你实际的设备名
swap因为之前内核没有启用,sd卡也没分这个区,暂时先不用,但是debian一般是要开启的,不知道会不会影响稳定性,以后再说。

tar zcvf root.tar.gz ./*

sd的root分区建议使用EXT3,因为4.14内核有些老了,支持的EXT4并不完善,用现在的很多新系统格式化出来的EXT4支持不是很好。

cp到sd卡root分区过去解压

tar xvf root.tar.gz ./

如果不压缩,直接用cp传,请原地做五十个俯卧撑再去洗个澡,回来应该刚好传完

最后在启动参数中加入一句:

init=/bin/sh rw

原来假如有init=/bin/bash的要把这句删掉,这样启动后将会进入单用户模式。

4.插卡上电,正常会显示:

/bin/sh: 0: can't access tty; job control turned off

别慌,正常。执行一次touch指令,试试文件系统是否以读写模式挂载,否则需要重新挂载:

mount -o rw,remount /

然后执行以下命令,执行第二阶段的安装配置:

DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true  LC_ALL=C LANGUAGE=C LANG=C /debootstrap/debootstrap --second-stage

好了,又是漫长的等待,泡杯咖啡吧

I: Base system installed successfully.

成功!
然后给root账户设置密码:

passwd root

好了,重启就能进系统了。

之后再配置一下网络:

sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp


debian其实比busybox简单。

四、玩一下屏幕
平时半死不活的SPI屏既然点起来了,不跑个界面,放个视频怎么对得起前面的劳动?

放个视频先吧:

sudo apt install mplayer
mplayer XX.mp4 -vo fbdev

有明显的刷屏感,但是也没办法,由于用的杜邦线连接,试了下这个SPI最多用48M,再上去显示不正常了。

装个轻量级界面吧:

sudo apt install xfce4
startx

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值