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

STM32MP157 Linux系统移植开发篇10:Linux内核网卡驱动移植

[复制链接]
STMCU小助手 发布时间:2022-9-30 18:32
实验原理
STM32MP157A系列SoC集成一个千兆以太网媒体访问控制器,支持RMII和MII两种标准的PHY,FS-MP1A设备上外接了一个瑞昱的千兆以太网PHY芯片RTL8211F,原理图如下:

fb8444371c403890e20ca26280e681ab.jpg

查看原理图得出RTL8211F数据管脚与STM32MP157A的管脚对应关系如下:
U]J2_F36492~SGT0GYXVIDI.png

1.网卡设备树节点

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

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

  2. stm32mp151中ethernet定义如下:

  3. ethernet0: ethernet@5800a000 {

  4. compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";

  5. reg = <0x5800a000 0x2000>;

  6. reg-names = "stmmaceth";

  7. interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>,

  8. <&exti 70 IRQ_TYPE_LEVEL_HIGH>;

  9. interrupt-names = "macirq",

  10. "eth_wake_irq";

  11. clock-names = "stmmaceth",

  12. "mac-clk-tx",

  13. "mac-clk-rx",

  14. "ethstp";

  15. clocks = <&rcc ETHMAC>,

  16. <&rcc ETHTX>,

  17. <&rcc ETHRX>,

  18. <&rcc ETHSTP>;

  19. st,syscon = <&syscfg 0x4>;

  20. snps,mixed-burst;

  21. snps,pbl = <2>;

  22. snps,en-tx-lpi-clockgating;

  23. snps,axi-config = <&stmmac_axi_config_0>;

  24. snps,tso;

  25. power-domains = <&pd_core>;

  26. status = "disabled";

  27. };
复制代码

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

对照内核文档目录下相关文档添加补充相关信息,亦可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-dkx.dtsi关于ethernet的描述符合我们的要求,内容如下:

  1. ðernet0 {

  2. status = "okay";

  3. pinctrl-0 = <ðernet0_rgmii_pins_a>;

  4. pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;

  5. pinctrl-names = "default", "sleep";

  6. phy-mode = "rgmii-id";

  7. max-speed = <1000>;

  8. phy-handle = <&phy0>;

  9. mdio0 {

  10. #address-cells = <1>;

  11. #size-cells = <0>;

  12. compatible = "snps,dwmac-mdio";

  13. phy0: ethernet-phy@0 {

  14. reg = <0>;

  15. };

  16. };

  17. };
复制代码

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

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

  1. ethernet0_rgmii_pins_a: rgmii-0 {

  2. pins1 {

  3. pinmux = <STM32_PINMUX('G', 5, AF11)>, /* ETH_RGMII_CLK125 */

  4. <STM32_PINMUX('G', 4, AF11)>, /* ETH_RGMII_GTX_CLK */

  5. <STM32_PINMUX('G', 13, AF11)>, /* ETH_RGMII_TXD0 */

  6. <STM32_PINMUX('G', 14, AF11)>, /* ETH_RGMII_TXD1 */

  7. <STM32_PINMUX('C', 2, AF11)>, /* ETH_RGMII_TXD2 */

  8. <STM32_PINMUX('E', 2, AF11)>, /* ETH_RGMII_TXD3 */

  9. <STM32_PINMUX('B', 11, AF11)>, /* ETH_RGMII_TX_CTL */

  10. <STM32_PINMUX('C', 1, AF11)>; /* ETH_MDC */

  11. bias-disable;

  12. drive-push-pull;

  13. slew-rate = <2>;

  14. };

  15. pins2 {

  16. pinmux = <STM32_PINMUX('A', 2, AF11)>; /* ETH_MDIO */

  17. bias-disable;

  18. drive-push-pull;

  19. slew-rate = <0>;

  20. };

  21. pins3 {

  22. pinmux = <STM32_PINMUX('C', 4, AF11)>, /* ETH_RGMII_RXD0 */

  23. <STM32_PINMUX('C', 5, AF11)>, /* ETH_RGMII_RXD1 */

  24. <STM32_PINMUX('B', 0, AF11)>, /* ETH_RGMII_RXD2 */

  25. <STM32_PINMUX('B', 1, AF11)>, /* ETH_RGMII_RXD3 */

  26. <STM32_PINMUX('A', 1, AF11)>, /* ETH_RGMII_RX_CLK */

  27. <STM32_PINMUX('A', 7, AF11)>; /* ETH_RGMII_RX_CTL */

  28. bias-disable;

  29. };

  30. };

  31. ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 {

  32. pins1 {

  33. pinmux = <STM32_PINMUX('G', 5, ANALOG)>, /* ETH_RGMII_CLK125 */

  34. <STM32_PINMUX('G', 4, ANALOG)>, /* ETH_RGMII_GTX_CLK */

  35. <STM32_PINMUX('G', 13, ANALOG)>, /* ETH_RGMII_TXD0 */

  36. <STM32_PINMUX('G', 14, ANALOG)>, /* ETH_RGMII_TXD1 */

  37. <STM32_PINMUX('C', 2, ANALOG)>, /* ETH_RGMII_TXD2 */

  38. <STM32_PINMUX('E', 2, ANALOG)>, /* ETH_RGMII_TXD3 */

  39. <STM32_PINMUX('B', 11, ANALOG)>, /* ETH_RGMII_TX_CTL */

  40. <STM32_PINMUX('A', 2, ANALOG)>, /* ETH_MDIO */

  41. <STM32_PINMUX('C', 1, ANALOG)>, /* ETH_MDC */

  42. <STM32_PINMUX('C', 4, ANALOG)>, /* ETH_RGMII_RXD0 */

  43. <STM32_PINMUX('C', 5, ANALOG)>, /* ETH_RGMII_RXD1 */

  44. <STM32_PINMUX('B', 0, ANALOG)>, /* ETH_RGMII_RXD2 */

  45. <STM32_PINMUX('B', 1, ANALOG)>, /* ETH_RGMII_RXD3 */

  46. <STM32_PINMUX('A', 1, ANALOG)>, /* ETH_RGMII_RX_CLK */

  47. <STM32_PINMUX('A', 7, ANALOG)>; /* ETH_RGMII_RX_CTL */

  48. };

  49. };
复制代码

实验目的
熟悉基于Linux操作系统下的网卡驱动移植配置过程。

实验平台
FS-MP1A平台;

实验步骤
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.添加网卡设备树配置。
修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi文件

在文件末尾添加如下内容:

  1. ðernet0 {

  2. status = "okay";

  3. pinctrl-0 = <ðernet0_rgmii_pins_a>;

  4. pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>;

  5. pinctrl-names = "default", "sleep";

  6. phy-mode = "rgmii-id";

  7. max-speed = <1000>;

  8. phy-handle = <&phy0>;

  9. mdio0 {

  10. #address-cells = <1>;

  11. #size-cells = <0>;

  12. compatible = "snps,dwmac-mdio";

  13. phy0: ethernet-phy@0 {

  14. reg = <0>;

  15. };

  16. };

  17. };
复制代码

3.配置内核
由于内核源码默认配置以及支持网卡,本节列出主要选项,如下:

linux@ubuntu make menuconfig

Device Drivers --->
Network device support --->
Ethernet driver support --->

<*> STMicroelectronics Multi-Gigabit Ethernet driver

<*> STMMAC Platform bus support

<*> Support for snps,dwc-qos-ethernet.txt DT binding.

<*> Generic driver for DWMAC

<*> STM32 DWMAC support

3.编译内核及设备树:
linux@ubuntu make -j4 uImage dtbs LOADADDR=0xC2000040

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

fe313fb6f3db573dc16e24195050eeb0.png

b7c59f193686ab0c3636c67f18a87bef.png

通过Ping 测试网卡

0a8eef4b7b15a8e10806b5be32019be7.png

如果设备不能接入以太网,可以ping主机
————————————————
版权声明:华清远见IT开放实验室


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

举报

0个回答

所属标签

相似分享

官网相关资源

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