本文章为《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.实验原理STM32MP157A系列SoC集成一个千兆以太网媒体访问控制器,支持RMII和MII两种标准的PHY,FS-MP1A设备上外接了一个瑞昱的千兆以太网PHY芯片RTL8211F,原理图如下:
查看原理图得出RTL8211F数据管脚与STM32MP157A的管脚对应关系如下: 原理图网络编号 | 对应管脚 | 管脚功能 | 管脚功能码 | ETH_MDC | PC1 | ETH1_MDC | AF11 | ETH_MDIO | PA2 | ETH1_MDIO | AF11 | ETH_TXD0 | PG13 | ETH1_*MII_ TXD0 | AF11 | ETH_TXD1 | PG14 | ETH1_*MII_ TXD1 | AF11 | ETH_TXD2 | PC2 | ETH1_*MII_ TXD2 | AF11 | ETH_TXD3 | PE2 | ETH1_*MII_ TXD3 | AF11 | ETH_TX_EN | PB11 | ETH1_*MII_ TX_EN | AF11 | ETH_TX_CLK | PG4 | ETH1_*MII_ GTX_CLK | AF11 | ETH_RXD0 | PC4 | ETH1_*MII_ RXD0 | AF11 | ETH_RXD1 | PC5 | ETH1_*MII_ RXD1 | AF11 | ETH_RXD2 | PB0 | ETH1_*MII_ RXD2 | AF11 | ETH_RXD3 | PB1 | ETH1_*MII_ RXD3 | AF11 | ETH_RX_DV | PA7 | ETH1_*MII_RX _DV | AF11 | ETH_RX_CLK | PA1 | ETH1_*MII_RX _CLK | AF11 | ETH_CLK125 | PG5 | ETH1_*MII_ CLK125 | AF11 | ETH_RST | PH2 | ETH1_*MII_ CRS | AF11 |
参考文档: Documenta tion/devicetree/bindings/net/stm32-dwmac.txt Documentation/devicetree/bindings/net/ethernet-controller.yaml Documentation/devicetree/bindings/net/ethernet-phy.yaml Documentation/devicetree/bindings/net/snps,dwmac.yam 内核中ST对STM32MP15x系列芯片的设备树资源了做了定义,可参见: arch/arm/boot/dts/stm32mp151.dtsi stm32mp151中ethernet定义如下: ethernet0: ethernet@5800a000 { compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a"; reg = <0x5800a000 0x2000>; reg-names = "stmmaceth"; interrupts-extended = <&intc GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH>, <&exti 70 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "macirq", "eth_wake_irq"; clock-names = "stmmaceth", "mac-clk-tx", "mac-clk-rx", "ethstp"; clocks = <&rcc ETHMAC>, <&rcc ETHTX>, <&rcc ETHRX>, <&rcc ETHSTP>; st,syscon = <&syscfg 0x4>; snps,mixed-burst; snps,pbl = <2>; snps,en-tx-lpi-clockgating; snps,axi-config = <&stmmac_axi_config_0>; snps,tso; power-domains = <&pd_core>; status = "disabled"; }; 上述代码只对ethernet做了基本的初始化,并没有针对不同的硬件设计做适配,所以需结合硬件补全设备树节点信息。 对照内核文档目录下相关文档添加补充相关信息,亦可参考内核中其他设备树文件中相关描述,比如stm32mp15xx-dkx.dtsi关于ethernet的描述符合我们的要求,内容如下: ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rgmii_pins_a>; pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rgmii-id"; max-speed = <1000>; phy-handle = <&phy0>;
mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; }; 在内核中STM32MP1默认管脚定义在文件
arch/arm/dts/stm32mp15-pinctrl.dtsi中,查看文件中是否有需要的管脚定义: 查看后确认有ethernet的管脚定义,且与FS-MP1A硬件使用情况一致,定义如下: ethernet0_rgmii_pins_a: rgmii-0 { pins1 { pinmux = , /* ETH_RGMII_CLK125 */ , /* ETH_RGMII_GTX_CLK */ , /* ETH_RGMII_TXD0 */ , /* ETH_RGMII_TXD1 */ , /* ETH_RGMII_TXD2 */ , /* ETH_RGMII_TXD3 */ , /* ETH_RGMII_TX_CTL */ ; /* ETH_MDC */ bias-disable; drive-push-pull; slew-rate = <2>; }; pins2 { pinmux = ; /* ETH_MDIO */ bias-disable; drive-push-pull; slew-rate = <0>; }; pins3 { pinmux = , /* ETH_RGMII_RXD0 */ , /* ETH_RGMII_RXD1 */ , /* ETH_RGMII_RXD2 */ , /* ETH_RGMII_RXD3 */ , /* ETH_RGMII_RX_CLK */ ; /* ETH_RGMII_RX_CTL */ bias-disable; }; };
ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 { pins1 { pinmux = , /* ETH_RGMII_CLK125 */ , /* ETH_RGMII_GTX_CLK */ , /* ETH_RGMII_TXD0 */ , /* ETH_RGMII_TXD1 */ , /* ETH_RGMII_TXD2 */ , /* ETH_RGMII_TXD3 */ , /* ETH_RGMII_TX_CTL */ , /* ETH_MDIO */ , /* ETH_MDC */ , /* ETH_RGMII_RXD0 */ , /* ETH_RGMII_RXD1 */ , /* ETH_RGMII_RXD2 */ , /* ETH_RGMII_RXD3 */ , /* ETH_RGMII_RX_CLK */ ; /* ETH_RGMII_RX_CTL */ }; }; 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文件 在文件末尾添加如下内容: ðernet0 { status = "okay"; pinctrl-0 = <ðernet0_rgmii_pins_a>; pinctrl-1 = <ðernet0_rgmii_pins_sleep_a>; pinctrl-names = "default", "sleep"; phy-mode = "rgmii-id"; max-speed = <1000>; phy-handle = <&phy0>;
mdio0 { #address-cells = <1>; #size-cells = <0>; compatible = "snps,dwmac-mdio"; phy0: ethernet-phy@0 { reg = <0>; }; }; }; 由于内核源码默认配置以及支持网卡,本节列出主要选项,如下: 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 linux@ubuntu:$ make -j4 uImage dtbs LOADADDR=0xC2000040
将编译好的设备树和内核镜像拷贝到/tftpboot目录下,通过tftp引导内核,重启设备后可以看到如下启动信息:
通过Ping 测试网卡
如果设备不能接入以太网,可以ping主机
硬件平台:华清远见FS-MP1A开发板(STM32MP157) 部分开发教程下载:加QQ群459754978,群文件里有。 部分视频课程收看:华清远见研发中心的个人空间_哔哩哔哩_Bilibili 淘宝购买链接:华清远见stm32mp157 linux开发板stm32单片机arm开发嵌入式学习板
|