11、STM32MP157A-EMMC移植

1、原理图

参考原理图可知 eMMC 使用的是 sdmmc2 总线,当前所使用的设备树文件中没有sdmmc2 的支持,所以需要增加相关内容才能正常驱动 eMMC

在这里插入图片描述

由于在使 STM32MP1 芯片很多管脚为多功能复用管脚,且很多管脚具备同样的功能,所以移植eMMC时需要确认硬件设计是使用的是那些管脚,根据原理图确认后管脚对应关系为:

在这里插入图片描述

在这里插入图片描述

2、设备树节点

内核中 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";
};
3、管脚定义

在内核中 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 */
    };
};
4、导入工具链

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

5、添加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";
};
6、配置内核

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

make menuconfig
Device Drivers --->
    <*> MMC/SD/SDIO card support --->
    [*] STMicroelectronics STM32 SDMMC Controller

编译内核设备树

make -j4 uImage dtbs LOADADDR=0xC2000040

由于只修改了设备树

make dtbs

cp arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb /tftpboot/

7、升级设备树。

uboot输入 run bootcmd_pxe

在这里插入图片描述

8、EMMC相关指令

fdisk -l

此为emmc设备

在这里插入图片描述

此为tf卡设备

在这里插入图片描述

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值