Nanopi-NEO点亮SPI-TFT
一、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相关推荐
- NanoPi NEO Air使用十一:编写SPI驱动点亮TFT屏幕,ST7789V
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用十三:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V,模块加载的方式
上节使用fbtft来驱动SPI接口TFT屏幕,但是是编译进内核的方式. 本节再来测试下编译成模块的用法. 引脚 240x240分辨率,1.3寸,主控为ST7789VW. 与开发板的引脚连接确定如下: ...
- NanoPi NEO Air使用十二:使用自带的fbtft驱动点亮SPI接口TFT屏幕,ST7789V
上节自己编写spi驱动来点亮spi接口的小屏幕,其实Linux内核里已经提供spi接口小屏的设备驱动,即内核中已经自带了此类驱动,名字为fbtft.本节就来使用它. 引脚 240x240分辨率,1.3 ...
- NanoPi NEO Air使用十五:移植RTL8723BU驱动
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用十:自己编写驱动来控制LED
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用九:使用Linux内核自带的LED驱动
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用八:编写个简单的驱动和应用程序
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用七:获取并编译U-boot和Linux的源码
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用六:使用摄像头
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- NanoPi NEO Air使用五:安装Xfce和xrdp,实现远程访问
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
最新文章
- 【UVALive 4642】Malfatti Circles(圆,二分)
- I-Matrix Power Series POJ - 3233 矩阵快速幂+分治
- ONAP — Overview
- autocad完全应用指南_建筑绘图慢?580页的AUTOCAD完全自学必备指南,高效绘图不求人...
- Android屏幕方向调整的两种方式
- 机房管理系列之杀毒服务器维护
- MySQL 中的重做日志,回滚日志以及二进制日志的简单总结
- LLVM与Codegen技术
- fabric node enrollAdmin.js 报错SyntaxError: Unexpected token function at createScript (vm.js:56:10)
- SoftGrid教程系列
- 汇编环境的搭建(windows 10 + debug)
- Delphi 正则表达式TPerlRegEx : Split 函数
- 我的csdn账号开通啦~
- 最常用20000英语单词表_家长最值得一看的文章如何培养孩子好的学习习惯!
- grep -A -B -C -a -c -n -v -i等
- 植发搞笑图片_搞笑:终于找到原图了!像不像?
- 一张照片生成3D头像!苹果新模型击败StyleGAN2,表情光线都能调,网友:要用于MR?...
- java面试(JVM)
- JavaScrip 防止别人复制,剪切,查看源代码,页面另存为的操作
- 训练集和测试集的标准化处理
热门文章
- ethereum-etl学习2
- 什么?作为程序员你还不知道人工智能搜索引擎?
- 0x01.被动信息收集
- Oracle版本升级后引出的catalog连接问题
- mPOS安全提升之路
- Outlook2016关联QQ邮箱
- 系统部署服务器位置,室内定位系统在实际项目中的部署
- 【遇见Doris】Apache Doris 在京东广告平台的应用
- 单片机c语言的define,单片机C语言中define的妙用
- Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能