韦东山Linux第三篇笔记 - 上
一、"板子设置为 EMMC 启动",EMMC是啥?
下面我专门针对 韦东山的 I.MX6ULL 开发板,重新、清晰、精确地解释:
✅ eMMC 是什么?(对 I.MX6ULL 开发板来说)
eMMC = embedded MultiMediaCard(嵌入式多媒体卡)
是一种焊在开发板上的内置存储芯片,用来存系统。
在韦东山的 I.MX6ULL 开发板上,eMMC 是板子上固定焊死的存储器,容量一般是:
- 4GB
- 8GB
- 16GB
用于存放:
- u-boot
- 内核(zImage / Image)
- 设备树
- 根文件系统 rootfs
- 配置数据
你可以把 eMMC 理解为:
"一块直接焊在开发板上的 SD 卡,但速度更快、寿命更长、更稳定。"
🔥 为什么 I.MX6ULL 板子要从 eMMC 启动?
因为在产品中(不像开发阶段):
- 系统不能用 SD 卡(容易松动、拔出、损坏)
- eMMC 可靠性高、速度快、寿命长
- eMMC 支持分区、坏块管理
- 上电即可读到系统
所以最终产品都会选用:
✔ eMMC 启动
✘ 不用 SD 卡启动
韦东山的 IMX6ULL 板子也是这个思路。
📌 I.MX6ULL 从 eMMC 启动的实际流程(重要)
I.MX6ULL 芯片内部有一个 BootROM(固化的代码)。
当你设置"eMMC 启动拨码开关"时,启动流程如下:
上电
↓
BootROM 读取 eMMC 的启动区域(boot0 / boot partition)
↓
加载 u-boot 到 RAM 并运行
↓
u-boot 去 eMMC 的 user partition 读取内核、设备树
↓
启动 Linux
↓
从 eMMC 的 rootfs 分区挂载根文件系统
↓
系统启动完成
这意味着整个系统(bootloader、kernel、rootfs)全部来自于 eMMC。
🧩 eMMC 和 NAND Flash 的区别(I.MX6ULL 非常关键)
| 存储类型 | 特点 |
|---|---|
| NAND Flash | 没有控制器,你自己要处理坏块、ECC、磨损均衡,麻烦 |
| eMMC | 内部自带控制器,坏块管理自动完成,像操作磁盘一样使用,I.MX6ULL 官方推荐 |
韦东山的 IMX6ULL 开发板 有 NAND 版本和 eMMC 版本
但现在主流都是 eMMC 版本,因为更稳定可靠。
📝 怎么确定板子当前是否使用 eMMC?
在 Linux 上输入:
ls /dev/mmcblk*
你一般会看到:
/dev/mmcblk0→ SD 卡/dev/mmcblk1→ eMMC
如果根文件系统是从 /dev/mmcblk1p2 挂载的,就说明你正在 从 eMMC 启动。
你也可以通过 u-boot 查看:
mmc list
🎯 最简总结(I.MX6ULL 专用版)
- eMMC 是焊在板子上的内置闪存,用来存系统。
- 板子设置为 eMMC 启动,就是从 eMMC 中读 u-boot / kernel / rootfs。
- eMMC 比 SD 卡稳定,是最终产品的必选项。
二、I.MX6ULL 开发板上的ADB是什么?
什么是 ADB?
ADB 全称是 Android Debug Bridge(安卓调试桥)。
你可能会问:"我学的是 Linux,为什么用'安卓'的工具?"
- 原因: Android 的底层核心其实就是 Linux。ADB 这个工具设计得非常出色、方便,所以嵌入式 Linux 开发者把它"借"了过来,移植到了普通的 Linux 开发板上使用。
- 简单理解: 它可以看作是一条连接你的 电脑(PC) 和 开发板 的"万能数据通道"。
只要用一根 USB 线把电脑和开发板连起来,你就可以在电脑上随心所欲地控制开发板,或者传输文件。
为什么需要 ADB?(它解决了什么痛点)
在没有 ADB 之前,或者是传统的开发方式中,初学者常遇到的麻烦是:
- 串口(Serial)不好传文件: 串口主要用来输入命令和看打印信息,想把电脑上写好的程序传到板子上运行,通过串口传输非常慢且复杂。
- 网络(SSH/NFS)配置麻烦: 想通过网线传输,你得设 IP 地址、搞定防火墙、保证电脑和板子在同一个网段,这对初学者来说容易"劝退"。
ADB 的优势:
- 即插即用: 只要 USB 线连上就能用(类似手机连电脑)。
- 传文件极快: 使用 USB 高速传输,把电脑上的程序发给板子只需一瞬间。
- 远程控制: 可以在电脑的命令行里直接操作板子。
ADB 的三大核心功能
1. adb shell(远程登录)
- 功能: 在电脑上打开一个终端窗口,直接进入开发板的 Linux 系统。
- 场景: 你不需要一直盯着开发板接出来的那个小屏幕或者串口助手,直接在电脑的命令行里敲
ls,cd,./my_program就可以控制板子。
2. adb push(推:电脑 -> 板子)
- 功能: 把电脑上的文件"推"进开发板。
- 场景: 你在电脑上写好了一个
hello_world程序,编译好了,想放到板子上运行。- 命令示例:
adb push hello_world /bin/(把电脑当前目录下的文件传到板子的 /bin 目录)。
- 命令示例:
3. adb pull(拉:板子 -> 电脑)
- 功能: 把开发板上的文件"拉"回电脑。
- 场景: 板子上运行产生了一个日志文件
log.txt,或者是摄像头拍了一张照片,你想弄到电脑上看。- 命令示例:
adb pull /root/photo.jpg .(把板子上的图片传到电脑当前目录)。
- 命令示例:
回到你的文档内容

文档中让你检查:
Bash
ls /usr/bin/adbd
这里的 adbd 多了一个 d ,代表 Daemon(守护进程)。
- 电脑端 运行的是
adb(客户端,发号施令的人)。 - 开发板端 运行的是
adbd(服务端,干活的人)。
文档的意思是:
如果你的板子系统里有 adbd 这个程序在运行,那么你的板子就具备了"听懂"电脑发来的 ADB 指令的能力。如果没有这个文件,你的电脑怎么敲命令,板子都不会理你。
总结
- ADB 是桥梁: 通过 USB 线连接电脑和板子。
- 它不是安卓独有: 嵌入式 Linux 用它来方便地传文件和输命令。
- adbd 是关键: 板子上必须有
adbd这个后台程序,才能和电脑对话。
三、USB OTG 和 USB 转串口的区别是什么?
这是一个非常好的问题,因为在嵌入式 Linux 开发板(如 I.MX6ULL)上,这两个接口都非常重要,但它们的功能和用途完全不同。
简单来说:
- USB OTG 是用于==高速数据传输和角色切换==的接口。
- USB 转串口 是用于**低速、可靠的文本调试**的接口。
1. ⚙️ USB OTG (On-The-Go)
核心功能:角色切换和高速通信
USB OTG 最大的特点是其接口可以在 Host (主机/主控) 和 Device (设备/被控) 两种角色之间切换。
| 特点 | 解释 |
|---|---|
| 通信速度 | 高速 (High-speed),通常能达到 480 Mbps。 |
| 通信协议 | 使用复杂的 USB 协议栈。 |
| 作为 Host (主机) | 开发板可以连接并控制外部设备,例如:连接鼠标、键盘、U盘等。 |
| 作为 Device (设备) | 开发板被电脑控制,实现以下高级功能: - 烧录固件: 电脑将系统镜像烧录到板子的存储器中。 - ADB 调试: 实现高速文件传输和远程 Shell。 - RNDIS 网络: 将板子模拟成一个 USB 网卡,通过 USB 线实现网络连接。 |
| 使用时机 | 通常需要 Linux 内核启动后,USB 驱动才能加载和工作。 |
2. 🔌 USB 转串口 (USB to Serial)
核心功能:低级、可靠的文本调试
USB 转串口 实际上是一个 适配器 (通常集成在板子上或使用一根转换线),它将电脑上的 USB 信号转换成老式的 UART/TTL 串口信号,连接到 I.MX6ULL 上的 UART 接口。
| 特点 | 解释 |
|---|---|
| 通信速度 | 低速 (Low-speed),通常固定在 115200 bps(波特率)。 |
| 通信协议 | 简单的 UART 协议,只传输原始的文本字符 (ASCII)。 |
| 通信内容 | 纯文本数据,用于显示系统运行日志和接收命令。 |
| 最重要的用途 | 最低级别的调试和控制台。 它用于: - U-Boot (Bootloader) 命令行: 系统启动前,你操作 U-Boot 的唯一途径。 - 内核启动日志: 打印内核启动过程中密密麻麻的文本信息。 - 系统崩溃日志: 即使系统内核崩溃,串口通常仍能打印出最后的错误信息。 |
| 使用时机 | 系统任何阶段都可以使用,因为它不依赖复杂的 USB 驱动。 |
🎯 总结对比表 (I.MX6ULL 上的使用)
| 特性 | USB OTG 接口 | USB 转串口接口 |
|---|---|---|
| 传输介质 | USB 协议 | 纯文本(UART 协议) |
| 速度 | 高速(MB/s 级别) | 低速(KB/s 级别) |
| 功能 | 烧录、ADB、高速传文件、网络、连接外设 | 打印启动日志、U-Boot 控制台 |
| 依赖性 | 依赖完整的 USB 驱动和操作系统 | 独立于操作系统,极其可靠 |
| 你的用途 | 高效传输文件、远程 Shell (ADB) | 观察系统启动、处理启动错误 |
🛠️ 结论:如何一起使用?
在你的 I.MX6ULL 开发过程中,你会同时使用这两个接口:
- 开机初期(U-Boot阶段): 你必须使用 USB 转串口 来观察启动信息,设置 U-Boot 环境变量。
操作系统 | 独立于操作系统,极其可靠 |
| 你的用途 | 高效传输文件、远程 Shell (ADB) | 观察系统启动、处理启动错误 |
🛠️ 结论:如何一起使用?
在你的 I.MX6ULL 开发过程中,你会同时使用这两个接口:
- 开机初期(U-Boot阶段): 你必须使用 USB 转串口 来观察启动信息,设置 U-Boot 环境变量。
- 系统启动后(Linux阶段): 你会转而使用 USB OTG(通过 ADB) 来进行高效的程序调试、文件传输和网络访问。