我是靠谱客的博主 幽默大象,最近开发中收集的这篇文章主要介绍嵌入式学习日志(一)——全志H3之开发环境准备,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

小目标:让自己编译的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之开发环境准备所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部