-
Notifications
You must be signed in to change notification settings - Fork 0
/
stm32mp157.md
281 lines (214 loc) · 6.88 KB
/
stm32mp157.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
# STM32MP157PRO 环境部署
## 接线规则
- 网口 net1:使用以太网转换器连接到电脑上,用于和电脑和虚拟机通信;
- 网口 net2:使用网线直接连接到路由器上;
- Type-C 口 OTG:用于向开发板烧写程序(对应通用串行总线设备中的 DFU);
- Type-C 口 Serial:用于串口连接开发板,使用 115200 波特率。
## 网络配置
串口登录开发板:使用 root 用户,没有密码。
```bash
cat <<EOF | sudo tee /etc/systemd/network/50-static.network
[Match]
Name=eth0
[Network]
Address=192.168.5.9/24
Gateway=192.168.5.1
EOF
sudo systemctl enable systemd-networkd
```
```{note}
开发板上网:接上网线后执行 `udhcpc -i eth1`。
```
配置虚拟机桥接网卡(用于和开发板互相通信)
```bash
虚拟机 - 设置 - 添加 - 网络适配器 - 桥接模式 - 复制物理网络连接状态
编辑 - 虚拟网络编辑器 - 添加网络 - VMnet0 - 桥接模式选择 AXIC 网络适配器
```
```bash
cat <<EOF | sudo tee /etc/netplan/99_config.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33: # NAT 网卡
addresses:
- 192.168.183.128/24
routes:
- to: default
via: 192.168.183.2
nameservers:
search: [localdomain, localhost]
addresses: [114.114.114.114, 8.8.8.8]
ens37: # 桥接网卡
addresses:
- 192.168.5.11/24
routes:
- to: 192.168.0.0/24
via: 192.168.5.1
EOF
sudo netplan apply
```
配置电脑端 AXIC 网络适配器的 IPv4 和网关(用于和开发板和虚拟机通信)
```bash
更改 AXIC 网络适配器属性
IPv4 : 192.168.5.10
Netmask : 255.255.255.0
Gateway : 192.168.5.1
关闭 Windows 公用网络防火墙
```
## 源代码下载
上层应用源代码
```bash
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
```
下载 BSP
```bash
git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_stm32mp157_pro-sdk && cd 100ask_stm32mp157_pro-sdk
../repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m stm32mp1/100ask_stm32mp157_pro_release-v2.0.xml --no-repo-verify
../repo/repo sync -j4
```
## 配置交叉编译环境
```bash
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
```
## 设置开发板启动方式
| 拨码开关 | 1 | 2 | 3 |
| ---- | ---- | ---- | ---- |
| EMMC(默认) | OFF | **ON** | OFF |
| SD | **ON** | OFF | **ON** |
| USB | OFF | OFF | OFF |
| M4(调试) | OFF | OFF | **ON** |
## 挂载 NFS 目录
在开发板上执行
```bash
mount -t nfs -o nolock,vers=3 192.168.5.11:~/nfs_rootfs /mnt
```
挂载完成后,在开发板 `/mnt` 目录,可以直接访问虚拟机上 `nfs_rootfs` 文件。
## 编译和安装内核
编译 Linux 内核
```bash
cd 100ask_stm32mp157_pro-sdk/Linux-5.4/
make 100ask_stm32mp157_pro_defconfig
make uImage LOADADDR=0xC2000040
make dtbs
cp arch/arm/boot/uImage ~/nfs_rootfs/
```
编译和安装内核模块
```bash
cd 100ask_stm32mp157_pro-sdk/Linux-5.4/
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules -j8
make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs INSTALL_MOD_STRIP=1 modules_install
```
将内核模块安装到开发板
```bash
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
mount /dev/mmcblk2p2 /boot
cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot
```
## 编译和安装驱动
```bash
cd 01_all_series_quickstart/05_嵌入式 Linux 驱动开发基础知识/source/01_hello_drv/
make
cp led_drv.ko ledtest ~/nfs_rootfs/
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cp /mnt/led_drv.ko ./
cp /mnt/ledtest ./
insmod led_drv.ko
lsmod
echo none > /sys/class/leds/heartbeat/trigger # 关掉 led0 的默认呼吸效果
chmod +x ./ledtest
./ledtest /dev/myled on # 打开 led0 灯
```
## 烧写系统
烧写工具:STM32CubeProgrammer(不能有中文路径)
更新整个系统的烧写方式:
- 关闭电源,设置 USB 启动方式,打开电源;
- 连接 OTG 线;
- 在 STM32CubeProgrammer 中选择 `USB` > `connect` > 刷新 Port 选择 `USB1`;
- 选择分区配置文件:`Buildroot_Emmc_Systemall.tsv`;
- 开始烧写;
- 烧写成功,关闭电源,设置 EMMC 启动方式,打开电源。
单独更新 Trust Boot 的烧写方式:
- 关闭电源,设置 USB 启动方式,打开电源;
- 连接 OTG 线;
- 在 STM32CubeProgrammer 中选择 `USB` > `connect` > 刷新 Port 选择 `USB1`;
- 选择分区配置文件:`Buildroot_Emmc_TrustUbootBootloader.tsv`;
- 开始烧写;
- 烧写成功,关闭电源,设置 EMMC 启动方式,打开电源。
## 编译生成 SDK 和工具链
一个完整的嵌入式操作系统应该包含以下几部分:
- 内核(Kernel)
- Bootloader
- 文件系统(fs)
- TFA(受信任固件)
- 交叉编译工具链
所有这些环境都可以通过 Buildroot 来完成构建:
1、准备环境
```bash
sudo apt install -y build-essential make
```
2、下载并解压源代码:
```bash
cd sdk/buildroot/
wget https://buildroot.org/downloads/buildroot-2023.02.9.tar.gz
tar xf buildroot-2023.02.9.tar.gz
```
3、生成编译所需的配置文件:
```bash
# cd /home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x
# make 100ask_stm32mp157_pro_ddr512m_systemD_qt5_defconfig
cd buildroot-2023.02.9 && make stm32mp157c_dk2_defconfig
```
4、编译和生成 kernel、u-boot、fs 等:
```bash
make all -j4
```
````{admonition} tree output/images/
```
output/images/
├── rootfs.ext2 # 文件系统分区镜像
├── rootfs.ext4 -> rootfs.ext2
├── sdcard.img
├── stm32mp157c-dk2.dtb # 设备树文件
├── tf-a-stm32mp157c-dk2.stm32 # 完整的系统镜像
├── u-boot.stm32 # u-boot 镜像文件
└── zImage # 内核镜像文件
```
````
## 编译 TFA(可选)
仅适用于 STM32MP157PRO 开发板
编译 TFA
```bash
cd /home/book/100ask_stm32mp157_pro-sdk/Tfa-v2.2
make -f $PWD/./Makefile.sdk all
cp tf-a-stm32mp157c-100ask-512d-v1.stm32 ~/nfs_rootfs/
```
更新 TFA
```bash
echo 0 > /sys/class/block/mmcblk2boot0/force_ro
echo 0 > /sys/class/block/mmcblk2boot1/force_ro
dd if=tf-a-stm32mp157c-100ask-512d-v1.stm32 of=/dev/mmcblk2/boot0 conv=fsync > /dev/null 2>&1
dd if=tf-a-stm32mp157c-100ask-512d-v1.stm32 of=/dev/mmcblk2/boot1 conv=fsync > /dev/null 2>&1
echo 1 > /sys/class/block/mmcblk2boot0/force_ro
echo 1 > /sys/class/block/mmcblk2boot1/force_ro
```
## 编译 Bootloader(可选)
编译 Bootloader
```bash
cd /home/book/100ask_stm32mp157_pro-sdk/Uboot-2020.02
make stm32mp15_trusted_defconfig
make DEVICE_TREE=stm32mp157c-100ask-512d-v1 all -j4
cp u-boot.stm32 ~/nfs_rootfs/
```
更新 u-boot 镜像
```bash
dd if=u-boot.stm32 of=/dev/mmcblk2p1 conv=fsync > /dev/null 2>&1
sync
```