目录
1 库依赖
交叉编译工具
#先更新,否则安装库可能会出错
sudo apt-get update
#//安装依赖库
sudo apt-get install lsb-core lib32stdc++6
TF-A
- 设备树依赖
sudo apt-get install device-tree-compiler
U-Boot
- 编译u-boot时的依赖,否则会编译出错。
sudo apt-get install libncurses5-dev bison flex
- U-Boot 图形化配置依赖:需要 ncurses 库。curses 库提供了一系列的 API 函数供调用者生成基于文本的图形界面。
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
kernel
1.编译内核需要lzop库
sudo apt-get update
sudo apt-get install lzop
sudo apt-get install libssl-dev
- mkimage工具
STM32MP1 编译出来的 Linux 内核镜像文件为 uImage,这是 uboot 所使用的内核镜像格式,通过在 zImage 镜像的前面添加 0X40 个字节的头部来得到 uImage,这个需要 mkimage 工具来完成此工作。
sudo apt-get install u-boot-tools
2 开发环境依赖
gcc、g++、make
gcc、g++、make 等工具,这里我们直接安装 build-essential 软件包即可。
sudo apt-get install build-essential
TFTP文件传输
Ubuntu 主机作为 TFTP 服务器,需要设置正确的tftp服务器及其目录,可以运用网络下载文件到DRAM。
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
mkdir /home/zuozhongkai/linux/tftpboot
chmod 777 /home/zuozhongkai/linux/tftpboot
#配置 tftp,新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在
#里面输入如下内容:
######################################################
#server tftp
#{
# socket_type = dgram
# protocol = udp
# wait = yes
# user = root
# server = /usr/sbin/in.tftpd
# server_args = -s /home/XX/linux/tftpboot/
# disable = no
# per_source = 11
# cps = 100 2
# flags = IPv4
#}
#启动 tftp 服务
sudo service tftpd-hpa start
#打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:
#######################################################
## /etc/default/tftpd-hpa
#TFTP_USERNAME="tftp"
#TFTP_DIRECTORY="/home/liangwencong/linux/tftpboot"
#TFTP_ADDRESS=":69"
#TFTP_OPTIONS="-l -c -s"
#重启 tftp服务器,至此tftp服务器搭建好了
sudo service tftpd-hpa restart
FTP文件传输
Windows 和 Ubuntu 下的文件互传我们需要使用 FTP 服务,设置方法如下:
sudo apt-get install vsftpd
sudo vi /etc/vsftpd.conf
#使能下面两个变量
#local_enable=YES
#write_enable=YES
#重启 FTP 服务
sudo /etc/init.d/vsftpd restart
NFS远程挂载
设置正确的nfs服务器及其目录。
#安装 NFS 服务
sudo apt-get install nfs-kernel-server rpcbind
#打开 nfs 配置文件/etc/exports,后面添加如下所示内容:
#/home/zuozhongkai/linux/nfs *(rw,sync,no_root_squash)
#重启 NFS 服务
sudo /etc/init.d/nfs-kernel-server restart
SSH远程终端
开启 Ubuntu 的 SSH 服务,使用终端软件登陆到 Ubuntu。
sudo apt-get install openssh-server
交叉编译器
安装交叉编译工具链(编译器),包括许多编译工具,包括ld,gcc,gcc,dtc等,存在工具的bin文件下。
-
交叉编译器复制到/usr/local/arm 这个目录中,并解压。
-
修改环境变量,打开/etc/profile 文件,在最后面输入如下所示内容:
export PATH=$PATH:/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin
- 重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了
3 工具依赖
stm32wrapper4dbg
编译 TF-A 或者 Uboot 的时候需要用到 stm32wrapper4dbg 这个工具,否则编译会报错。
STM32CubeMX
STM32CubeMX是图形化配置工具,可以直观的选择MCU/MPU型号,可以动态地配置引脚、配置时钟树、配置中间件、配置内存,可以生成初始化代码、MPU设备树源码,可以进行DDR测试等。STM32CubeMX的好处是具有直观的图形配置界面,而且它把很多东西封装的比较好,例如硬件抽象层、中间层、外围器件和示例代码以及Arm Cortex-A内核部分Linux设备树等。
STM32CubeIDE
它集成 了TrueSTUDIO
和 STM32CubeMX
插件,并基于 GDB 进行调试,它允许集成数百个现有插件,这些插件完成 Eclipse 的功能。
TrueSTUDIO
插件是一款建立在 Eclipse CDT、GCC 和 GDB 的 C/C++集成开发工具,其具有项目创建和管理、代码编辑、代码编译以及代码调试等功能。
STM32CubeIDE 完全开源,并且跨平台,目前支持 Windows、Linux 和 macOS 多个操作系统(64 位版本) 。
tm32image
第二进制启动文件需要在前面加上二进制头文件,在最后由.bin文件生成.stm32文件需要用到。
winhex
打开添加了头文件的烧写固件,对固件以十六进制的形式打开。
STM32CubeProgrammer
为用户提供 STM32 微控制器代码烧写和固件安全安装、更新功能,帮助用户更快地开发特定外部存储器的加载程序。
STM32CubeProgrammer 支持对外部存储器进行编程、擦除和验证,用户烧写 STM32微控制器既可使用片上 SWD (单线调试)或 JTAG 调试端口,也可以用程序引导装入端口(例如UART 和 USB)。它支持 Motorola S19、Intel HEX、ELF 和 二进制格式(BIN 文件) ,支持 ST-LINK 固件更新,支持图形化界面操作也支持命令行操作,在命令行界面,可通过脚本实现自动化编程。
STM32CubeProgrammer 支持 Windows、Linux 和 macOS 多个操作系统(64 位版本) 。
4 工程文件类型
烧写文件
.tsv
烧写时候的布局文件。
tf-a
.stm32
烧写固件文件,添加好头部信息的bin文件,直接烧写。
.map
内存映射文件。
.ld
连接信息。
.patch
补丁文件。
.bin
开发板对应的TF-A二进制执行文件。
.elf
生成bin文件所需要的文件。
u-boot
.lds
链接脚本文件。
.cfg
:u-boot的另一种配置文件。
.dtb
:设备数文件编译后的文件。
.srec
:S-Record 格式的镜像文件。
.sym
:uboot 符号文件。
.stm32
:最终需要的烧写文件。
.map
:映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
.cmd
:存储文件名相关的命令的文件,描述相关文件是如何产生的。
.S
:汇编语言文件,ARM架构,向量表是一个特殊的数据结构,其中包含处理器异常和中断处理程序的地址。
bootfs
.dtb
:设备树文件。
.ext4
:内核烧写ext4格式的文件系统,将Uimage
和.dtb
一起打包而成,ext4类型的文件系统。
- 文件系统有很多种,如: ext4、initramfs、ramfs 等。
device tree
.dts
设备树文件,也可以被别的设备树引用。
.dtsi
设备树头文件。
.dtb
设备树文件编译后文件,开发板需要烧写的文件。DTC 是编译设备树的编译工具。
5 工程目录讲解
/home/XX/linux/tf-a/tf-a-stm32mp-2.2.r1-r0
├── 0001-st-update-v2.2-r2.0.0.patch #补丁文件
├── Makefile.sdk #编译属性设置文件
├── README.HOW_TO.txt
├── series #补丁源文件
└── tf-a-stm32mp-2.2.r1 #tf-a源文件
├── bl1 #Tf-a四个启动阶段文件 bl1一般为内部ROM ----|
├── bl2 # ...可信启动固件 -----------------------|
├── bl2u #... | ---> 宏观的tf-a,bl2是传统意义上的tf-a
├── bl31 #...EL3 运行时固件(RuntimeFirware) |
├── bl32 #...安全操作系统(OP-TEE) ---------------|
├── common
├── CONTRIBUTING.md
├── dco.txt
├── docs
├── drivers #设备
├── fdts #文件树文件
├── include
├── lib
├── license.rst
├── Makefile #编译主文件
├── make_helpers
├── plat
├── readme.rst
├── services
└── tools
└── build #编译生成烧写文件
├── optee #针对OP-TEE
├── serialboot #串行启动 ----> tf-a-stm32mp157d-atk-serialboot.stm32
└── trusted #保存MP1型号的TF-A固件镜像 ----> tf-a-stm32mp157d-atk-trusted.stm32
/home/XX/linux/u-boot/alientek-u-boot
想要分析源码,先进性编译,编译生成的文件是分析源码不可缺少的文件。
├── api #与硬件无关的 API 函数 自带
├── arch # *** 重要*** 与硬件架构体系有关的代码 自带 **** <------- ./arm/dts/dts 设备树
├── board # ***重要*** 不同板子(开发板)的定制代码 自带 **** <------ ./st st的板子都在这个下面
├── build.sh
├── cmd # 命令相关代码 自带
├── common # 通用代码 自带
├── config.mk # 图形配置界面描述文件 自带
├── configs # *** 重要 *** 配置文件 自带 *** <--------
├── CONTRIBUTING.md
├── disk # 磁盘分区相关代码 自带
├── doc # 文档 自带
├── drivers # 驱动代码 自带
├── dts # 设备树 自带
├── env
├── examples # 示例代码 自带
├── fs # 文件系统 自带
├── include # 头文件
├── Kbuild # 用于生成一些和汇编有关的文件
├── Kconfig # 图形配置界面描述文件,是一个脚本文件。
├── lib # 库文件
├── Licenses # 许可证相关文件
├── MAINTAINERS # 维护者联系方式文件
├── Makefile # ***重要*** 主Makefile文件 *** <-------------
├── net # 网络相关代码
├── post # 上电自检程序
├── README # 帮助文档 自带
├── scripts # 脚本文件
├── System.map # 系统映射文件 编译生成
├── test # 测试代码 自带
├── tools # 工具文件夹 自带
├── u-boot # 编译出来的 u-boot 文件 编译生成
├── u-boot.bin
├── u-boot.cfg
├── u-boot.cfg.configs
├── u-boot.dtb
├── u-boot-dtb.bin
├── u-boot.lds
├── u-boot.map # 此文件看到某个 文件 或者 函数 链接到了哪个 地址
├── u-boot-nodtb.bin
├── u-boot.srec
├── u-boot.stm32
├── u-boot.stm32.log
├── u-boot.sym
├──.config # *** 重要 *** 配置文件; 使用命令“make xxx_defconfig”配置 uboot编译生成的 *** <----
├──.gitignore # git工具相关列表
└──.u-boot.xx.cmd # ***重要*** 一系列的文件,用于保存着一些命令 编译生成 *** <----
ld.bfd 将各个built-in.o 文件链接在一起 -> u-boot(ELF) -> u-boot-nodtb.bin -> u-boot-dtb.bin -> u-boot.stm32
/home/XX/linux/kernel/alientek-kernel
├── arch # 架构相关目录 <--------
├── block # 块设备相关目录 <---------
├── build.sh
├── certs
├── CONTRIBUTING.md
├── COPYING
├── CREDITS
├── crypto # 加密相关目录 crc crc32 md4 md5 hash等加密算法 <---------
├── Documentation
├── drivers #驱动 <----------
├── fs #文件系统 <---------
├── include #头文件 <--------
├── init #初始化 <---------
├── ipc #进程之间相关通信 <----------
├── Kbuild #主makefile读取相关信息,进行子makefile的读取 ***
├── Kconfig #图像化配置界面 ***
├── kernel # 内核 <-------------
├── lib #库相关文件 <---------
├── LICENSES
├── MAINTAINERS
├── Makefile # <------------
├── mm # 内存 <------------
├── modules.builtin.modinfo
├── Module.symvers
├── net #网络 <----------
├── README
├── samples
├── scripts #脚本
├── security #安全目录 <-----------
├── sound #音频目录 <--------------
├── stm32mp157d_atk.sh #编译脚本
├── System.map
├── tools #工具相关
├── usr #用于生成initramfs
├── virt #虚拟化
├── vmlinux
└── vmlinux.o