文章目录

  • U-boot编译
    • 环境配置
    • 下载Uboot
    • 执行编译
    • 分区一(boot分区)设置:
    • 分区二(rootfs分区)设置:
  • Kernel编译
    • 修改参数:添加LCD st7789
    • 单独编译设备树
  • licheepi buildroot根文件系统
    • ubootroot的目录结构
    • 选中Target options以选择licheepi对应的架构
    • Toolchain 配置交叉工具链
    • Target package
  • 编译
    • 插卡,完成

U-boot编译

环境配置

先换源,避免后续的下载速度太慢

执行 sudo apt-get update

下载一个vim,等下方便修改

sudo apt-get install vim

进入vi配置文件 sudo vi /etc/vim/vimrc

在配置文件设置行距为4并且打开行号

vim的使用这里步做过多讲解,自行百度

进入正题,配置交叉环境,安装gcc编译器,本教程使用的是6.3.1版本

先cd /opt文件里面

执行 : sudo wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz

如果出现安全证书过期,请换成http进行下载

解压交叉编译器 sudo tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz

完成 ls 查看一下文件

添加交叉编译器路径 修改profile文件

sudo vim /etc/profile

再最后一行加入export PATH=命令行路径:$PATH

如:export PATH=/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin:$PATH

保存退出后运行source /etc/profile 生效

或者重启系统生效

备注:如果需要查看路径,终端运行 echo $PATH。 Ubuntu几种路径添加方式对比:(11条消息) ubuntu添加环境变量的四种方法_K_K_yl的博客-CSDN博客_ubuntu添加环境变量

查看编译器是否安装成功,终端运行arm-linux-gnueabihf-gcc -v

成功会返回如下:

将终端退出重新打开一下 安装设备树编译器

终端输入sudo apt-get install device-tree-compiler

下载Uboot

安装git,终端输入sudo apt-get install git

拷贝Uboot到Ubuntu下,终端输入 sudo git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-spi-experimental

克隆失败,重新克隆可以解决

下载完成

进入u-boot

uboot目录结构

├── api 存放uboot提供的API接口函数

├── arch 平台相关的部分我们只需要关心这个目录下的ARM文件夹

│ ├──arm

│ │ └──cpu

│ │ │ └──armv7

│ │ └──dts

│ │ │ └──*.dts 存放设备的dts,也就是设备配置相关的引脚信息

├── board 对于不同的平台的开发板对应的代码

├── cmd 顾名思义,大部分的命令的实现都在这个文件夹下面。

├── common 公共的代码

├── configs 各个板子的对应的配置文件都在里面,我们的Lichee配置也在里面

├── disk 对磁盘的一些操作都在这个文件夹里面,例如分区等。

├── doc 参考文档,这里面有很多跟平台等相关的使用文档。

├── drivers 各式各样的驱动文件都在这里面

├── dts 一种树形结构(device tree)这个应该是uboot新的语法

├── examples 官方给出的一些样例程序

├── fs 文件系统,uboot会用到的一些文件系统

├── include 头文件,所有的头文件都在这个文件夹下面

├── lib 一些常用的库文件在这个文件夹下面

├── Licenses 这个其实跟编译无关了,就是一些license的声明

├── net 网络相关的,需要用的小型网络协议栈

├── post 上电自检程序

├── scripts 编译脚本和Makefile文件

├── spl second program loader,即相当于二级uboot启动。

├── test 小型的单元测试程序。

└── tools 里面有很多uboot常用的工具。

安装make 终端输入 sudo apt-get install make

设置参数

sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig

#or sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero480x272LCD_defconfig

#or sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig

安装libncurses5-dev,终端输入sudo apt-get install libncurses5-dev解决

uboot配置命令

终端输入 sudo make menuconfig

此时会跳出以下配置界面

—按回车,即选择当前菜单

------- 按Y 代表该config选项选中

------- 按N 代表不选中该选项

-------- 按M

代表该驱动编译成**.ko的方式,在系统起来之后,当驱动需要的时候加载---------按/ 可以查找某个选项---------退出<** > ----------按Y选中后的状态

这里面有几个常见的配置选项我们可以看下:

  1. 第一个Architecture select架构选择,不用质疑这个是ARM架构
  2. 第二个ARM architecture

这个选项比较重要,主要配置ARM框架下的常用的配置函数以及LCD等参数

DDR配置

选择这个,进入

再进这个

···
Target select (Support sunxi (Allwinner) SoCs)   #进去之后可以选择sunxi Soc系列芯片
···
[*] Sunxi SoC Variant    # 这个就是对芯片Soc 的选择,我们可以看到配置选择了`sun8i (Allwinner V3s)
(360) sunxi dram clock speed     # 配置dram的时钟速率
(14779) sunxi dram zq value     #  配置dram的ZQ值,是用来动态加强DDR3的
-*- Board uses DDR2 DRAM     #   使用DDR2 DRAM

时钟频率配置#

Boot images --->(1008000000) CPU clock frequency

这里设置了CPU的时钟频率

开机延时设置#

delay in seconds before automatically booting

这个是uboot开机的时候的一个等待时间的秒数,可以改大一点,默认是2s

SPL配置

SPL / TPL ---> 这个就是SPL相关的配置了
[*]   MMC raw mode: by sector                       按扇区
(0x50)  Address on the MMC to load U-Boot from  mmc加载uboot的地址
[*] Support GPIO                                 支持GPIO
[ ] Support I2C                                 支持I2C
[*] Support common libraries                    支持通用lib
[*] Support disk paritions                      支持分区
[*] Support generic libraries                   支持一般lib库
[*] Support MMC                                 支持MMC
[*] Support power drivers                  支持电源驱动
[*] Support serial                               支持串口

spi lcd及串口输出配置

修改include/configs/sun8i.h 使uboot从tf卡启动

不需要LCD的在sun8i.h中加入以下

#define CONFIG_BOOTCOMMAND   "setenv bootm_boot_mode sec; " "load mmc 0:1 0x41000000 zImage; "
​                            "load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb; "
​                            "bootz 0x41000000 - 0x41800000;"
\#define CONFIG_BOOTARGS     "console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0"

需要LCD显示的在sun8i.h中加入以下

#define CONFIG_BOOTCOMMAND   "setenv bootm_boot_mode sec; " \"load mmc 0:1 0x41000000 zImage; " \"load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb; " \"bootz 0x41000000 - 0x41800000;"
#define CONFIG_BOOTARGS     "console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw  vt.global_cursor_default=0"

备注:因为我们需要使用lcd显示跟串口同时输出,所以使用第二种加入后如下

执行编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make

编译成功后可以uboot目录发现多出了个u-boot-sunxi-with-spl.bin

如果权限不够,可以给这个文件夹最高权限

sudo chmod -R 777 u-boot

编译成功后可以uboot目录发现多出了个u-boot-sunxi-with-spl.bin

然后需要将SD卡格式化

分区需要在Ubuntu进行,先安装软件

sudo apt-get install gparted

打开查看SD卡是sdb

右键删除fat32

分区一(boot分区)设置:

分区二(rootfs分区)设置:

最终得到

点一下勾勾完成,耐心等待

完成后拔插一下这样就分区成功

烧录到SD卡的8k偏移处

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

Kernel编译

1、安装依赖#

sudo apt install git wget make gcc flex bison libssl-dev bc kmod

2、下载Linux源码

git clone -b zero-5.2.y --depth 1 https://github.com/Lichee-Pi/linux.git

3、编译源码

修改Makefile文件

cd linux

vim Makefile

[364]行 修改为ARCH            = arm
[365]行 添加 CROSS_COMPILE    = arm-linux-gnueabihf-
[366]行 添加 INSTALL_MOD_PATH = out

修改参数:添加LCD st7789

终端输入make menuconfig

按如下箭头操作

然后选Save并退出

要使用lcd要在设备树上做一些修改

1、sun8i-v3s.dtsi中注释掉自带的视频输出

终端输入vim arch/arm/boot/dts/sun8i-v3s.dtsi

在sun8i-v3s-licheepi-zero-dock.dts增加屏幕驱动节点并注释掉i2c0

&spi0 {
status = "okay";
st7789v: st7789v@0{
compatible        = "sitronix,st7789v";
reg               = <0>;
status            = "okay";
spi-max-frequency = <36000000>;
spi-cpol;
spi-cpha;
rotate            = <0>;
fps               = <60>;
buswidth          = <8>;
rgb;
dc-gpios          = <&pio 1 5 GPIO_ACTIVE_HIGH>; //PB5
reset-gpios       = <&pio 1 6 GPIO_ACTIVE_HIGH>; //PB6
width             = <240>;
height            = <320>;
debug             = <0>;
};
};

单独编译设备树

终端输入make dtbs

make licheepi_zero_defconfig
make menuconfig   #一般不用修改,需要时单独改
make -j16
make  -j16 modules #编译模块
make -j16 modules_install #安装模块
make dtbs #编译设备树

编译完成后,zImage在arch/arm/boot/下,驱动模块在out/lib下,设备树在arch/arm/boot/dts下。

然后把zImage,sun8i-v3s-licheepi-zero-dock.dtb放到第一分区

此时插卡上电串口有信息输出,但是没有根文件系统进不去

licheepi buildroot根文件系统

首先安装一些依赖,比如linux头文件:

apt-get install linux-headers-$(uname -r)
apt-get install libncurses5-dev
apt-get install wget
apt-get install gcc automake autoconf libtool make

然后下载安装解压:

wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
cd buildroot-2017.08/
make menuconfig

ubootroot的目录结构

.
├── arch: #存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board
├── boot
├── CHANGES
├── Config.in
├── Config.in.legacy
├── configs: #放置开发板的一些配置参数.
├── COPYING
├── DEVELOPERS
├── dl: #存放下载的源代码及应用软件的压缩包.
├── docs: #存放相关的参考文档.
├── fs: #放各种文件系统的源代码.
├── linux: #存放着Linux kernel的自动构建脚本.
├── Makefile
├── Makefile.legacy
├── output: #是编译出来的输出文件夹.
│   ├── build: #存放解压后的各种软件包编译完成后的现场.
│   ├── host: #存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
│   ├── images: #存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│   ├── staging
│   └── target: #用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package:#下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk。
├── README
├── support
├── system
├── toolchain
└── utils               # 实用工具

使用make config进入配置界面。

选中Target options以选择licheepi对应的架构

​ licheepi用的v3s cpu 参数如下

CPU
ARM Cortex A7 @ 1.2GHz
Support NEON Advanced SIMD instruction
VFPv4 Floating Point Unit

Toolchain 配置交叉工具链

​ 配置成外部工具链

Toolchain type (External toolchain)  --->
x   ( ) Buildroot toolchain
x   (X) External toolchain

在u-boot时已经配置好外部工具,地址在

/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/

选中() Toolchain path (NEW),填入path

Toolchain prefix前缀是: arm-linux-gnueabihf

External toolchain gcc version:我们使用的是6.3版本,选中6.x

External toolchain kernel headers series:是在
arm-linux-gnueabihf/libc/usr/include/linux/version.h
里读取内核版本信息。本机的版本是4.6(263680=0x040600, 即4.6.0)

cat /opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/linux/version.h
#define LINUX_VERSION_CODE 263680

External toolchain C library还是选择传统的glibc。需要小体积可以选uclibc(需要自行编译安装)。然后勾选上 [] Toolchain has C++ support?

最终配置

System configuration 配置系统参数

  • System hostname:根据需要定义一个字符串,是控制台前面的提示符xxx@vsi,这里改为 (licheepi) System hostname
  • Init system:这里选择busybox,轻量级使用非常广泛。可选的有systemV,systemd.
  • Root password配置登录密码。

Target package

用于配置一些软件包,例如QT5

Target packages  --->
x  Graphic libraries and applications (graphic/text)  --->
xx   [*] Qt5  --->

配置完成退出保存,安装环境

sudo apt-get install g++ patch cpio python unzip rsync bc

编译

make

如果报错,make clean all一下重新编译,这里一定要注意gcc的路径,不然会过不去

编译完成后会在output/images下生成rootfs.tar

解压到第二分区后就能使用了

我喜欢直接拖动文件,启动超级文件权限

sudo nautilus

将子文件全部拖出来,不然还是会进不去系统

默认失能串口登录,需要修改 /etc/inittab :

#console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GE

如果需要免密码登录,直接

#console::respawn:/sbin/getty -L  console 0 vt100 # GENERIC_SERIAL
ttyS0::respawn:/bin/sh

插卡,完成

全志V3S零基础教程相关推荐

  1. B站百万播放量Java零基础教程视频(适合Java 0基础,Java初学入门),史上最细Java零基础教学视频

    是否还在为学习Java如何入门而烦恼? 是否还在为Java软件如何安装而烦恼? 是否还在找寻着适合零基础的Java视频教程? 动力节点教学总监老杜159集课堂实录Java零基础视频教程,从初学者角度出 ...

  2. 保姆级的HTML零基础教程少见吧?这是第一节(1)

    作者简介 作者名:1_bit 简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者.15-16年曾在网上直播,带领一批程序小白走上程序员之路.欢迎各位小白加我咨询我相关信息,迷茫的你会找到 ...

  3. 麒麟子Javascript游戏编程零基础教程大纲

    大家好,我是麒麟子, 开源项目<幼麟棋牌-四川麻将>(泄漏版叫 <达达麻将>)作者,成都幼麟科技创始人. 开源项目地址(Github与Gitee同步更新): Github ht ...

  4. 微信小游戏开发零基础教程(一)-CocosCreator

    微信小游戏零基础教程(一)-CocosCreator 最终效果预览 准备工作 创建工程 测试第一个场景 最终效果预览 本教程最后制作的游戏效果: 准备工作 下载 微信开发者工具 最新版->下载地 ...

  5. Make 命令零基础教程

    Make这个词,英语的意思是"制作".Make命令直接用了这个意思,就是要做出某个文件.比如,要做出文件a.txt,就可以执行下面的命令. $ make a.txt 但是,如果你真 ...

  6. Openlayers 6 零基础教程

    Openlayers 6 零基础教程 掌握 OpenLayers(JavaScript Web 制图库)并构建 Web 制图应用程序 课程英文名:Openlayers 6 From Scratch W ...

  7. ROS机器人入门课程《ROS理论与实践》零基础教程(推荐课程)

    ROS的入门,对于纯小白的我来说很是痛苦,尤其是听完古月老师的21讲之后,更是浇灭了学习的兴趣,当时还在考虑要不要他的买课,还是算了,反正也听不懂,,,!!! 在一番挣扎之后,发现了赵虚左老师的课程, ...

  8. OpenMV零基础教程

    一.资料导航 "工欲善其事,必先利其器".在正式学习OpenMV之前,你必须知道一条或几条OpenMV的学习途径.这里推荐星瞳科技的中文官网教程,这个教程里面包括了OpenMV I ...

  9. 《网络安全》零基础教程-适合小白科普

    <网络安全>零基础教程 目录 目录 <网络安全>零基础教程 第1章 网络安全基础 什么是网络安全 常见的网络安全威胁 网络安全的三个基本要素 网络安全的保障措施 第2章 网络攻 ...

最新文章

  1. C++实现Hash表
  2. 怎么查看自己电脑的配置_怎么查看自己网卡是千兆网卡还是百兆网卡
  3. DBA巡检常用的SQL语句
  4. 不要将时间浪费到编写完美代码上
  5. 利用浏览器调试功能 计算 百度网盘 文件数量
  6. ubuntun安装ssh,并远程链接服务器操作
  7. Python SimpleITK实现医学图像增强算法
  8. python 贴吧自动发帖_python接口自动化3-自动发帖(session)
  9. 阻止路由跳转得方式_vue中路由跳转的三种方式 简洁易懂
  10. python钓鱼评论爬取
  11. CSDN账号注销问题
  12. duilib开发(七):复杂控件介绍
  13. 正圆锥体空间方程_计算机基础算法(一)——时间与空间复杂度
  14. WPF开发之解决程序调用自定义dll库在部分win7电脑上无法运行的情况
  15. 《疯狂Java讲义》第3章——数据类型和运算符
  16. 动态页面抓取超级指南_减少页面重量的完整指南
  17. 生物信息学习--nr/nt 数据库(总+子)构建
  18. BUAACTF 2021校赛
  19. 2018最新各大网站软件提交入口 |软件发布
  20. 城市燃气价格体系及计量、计费

热门文章

  1. Java后台下载Excel模板并输出到浏览器上的样例
  2. Unity3D ——强大的跨平台3D游戏开发工具教程
  3. MonoRail MVC应用(1)-VM/HTML页面
  4. Percona(MySQL)安装
  5. 判断两个IP地址(ipv4)是否在同一个网段
  6. 2008 R2 Remote Desktop Server driver RDPDR.sys cannot be started, error 577
  7. Javascript的undefined和notdefined的区别
  8. 华师大 OJ 2850
  9. MySQLdb 使用简介
  10. Python 魔方方法