mmcblk设备源码添加位置

MMCblk设备源码添加与节点生成详解

 

MMCblk设备的源码添加通常涉及到Linux内核的驱动开发。根据搜索结果,MMCblk设备的驱动源码位于drivers/mmc/card(core)/block.c文件中,其中mmc_blk_probe()函数是块设备驱动初始化时的入口函数,主要负责分配与块设备紧密相关的struct gendisk结构,并将其添加到系统中。

 

在mmc_blk_probe()函数中,会分配struct gendisk并初始化,包括主次设备号、块设备操作函数mmc_bdops等。然后通过mmc_add_disk(md)将struct gendisk *disk添加到系统中。

 

设备节点生成过程

 

块设备注册:mmc_blk_probe()函数负责注册块设备。

 

设备节点创建:在add_disk(struct gendisk *disk)函数中,会根据disk的major和first_minor,由MKDEV处理后返回devt,即主次设备号。然后通过blk_register_region(disk_devt(disk), disk->minors, NULL, exact_match, exact_lock, disk);将块设备添加到系统,并通过register_disk(disk);创建mmcblk0块设备主分区节点,创建主分区的bdev。

 

总结

 

MMCblk设备的源码添加主要涉及到drivers/mmc/card(core)/block.c文件中的mmc_blk_probe()函数,该函数负责块设备的初始化和注册。设备节点的生成过程则涉及到add_disk(struct gendisk *disk)函数,该函数负责将块设备添加到系统并创建相应的设备节点。

<think>好的,用户现在问的是如何为ImmortalWrt编译添加EMMC支持。我需要仔细分析用户的问题,并结合之前的对话历史来给出准确的回答。 首先,用户之前的提问是关于是否需要解压img.gz文件使用BalenaEtcher烧录到U盘,而现在的转向是关于编译ImmortalWrt时添加EMMC支持。这两个问题看起来关联不大,但可能需要考虑到用户可能在尝试将系统安装到N1盒子的EMMC存储中,而之前的U盘启动可能只是临时步骤,现在想要更永久的解决方案。 用户提供的引用[1]是关于在OpenWrt 21.02中添加编译日期和Git记录到发布文件的代码片段。这个引用似乎不太直接相关,但可能用户是想在编译过程中自定义信息,或者误引用了内容。我需要忽略这个引用,专注于用户当前的问题。 用户的需求是添加EMMC支持到ImmortalWrt的编译中。EMMC支持通常指的是让系统能够识别并正确使用设备的嵌入式多媒体存储卡,这在一些嵌入式设备如电视盒子(比如N1)中很重要,因为它们可能默认从U盘启动,但用户可能希望将系统刷入内部EMMC存储,以获得更稳定的运行环境。 首先,我需要回忆ImmortalWrt的编译流程,以及如何在内核配置中添加驱动支持。EMMC的支持通常涉及到内核中的MMC子系统驱动,以及对应的设备树配置。对于特定的硬件,比如N1盒子(可能使用Amlogic芯片),可能需要启用相关的驱动和配置设备树。 接下来,我需要考虑用户可能的设备型号,比如是否基于Amlogic S905D等,这会影响具体的驱动选择和设备树配置。例如,N1盒子可能需要启用meson-gxl的MMC控制器驱动,并确保设备树中的EMMC节点正确配置。 另外,用户可能需要修改启动脚本或U-Boot配置,以确保系统能够从EMMC启动,或者安装脚本能够正确地将系统写入EMMC。这可能涉及到打包镜像时包含必要的脚本和工具,比如amlogic-installer或其他刷机工具。 还需要检查ImmortalWrt的文档或社区资源,是否有现成的补丁或配置选项可以启用EMMC支持。例如,某些项目可能需要应用特定的补丁到内核或uboot,或者修改target/linux下的配置文件。 用户可能遇到的问题包括编译后的镜像无法识别EMMC,启动失败,或者写入EMMC后无法正确引导。因此,在回答中需要包含验证步骤,如检查内核日志中的MMC设备识别情况,确保设备树正确,以及测试刷写过程是否成功。 此外,用户可能需要知道如何将编译好的镜像刷入EMMC,这可能涉及到使用之前的U盘启动方法,然后运行安装脚本将系统写入EMMC。因此,可能需要指导用户如何在编译时包含必要的刷机工具和脚本。 总结起来,回答需要涵盖以下步骤: 1. 准备编译环境,克隆ImmortalWrt源码并更新feed。 2. 在内核配置中启用EMMC相关驱动,特别是针对设备硬件的驱动(如Amlogic的MMC控制器)。 3. 配置设备树,确保EMMC节点正确启用和参数设置。 4. 添加或修改固件打包脚本,包含EMMC安装工具(如amlogic-installer)。 5. 编译并生成镜像,测试镜像是否支持EMMC。 6. 提供刷入EMMC的步骤,例如通过U盘启动后运行安装命令。 同时,需要注意用户可能的误区,比如是否需要特定的分区格式,或者在编译时是否需要选择特定的Target或Subtarget。例如,Amlogic设备可能需要选择armvirt作为Target,或者具体的目标平台。 最后,根据用户之前的问题,他们可能对N1盒子比较熟悉,所以回答中可以具体提到N1相关的配置,比如使用meson-gxl-s905d-phicomm-n1.dtb设备树文件,以及如何确保U-Boot支持从EMMC启动。 需要确保回答结构清晰,分步骤说明,并包含代码示例和验证方法,帮助用户逐步操作。此外,生成的相关问题应该引导用户进一步解决可能遇到的问题,如驱动未启用、设备树配置错误或刷写失败等。</think>### 为 ImmortalWrt 编译添加 EMMC 支持的完整指南 要为 ImmortalWrt 添加 EMMC 支持,需从 **内核驱动**、**设备树配置** 和 **系统安装脚本** 三方面入手。以下是针对 Amlogic S905D(如 N1 盒子)等设备的详细步骤: --- #### 一、**编译环境准备** 1. **克隆 ImmortalWrt 源码并更新 feeds** 确保使用最新代码分支(如 `openwrt-21.02`): ```bash git clone https://github.com/immortalwrt/immortalwrt.git cd immortalwrt ./scripts/feeds update -a ./scripts/feeds install -a ``` 2. **选择目标平台** 执行 `make menuconfig`,配置以下选项: - **Target System** → `Amlogic ARMv8` - **Subtarget** → `Amlogic S905D` - **Target Images** → 勾选 `Build amlogic-installer`(用于生成 EMMC 刷机脚本)[^1]。 --- #### 二、**内核驱动配置** 1. **启用 EMMC 控制器驱动** 在 `make menuconfig` 中进入 **Kernel Modules → MMC/SD/SDIO/AOSP**,勾选以下模块: ```bash kmod-mmc # MMC 核心驱动 kmod-mmc-spi # SPI 接口支持(部分设备需要) kmod-sdhci # SDHCI 控制器驱动 kmod-sdhci-of-aml # Amlogic 的 SDHCI 驱动(关键!) ``` 2. **配置内核参数** 编辑 `target/linux/armvirt/config-5.15`(以 5.15 内核为例),添加或检查以下配置: ```config CONFIG_MMC=y CONFIG_MMC_BLOCK=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_OF_AML=y # Amlogic 设备专用 CONFIG_MMC_SDHCI_IO_ACCESSORS=y ``` --- #### 三、**设备树(DTB)配置** 1. **修改设备树文件** 编辑设备树文件 `target/linux/armvirt/dts/meson-gxl-s905d-phicomm-n1.dts`,确保 EMMC 节点正确启用: ```dts &sd_emmc_c { status = "okay"; // 确保状态为启用 bus-width = <8>; // EMMC 总线宽度 non-removable; // 标记为不可移除设备 cap-mmc-highspeed; // 支持高速模式 mmc-ddr-1_8v; // DDR 模式电压 max-frequency = <200000000>; // 最大频率 200MHz }; ``` 2. **生成更新后的 DTB 文件** 编译后,新的 DTB 文件会输出到 `bin/targets/armvirt/64/openwrt-*-meson-gxl-s905d-phicomm-n1.dtb`,需将其复制到 U 盘的 `boot` 分区[^2]。 --- #### 四、**集成 EMMC 安装脚本** 1. **添加 amlogic-installer** 在 `package/utils/amlogic-installer` 目录下检查脚本是否包含 EMMC 分区逻辑。关键部分如下: ```bash # 检查 EMMC 设备是否存在 if [ -b /dev/mmcblk0 ]; then mkfs.ext4 /dev/mmcblk0p2 # 格式化 EMMC 分区 dd if=/tmp/openwrt.img of=/dev/mmcblk0 # 写入镜像 fi ``` 若缺失,需从官方仓库同步最新脚本。 2. **编译生成镜像** 执行编译命令,生成包含 EMMC 支持的固件: ```bash make -j$(nproc) V=s ``` 输出文件为 `bin/targets/armvirt/64/immortalwrt-armvirt-64-rootfs.img.gz`。 --- #### 五、**刷入 EMMC 的步骤** 1. **U 盘启动临时系统** 参考之前的烧录方法,将编译后的镜像写入 U 盘并启动 N1。 2. **执行 EMMC 安装脚本** SSH 登录临时系统后运行: ```bash /usr/sbin/amlogic-installer # 自动检测并写入 EMMC reboot ``` 3. **验证 EMMC 识别** 启动后检查内核日志: ```bash dmesg | grep mmcblk0 # 应显示 EMMC 设备及分区 mount | grep /dev/mmcblk0p2 # 确认根文件系统挂载 ``` --- ### 常见问题排查 1. **EMMC 未被识别** - **检查驱动加载**:运行 `lsmod | grep sdhci` 确认驱动已加载。 - **设备树错误**:验证 DTB 文件中 EMMC 节点是否启用 `status = "okay"`。 2. **写入 EMMC 失败** - **权限问题**:确保 `amlogic-installer` 具有可执行权限(`chmod +x`)。 - **分区冲突**:某些设备需先擦除原有分区表(风险高,谨慎操作)。 3. **启动后无法进入系统** - **U-Boot 配置**:确认 U-Boot 环境变量 `bootcmd` 指向 EMMC 分区(如 `mmc dev 0; ext4load mmc 0:2 ...`)。 --- ### 代码示例:手动验证 EMMC 设备 ```bash # 查看 EMMC 设备信息 mmc extcsd read /dev/mmcblk0 | grep "Extended CSD" # 检查分区表 fdisk -l /dev/mmcblk0 ``` --- ### 相关问题 1. 如何修改 U-Boot 以优先从 EMMC 启动? 2. ImmortalWrt 编译时如何添加自定义软件包? 3. 刷写 EMMC 后如何恢复原始 Android 系统? [^1]: `amlogic-installer` 是 ImmortalWrt 官方提供的刷机工具,支持直接写入 EMMC。 [^2]: N1 的 EMMC 控制器由 `meson-gxl-sd-emmc` 驱动管理,需确保设备树配置匹配。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值