天天看點

STM32MP157 Linux系統移植開發篇10:Linux核心網卡驅動移植

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

實驗原理

STM32MP157A系列SoC內建一個千兆以太網媒體通路控制器,支援RMII和MII兩種标準的PHY,FS-MP1A裝置上外接了一個瑞昱的千兆以太網PHY晶片RTL8211F,原理圖如下:

STM32MP157 Linux系統移植開發篇10:Linux核心網卡驅動移植

檢視原理圖得出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
  1. 網卡裝置樹節點

參考文檔:

Documentation/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: [email protected] {

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的描述符合我們的要求,内容如下:

&ethernet0 {

status = "okay";

pinctrl-0 = <&ethernet0_rgmii_pins_a>;

pinctrl-1 = <&ethernet0_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: [email protected] {

reg = <0>;

};

};

};

  1. 管腳定義

在核心中STM32MP1預設管腳定義在檔案arch/arm/dts/stm32mp15-pinctrl.dtsi中,檢視檔案中是否有需要的管腳定義:

檢視後确認有ethernet的管腳定義,且與FS-MP1A硬體使用情況一緻,定義如下:

ethernet0_rgmii_pins_a: rgmii-0 {

pins1 {

pinmux = <STM32_PINMUX('G', 5, AF11)>,

<STM32_PINMUX('G', 4, AF11)>,

<STM32_PINMUX('G', 13, AF11)>,

<STM32_PINMUX('G', 14, AF11)>,

<STM32_PINMUX('C', 2, AF11)>,

<STM32_PINMUX('E', 2, AF11)>,

<STM32_PINMUX('B', 11, AF11)>,

<STM32_PINMUX('C', 1, AF11)>;

bias-disable;

drive-push-pull;

slew-rate = <2>;

};

pins2 {

pinmux = <STM32_PINMUX('A', 2, AF11)>;

bias-disable;

drive-push-pull;

slew-rate = <0>;

};

pins3 {

pinmux = <STM32_PINMUX('C', 4, AF11)>,

<STM32_PINMUX('C', 5, AF11)>,

<STM32_PINMUX('B', 0, AF11)>,

<STM32_PINMUX('B', 1, AF11)>,

<STM32_PINMUX('A', 1, AF11)>,

<STM32_PINMUX('A', 7, AF11)>;

bias-disable;

};

};

ethernet0_rgmii_pins_sleep_a: rgmii-sleep-0 {

pins1 {

pinmux = <STM32_PINMUX('G', 5, ANALOG)>,

<STM32_PINMUX('G', 4, ANALOG)>,

<STM32_PINMUX('G', 13, ANALOG)>,

<STM32_PINMUX('G', 14, ANALOG)>,

<STM32_PINMUX('C', 2, ANALOG)>,

<STM32_PINMUX('E', 2, ANALOG)>,

<STM32_PINMUX('B', 11, ANALOG)>,

<STM32_PINMUX('A', 2, ANALOG)>,

<STM32_PINMUX('C', 1, ANALOG)>,

<STM32_PINMUX('C', 4, ANALOG)>,

<STM32_PINMUX('C', 5, ANALOG)>,

<STM32_PINMUX('B', 0, ANALOG)>,

<STM32_PINMUX('B', 1, ANALOG)>,

<STM32_PINMUX('A', 1, ANALOG)>,

<STM32_PINMUX('A', 7, ANALOG)>;

};

};

實驗目的

熟悉基于Linux作業系統下的網卡驅動移植配置過程。

實驗平台

華清遠見開發環境,FS-MP1A平台;

實驗步驟

  1. 導入交叉編譯工具鍊

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

  1. 添加網卡裝置樹配置。

修改arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi檔案

在檔案末尾添加如下内容:

&ethernet0 {

status = "okay";

pinctrl-0 = <&ethernet0_rgmii_pins_a>;

pinctrl-1 = <&ethernet0_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: [email protected] {

reg = <0>;

};

};

};

  1. 配置核心

由于核心源碼預設配置以及支援網卡,本節列出主要選項,如下:

[email protected]:$ 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

  1. 編譯核心及裝置樹:

[email protected]:$ make -j4 uImage dtbs LOADADDR=0xC2000040

  1. 重新開機測試

将編譯好的裝置樹和核心鏡像拷貝到/tftpboot目錄下,通過tftp引導核心,重新開機裝置後可以看到如下啟動資訊:

STM32MP157 Linux系統移植開發篇10:Linux核心網卡驅動移植
STM32MP157 Linux系統移植開發篇10:Linux核心網卡驅動移植

通過Ping 測試網卡

[email protected]:$ ping http://www.baidu.com

STM32MP157 Linux系統移植開發篇10:Linux核心網卡驅動移植

如果裝置不能接入以太網,可以ping主機

硬體平台:華清遠見FS-MP1A開發闆(STM32MP157)

部分開發教程下載下傳:加QQ群459754978,群檔案裡有。

部分視訊課程收看:華清遠見研發中心的個人空間_哔哩哔哩_Bilibili

淘寶購買連結:華清遠見stm32mp157 linux開發闆stm32單片機arm開發嵌入式學習闆

繼續閱讀