概述
小目标:让自己编译的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大小的扇区。 相关宏定义见licheebrandyu-boot-2011.09includespare_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模式下运行裸机程序
最后
以上就是幽默大象为你收集整理的嵌入式学习日志(一)——全志H3之开发环境准备的全部内容,希望文章能够帮你解决嵌入式学习日志(一)——全志H3之开发环境准备所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复