STM32MP157 Linux系统移植开发篇9:Linux内核eMMC驱动移植

本文章为《STM32MP157 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

  1. eMMC设备树节点

参考文档:

Documentation/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 = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;

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";

};

  1. 管脚定义

在内核中STM32MP1默认管脚定义在文件arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义:

查看后确认有sdmmc2的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下:

sdmmc2_b4_pins_a: sdmmc2-b4-0 {

pins1 {

pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */

<STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */

<STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */

<STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */

<STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */

slew-rate = <1>;

drive-push-pull;

bias-pull-up;

};

pins2 {

pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */

slew-rate = <2>;

drive-push-pull;

bias-pull-up;

};

};

sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {

pins1 {

pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */

<STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */

<STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */

<STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */

slew-rate = <1>;

drive-push-pull;

bias-pull-up;

};

pins2 {

pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */

slew-rate = <2>;

drive-push-pull;

bias-pull-up;

};

pins3 {

pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */

slew-rate = <1>;

drive-open-drain;

bias-pull-up;

};

};

sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {

pins {

pinmux = <STM32_PINMUX('B', 14, ANALOG)>, /* SDMMC2_D0 */

<STM32_PINMUX('B', 15, ANALOG)>, /* SDMMC2_D1 */

<STM32_PINMUX('B', 3, ANALOG)>, /* SDMMC2_D2 */

<STM32_PINMUX('B', 4, ANALOG)>, /* SDMMC2_D3 */

<STM32_PINMUX('E', 3, ANALOG)>, /* SDMMC2_CK */

<STM32_PINMUX('G', 6, ANALOG)>; /* SDMMC2_CMD */

};

};

sdmmc2_b4_pins_b: sdmmc2-b4-1 {

pins1 {

pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */

<STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */

<STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */

<STM32_PINMUX('B', 4, AF9)>, /* SDMMC2_D3 */

<STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */

slew-rate = <1>;

drive-push-pull;

bias-disable;

};

pins2 {

pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */

slew-rate = <2>;

drive-push-pull;

bias-disable;

};

};

sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {

pins1 {

pinmux = <STM32_PINMUX('B', 14, AF9)>, /* SDMMC2_D0 */

<STM32_PINMUX('B', 15, AF9)>, /* SDMMC2_D1 */

<STM32_PINMUX('B', 3, AF9)>, /* SDMMC2_D2 */

<STM32_PINMUX('B', 4, AF9)>; /* SDMMC2_D3 */

slew-rate = <1>;

drive-push-pull;

bias-disable;

};

pins2 {

pinmux = <STM32_PINMUX('E', 3, AF9)>; /* SDMMC2_CK */

slew-rate = <2>;

drive-push-pull;

bias-disable;

};

pins3 {

pinmux = <STM32_PINMUX('G', 6, AF10)>; /* SDMMC2_CMD */

slew-rate = <1>;

drive-open-drain;

bias-disable;

};

};

sdmmc2_d47_pins_a: sdmmc2-d47-0 {

pins {

pinmux = <STM32_PINMUX('A', 8, AF9)>, /* SDMMC2_D4 */

<STM32_PINMUX('A', 9, AF10)>, /* SDMMC2_D5 */

<STM32_PINMUX('E', 5, AF9)>, /* SDMMC2_D6 */

<STM32_PINMUX('D', 3, AF9)>; /* SDMMC2_D7 */

slew-rate = <1>;

drive-push-pull;

bias-pull-up;

};

};

sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {

pins {

pinmux = <STM32_PINMUX('A', 8, ANALOG)>, /* SDMMC2_D4 */

<STM32_PINMUX('A', 9, ANALOG)>, /* SDMMC2_D5 */

<STM32_PINMUX('E', 5, ANALOG)>, /* SDMMC2_D6 */

<STM32_PINMUX('D', 3, ANALOG)>; /* SDMMC2_D7 */

};

};

2.实验目的

熟悉基于Linux操作系统下的块设备驱动移植配置过程。

3.实验平台

华清远见开发环境,FS-MP1A平台;

4.实验步骤

1.导入交叉编译工具链

linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi

2.添加eMMC设备树配置

修改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";

};

3.配置内核

由于内核源码默认配置已经支持eMMC,本节列出主要选项,如下

linux@ubuntu:$ make menuconfig

Device Drivers --->

<*> MMC/SD/SDIO card support --->

[*] STMicroelectronics STM32 SDMMC Controller

4.编译内核级设备树:

linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040

5.重启测试

将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,重启设备后可以看到如下启动信息:

由于eMMC中有出厂预

装的FS-MP1A系统,所以可以正常完成文件系统挂载进入系统:

硬件平台:华清远见FS-MP1A开发板(STM32MP157)

部分开发教程下载:加QQ群459754978,群文件里有。

部分视频课程收看:华清远见研发中心的个人空间_哔哩哔哩_Bilibili

淘宝购买链接:华清远见stm32mp157 linux开发板stm32单片机arm开发嵌入式学习板

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值