在放假前就买了荔枝派nano和zero这俩块小板子,打算寒假上手玩一下,但是赶放假看了看官方的文档发现那时的水平还不太能玩的动,那时对Linux基本不太熟悉,只会一些简单的操作,经过了快一个月的学习,现在感觉自己已经可以来试着玩玩了,同时也是为开学上手驱动开发打些基础,今天玩了玩nano这块板子,在板子上移植了Uboot。
一、硬件参数
CPU: 全志 F1C100s, ARM 926EJS , 最高 900MHz
内存:
集成32MB DDR
存储:
预留SOP8 SPI Flash焊盘(可定制贴片8~32MB SPI Nor Flash);
板载 TF卡座,可TF启动。
显示:
通用 40P RGB LCD FPC座
可直插常见的40P 4.3/5/7寸屏幕(板载背光驱动),通过转接板可插50P 7/9寸屏
支持常见的272x480, 480x800, 1024x600等分辨率
板载电阻式触摸屏芯片,另配合底板可适配电容触摸屏
支持 720P 视频输出
支持 H.264 / MPEG 等视频流解码
通信接口
SDIO,可搭配配套SDIO WiFi+BT 模块
SPI x2
TWI x3
UART x3
OTG USB x1
TV out
其它接口
PWM x2
LRADC x1
Speakerx2 + Mic x1
电气特性
Micro USB 5V供电; 2.54mm 插针 3.3V~5V供电; 1.27mm 邮票孔供电
输出 3.3V ,可选择输入RTC电压
900MHz linux空载运行电流 54mA, 带屏运行电流 ~250mA
存储温度 -40~125℃,运行温度 -20~70℃
原理图
二、Uboot移植
1、安装交叉编译链
# 此处为获取7.2.1版本,您可获取其他版本或者通过链接直接下载
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/
sudo vim /etc/bash.bashrc
# 在文件末尾 添加以下内容
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
# 添加完毕
# 使路径生效
source /etc/bash.bashrc
此时可用 arm-linux-gnueabi-gcc -v
进行测试;若普通用户状态下没有成功,通过 sudo su
切换到root用户再尝试;
2、编译Uboot
然后从GitHub上拉取对Nano进行了适配的Uboot,就是nano分支的v2018.01,如果clone速度过慢也可以下载zip包然后解压
sudo apt-get install git
git clone https://github.com/Lichee-Pi/u-boot.git
cd u-boot
# 查看分支
git branch -a
# 切换到 Nano 分支
git checkout nano-v2018.01
Uboot的文件结构,这个还是比较复杂的,过几天会深入的学习一下
.
├── api //封装一些平台无关的操作,如字符串打印,显示,网络,内存
├── arch //以平台架构区分
│ ├──arm
│ │ └──cpu
│ │ │ └──arm926ejs
│ │ │ │ └──sunxi //cpu相关的一些操作,如定时器读取
│ │ │ │ │ └──u-boot-spl.lds //spl的放置方法
│ │ └──dts
│ │ │ └──suniv-f1c100s-licheepi-nano.dts // f1c100s芯片的一些配置
│ │ │ └──suniv-f1c100s-licheepi-nano.dtb
│ │ │ └──suniv-f1c100s.dtsi
│ │ │ └──suniv.dtsi
│ │ └──lib //一些库文件
│ │ └──mach-sunxi
│ │ │ └──board.c //board_init_f
│ │ │ └──dram_sun4i.c //ddr的操作,复位,时钟,延时,odt,etc.
│ │ │ └──dram_helpers.c //ddr的设置及读写测试
├── board
│ ├──sunxi
│ │ └──board.c //sunxi_board_init 入口
│ │ └──dram_suniv.c //DRAM的一些默认参数
├── cmd //Uboot命令行的一些命令
├── common //含spl
├── configs //menuconfig里的默认配置,比如各类驱动适配
│ ├── licheepi_nano_defconfig
│ ├── licheepi_nano_spiflash_defconfig
├── disk //硬盘分区的驱动
├── doc
├── drivers //外设驱动
├── dts
├── examples
├── fs //多种文件系统
├── include
│ ├──configs
│ │ └──sunxi_common.h //预配置的参数,如串口号等
│ │ └──suniv.h
├── lib //加密压缩等算法
├── net //nfs,tftp等网络协议
├── post
├── scripts
了解u-boot大致结构后,我们就可以开始尝试编译了;
# 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各项默认配置为 nano 的spiflash支持版
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig
# 若不带spi-flash的板子,请换成 licheepi_nano_defconfig
# 进行可视化配置
make ARCH=arm menuconfig
然后来设置LCD,我买了800*480的LCD,我的配置过程如下:
通过配置 ARM architecture ‣ Enable graphical uboot console on HDMI, LCD or VGA 为 Y
接着配置同级的 LCD panel timing details 为:
x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0
并将 LCD panel backlight pwm pin 设为:
PE6 (查自 Nano 原理图)
接下来就可以开启编译了
# 开始编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
在编译Uboot的步骤中可能会报错缺少swig、缺少python.h、缺少curses.h、缺少zlib.h
对应的执行以下指令就可以解决
sudo apt-get install swig、
sudo apt-get install python-dev # for python2.x installs
sudo apt-get install python3-dev # for python3.x installs
sudo apt-get install libncurses5-dev
sudo apt-get install zlib1g-dev
3、下载工具sunxi-tools安装
在食用前,我们仍需要一个适配 Nano 的下载工具;
git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git
cd sunxi-tools
make && sudo make install
如果出现:fel_lib.c:26:20: fatal error: libusb.h: No such file or directory,那需要安装libusb:
sudo apt-get install libusb-1.0-0-dev
安装成功后将nano接到电脑进行以下的测试
$ sudo ./sunxi-fel ver
AWUSBFEX soc=00001663(F1C100s) 00000001 ver=0001 44 08 scratchpad=00007e00 00000000 00000000
$ sudo ./sunxi-fel -l
USB device 001:013 Allwinner F1C100s
4、不插卡上电烧录
此时有两种方式进行程序下载:
# 1.以 uboot file-with-spl形式进行(单次运行,测试时个人推荐)
sunxi-fel uboot /your/path/to/u-boot-sunxi-with-spl.bin # 请自行修改到本机地址
# 2.烧进 spi-flash (开机自启)
sunxi-fel -p spiflash-write 0 /your/path/to/u-boot-sunxi-with-spl.bin
# note: 重新烧录或重进fel模式时,请在上电时拉低SPI flash 的 CS引脚
我选用了第一种,烧录成功后LCD显示如下的图像
此时使用TTL转USB的模块连接nano板的串口0,在串口助手找到对应的串口设置波特率为115200然后发送bdinfo将列出各种板子信息,如:
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank = 0x00000000
-> start = 0x80000000
-> size = 0x02000000
baudrate = 115200 bps
TLB addr = 0x80FF0000
relocaddr = 0x80F72000
reloc off = 0xFF872000
irq_sp = 0x80E67D90
sp start = 0x80E67D80
FB base = 0x81E89000
Early malloc usage: 118 / 400
fdt_blob = 80e67da8
三、总结
到这里Uboot的移植就结束了,这仅仅是将Uboot成功的移植到了板子上,Uboot是广泛使用的系统引导程序,对于嵌入式来说至关重要,所以以后会进一步学习相关的知识。