本文章为《Linux系统移植篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。
针对FS-MP1A开发板,除了Linux系统移植篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、FreeRTOS系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加威廉希尔官方网站
交流Q群459754978,感谢关注。
关于FS-MP1A开发板:
手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤
链接:
https://item.taobao.com/item.htm?id=622457259672
1.实验原理参考原理图可知eMMC使用的是sdmmc2总线,当前所使用的设备树文件中没有sdmmc2的支持,所以需要增加相关内容才能正常驱动eMMC。
由于在使STM32MP1芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:
原理图网络编号
| 对应管脚
| 管脚功能
| 管脚功能码
| SD2_DATA0
| PB14
| SDMMC2_D0
| AF9
| SD2_DATA1
| PB15
| SDMMC2_D1
| AF9
| SD2_DATA2
| PB3
| SDMMC2_D2
| AF9
| SD2_DATA3
| PB4
| SDMMC2_D3
| AF9
| SD2_DATA4
| PA8
| SDMMC2_D4
| AF9
| SD2_DATA5
| PA9
| SDMMC2_D5
| AF10
| SD2_DATA6
| PE5
| SDMMC2_D6
| AF9
| SD2_DATA7
| PD3
| SDMMC2_D7
| AF9
| SD2_CLK
| PE3
| SDMMC2_CK
| AF9
| SD2_CMD
| PG6
| SDMMC2_CMD
| AF10
|
参考文档:
Documenta tion/devicetree/bindings/mmc/mmc-controller.yaml Documentation/devicetree/bindings/mmc/mmci.txt 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:
arch/arm/boot/dts/stm32mp151.dtsi stm32mp151中sdmmc2定义如下:
sdmmc2: sdmmc@58007000 { compatible = "arm,pl18x", "arm,primecell"; arm,primecell-periphid = <0x00253180>; reg = <0x58007000 0x1000>, <0x58008000 0x1000>; interrupts = ; interrupt-names = "cmd_irq"; clocks = <&rcc SDMMC2_K>; clock-names = "apb_pclk"; resets = <&rcc SDMMC2_R>; cap-sd-highspeed; cap-mmc-highspeed; max-frequency = <120000000>; status = "disabled"; }; 上述代码只对sdmmc2做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。
eMMC有8根数据线,且eMMC无需热插拔等功能,结合硬件信息添加sdmmc2节点信息,也可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-edx.dtsi关于sdmmc2的描述符合我们的要求,内容如下:
&sdmmc2 { pinctrl-names = "default", "opendrain", "sleep"; pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>; pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>; pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>; non-removable; no-sd; no-sdio; st,neg-edge; bus-width = <8>; vmmc-supply = <&v3v3>; vqmmc-supply = <&vdd>; mmc-ddr-3_3v; status = "okay"; }; 在内核中STM32MP1默认管脚定义在文件
arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:
查看后确认有sdmmc2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:
sdmmc2_b4_pins_a: sdmmc2-b4-0 { pins1 { pinmux = , /* SDMMC2_D0 */ , /* SDMMC2_D1 */ , /* SDMMC2_D2 */ , /* SDMMC2_D3 */ ; /* SDMMC2_CMD */ slew-rate = <1>; drive-push-pull; bias-pull-up; }; pins2 { pinmux = ; /* SDMMC2_CK */ slew-rate = <2>; drive-push-pull; bias-pull-up; }; }; sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 { pins1 { pinmux = , /* SDMMC2_D0 */ , /* SDMMC2_D1 */ , /* SDMMC2_D2 */ ; /* SDMMC2_D3 */ slew-rate = <1>; drive-push-pull; bias-pull-up; }; pins2 { pinmux = ; /* SDMMC2_CK */ slew-rate = <2>; drive-push-pull; bias-pull-up; }; pins3 { pinmux = ; /* SDMMC2_CMD */ slew-rate = <1>; drive-open-drain; bias-pull-up; }; }; sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 { pins { pinmux = , /* SDMMC2_D0 */ , /* SDMMC2_D1 */ , /* SDMMC2_D2 */ , /* SDMMC2_D3 */ , /* SDMMC2_CK */ ; /* SDMMC2_CMD */ }; }; sdmmc2_b4_pins_b: sdmmc2-b4-1 { pins1 { pinmux = , /* SDMMC2_D0 */ , /* SDMMC2_D1 */ , /* SDMMC2_D2 */ , /* SDMMC2_D3 */ ; /* SDMMC2_CMD */ slew-rate = <1>; drive-push-pull; bias-disable; }; pins2 { pinmux = ; /* SDMMC2_CK */ slew-rate = <2>; drive-push-pull; bias-disable; }; }; sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 { pins1 { pinmux = , /* SDMMC2_D0 */ , /* SDMMC2_D1 */ , /* SDMMC2_D2 */ ; /* SDMMC2_D3 */ slew-rate = <1>; drive-push-pull; bias-disable; }; pins2 { pinmux = ; /* SDMMC2_CK */ slew-rate = <2>; drive-push-pull; bias-disable; }; pins3 { pinmux = ; /* SDMMC2_CMD */ slew-rate = <1>; drive-open-drain; bias-disable; }; }; sdmmc2_d47_pins_a: sdmmc2-d47-0 { pins { pinmux = , /* SDMMC2_D4 */ , /* SDMMC2_D5 */ , /* SDMMC2_D6 */ ; /* SDMMC2_D7 */ slew-rate = <1>; drive-push-pull; bias-pull-up; }; }; sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 { pins { pinmux = , /* SDMMC2_D4 */ , /* SDMMC2_D5 */ , /* SDMMC2_D6 */ ; /* SDMMC2_D7 */ }; };
2.实验目的熟悉基于Linux操作系统下的块设备驱动移植配置过程。
3.实验平台华清远见开发环境,FS-MP1A平台;
4.实验步骤linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi 修改
arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件
在原有sdmmc1节点下添加如下内容:
&sdmmc2 { pinctrl-names = "default", "opendrain", "sleep"; pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>; pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>; pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>; non-removable; no-sd; no-sdio; st,neg-edge; bus-width = <8>; vmmc-supply = <&v3v3>; vqmmc-supply = <&vdd>; mmc-ddr-3_3v; status = "okay"; }; 由于内核源码默认配置已经支持eMMC,本节列出主要选项,如下
linux@ubuntu:$ make menuconfig Device Drivers ---> <*> MMC/SD/SDIO card support ---> STMicroelectronics STM32 SDMMC Controller
linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040 将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,重启设备后可以看到如下启动信息:
由于eMMC中有出厂预
装的FS-MP1A系统,所以可以正常完成文件系统挂载进入系统:
硬件平台:华清远见FS-MP1A开发板(STM32MP157) 部分开发教程下载:加QQ群459754978,群文件里有。 手机淘宝分享码:复制本行文字打开手淘₤T4FPXn3YYJ2₤
|