概述
文章目录
- 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选中后的状态
这里面有几个常见的配置选项我们可以看下:
- 第一个Architecture select架构选择,不用质疑这个是ARM架构
- 第二个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零基础教程U-boot编译Kernel编译licheepi buildroot根文件系统编译的全部内容,希望文章能够帮你解决全志V3S零基础教程U-boot编译Kernel编译licheepi buildroot根文件系统编译所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复