大家好:
我有个方案需要实现:DM8168想和另外一个ARM设备通过MAC直连实现通信(即没有PHY,为了省成本….), 网上说在设备树里边把PHY的属性设置为fixed-link即可。DM8168有这方面更详细的资料或者介绍吗? 多谢!
Chris Meng:
你好,
请参考下面讨论的信息:
https://e2e.ti.com/support/dsp/davinci_digital_media_processors/f/717/t/261978
tao li89:
楼主实现了吗?MII直连,使用fixed-link方式是否能正常通信
dadi zeng:
回复 tao li89:
我没有在dm8168上实现,但我在海思3521A 和 xilinx的ZYNQ平台上实现了,应该对DM8168是一样的。
有2种办法:
1.如果你的内核比较新,那内核是支持MAC直连的。在设备树里直接把MAC属性设置为fixed-link就可以了。参考内核以下文档 Documentation\devicetree\bindings\net\fixed-link.txt下边有我的一个参考设备树(上边一个MAC是带了PHY和PC相连的,下边一个MAC不带PHY和另外一个芯片直连的):可以看到带PHY的话,MAC需要描述相关MDIO总线信息和挂在MDIO总线上的PHY芯片信息。不带PHY的话,MAC直接通过fixed-link属性写死ps7-ethernet@e000b000 {#address-cells = <1>;#size-cells = <0>;clock-names = "ref_clk", "aper_clk";clocks = <0x2 0xd 0x2 0x1e>;compatible = "xlnx,ps7-ethernet-1.00.a";interrupt-parent = <0x3>;interrupts = <0x0 0x16 0x4>;local-mac-address = [00 0a 35 00 00 01];phy-handle = <&phy0>;phy-mode = "gmii";xlnx,ptp-enet-clock = <125000000>;xlnx,slcr-div0-1000Mbps = <0x8>;xlnx,slcr-div0-100Mbps = <0x8>;xlnx,slcr-div0-10Mbps = <0x8>;xlnx,slcr-div1-1000Mbps = <0x1>;xlnx,slcr-div1-100Mbps = <0x5>;xlnx,slcr-div1-10Mbps = <0x32>;reg = <0xe000b000 0x1000>;xlnx,enet-reset = "<Select>";xlnx,eth-mode = <0x0>;xlnx,has-mdio = <0x1>;mdio {#address-cells = <1>;#size-cells = <0>;phy0:phy@0{compatible = "marvell,88e1510";device_type = "ethernet-phy";reg = <0x0>;marvell,reg-init = <0x3 0x16 0xff00 0x1e 0x3 0x17 0xfff0 0x0a>;} ;} ;};ps7-ethernet@e000c000 {#address-cells = <1>;#size-cells = <0>;clock-names = "ref_clk", "aper_clk";clocks = <0x2 0xe 0x2 0x1f>;
compatible = "xlnx,ps7-ethernet-1.00.a";interrupt-parent = <0x3>;interrupts = <0x0 0x2d 0x4>;local-mac-address = [00 0a 35 00 00 02];phy-mode = "gmii";xlnx,ptp-enet-clock = <125000000>;xlnx,slcr-div0-1000Mbps = <0x8>;xlnx,slcr-div0-100Mbps = <0x8>;xlnx,slcr-div0-10Mbps = <0x8>;xlnx,slcr-div1-1000Mbps = <0x1>;xlnx,slcr-div1-100Mbps = <0x5>;xlnx,slcr-div1-10Mbps = <0x32>;reg = <0xe000c000 0x1000>;xlnx,enet-reset = "<Select>";xlnx,eth-mode = <0x0>;xlnx,has-mdio = <0x0>;fixed-link { speed = <1000>;full-duplex; };};
2. 如果内核比较旧, 那可以采用欺骗方式,具体实施方案是:MAC通过MDIO总线去读取PHY状态,PHY的前16个寄存器是固定用途的,其中有几个用于反馈速率和双工状态(网络的速率,双工模式等都是PHY芯片负责协商,MAC通过读取PHY的寄存器获得)。我们可以把MDIO总线的读取寄存器函数写死,比如读取速率寄存器,我就固定返回他的协商速率是1000M, 即软件模拟一个真实的PHY,这个方案在海思芯片验证是可行的。
tao li89:
回复 dadi zeng:
谢谢你的回复。我想问下直连FPGA时应该怎么做测试,以证明可以通信,因为我不是使用MCU与MCU对接,FPGA没有使用MAC控制器IP核?我使用的linux是比较新的4.4.19,使用fixed-link,出来eth1了,但我使用ping,用示波器抓取,发现mii的tx_en引脚没有波形,数据总线上也没有波形,不知怎样判断是否ok。FPGA方面做了“1,产生TX_CLK和RX_CLK给am3358。2,把TX_DATA[3:0]的数据总线环出到RX数据总线上,TX_EN和RX_DRV也接在一起”
tao li89:
回复 dadi zeng:
另外,如果两颗CPU的MAC直连,那怎么处理Rx_clk和Tx_clk,据我所知,MII的话他们都是PHY产生的,即对于CPU来说是输入的。直连时,两个输入的时钟脚直连不是有问题吗?
dadi zeng:
回复 tao li89:
我们这边的方案是FPGA + HISI。两边都工作在GMII模式下。FPGA那边的信息我不是很清楚,我这边负责软件。 FPGA有逻辑工程师负责。