荔枝派nano上手笔记(一)移植Uboot

时间:2024-05-23 18:14:37

    在放假前就买了荔枝派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℃

    原理图

        荔枝派nano上手笔记(一)移植Uboot

二、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显示如下的图像

        荔枝派nano上手笔记(一)移植Uboot

       此时使用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是广泛使用的系统引导程序,对于嵌入式来说至关重要,所以以后会进一步学习相关的知识。