前言
最近过年放假回家 , 想大过年的无所事事突发奇想自己搞一套智能家居玩玩 , 想来想去决定以linux 作为中枢上Home Assistant 但是开发板留在了宿舍没带回来, 手上只有一块bearpi-micro . 但是看了看官方教程 只提供了编译好的固件 ,最底层也是基于HMOS的固件 ,然鹅er 鸿蒙os 又是一块难啃的骨头,所以决定bearpi-micro 移植上 linux内核 作为中枢网关了 ,
天不随人愿, 网上关于bearpi-micro的资料简直少得可怜(难道是我搜索方式不对?) 所以决定参考 韦东山老师的 100ask_stm32mp157pro开发板的教程来 尝试自己移植到bearpi-micro上(一步一个坑) 源代码后续会上传到gitee上 (移植好的) ,本教程也是记录一下操作方法,汇总一下,同时供大家参考学习一下.
日期 | 版本 | 备注 | 作者 |
---|---|---|---|
2024年2月14日 | 1.0.0 | 起稿 | 蓝羽玄机 |
1. 物料准备
硬件
- 16G以上的SD卡 (作为启动盘用 要求皮实耐用的)
- bearpi-micro 开发板
- TF读卡器
- Type-C口 USB数据线
软件
-
百问网100ask_stm32mp157 开发包 网址: https://pan.baidu.com/s/1Gnh9G8a05LSgHYlohyl93Q?pwd=root 以下统称开发包
-
VMware Workstation Pro 按照开发包教程来安装
-
Visual Studio Code
2. 环境搭建
参考 嵌入式Linux应用开发完全手册V5.1_STM32MP157_Pro开发板.pdf 第二篇 第一章 安装VMware 并导入ubuntu18.04 的系统镜像 , 写的很详细 这里不过多赘述了.
因为我的电脑 总是VMware 开GUI会卡死 但是后台确实还在执行 所以我直接将VMware 再后台运行 使用WindTerm 通过 ssh 执行终端命
因为开发包教程中 通过 repo 对100ASK_STM32MP157_Pro开发板的 BSP 进行统一管理,以防后续如果改版 再使用本教程可能会出现错误 所以我先git一份 上传到gitee上 在想自己挑战移植的同志们也可以 **嵌入式Linux应用开发完全手册V5.1_STM32MP157_Pro开发板.pdf 第二章 第六篇 ** 来拉取开发包提供的工程
交叉编译工具链
交叉编译的概念一般用于嵌入式系统开发。
使用交叉编译的主要原因,是嵌入式系统中配置较低,资源过少,远不及PC的编译效率。
以笔者为例,笔者的毕业设计是把在ARM上运行一个搭建一个小型监控系统,所以就需要在ARM上配置OpenCV。一方面,笔者的ARM是Cortex-A9的四核1.0GHz的芯片(且已经算比较高的配置),但编译速度依旧远远不如笔者的PC机(i7处理器,8核3.6GHz)。如果在ARM上编译OpenCV,编译过程中生成的中间文件可能大于ARM存储容量不说,且编译速度也远不如本地编译。另一方面,PC机的CPU架构是x86型的,ARM的CPU架构是ARM型的,所以这时候就需要用交叉编译器(此处即为ARM的编译器)编译程序代码,然后移植到ARM平台运行。所以这就是交叉编译的意义所在。
一般所说的工具链,指的是本地平台自己的工具链。而用于交叉编译的工具链,就是交叉工具链。交叉工具链中,gcc编译器、ld链接器以及其他的相关工具,都是用来跨平台交叉编译的。
交叉工具链与本地工具链类似,也有交叉编译版本的gcc, ld, as等工具,与本地工具链两两对应。交叉工具链中最重要的工具还是编译器gcc,所以我们也经常把交叉工具链简称为交叉编译器,即严格意义上来讲,交叉编译器指的是交叉编译版本的gcc,但为了叫法上的方便,我们平常说的交叉编译,其实指的都是交叉工具链。
- 修改~/.bashrc 是环境变量每次自动设置
sudo nano ~/.bashrc
在尾部添加以下代码
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
PATH环境变量上的路径 要与你的ubuntu中项目toolchain下 交叉编译工具链的位置相匹配
完成后使用以下命令使其生效
sudo source ~/.bashrc
使用以下命令验证交叉编译工具链是否生效
arm-buildroot-linux-gnueabihf-gcc -v
结果如下图所示
3. SD卡准备
拿出准备好的SD卡 使用TF读卡器 连接电脑
如果此时开启虚拟机 先让SD卡 连接Windows
然后打开计算机硬盘管理 清空SD卡的所有卷
然后再虚拟机中将SD卡 连接至虚拟机
此时输入以下命令 查看SD卡 名称
sudo ls /dev/sdb*
使用 sgdisk查看分区信息
sudo sgdisk -p /dev/sdb
可以看到 此时SD卡中无分区 此时 使用以下命令 给SD卡分区
sudo sgdisk --resize-table=128 -a 1 \
-n 1:34:545 -c 1:fsbl1 \
-n 2:546:1057 -c 2:fsbl2 \
-n 3:1058:5153 -c 3:ssbl \
-n 4:5154:136225 -c 4:bootfs \
-n 5:136226: -c 5:rootfs \
-A 4:set:2 \
-p /dev/sdb -g
具体含义可参考以下列表理解
参数 | 含义 |
---|---|
-A | 查看或设置分区属性 |
-a | 设置对齐值 |
–resize-table | 设置分区数限制 |
-p | 显示分区表 |
-g | mbr转换gpt |
-c | 分区名称 x:y 分区编号:分区名称 |
-n | 分区区域 x:y:z 创建一个编号 x 的新分区,从 y扇区 开始,到 z扇区 结束 |
运行成功后 可以看到 返回结果为5个分区
到此时, SD卡算是设置好了. 接下来就是记住烧录的命令 X 为分区编号 例如 烧录fsbl1 就是 =/dev/sdb1
sudo dd if=文件地址 of=/dev/sdbX conv=fdatasync
如果使用其他方式格式化了SD卡 或 其中有一个或多个分区
如图所示 我使用了SDCard Formatter 工具格式化了SD卡 (自己摸索的操作 有更好的方法的话请赐教) 那么可以先将分区清除 再创建分区
操作如下 先输入以下命令 创建分区表
sudo sgdisk -og /dev/sdb
然后暴力一点 直接清除所有分区
sudo sgdisk -z /dev/sdb
当然你也可以温柔一点 一个分区一个分区的删除
sudo sgdisk -d 分区编号 /dev/sdb
再通过查看分区命令 可以发现 一样的清楚了所有分区
sudo sgdisk -p /dev/sdb
接下来的操作 跳转到这一步
sudo sgdisk --resize-table=128 -a 1 \
-n 1:2048:2559 -c 1:fsbl1 \
-n 2:2560:3071 -c 2:fsbl2 \
-n 3:3072:7167 -c 3:ssbl \
-n 4:7168:138239 -c 4:bootfs \
-n 5:138240: -c 5:rootfs \
-A 4:set:2 \
-p /dev/sdb -g
注意事项
因为linux 特殊机制,将SD卡插入但还未挂载好的时候就写入文件的话 可能会显示已经写入成功 但实际并未写入的这种现象
正常的挂在应该如上述所示
正常情况下,我们将SD卡通过虚拟机接入Ubuntu系统并用ls命令查看/dev下的设备,需要指明的是,sda为虚拟硬盘,为虚拟机安装系统时所默认创建的;sdb为我从外部通过虚拟机接入Ubuntu的SD卡设备。从图中我可以看到,它们的文件类型均为’b’,这个’b’代表了块设备,而linux中块设备包括但不限于:硬盘/软盘/CD-ROM驱动器/闪存等一系列的存储设备,故SD卡自然而然的也属于块设备的一种。故当SD卡接入Ubuntu后,此处显示为‘b’说明SD卡被正常挂载,且其下有一个分区叫做sdb1。
作者:21Galaxy
链接:https://juejin.cn/post/7186603236411834429
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
不正常的挂载情况 ,通过ls命令查看/dev下的设备,可以看到/dev下多出了一个名为/dev/sdb的设备,且其文件类型为‘-’,代表其为普通文件,且Ubuntu已经很醒目地将其去掉了高亮颜色。说明此文件并非一个块文件。
那么为什么会产生这样一个奇怪的/dev/sdb的文件呢?原因在于先前在SD卡没有接入Ubuntu的时,就执行了dd指令,从而生成了假的设备盘符遗留在系统中。
解决办法时把U盘先拔出 ,此时执行ls命令 还是会看到有刚才的/dev/sdb的设备 这个就是缓存文件
此时执行下述命令 来删除两个缓存文件 X根据你的缓存文件名称来删除
sudo rm /dev/sdbX
再次插入U盘会发现 所有卷设备都已经显示高亮 同时前面带有b字母 证明几个设备 证明设备没问题 此时写入文件便可以成功写到SD卡
4. 总结
至此,环境搭建便已经完成了.
此篇记录 涉及到linux 的基础操作 包括dd/sgdisk 等磁盘管理工具 与 cd ls 等基础命令. 同时学习关于 VMware 相关的虚拟机操作 与ssh连接工具 .
后续笔记正在赶来的路上…
如果觉得我的操作或者步骤有问题 欢迎批评指正共同进步 .
同样如果觉得写的不错 欢迎进行打赏.一分也是爱. 也可以加我微信交流.