一、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