在linux kerneldriver/net/ethernet/nxpmac目錄下的**是對s5p4418 soc中的mac進行初始化,該目錄下仍然存在大量的stmmac
其中在nxpmac_main.c中是這個驅動的入口,在這個原始檔中存在
module_init(stmmac_init);
module_exit(stmmac_exit);
在stmmac_init函式中呼叫stmmac_register_platform向kernel註冊驅動程式。而stmmac_register_platform函式存在於nxpmac.h,函式實體如下:
extern struct platform_driver stmmac_pltfr_driver;
static inline int stmmac_register_platform(void)
static inline void stmmac_unregister_platform(void)
進一步追蹤stmmac_pltfr_driver變數,在nxpmac_platform.c中發現該變數的定義
struct platform_driver stmmac_pltfr_driver = ,
};對stmmac_pltfr_probe進行分析:首先是獲取mac i/o記憶體的起始位址和大小(mac和phy暫存器的位址資源)res = platform_get_resource(pdev, ioresource_mem, 0);
然後在核心io記憶體request_mem_region(res->start, resource_size(res), pdev->name),申請成功後使用addr = ioremap(res->start, resource_size(res));獲取實體地址對應的虛擬位址。
緊接著,驅動程式獲取之前註冊裝置的時候註冊的資料plat_dat = dev_get_platdata(&pdev->dev);如果註冊裝置的時候沒有註冊platdata,那麼驅動程式會為platdata申請記憶體
if (!plat_dat)
plat_dat = devm_kzalloc(&pdev->dev,
sizeof(struct plat_stmmacenet_data),
gfp_kernel);
接下來會呼叫ret = stmmac_probe_config_dt(pdev, plat_dat, &mac);這個函式的作用是獲取註冊裝置的時候註冊的一些配置。但是在nanopc-t2中,這個函式是空的,不會做任何的事情。
驅動會呼叫註冊裝置時候新增的乙個init函式
if (plat_dat->init)
static struct plat_stmmacenet_data nxpmac_plat_data = ;
在nxpmac_init函式中做如下的配置:
一、時鐘設定
1、在s5p4418 soc中存在乙個clok generator模組,在這個模組中控制各個ip時鐘產生,在nxpmac_init會獲取控制gmac始終控制暫存器的位址
addr = nx_clkgen_getphysicaladdress(clockindex_of_dwc_gmac_module);
2、設定gmacclkgen0l暫存器的clksrcsel0=4,意味著rx的時鐘來自外部。在nanopc-t2中,rx時鐘來自phy晶元
nx_clkgen_setclocksource( clockindex_of_dwc_gmac_module, 0, 4);
3、設定gmacclkgen0l暫存器的clkdiv0=0
nx_clkgen_setclockdivisor( clockindex_of_dwc_gmac_module, 0, 1);
4、設定gmacclk暫存器的outclkinv0=0(normal:falling edge)
nx_clkgen_setclockoutinv( clockindex_of_dwc_gmac_module, 0, cfalse);
5、設定gmacclkenb暫存器的clkgenenb=1
nx_clkgen_setclockdivisorenable( clockindex_of_dwc_gmac_module, ctrue);
二、復位控制設定
1、獲取復位控制暫存器的實體地址,開始位址在0xc001_2000
2、讓mac ip核覆位一下
nx_rstcon_setnrst(resetindex_of_dwc_gmac_module_aresetn_i, rstcon_enable);
udelay(100);
nx_rstcon_setnrst(resetindex_of_dwc_gmac_module_aresetn_i, rstcon_disable);
udelay(100);
nx_rstcon_setnrst(resetindex_of_dwc_gmac_module_aresetn_i, rstcon_enable);
udelay(100);
三、讓phy晶元復位
1、外部的phy晶元的reset與s5p4418的乙個引腳相連,驅動程式通過讓此引腳輸出低電平來達到讓phy復位的功能
gpio_request(cfg_ether_gmac_phy_rst_num,"ethernet rst pin");
gpio_direction_output(cfg_ether_gmac_phy_rst_num, 1 );
udelay( 100 );
gpio_set_value(cfg_ether_gmac_phy_rst_num, 0 );
udelay( 100 );
gpio_set_value(cfg_ether_gmac_phy_rst_num, 1 );
以上步驟執行完畢後,返回stmmac_pltfr_probe函式執行priv = stmmac_dvr_probe(&(pdev->dev), plat_dat, addr);
下一章介紹stmmac_dvr_probe函式的過程。
NanoPC T2 乙太網分析 3
本章節用來介紹stmmac dvr probe函式過程。函式一開始就呼叫nxp plat initialize函式對mac ip核覆位 phy復位 mac ip核用到的時鐘進行初始化,但是這部分做的事情跟註冊mac裝置的時候nxpmac init做的事情完全一樣,所以這個函式做的事情就不再進行詳細的...
NanoPC T2 使用記錄
這裡記錄一些指令碼,方便開發。大多基於來的。交叉工具鏈我使用的是gcc arm linux gnueabihf,安裝方法是 sudo apt get install gcc arm linux gnueabihf 核心中配置交叉工具鏈 make menuconfig general setup ar...
基於ns2的乙太網基礎實驗
試驗平台 cygwin 和ns2.31 沒有任何補丁。實驗目的 深入學習以太 性,深入了解 csma cd 原理。實驗步驟 構建乙個如下圖所示的乙太網,在這個網路中,4個節點共享乙個傳輸介質 匯流排 任何時間只能有一對節點傳輸資料。在ns2 中建立乙太網 區域網 的方法是使用 make lan 函式...