一、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 loopbackauto eth0
iface eth0 inet dhcp

debian其实比busybox简单。

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

放个视频先吧:

sudo apt install mplayer
mplayer XX.mp4 -vo fbdev

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

装个轻量级界面吧:

sudo apt install xfce4
startx

Nanopi-NEO点亮SPI-TFT相关推荐

  1. NanoPi NEO Air使用十一:编写SPI驱动点亮TFT屏幕,ST7789V

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  2. NanoPi NEO Air使用十三:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V,模块加载的方式

    上节使用fbtft来驱动SPI接口TFT屏幕,但是是编译进内核的方式. 本节再来测试下编译成模块的用法. 引脚 240x240分辨率,1.3寸,主控为ST7789VW. 与开发板的引脚连接确定如下: ...

  3. NanoPi NEO Air使用十二:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V

    上节自己编写spi驱动来点亮spi接口的小屏幕,其实Linux内核里已经提供spi接口小屏的设备驱动,即内核中已经自带了此类驱动,名字为fbtft.本节就来使用它. 引脚 240x240分辨率,1.3 ...

  4. NanoPi NEO Air使用十五:移植RTL8723BU驱动

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  5. NanoPi NEO Air使用十:自己编写驱动来控制LED

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  6. NanoPi NEO Air使用九:使用Linux内核自带的LED驱动

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  7. NanoPi NEO Air使用八:编写个简单的驱动和应用程序

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  8. NanoPi NEO Air使用七:获取并编译U-boot和Linux的源码

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  9. NanoPi NEO Air使用六:使用摄像头

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  10. NanoPi NEO Air使用五:安装Xfce和xrdp,实现远程访问

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

最新文章

  1. 【UVALive 4642】Malfatti Circles(圆,二分)
  2. I-Matrix Power Series POJ - 3233 矩阵快速幂+分治
  3. ONAP — Overview
  4. autocad完全应用指南_建筑绘图慢?580页的AUTOCAD完全自学必备指南,高效绘图不求人...
  5. Android屏幕方向调整的两种方式
  6. 机房管理系列之杀毒服务器维护
  7. MySQL 中的重做日志,回滚日志以及二进制日志的简单总结
  8. LLVM与Codegen技术
  9. fabric node enrollAdmin.js 报错SyntaxError: Unexpected token function at createScript (vm.js:56:10)
  10. SoftGrid教程系列
  11. 汇编环境的搭建(windows 10 + debug)
  12. Delphi 正则表达式TPerlRegEx : Split 函数
  13. 我的csdn账号开通啦~
  14. 最常用20000英语单词表_家长最值得一看的文章如何培养孩子好的学习习惯!
  15. grep -A -B -C -a -c -n -v -i等
  16. 植发搞笑图片_搞笑:终于找到原图了!像不像?
  17. 一张照片生成3D头像!苹果新模型击败StyleGAN2,表情光线都能调,网友:要用于MR?...
  18. java面试(JVM)
  19. JavaScrip 防止别人复制,剪切,查看源代码,页面另存为的操作
  20. 训练集和测试集的标准化处理

热门文章

  1. ethereum-etl学习2
  2. 什么?作为程序员你还不知道人工智能搜索引擎?
  3. 0x01.被动信息收集
  4. Oracle版本升级后引出的catalog连接问题
  5. mPOS安全提升之路
  6. Outlook2016关联QQ邮箱
  7. 系统部署服务器位置,室内定位系统在实际项目中的部署
  8. 【遇见Doris】Apache Doris 在京东广告平台的应用
  9. 单片机c语言的define,单片机C语言中define的妙用
  10. Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能