飛騰E2000板載以太網(wǎng)適配
?
-
- 1. 設(shè)備樹移植
- 2. MACB驅(qū)動移植
-
3. 網(wǎng)絡(luò)連通性調(diào)試
- 3-1. MACB驅(qū)動環(huán)回測試
- 3-2. YT8521 PHY工作模式及電壓確認(rèn)
- 3-3. YT8521 PHY環(huán)回測試
- 3-4. YT8521 PHY tx delay調(diào)整
飛騰E2000嵌入式板卡的MAC芯片對應(yīng)linux通用macb驅(qū)動,外接YT8521 PHY芯片。飛騰在5.10內(nèi)核上進(jìn)行過適配,現(xiàn)將其移植到麒麟5.4內(nèi)核。
?
本文參考資料:
飛騰5.10內(nèi)核源碼
飛騰E2000以太網(wǎng)驅(qū)動注冊和使用簡介
飛騰騰瓏E2000軟件編程手冊V0.6.pdf
YT8521S初始化配置相關(guān)ver2.1.pdf
YT8521SH-CA_YT8521SC-CA_Datasheet_v1.02.pdf
1. 設(shè)備樹移植
phy-mode
為MAC芯片與PHY芯片物理層的連接方式,這涉及到真實的物理連接方式,本文所用的硬件采用rgmii模式。
注:rgmii模式下,tx clk由mac提供,rx clK由phy提供。
macb0: ethernet@3200c000 {
compatible = "cdns,phytium-gem-1.0";
reg = <0x0 0x3200c000 0x0 0x2000>;
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
...
<GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
clock-names = "pclk", "hclk", "tx_clk", "tsu_clk";
clocks = <&sysclk_250mhz>, <&sysclk_48mhz>, <&sysclk_48mhz>, <&sysclk_250mhz>;
magic-packet;
status = "okay";
phy-mode = "rgmii";
use-mii;
};
2. MACB驅(qū)動移植
飛騰5.10 macb驅(qū)動無法直接替換麒麟5.4 macb驅(qū)動,因此需要進(jìn)行手動移植。
根據(jù)設(shè)備樹知道硬件通過cdns,phytium-gem-1.0
進(jìn)行匹配,因此需要在macb_dt_ids
中新增cdns,phytium-gem-1.0
條目,并將phytium_gem1p0_config
移植到麒麟5.4內(nèi)核中。
drivers/net/ethernet/cadence/macb_main.c:
static const struct macb_config phytium_gem1p0_config = {
.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
MACB_CAPS_JUMBO |
MACB_CAPS_GEM_HAS_PTP |
MACB_CAPS_BD_RD_PREFETCH |
MACB_CAPS_SEL_CLK,
.dma_burst_length = 16,
.clk_init = phytium_clk_init,
.init = phytium_init,
.jumbo_max_len = 16360,
.sel_clk_hw = phytium_gem1p0_sel_clk,
};
static const struct of_device_id macb_dt_ids[] = {
...
{ .compatible = "cdns,phytium-gem-1.0", .data = &phytium_gem1p0_config },
...
}
由于麒麟5.4 macb驅(qū)動與飛騰5.10 macb驅(qū)動有所差別,僅移植以上部分還不夠。
根據(jù)phytium_gem1p0_config
的定義,其中包含了.sel_clk_hw = phytium_gem1p0_sel_clk
,但在麒麟5.4 macb驅(qū)動中并未定義和使用phytium_gem1p0_sel_clk
函數(shù)。
查看飛騰5.10內(nèi)核phytium_gem1p0_sel_clk
函數(shù)實現(xiàn)及調(diào)用,發(fā)現(xiàn)當(dāng)caps & MACB_CAPS_SEL_CLK
成立時該函數(shù)才會被調(diào)用,并且在麒麟5.4內(nèi)核中存在功能等價的替代函數(shù)phytium_gem_sel_clk
,該替代函數(shù)只有caps & MACB_CAPS_SEL_CLK_HW
成立時才被調(diào)用。
飛騰5.10
drivers/net/ethernet/cadence/macb_main.c:
static void macb_mac_link_up(struct phylink_config *config,
struct phy_device *phy,
unsigned int mode, phy_interface_t interface,
int speed, int duplex,
bool tx_pause, bool rx_pause)
{
... ...
if (bp->caps & MACB_CAPS_SEL_CLK)
bp->sel_clk_hw(bp, speed);
... ...
}
麒麟5.4
static void macb_handle_link_change(struct net_device *dev)
{
... ...
if (bp->caps & MACB_CAPS_SEL_CLK_HW)
phytium_gem_sel_clk(bp);
... ...
}
綜上,最終驅(qū)動的移植方案是使用phytium_gem_sel_clk + MACB_CAPS_SEL_CLK_HW
替代phytium_gem1p0_sel_clk + MACB_CAPS_SEL_CLK
如下:
drivers/net/ethernet/cadence/macb_main.c:
static const struct macb_config phytium_gem1p0_config = {
.caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE |
MACB_CAPS_JUMBO |
MACB_CAPS_GEM_HAS_PTP |
MACB_CAPS_BD_RD_PREFETCH |
MACB_CAPS_SEL_CLK_HW,
.dma_burst_length = 16,
.clk_init = macb_clk_init,
.init = macb_init,
.jumbo_max_len = 16360,
//.sel_clk_hw = phytium_gem1p0_sel_clk,
};
static const struct of_device_id macb_dt_ids[] = {
...
{ .compatible = "cdns,phytium-gem-1.0", .data = &phytium_gem1p0_config },
...
}
3. 網(wǎng)絡(luò)連通性調(diào)試
macb驅(qū)動移植成功之后,網(wǎng)絡(luò)順利UP,但無法ping通.netstat -i
可以看到存在RX-OK、TX-OK計數(shù),并且計數(shù)正常累加。這里基本可以說明MAC層收發(fā)是正常的。
利用tcpdump
抓包發(fā)現(xiàn),雖然TX-OK正常累加,但對端陪測機(jī)無法抓到被測機(jī)所發(fā)的任何數(shù)據(jù)包,被測機(jī)能抓到陪測機(jī)發(fā)的數(shù)據(jù)包,基本確定網(wǎng)絡(luò)只能收不能發(fā)。
3-1. MACB驅(qū)動環(huán)回測試
飛騰騰瓏E2000軟件編程手冊V0.6.pdf中,以太網(wǎng)基地址如下:
?

?
在0x00 network_control寄存器中bit1為本地環(huán)回寄存器,將該bit位置1。
?

?
devmem2 $((0x32010000+0x00)) h #讀0x00寄存器的值
0x1c
devmem2 $((0x32010000+0x00)) h 0x1e #寫0x00寄存器,將bit1置1.
進(jìn)行ping環(huán)回抓包測試,測試通過,排除MAC層異常。
3-2. YT8521 PHY工作模式及電壓確認(rèn)
?

?
?

?
phy的工作模式和電壓與硬件強(qiáng)相關(guān),可以通過讀取0xa001擴(kuò)展配置寄存器,確認(rèn)phy工作模式與實際物理連接是否一致。
?

?
root@kylin:/opt/phytool# ./phytool write eth1/0x0/0x1e 0xa001 && ./phytool eth1/0x0/0x1f
ieee-phy: reg:0x1f val:0x8140
0xa001寄存器的值為0x8140,因此phy的工作模式配置為UTP_TO_RGMII,電壓為3.3v。
3-3. YT8521 PHY環(huán)回測試
在YT8521SH-CA_YT8521SC-CA_Datasheet_v1.02.pdf中PHY環(huán)回寄存器中,0x00基本控制寄存器bit14位是環(huán)回使能位。
?

?
需要說明的是在進(jìn)行環(huán)回測試時,需要將PHY Autonet_En關(guān)閉,否則網(wǎng)口無法UP。
./phytool write eth1/0x0/0x00 0x4140
./phytool eth1/0x0/0x00
這里phy 環(huán)回測試未通過,可以確定PHY未將數(shù)據(jù)發(fā)送出去,問題在PHY層發(fā)送方向。
3-4. YT8521 PHY tx delay調(diào)整
RGMII模式下,MAC負(fù)責(zé)提供TX時鐘,PHY提供RX時鐘。通過macb驅(qū)動確認(rèn)1000M帶寬下tx時鐘頻率為125MHz,確認(rèn)時鐘頻率正常。
drivers/net/ethernet/cadence/macb_main.c:
static void macb_set_tx_clk(struct clk *clk, int speed, struct net_device *dev)
{
... ...
switch (speed) {
... ...
case SPEED_1000:
rate = 125000000;
break;
default:
return;
}
rate_rounded = clk_round_rate(clk, rate);
if (rate_rounded < 0)
return;
/* RGMII allows 50 ppm frequency error. Test and warn if this limit
* is not satisfied.
*/
ferr = abs(rate_rounded - rate);
ferr = DIV_ROUND_UP(ferr, rate / 100000);
if (ferr > 5)
netdev_warn(dev, "unable to generate target frequency: %ld Hz\n",
rate);
if (clk_set_rate(clk, rate_rounded))
netdev_err(dev, "adjusting tx_clk failed.\n");
}
查看tx clk delay,讀取0xa003寄存器,千兆帶寬tx clk delay時延由bit3:0提供。
?

?
root@kylin:/opt/phytool# ./phytool write eth1/0x0/0x1e 0xa003 && ./phytool eth1/0x0/0x1f
ieee-phy: reg:0x1f val:0x00f1
0xa003 bit3:0 默認(rèn)為1,時延150ps,根據(jù)YT8521S初始化配置相關(guān)ver2.1.pdf資料,業(yè)內(nèi)默認(rèn)rgmii模式下tx clk delay默認(rèn)為750ps。
?

?
修改0xa003寄存器為750ps,千兆依然不通,從150ps增加到450ps時,可以ping通,但存在丟包的情況,繼續(xù)增加時延到1200ps(8*150ps)時,可以ping通,ping未看到丟包,千兆帶寬測試正常。
./phytool write eth1/0x0/0x1e 0xa003
./phytool write eth1/0x0/0x1f 0x00f8
附:文章來源:http://www.zghlxwxcb.cn/news/detail-747459.html
時鐘精度(Frequency Tolerance):時鐘精度一般是25℃下測量額時鐘相對于標(biāo)準(zhǔn)頻率的偏差,單位ppm(百萬分之一),例如測得精度為±15ppm,時鐘頻率為25MHz,周期為1/25MHz=40ns,精度偏差為40ns×(±15/1000000)=0.6ps
時鐘溫漂(Frequency versus Temperature Characteristics):由于晶振材料和工藝限制,致使時鐘在不同的溫度下精度會有較大偏差,單位也為ppm。例如溫漂為±100ppm,時鐘頻率為25MHz,周期為1/25MHz=40ns,精度偏差為40ns×(±100/1000000)=4ps
時鐘抖動(Jitter):晶振源固有的噪聲和干擾通常會帶來時鐘信號的周期性偏差。單位一般為ps文章來源地址http://www.zghlxwxcb.cn/news/detail-747459.html
到了這里,關(guān)于飛騰E2000板載以太網(wǎng)適配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!