当前位置: 首页 > article >正文

嵌入式开发实战:为Android设备交叉编译mmc-utils工具集

1. 为什么需要交叉编译mmc-utils在嵌入式开发中我们经常需要与eMMC存储设备打交道。mmc-utils就是这样一套专门用于管理eMMC存储设备的实用工具集它提供了读取extcsd、修改分区配置、设置写保护等强大功能。但问题来了——Android设备通常没有预装这些工具而直接在设备上编译又几乎不可能这就是交叉编译技术大显身手的时候了。交叉编译简单说就是在PC上编译出能在ARM架构Android设备上运行的程序。我最近在调试一块基于Rockchip SoC的开发板时就遇到了这个问题需要修改eMMC的boot分区配置但设备上缺少必要的工具。通过交叉编译mmc-utils最终成功解决了这个问题。2. 搭建编译环境2.1 获取源码第一步当然是获取mmc-utils的源代码。官方仓库托管在GitHub上我们可以直接克隆git clone https://github.com/mhei/mmc-utils.git cd mmc-utils建议使用最新release版本而非master分支因为主分支可能包含未经验证的改动。我上次就踩过坑用了master分支导致编译出的工具在设备上运行崩溃。2.2 准备交叉编译工具链Android环境下有两种主要编译方式AOSP完整编译环境适合已经在做系统级开发的团队Android NDK独立工具链更适合单独编译某个工具对于大多数开发者我推荐使用NDK方式因为它更轻量。下载NDK后需要生成独立的工具链# 假设NDK安装在/opt/android-ndk /opt/android-ndk/build/tools/make-standalone-toolchain.sh \ --archarm \ --platformandroid-21 \ --install-dir/opt/ndk-standalone这里有几个关键参数需要注意--arch必须匹配目标设备的CPU架构arm/arm64/x86等--platformAndroid API级别建议不低于设备系统版本--install-dir工具链安装路径3. 解决编译问题3.1 头文件缺失问题直接编译通常会遇到第一个错误找不到endian.h头文件。这是因为Android的C库与标准Linux有所不同。解决方法是在mmc_cmds.c文件开头添加#include endian.h如果仍然报错可以尝试使用Android提供的替代方案#include sys/endian.h3.2 结构体初始化问题第二个常见问题是结构体未完全初始化导致的编译错误。在mmc.c文件中需要补全commands数组的所有字段。原始代码可能像这样{ do_read_extcsd, -1, extcsd read, device\n Print extcsd data from device., NULL }需要修改为{ do_read_extcsd, -1, extcsd read, device\n Print extcsd data from device., NULL, NULL, 0 }这个修改确保了结构体的所有字段都被正确初始化。我在第一次编译时忽略了这个问题导致工具运行时出现段错误排查了很久才发现是这个原因。4. 编译与部署4.1 使用Android.mk编译如果你使用AOSP环境可以创建一个Android.mk文件LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE : mmc_utils LOCAL_SRC_FILES : mmc.c mmc_cmds.c LOCAL_CFLAGS : -Wall -Werror LOCAL_MODULE_TAGS : optional include $(BUILD_EXECUTABLE)然后在AOSP根目录下执行source build/envsetup.sh lunch 你的设备配置 mmma external/mmc-utils编译完成后可执行文件会生成在out/target/product/设备/system/bin目录下。4.2 使用NDK独立编译如果使用NDK工具链需要修改MakefileCC /opt/ndk-standalone/bin/arm-linux-androideabi-gcc CFLAGS -Wall -Werror -pie -fPIE LDFLAGS -pie -fPIE all: mmc_utils mmc_utils: mmc.o mmc_cmds.o $(CC) $(LDFLAGS) -o $ $^ clean: rm -f *.o mmc_utils编译命令很简单make4.3 部署到设备无论哪种方式编译出的二进制文件都需要推送到设备上adb push mmc_utils /data/local/tmp/ adb shell chmod x /data/local/tmp/mmc_utils如果需要永久安装可以推送到/system/bin需要root权限adb remount adb push mmc_utils /system/bin/ adb shell chmod 755 /system/bin/mmc_utils5. 实际使用案例5.1 读取eMMC信息最基本的用法是读取eMMC的extcsd信息mmc_utils extcsd read /dev/block/mmcblk0这个命令会输出eMMC的所有配置参数包括设备容量分区大小支持的命令集当前工作模式我在调试一个启动问题时就是通过这个命令发现boot分区大小配置不正确导致的。5.2 修改boot分区配置如果需要修改boot分区设置可以使用mmc_utils bootpart enable 1 1 /dev/block/mmcblk0这个命令启用第一个boot分区参数1设置需要ACK确认第二个参数1操作设备/dev/block/mmcblk0特别注意很多eMMC操作是一次性编程OTP的修改后无法恢复操作前务必确认参数正确。5.3 RPMB安全区域操作对于安全要求高的场景可能需要操作RPMB区域# 写入RPMB密钥 echo -n 32字节密钥内容 rpmb_key.bin mmc_utils rpmb write-key /dev/block/mmcblk0rpmb rpmb_key.bin # 读取RPMB计数器 mmc_utils rpmb read-counter /dev/block/mmcblk0rpmbRPMB操作需要特别注意权限问题普通应用通常无法直接访问这些设备节点。6. 常见问题排查6.1 权限问题在非root设备上可能会遇到权限不足的错误error: could not open device /dev/block/mmcblk0解决方法使用root权限运行修改设备节点权限需要root使用已经有权访问的组如system组6.2 版本兼容性问题不同eMMC版本支持的指令可能不同。如果遇到invalid command错误可以先检查extcsd中的eMMC版本mmc_utils extcsd read /dev/block/mmcblk0 | grep eMMC Version6.3 工具运行崩溃如果工具运行直接崩溃可能是编译时架构不匹配如用ARMv7工具链编译但设备是ARMv8缺少必要的库文件可以用NDK静态编译解决内核版本不兼容7. 进阶技巧7.1 静态编译为避免依赖问题可以静态链接所有库。在Makefile中添加LDFLAGS -static这样编译出的二进制文件会稍大但可以在任何同架构设备上运行。7.2 调试符号遇到问题时可以保留调试符号CFLAGS -g编译后用ndk-stack工具分析崩溃日志adb logcat | ndk-stack -sym ./obj/local/armeabi-v7a/7.3 自动化脚本对于需要频繁执行的操作可以编写shell脚本#!/system/bin/sh # 备份当前extcsd配置 mmc_utils extcsd read /dev/block/mmcblk0 /sdcard/extcsd_backup.txt # 修改boot配置 mmc_utils bootpart enable 1 1 /dev/block/mmcblk0 # 验证修改 mmc_utils extcsd read /dev/block/mmcblk0 | grep BOOT_CONFIG记得给脚本执行权限chmod x /sdcard/emmc_config.sh

相关文章:

嵌入式开发实战:为Android设备交叉编译mmc-utils工具集

1. 为什么需要交叉编译mmc-utils 在嵌入式开发中,我们经常需要与eMMC存储设备打交道。mmc-utils就是这样一套专门用于管理eMMC存储设备的实用工具集,它提供了读取extcsd、修改分区配置、设置写保护等强大功能。但问题来了——Android设备通常没有预装这些…...

OrCAD原理图打印终极指南:Instance和Occurrence模式选择对PDF标签的影响

OrCAD原理图打印终极指南:Instance和Occurrence模式选择对PDF标签的影响 在复杂电路设计中,原理图的清晰呈现与高效导航直接关系到团队协作效率与后期维护成本。作为Cadence OrCAD的核心功能之一,Instance与Occurrence模式的选择往往被工程师…...

Keyence VT5 HMI嵌入式串口通信库深度解析

1. KeyenceHMI_Lib 库深度解析:面向工业现场的嵌入式 HMI 串行通信实现1.1 工程定位与核心价值KeyenceHMI_Lib 是一个专为 Arduino 平台(基于 PlatformIO 构建环境)设计的轻量级 C 库,其唯一且明确的工程目标是:在资源…...

别再只盯着普通图了!用Python+NetworkX快速上手超图(Hypergraph)建模,搞定复杂关系分析

用PythonNetworkX解锁超图建模:从理论到复杂关系分析实战 第一次听说"超图"这个概念时,我正为一个电商推荐系统的项目头疼——传统的图结构无法准确表达用户同时浏览多个商品的行为模式。直到发现超图(Hypergraph)这种…...

3大挑战如何破解:智能工具重塑资源获取新范式

3大挑战如何破解:智能工具重塑资源获取新范式 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在信息爆炸的数字时代,智能资源获取已成为提升工作效率的关键技能。你是否曾因频繁查找百度网盘提取码而浪…...

Glyph视觉推理快速上手:从镜像拉取到网页推理全流程

Glyph视觉推理快速上手:从镜像拉取到网页推理全流程 1. 引言:为什么选择Glyph视觉推理 想象一下,你需要处理一本几百页的小说内容,传统的大模型需要消耗大量显存来存储这些文本的token信息。而Glyph视觉推理模型提供了一种全新的…...

一台电脑如何实现四人同屏游戏?Nucleus Co-Op 分屏神器深度解析

一台电脑如何实现四人同屏游戏?Nucleus Co-Op 分屏神器深度解析 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾经梦想过和朋友…...

何日得遂田圆乐,睡到人间饭熟时

何日得遂田圆乐,睡到人间饭熟时女儿三岁,去年玩我手机,摔破屏幕,于是,拼㙍(duo)㙍(duo)上网购唱戏机,内存SD卡,上有视频,这样代替手机,手机替代品…...

从微调到部署:如何通过对话模板对齐确保vLLM与LLaMA-Factory的推理效果一致

1. 为什么你的微调模型在vLLM上效果变差了? 最近帮几个团队排查大模型部署问题,发现一个高频痛点:在LLaMA-Factory微调好的模型,用vLLM部署后生成质量明显下降。比如有个做客服机器人的团队,微调时回答准确率能达到92%…...

如何突破微信网页版限制:wechat-need-web浏览器扩展终极指南

如何突破微信网页版限制:wechat-need-web浏览器扩展终极指南 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法使用微信网页版而烦…...

[特殊字符] YOLO26 实战教程:从 0 到 1 完成自定义数据集训练全流程 | 附性能对比 + YOLOv5 迁移指南

摘要:YOLO26 作为 Ultralytics 团队 2026 年推出的新一代 YOLO 旗舰模型,凭借原生端到端无 NMS 设计、CPU 推理效率最高提升 43%、小目标检测专项优化、训练收敛更快更稳等核心特性,成为边缘设备、低功耗场景实时目标检测的新标杆。本文以「石…...

3分钟掌握Markdown浏览器插件:让技术文档阅读变得简单高效

3分钟掌握Markdown浏览器插件:让技术文档阅读变得简单高效 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为浏览器中打开Markdown文件显示原始代码而烦恼吗&…...

如何快速解决网易云音乐NCM格式转换难题:专业工具完全解析

如何快速解决网易云音乐NCM格式转换难题:专业工具完全解析 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他设备播放而烦恼吗?ncmdu…...

基于Python的考试系统毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。 一、研究目的 本研究旨在设计并实现一个基于Python的考试系统,以满足现代教育环境中对在线考试系统的需求。该系统旨在提供一种高效、安全、便捷的考试环境&am…...

ccmusic-database/music_genre参数详解:batch_size/num_workers调优手册

ccmusic-database/music_genre参数详解:batch_size/num_workers调优手册 1. 应用背景与核心价值 你有没有试过听一首歌,却说不清它到底属于什么风格?蓝调的忧郁、电子的律动、爵士的即兴、金属的张力……音乐流派看似直观,但对机…...

英雄联盟本地自动化工具:LeagueAkari 完整指南与实战教程

英雄联盟本地自动化工具:LeagueAkari 完整指南与实战教程 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit LeagueAkari 是一款基于官…...

Ostrakon-VL-8B惊艳效果:在严重反光/水渍/褶皱包装袋上仍识别品牌

Ostrakon-VL-8B惊艳效果:在严重反光/水渍/褶皱包装袋上仍识别品牌 想象一下,你是一家连锁超市的巡检员,每天要检查上百个货架。有些商品包装袋在运输中压皱了,有些被顾客不小心洒上了水,还有些在灯光下反光严重。传统…...

造相-Z-Image效果展示:4090深度优化,中英文提示词直出惊艳作品

造相-Z-Image效果展示:4090深度优化,中英文提示词直出惊艳作品 你是否好奇,当顶级的RTX 4090显卡遇上专为它深度优化的文生图引擎,会产生怎样令人惊叹的作品?今天,我们不谈复杂的参数,不聊晦涩…...

新手必看:实时口罩检测-通用镜像使用指南,快速实现防疫检测功能

新手必看:实时口罩检测-通用镜像使用指南,快速实现防疫检测功能 1. 引言:为什么选择这个口罩检测方案 在公共场所实施防疫检测时,快速准确识别口罩佩戴情况是关键需求。传统人工检查方式效率低且容易遗漏,而从头开发…...

VOFA+不止能调PID:手把手教你用FireWater协议,把STM32的传感器数据变成酷炫波形图

VOFA与STM32的FireWater协议实战:打造多传感器数据可视化方案 在嵌入式开发中,数据可视化一直是提升调试效率的关键环节。传统方式往往需要开发者自行编写上位机软件或依赖复杂的第三方工具,而VOFA的出现改变了这一局面。这款开源免费的上位机…...

% 的人都用错了!Playwright vs Chrome DevTools MCP到底该怎么选?素

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

物联网平台层避坑指南:华为云IoT vs 阿里云物联网平台功能对比(2024新版)

华为云IoT与阿里云物联网平台深度对比:2024企业选型实战指南 当企业决定将业务迁移到物联网平台时,技术选型往往成为第一个关键决策点。作为国内市场份额最高的两大平台,华为云IoT和阿里云物联网平台各自拥有独特的优势与适用场景。但在实际商…...

利用.accelerate库优化Phi-4-mini-reasoning推理速度:分布式训练与推理实战

利用.accelerate库优化Phi-4-mini-reasoning推理速度:分布式训练与推理实战 1. 为什么需要加速Phi-4-mini-reasoning推理 Phi-4-mini-reasoning作为当前热门的轻量级推理模型,在实际部署中常面临显存不足和推理速度慢的问题。特别是在处理大批量请求时…...

ComfyUI Qwen人脸生成图像应用:电商模特、社交头像一键生成

ComfyUI Qwen人脸生成图像应用:电商模特、社交头像一键生成 1. 引言:从人脸到全身照的AI魔法 你是否遇到过这样的场景:需要一张专业形象照但没时间拍摄,或是想为电商产品展示不同风格的模特?传统解决方案要么成本高昂…...

LeetCode 最长回文子串:python 题解几

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

数据漂移预警失效、模型回滚超时、特征服务雪崩……AI原生软件交付失败的5大暗礁,你已踩中几个?

第一章:AI原生软件交付失败的暗礁全景图 2026奇点智能技术大会(https://ml-summit.org) AI原生软件并非传统应用的简单升级,而是从架构设计、数据契约、模型生命周期到可观测性全栈重构的系统工程。交付失败往往并非源于单点技术缺陷,而是多…...

解放双手!5分钟学会用taskt实现办公自动化,告别重复性工作

解放双手!5分钟学会用taskt实现办公自动化,告别重复性工作 【免费下载链接】taskt taskt (pronounced tasked and formely sharpRPA) is free and open-source robotic process automation (rpa) built in C# powered by the .NET Framework 项目地址:…...

MPV_lazy高性能播放器架构深度解析:5大优化实战指南

MPV_lazy高性能播放器架构深度解析:5大优化实战指南 【免费下载链接】mpv_PlayKit 🔄 mpv player 播放器折腾记录 Windows conf | 中文注释配置 汉化文档 快速帮助入门 | mpv-lazy 懒人包 Win11 x64 config | 着色器 shader 滤镜 filter 整合方案 项目…...

【SITS2026前沿首发】:大模型边缘部署的5大技术拐点与3类硬件适配避坑指南

第一章:SITS2026前沿首发:大模型边缘部署的范式跃迁 2026奇点智能技术大会(https://ml-summit.org) 传统大模型部署长期受限于云端集中式架构,带来高延迟、数据隐私风险与带宽瓶颈。SITS2026首次公开的EdgeLM Runtime框架,标志着…...

终极Cursor免费VIP指南:3步解锁AI代码编辑器完整功能

终极Cursor免费VIP指南:3步解锁AI代码编辑器完整功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...