你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:55
1.实验原理

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

4f511c126996719720dc334d7edd11fb.jpg

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

1.eMMC设备树节点

内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见:

  1. arch/arm/boot/dts/stm32mp151.dtsi

  2. stm32mp151中sdmmc2定义如下:

  3. sdmmc2: sdmmc@58007000 {

  4. compatible = "arm,pl18x", "arm,primecell";

  5. arm,primecell-periphid = <0x00253180>;

  6. reg = <0x58007000 0x1000>, <0x58008000 0x1000>;

  7. interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;

  8. interrupt-names = "cmd_irq";

  9. clocks = <&rcc SDMMC2_K>;

  10. clock-names = "apb_pclk";

  11. resets = <&rcc SDMMC2_R>;

  12. cap-sd-highspeed;

  13. cap-mmc-highspeed;

  14. max-frequency = <120000000>;

  15. status = "disabled";

  16. };
复制代码

上述代码只对sdmmc2做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。

eMMC有8根数据线,且eMMC无需热插拔等功能,结合硬件信息添加sdmmc2节点信息,也可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-edx.dtsi关于sdmmc2的描述符合我们的要求,内容如下:

  1. &sdmmc2 {

  2. pinctrl-names = "default", "opendrain", "sleep";

  3. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;

  4. pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;

  5. pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;

  6. non-removable;

  7. no-sd;

  8. no-sdio;

  9. st,neg-edge;

  10. bus-width = <8>;

  11. vmmc-supply = <&v3v3>;

  12. vqmmc-supply = <&vdd>;

  13. mmc-ddr-3_3v;

  14. status = "okay";

  15. };
复制代码

2.管脚定义

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

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

  1. sdmmc2_b4_pins_a: sdmmc2-b4-0 {

  2. pins1 {

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

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

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

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

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

  8. slew-rate = <1>;

  9. drive-push-pull;

  10. bias-pull-up;

  11. };

  12. pins2 {

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

  14. slew-rate = <2>;

  15. drive-push-pull;

  16. bias-pull-up;

  17. };

  18. };

  19. sdmmc2_b4_od_pins_a: sdmmc2-b4-od-0 {

  20. pins1 {

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

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

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

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

  25. slew-rate = <1>;

  26. drive-push-pull;

  27. bias-pull-up;

  28. };

  29. pins2 {

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

  31. slew-rate = <2>;

  32. drive-push-pull;

  33. bias-pull-up;

  34. };

  35. pins3 {

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

  37. slew-rate = <1>;

  38. drive-open-drain;

  39. bias-pull-up;

  40. };

  41. };

  42. sdmmc2_b4_sleep_pins_a: sdmmc2-b4-sleep-0 {

  43. pins {

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

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

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

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

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

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

  50. };

  51. };

  52. sdmmc2_b4_pins_b: sdmmc2-b4-1 {

  53. pins1 {

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

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

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

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

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

  59. slew-rate = <1>;

  60. drive-push-pull;

  61. bias-disable;

  62. };

  63. pins2 {

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

  65. slew-rate = <2>;

  66. drive-push-pull;

  67. bias-disable;

  68. };

  69. };

  70. sdmmc2_b4_od_pins_b: sdmmc2-b4-od-1 {

  71. pins1 {

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

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

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

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

  76. slew-rate = <1>;

  77. drive-push-pull;

  78. bias-disable;

  79. };

  80. pins2 {

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

  82. slew-rate = <2>;

  83. drive-push-pull;

  84. bias-disable;

  85. };

  86. pins3 {

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

  88. slew-rate = <1>;

  89. drive-open-drain;

  90. bias-disable;

  91. };

  92. };

  93. sdmmc2_d47_pins_a: sdmmc2-d47-0 {

  94. pins {

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

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

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

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

  99. slew-rate = <1>;

  100. drive-push-pull;

  101. bias-pull-up;

  102. };

  103. };

  104. sdmmc2_d47_sleep_pins_a: sdmmc2-d47-sleep-0 {

  105. pins {

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

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

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

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

  110. };

  111. };
复制代码

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节点下添加如下内容:

  1. &sdmmc2 {

  2. pinctrl-names = "default", "opendrain", "sleep";

  3. pinctrl-0 = <&sdmmc2_b4_pins_a &sdmmc2_d47_pins_a>;

  4. pinctrl-1 = <&sdmmc2_b4_od_pins_a &sdmmc2_d47_pins_a>;

  5. pinctrl-2 = <&sdmmc2_b4_sleep_pins_a &sdmmc2_d47_sleep_pins_a>;

  6. non-removable;

  7. no-sd;

  8. no-sdio;

  9. st,neg-edge;

  10. bus-width = <8>;

  11. vmmc-supply = <&v3v3>;

  12. vqmmc-supply = <&vdd>;

  13. mmc-ddr-3_3v;

  14. status = "okay";

  15. };
复制代码

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引导内核,重启设备后可以看到如下启动信息:

f5a98c74cf1c3e488107fc9ab5244afb.png

由于eMMC中有出厂预

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

0fb51a7f44c5f3b6884ca657a1bd9022.png
————————————————
版权声明:华清远见IT开放实验室


收藏 评论0 发布时间:2022-9-30 18:55

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版