ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

22_实验二十一_移植eMMC驱动

22_实验二十一_移植eMMC驱动 实验二十一 移植 eMMC 驱动——让内核看见板载硬盘对应课件《第5章 移植Linux内核》5.4 节步骤 5Slide 47~51系列说明本系列基于华清远见 FS-MP1ASTM32MP157A开发板对应课件《第5章 移植Linux内核》。实验二十编出的零修改内核看不见 eMMC点火会卡在找根文件系统。本篇补上这块短板。好消息是源码层面查过实验二十步骤 6内核里 SDMMC 控制器驱动早就编进去了那个配置选项默认就是开的实验二十的看不见缺的只是设备树里的 sdmmc2 节点——所以本篇真正的改动只有一小段设备树menuconfig 那一步是开进去确认而不是修改。前置实验二十内核与 dtb 已编出。一、先想明白内核看见一块存储需要哪两样第 3 章给 U-Boot 开 eMMCF-6时你已经见过这套组合拳的 U-Boot 版内核版一模一样的道理——但有一个查清了的事实差别需要什么我们的现状本篇做什么驱动代码被编进内核已经在CONFIG_MMC_STM32_SDMMC依赖 ARM AMBA MMC 且default y实验十九的.config里天生就是y开 menuconfig确认一眼步骤 2设备树声明这条总线缺SoC 级stm32mp151.dtsi里sdmmc2默认status disabled老师的fsmp1x.dtsi又没写板级节点往fsmp1x.dtsi加一段节点步骤 1主角设备树不描述驱动再全也是有兵无将令——这就是实验二十步骤 6 说的一出一入SD 卡sdmmc1 节点齐全认得出、eMMCsdmmc2 无节点认不出。本篇把第二样补齐重编译一次就通。这也是内核移植的标准节奏改设备树 → 核对配置 → 重编 → 看日志后面实验二十二换网卡还是这个循环。二、实验环境实际项目实际值操作位置Ubuntu 虚拟机实验二十那棵源码树 make menuconfig图形界面上篇产物arch/arm/boot/uImage、arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb实验二十板子本篇不开编译在虚拟机点火验证在实验二十三统一做开工自检10 秒ls arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi在实验二十步骤 3 放的grep MMC_STM32 .config应已打出CONFIG_MMC_STM32_SDMMCy即上一节说的天生已开——如果这条现在就有输出本篇步骤 2 就只是走个过场。三、课件 ↔ 步骤对应表课件 Slide内容对应步骤47移植思路内核已有 eMMC 驱动代码此处只需要修改设备树开篇与源码核查一致48dtsi 里原有 sdmmc1 后面添加 sdmmc2 节点第 150~165 行步骤 149~50menuconfig 路径 Device Drivers → MMC/SD/SDIO → STM32 SDMMC Controller步骤 2确认51make -j4 uImage dtbs LOADADDR0xC2000040重编译步骤 3本篇动作 → 后面谁用 → 现在含糊的后果本篇动作后面哪一篇要用现在含糊的后果fsmp1x.dtsi里新增的sdmmc2节点实验二十三点火后内核认出 eMMC就是 U-Boot 里mmc dev 1那颗 004GA0第 6 章借它挂根、第 7 章起一切板级开发都以盘被认出为前提节点位置/拼写错eMMC 不出现实验二十三连根都借不了menuconfig 确认CONFIG_MMC_STM32_SDMMCy实验二十二再开一次 menuconfig勾网卡 PHY——手法相同万一是[ ]没发现实验二十三白点火一次make -j4 uImage dtbs LOADADDR0xC2000040一条重编实验二十二用同一条命令重编改的文件不同而已漏dtbs只重编了内核dtb 还是旧的现象对不上还以为没生效本篇不需要新资料——所有内容都在课件 Slide 48 与本篇正文里照抄进设备树即可。四、实验步骤步骤 1设备树加 sdmmc2 节点Slide 47~48cd共享目录/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/linux-5.4.31# 内核源码顶层与实验二十同款新开终端就要重新 cdnanoarch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsiCtrlW搜索sdmmc1 TF 卡回车定位改完CtrlO回车保存、CtrlX退出——nano 键位卡见实验二十步骤 1下同。打开文件后找到已有的sdmmc1节点带/*sdmmc1 TF 卡*/注释约第 136~148 行——就是实验二十彩蛋②里那个cd-gpios用gpioh 3的节点在它后面、sram节点之前插入课件给出的整段/*sdmmc2 eMMC*/sdmmc2{pinctrl-namesdefault,opendrain,sleep;pinctrl-0sdmmc2_b4_pins_asdmmc2_d47_pins_a;pinctrl-1sdmmc2_b4_od_pins_asdmmc2_d47_pins_a;pinctrl-2sdmmc2_b4_sleep_pins_asdmmc2_d47_sleep_pins_a;non-removable;no-sd;no-sdio;st,neg-edge;bus-width8;vmmc-supplyv3v3;vqmmc-supplyvdd;mmc-ddr-3_3v;statusokay;};图实测顶替课件 Slide 48——nano 4.8 里改好的样子/*sdmmc2 eMMC*/ sdmmc2 { ... }整段已插入sdmmc1节点之后git diff确认只有这一段新增。这一段不用背但每个属性值得认识一遍与实验十四、F-1/F-2/F-6 的 U-Boot 经历逐条对上属性意思对应我们已有的经验pinctrl-0/1/2三种状态下的引脚复用默认/开漏/睡眠b4 DATA0~3 基础组、d47 DATA4~7 扩展组8 位线要两组一起上F 系列改 U-Boot 设备树时见的 pinctrl 同一套写法引用的五个 pin 组都定义在 SoC 级stm32mp15-pinctrl.dtsi里0020 补丁带来的不用我们写non-removableeMMC 焊死在板上不存在拔出——不声明它内核会去等插拔信号实验十四eMMC 永远在线SD 卡才有 CD 引脚no-sd/no-sdio明确告诉驱动这条总线上不是 SD 卡也不是 SDIO 设备F-6 给 U-Boot 开 eMMC 时同样写法U-Boot 版节点还多一个u-boot,dm-spl那是 U-Boot SPL 阶段专用的属性内核版不需要——同一条总线、两个 bootloader 各自描述同名文件别改混st,neg-edge时钟下降沿采样ST 控制器的时序特性U-Boot 版节点同款bus-width 88 位数据线全用上实验十四mmc info实测Bus Width: 8-bit的源头就是这里vmmc-supply v3v3/vqmmc-supply vdd存储芯片的两组供电接在哪路电源上v3v3、vdd本文件第 61~77 行已经定义实验二十彩蛋①的两路 3.3V 固定电源不用我们加第 3 章 F-1 在 U-Boot 侧也加过同名固定电源——两边各管各的这次内核侧现成mmc-ddr-3_3v支持 3.3V 双倍速率模式实验十六内核日志里 eMMC 的 DDR 高速档与此有关status okay启用这个节点把 SoC dtsi 里默认的 disabled 翻过来每个节点的开关阀改完git diff过一眼应只有这一段新增。步骤 2menuconfig 确认 STM32 SDMMC 控制器Slide 49~50makemenuconfig按课件路径走一遍先grep MMC_STM32 .config的话多半已经看到y开进去只是眼见为实Device Drivers --- * MMC/SD/SDIO card support --- [*] STMicroelectronics STM32 SDMMC Controllermenuconfig 三招小白版本系列通用①进子菜单用方向键把光标移到---结尾的行上按回车进入按Esc返回上一层。②选中 / 取消选中光标移到选项行按空格键在[*]选中和[ ]取消之间来回切也可以按Y直接选中、N直接取消带M的三态项则是[*]→M→[ ]三档循环。③退出并保存连按两次Esc或选Exit逐层退出退出最外层时会问Do you wish to save your new configuration?——用方向键选Yes回车。不保存 白改这是 menuconfig 头号坑。本篇预期它已经是[*]default y机制所以三招一次都用不上也没关系——亲眼确认一遍就是收获。图课件 Slide 49——menuconfig 修改路径Device Drivers --- * MMC/SD/SDIO card support ---选中[*] STMicroelectronics STM32 SDMMC Controller。图课件 Slide 50——MMC/SD/SDIO 菜单实拍* ARM AMBA Multimedia Card Interface support、高亮的[*] STMicroelectronics STM32 SDMMC Controller、* Secure Digital Host Controller Interface support等。预期它已经是[*]default y机制——实验二十步骤 6 讲过万一显示[ ]比如换过别的 defconfig按上面三招勾上并保存。就地验证grepMMC_STM32 .config# 应打出 CONFIG_MMC_STM32_SDMMCy注意搜的符号是MMC_STM32_SDMMC——名字是MMC 下的 STM32 SDMMC不是SDMMC_STM32搜错关键词会误判成没勾。步骤 3重编译Slide 51make-j4uImage dtbsLOADADDR0xC2000040一条命令同时重编内核与设备树我们改了 dtsidtb 必须重出.config有变动内核也要重出一小部分。因为只改了设备树和一个配置项这次是增量编译几分钟完事4GB 内存虚拟机 OOM 就换-j2实验二十注意事项 1 同款。验证ls-larch/arm/boot/uImage arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb# 两者的修改时间应是刚才uImage 字节数与实验二十那份不同配置生效、代码量变了记下新数验收预告本篇不点火实验二十三验收用这对新文件点火后内核日志里应出现 eMMC 的报到行——mmcX: new ... MMC card at address 0001与mmcblkY: mmcX:0001 004GA0 3.69 GiB。Y 的编号以日志实录为准我们的设备树没写 mmc 别名Linux 按探测顺序给盘编号实验十六出厂 dtb 下的mmcblk2只是参照、不必照搬认盘认3.69 GiB p1~p5 分区别认死编号。本篇不单独提交 git实验二十一eMMC与实验二十二网卡改的是同一个fsmp1x.dtsi、同属第 5 章驱动移植一组改动分开提交界线模糊——两篇的改动一起在实验二十二收官时提交一条FS-MP1A eMMC 与网卡驱动实验二十一/二十二命令见实验二十二篇尾。本篇改动先留在工作区git status --short能看到 dtsi 与.config的未提交改动属正常此时内核版本串会带-dirty实验十九步骤 3.3 的机制也别当异常。实验二十步骤 6 说的认不出 eMMC到这一步就该翻面了。五、注意事项sdmmc2节点加在sdmmc1之后dtsi 是顺序文本加错位置不影响编译但影响可读性git diff一眼能看出插哪了。属性值里的 是设备树语法整数用尖括号包住不是手误字符串才用引号如pinctrl-names default...。menuconfig 这步是确认default y让它天生就是[*]只有看到[ ]才需要动手勾Save。判据永远以grep MMC_STM32 .config为准。别动.config文件本身实验十八说过menuconfig 是唯一正规入口。重编译命令必须带LOADADDR0xC2000040只写make uImage dtbs时 uImage 的加载地址字段不对点火会失败且难查实验二十注意事项 2 同款。同名文件两个世界U-Boot 那棵树的stm32mp15xx-fsmp1x.dtsiF-6 改过与内核这棵的是两份文件——确认你 nano 打开的是linux-5.4.31/arch/arm/boot/dts/下的这份。六、验证点一览验证点命令通过的样子在哪一步敲节点已插入grep -A 16 sdmmc2 eMMC arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi打出我们加的整段步骤 1节点位置正确git diff arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi只有一段新增位于sdmmc1之后步骤 1控制器配置就位grep MMC_STM32 .configCONFIG_MMC_STM32_SDMMCy步骤 2重编完成ls -l arch/arm/boot/uImage arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb两个产物时间戳都是刚刚新 uImage 字节数已记步骤 3改动范围清白git status --short预期项 fsmp1x.dtsi.config类忽略件无意外文件收尾不达标时的排查现象先查什么menuconfig 里找不到 STM32 SDMMC 那一项搜索大法menuconfig 里按/键输入SDMMC它会告诉你它藏在哪条路径下、依赖什么选项依赖的是 ARM AMBA MMC本身得是[*]grep MMC_STM32 .config没输出.config不在当前目录要在内核顶层敲或 menuconfig 改了没保存重编后 dtb 字节数没变make dtbs漏了或 dtsi 改动没保存ls -l看修改时间重编后 uImage 字节数与实验二十完全一样.config没变SDMMC 本来就是 y 的话字节数可能真的不变——这不算错本篇对 uImage 的实质影响可能只有设备树部分点火后仍无 eMMC实验二十三验收先把三处自查一遍节点拼写、y、dtb 重编了七、实验完成标志stm32mp15xx-fsmp1x.dtsi已在sdmmc1之后加入sdmmc2节点整段git diff只显示这一段步骤 1menuconfig 走过课件路径.config里CONFIG_MMC_STM32_SDMMCy步骤 2make -j4 uImage dtbs LOADADDR0xC2000040重编译成功两个产物时间戳已更新、新 uImage 字节数已记步骤 3八、下一步移植网卡驱动eMMC 这只眼睛装好了。下一篇实验二十二装第二只MAE0621A 网卡驱动——这次连驱动代码都要自己放资料包kernel-网卡驱动.zip里的maxio.c/phy_device.c后者还要覆盖内核同名文件Makefile、Kconfig、menuconfig、设备树四处齐动是第 5 章改动最多的一篇。
返回列表