嵌入式学习日志(一)——全志H3之开发环境准备

  • Post author:
  • Post category:其他


小目标:让自己编译的uboot跑起来

参考:wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO

首先熟悉一下板子NanoPi NEO和开发流程。维基主要参考《使用全志原厂BSP》这一节。

概要步骤:

1.获得BSP源码包:

git clone https://github.com/friendlyarm/h3_lichee.git lichee

2.下载交叉编译器gcc-linaro-arm.tar.xz,即通常说的arm-linux-gnueabi,将该压缩包放置在lichee/brandy/toochain/目录下即可,无需解压




http://download.friendlyarm.com/nanopineo

提取码:7l8h

目前试验版本为4.6.3,由嵌入式开发一贯的尿性可知,换个版本不一定能用,日后再探索版本问题

3.官方指定要用64bit PC Linux来开发,我这里用了debian 10,然后安装以下软件库

$ sudo apt-get install gawk git gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386

这一段是ubuntu下的代码,在debian下需要去掉“:i386”

4.然后是整个编译,完成整个编译才能单独编译Uboot和Kernel。

该命令会一次性编译好U-boot、Linux内核和模块。

lichee目录里内置了交叉编译器,当进行源码编译时,会自动使用该内置的编译器,所以无需手动安装编译器。 这里先按默认设置编译

$ cd lichee/fa_tools
$ ./build.sh -b nanopi-neo -p linux -t all

5.这下uboot,内核都有了,我想自己制作一个sd启动卡,引用网友的案例,大致流程为:

①:制作空映像,/dev/zero是系统自带的一个黑洞,里面全是0,并且无限长度,别怕给不起,就怕要不起

代码解释为,从/dev/zero读出512个块,每块大小为1M byte,每读出1块,就往fs_H3_512M.img里面写一块

touch fs_H3_512M.img
sudo dd if=/dev/zero of=fs_H3_512M.img bs=1M count=512

②把映像文件映射到/dev/loop0,以方便后续的分区和块操作

sudo losetup /dev/loop0 fs_H3_512M.img

再分2个区,第一区100M(放linux内核,大小视情况而定) 剩下的全划入第二区,官方的分区有好多,这里先调通Uboot为主,只分2个。

sudo fdisk /dev/loop0

省略分区操作,这里要注意分区起始扇区(1扇区=512byte)要大于40192。这之前的空间要用来烧录bootloader,其中uboot的程序被H3的头文件指定放在32800扇区或38192扇区,其大小为2000个扇区,所以分区不能占用之前38192+2000大小的扇区。 相关宏定义见\lichee\brandy\u-boot-2011.09\include\spare_head.h

#define BOOT0_SDMMC_START_ADDR                  (16) //bootloader启动地址为16扇区,即32k
#ifndef CONFIG_SUNXI_SECURE_SYSTEM
#define UBOOT_START_SECTOR_IN_SDMMC             (38192)//如果没定义CONFIG_SUNXI_SECURE_SYSTEM,则uboot程序地址为38192扇区,即19096k
#else
#define UBOOT_START_SECTOR_IN_SDMMC             (32800)//如果定义了CONFIG_SUNXI_SECURE_SYSTEM,则uboot程序地址为32800扇区,即16400k,并会尝试在其前后两个地址寻找uboot程序,地址1:32800-(38192-32800),地址2:38192,下面的宏就是用来干这个的,啥意思不知道
#define UBOOT_START_SECTOR_PRE_IN_SDMMC         (38192)
#endif

然后是格式化,一个fat分区存放映像和启动配置,另一个ext4用来存放根文件系统,也就是说fat分区参与启动linux,Linux跑起来后,就只有ext4分区的事了。

partprobe /dev/loop0   识别分区
mkfs.vfat -I /dev/loop0p1
mkfs.ext4 /dev/loop0p2

③然后就可以开始烧写uboot了,H3的bootloader也分为两部分,boot0和boot1。boot0是负责启动,主要工作是初始化硬件,然后找到uboot程序的存放地址,把uboot读到内存运行,即进入boot1阶段。所以烧写bootloader也要分两步

烧写boot0:

sudo dd if=boot0_sdcard.fex of=/dev/loop0 bs=1k seek=8

boot0_sdcard.fex 文件在lichee/tools/pack/out/目录下

烧写uboot:

sudo dd if=u-boot.fex of=/dev/loop0 bs=1k seek=16400

u-boot.fex 文件在lichee/tools/pack/out/目录下

说明:

seek即偏移地址,上面解释过了,这里的seek可能是16400也可能是19096,可以都试试;

fex文件是啥?个人理解应该把一个或多个bin文件整合在一起,并且设置为固定长度,方便分配空间和地址,就当他是专用bin文件好了

6.文件系统先不管,跑uboot要紧,现在你的img文件里已经有了bootloader了,可以烧写sd卡上机了,不要忘了先把loop设备解绑

sudo losetup -d /dev/loop0 

然后用dd命令烧写

sudo dd if=fs_H3_512M.img of=/dev/sdb

OK,插卡上电美滋滋,眼疾手快留在uboot命令模式。

上电画面
下一篇将记录如何在本文做好的uboot模式下运行裸机程序



版权声明:本文为Three_Sheep原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。