ETH网络


系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总
本文链接:《【SA8295P 源码分析】35 - QNX侧 Marvell 88Q5152 Phy_Switch 导通实录(硬核)



今天下午把 Marvell 88Q5152 Phy_Switch 导通了,使用车载以太网转换器ping 测试OK,接线方式如下:
电脑(RJ45网口)

     < 
    
   
     = 
    
   
     = 
    
   
     > 
    
   
  
    <==> 
   
  
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&lt;==&gt;</span></span></span></span></span> (<code>RJ4</code>网口)车载以太网转换器(<code>100/1000BASE-T1</code>) <span class="katex--inline"><span class="katex"><span class="katex-mathml"> 
 
  
   
   
     &lt; 
    
   
     = 
    
   
     = 
    
   
     &gt; 
    
   
  
    &lt;==&gt; 
   
  
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&lt;==&gt;</span></span></span></span></span> (<code>100/1000BASE-T1</code>) <code>SOC</code>车机</p> 


实测结果如下:

DHU SOC 端 ping 结果:
# ifconfig emac0 169.254.51.201
# ping 169.254.51.192
PING 169.254.51.192 (169.254.51.192): 56 data bytes
64 bytes from 169.254.51.192: icmp_seq=0 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=1 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=2 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=3 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=9 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=10 ttl=64 time=0 ms
64 bytes from 169.254.51.192: icmp_seq=11 ttl=64 time=0 ms

PC 端 ping 结果:
$ ping 169.254.51.192
PING 169.254.51.192 (169.254.51.192) 56(84) bytes of data.
64 bytes from 169.254.51.192: icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 169.254.51.192: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 169.254.51.192: icmp_seq=3 ttl=64 time=0.045 ms
64 bytes from 169.254.51.192: icmp_seq=4 ttl=64 time=0.048 ms
64 bytes from 169.254.51.192: icmp_seq=5 ttl=64 time=0.047 ms
64 bytes from 169.254.51.192: icmp_seq=6 ttl=64 time=0.047 ms

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

以太网带宽测试:

客户端配置

iperf3 -c 169.254.51.110   -p 5201

 
 
  • 1

服务端配置

# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 169.254.51.192, port 60966
[  5] local 169.254.51.110 port 5201 connected to 169.254.51.192 port 60968
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec   107 MBytes   896 Mbits/sec
[  5]   1.00-2.00   sec   112 MBytes   941 Mbits/sec
[  5]   2.00-3.00   sec   112 MBytes   942 Mbits/sec
[  5]   3.00-4.00   sec   112 MBytes   943 Mbits/sec
[  5]   4.00-5.00   sec   112 MBytes   942 Mbits/sec
[  5]   5.00-6.00   sec   112 MBytes   942 Mbits/sec
[  5]   6.00-7.00   sec   112 MBytes   943 Mbits/sec
[  5]   7.00-8.00   sec   112 MBytes   941 Mbits/sec
[  5]   8.00-9.00   sec   112 MBytes   943 Mbits/sec
[  5]   9.00-10.00  sec   112 MBytes   941 Mbits/sec
[  5]  10.00-10.00  sec   451 KBytes  2.11 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  1.09 GBytes   938 Mbits/sec                  receiver

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21


在前文《【SA8295P 源码分析】32 - QNX Ethernet Phy_Switch 驱动初始化 源码分析》中,
我们大致分析了下 EMAC MDIO 的源码初始化流程,同时根据初始化流程,我们也做了猜想,可以把 Swtich 初始化的代码放在 int emac_mdio_register(emac_dev_t *dev) 函数中来配置。

本文,我们根据导通后的修改总结总结,修改思路,其实跟前文分析差不多的。


一、硬件原理分析

先分析下原理框图,
可以看出,DHU SOC EMAC1 通过 Port 5 端口与 88Q5152 Switch 芯片相连接的,(需要配置 Switch Port 5 端口)
另一端,2x 1000M-T1 以太网 PHY 的两个接口,分别通过 P1P2 连接在 88Q5152 上,(需要配置 Switch Port 1 、Port2 端口)

逻辑框图如下:
在这里插入图片描述

硬件原理图如下:
在这里插入图片描述

经过原理图分析,我们需要配置 P1P2P3 三个端口,配置 1000MbpsSlave 模式


二、88Q5152 芯片读写时序分析


2.1 Clause 22 读、写寄存器配置(配置 Port 5 采用C22条款)

C22 条款的读写方式相对简单,读写函数分别如下:

unsigned short emac_mdio_read( void  *handle, unsigned char  phyaddr, unsigned char  phyreg)
{
	int   phydata=0, ret=0;
  	struct emac_prv_data_t *pdata = (struct emac_prv_data_t*)handle;
  	struct hw_if_struct    *hw_if = &(pdata->hw_if);
<span class="token keyword">if</span> <span class="token punctuation">(</span>hw_if<span class="token operator">-&gt;</span>read_phy_regs<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	ret <span class="token operator">=</span> hw_if<span class="token operator">-&gt;</span><span class="token function">read_phy_regs</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> <span class="token operator">&amp;</span>phydata<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">EMAC_MSG_INFO</span><span class="token punctuation">(</span><span class="token string">"%s: read from phyaddr=0x%x , phyreg=0x%x , phydata=0x%x \n"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> phydata <span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> EMAC_SUCCESS<span class="token punctuation">)</span>	<span class="token punctuation">{<!-- --></span>
  		<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"read_phy_regs failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> phydata<span class="token punctuation">;</span>

} /* emac_mdio_read */

void emac_mdio_write(void handle, unsigned char phyaddr, unsigned char phyreg, unsigned short phydata)
{
struct emac_prv_data_t pdata = (struct emac_prv_data_t)handle;
struct hw_if_struct hw_if = &(pdata->hw_if);
int ret;

<span class="token keyword">if</span> <span class="token punctuation">(</span>hw_if<span class="token operator">-&gt;</span>write_phy_regs<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	ret <span class="token operator">=</span> hw_if<span class="token operator">-&gt;</span><span class="token function">write_phy_regs</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> phydata<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">EMAC_MSG_DEBUG2</span><span class="token punctuation">(</span><span class="token string">"%s: Write to phyaddr=0x%x , phyreg=0x%x , phydata=0x%x "</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> phyreg<span class="token punctuation">,</span> phydata <span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">!=</span> EMAC_SUCCESS<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
  		<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"write_phy_regs failed"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>

} /* emac_mdio_write */

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2.1.1 88Q5152 P5 端口配置

88Q5152 P5 端口配置如下;

// 88Q5152 P5  0x1  Physical Control Register 0xe03e
regvalue = emac_mdio_read(0x5, 0x01);
EMAC_MSG_ERROR("[switch] P5 PHY_CTRL(0x01) = 0x%04x", regvalue);
if(regvalue != 0xe03e)
{
    emac_mdio_write(0x5, 0x1A, 0xA100);
    regvalue = emac_mdio_read(0x5, 0x1A);
    EMAC_MSG_ERROR("[switch] P5 GMAC(0x1A) = 0x%04x", regvalue);
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">,</span> <span class="token number">0xDEA0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P4 GMAC(0x1A) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">,</span> <span class="token number">0x0e07</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">,</span> <span class="token number">0xe03e</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PHY_CTRL(0x01) RGMII Timing Control updating......"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PHY_CTRL(0x01) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">!=</span> <span class="token number">0x007f</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
    <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">,</span> <span class="token number">0x007f</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch] P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

相关log如下:

# slog2info | grep switch
00:00:02.966   emac1  [switch] SwitchID Product Number: 0xb52, Revision: 2
00:00:02.968   emac1  [switch] P5 PHY_CTRL(0x01) = 0x0003
00:00:02.973   emac1  [switch] P5 GMAC(0x1A) = 0x2100
00:00:02.978   emac1  [switch] P4 GMAC(0x1A) = 0x5e00
00:00:02.980   emac1  [switch] P5 PORT_STAT(0x00) = 0x0e07
00:00:02.985   emac1  [switch] P5 PORT_STAT(0x00) = 0x0e07
00:00:02.987   emac1  [switch] P5 PHY_CTRL(0x01) RGMII Timing Control updating......
00:00:02.990   emac1  [switch] P5 PHY_CTRL(0x01) = 0xe03e
00:00:02.992   emac1  [switch] P5 PORT_CTRL(0x04) = 0x007f

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.2 Clause 45 读寄存器时序(配置 Port 1、Port 2 采用C45条款)

以读 P2 口,devaddr=30xFCAB 寄存器为例,读写时序如下:

Value = Phy_Switch_Clause45_read(2, 3, 0xFCAB);

读流程:
1. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
2. 写寄存器地址: 0xFCAB
0x19 地址, 0xFCAB
0x18 寄存器 0x8043
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 00 > 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 > 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 > 配置 devaddr=3
3. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
4. 写读请求
0x18 寄存器 0x8C43
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 11 > 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 > 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 > 配置 devaddr=3
5. 读取 0x19 寄存器,获取到寄存器值

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

2.2.1 Phy_Switch_Clause45_read() 函数实现

static int phy_switch_glb2_smi_busy(){
    uint16_t value;
    uint16_t timeout = 1000;
    do{
        value = emac_mdio_read(GLB2_SMI_DEV_ADDR, GLB2_SMI_PHY_CMD);
        if(!(value & (1 << 15))){	
        	break;
        }
		usleep(100);
    } while(--timeout);
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span>	 <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

uint16_t Phy_Switch_Clause45_read(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>					<span class="token comment">// 读 0x18</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">// 写19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">// 配置端口 读</span>

cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_READ<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

2.2.2 Switch Global 2 Register 0x18 0x19 寄存器描述

参考芯片手册:《88Q5152_88Q5151 Functional Specification.pdf》

Switch Global 2 Register 0x18 寄存器配置如下:
在这里插入图片描述


Switch Global 2 Register 0x19 寄存器配置如下:
在这里插入图片描述

2.3 Clause 45 写寄存器时序(配置 Port 1、Port 2 采用C45条款)

以写 P2 口,devaddr=30xFCAB 寄存器值 0x1054 为例:

Phy_Switch_Clause45(2, 3, 0xFCAB, 0x1054)

写流程:
1. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
2. 写寄存器地址: 0xFCAB
0x19 地址, 0xFCAB
0x18 寄存器 0x8043
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 00 > 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 > 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 > 配置 devaddr=3

3. 读取 0x18 寄存器,直到 bit15 = 0, 再往下走 (1000次试错)
4. 写入寄存器值 0x1054
0x19 地址,0x1054
5. 写入写请求
0x18 寄存器 0x8443
0x18 寄存器各bit 配置如下:
SMIBusy = 1
SMIFunc = 00
SMIMode = 0
SMIOp = 01 > 00 (写addr reg) 01(写 Data reg) 11(读寄存器)
DevAddr = 00010 > 配置 Port 口:00001 (Port 1) 00010 (Port 2)
RegAddr = 00011 > 配置 devaddr=3
6. 读取 0x18 寄存器,直到 bit15 = 0, 说明写完毕

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

2.3.1 Phy_Switch_Clause45_write() 函数实现

static int phy_switch_glb2_smi_busy(){
    uint16_t value;
    uint16_t timeout = 1000;
    do{
        value = emac_mdio_read(GLB2_SMI_DEV_ADDR, GLB2_SMI_PHY_CMD);
        if(!(value & (1 << 15))){	
        	break;
        }
		usleep(100);
    } while(--timeout);
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span>	 <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

void Phy_Switch_Clause45_write(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr, uint16_t regvalue)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;

<span class="token class-name">uint16_t</span> tmp_before<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> tmp_end<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
tmp_before <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>

cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//0x19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_DATA_WRITE<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

tmp_end <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[%s][%d] P%d Port, DevAddr(0x%x), Reg[0x%x]= (0x%x) set to =&gt; (0x%x) , right vlue(0x%x)"</span><span class="token punctuation">,</span>  <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>
		phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">,</span> tmp_before<span class="token punctuation">,</span> tmp_end<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

2.3.2 88Q5152 P1、P2 端口配置 1000Mbps、Slave模式

88Q5152 P5 端口配置如下;

	// 88Q5152  Port1  1000BT  Slave Mode init
	Phy_Switch_Clause45_write( 1, 3, 0x8022, 0x0000 ); //disable passive sleep mode
	Phy_Switch_Clause45_write( 1, 3, 0xFFE4, 0x0007 );
	Phy_Switch_Clause45_write( 1, 1, 0x0000, 0x0840 );
	usleep(3000);   // Delay for 3ms
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0x8001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Slave 1G</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 88Q5152  Port2  1000BT  Slave Mode init</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8022</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//disable passive sleep mode</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x0007</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0840</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">//Delay for 3ms</span>

<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0x8001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//Slave 1G</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

2.3.3 88Q5152 P1、P2 端口配置 1000Mbps、Master模式

	// 88Q5152  Port1  1000BT  Master Mode init
	Phy_Switch_Clause45_write( 1, 3, 0x8022, 0x0000 ); //disable passive sleep mode
	Phy_Switch_Clause45_write( 1, 3, 0xFFE4, 0x0007 );
	Phy_Switch_Clause45_write( 1, 1, 0x0000, 0x0840 );
	usleep(3000);   //Delay for 3ms
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0xC001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Master 1G</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 88Q5152  Port2  1000BT  Master Mode init																	</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8022</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//disable passive sleep mode</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x0007</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0840</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">//Delay for 3ms</span>

<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">0x0200</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0000</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFDB</span><span class="token punctuation">,</span> <span class="token number">0xFC10</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAD</span><span class="token punctuation">,</span> <span class="token number">0x030C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8032</span><span class="token punctuation">,</span> <span class="token number">0x6001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDFF</span><span class="token punctuation">,</span> <span class="token number">0x05A5</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFDEC</span><span class="token punctuation">,</span> <span class="token number">0xDBAF</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAB</span><span class="token punctuation">,</span> <span class="token number">0x1054</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFCAC</span><span class="token punctuation">,</span> <span class="token number">0x1483</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">,</span> <span class="token number">0xC001</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//Master 1G</span>
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0048</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x0900</span><span class="token punctuation">,</span> <span class="token number">0x8000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x000C</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFE1B</span><span class="token punctuation">,</span> <span class="token number">0x0058</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

一般来说,100Mbps 默认不用配是OK 的,如果不行的话,可以找FAE 要下参数配置。


三、代码导通配置

3.1 配置 ether.c

# apps/qnx_ap/target/filesets/launcher_scripts/ether.c
static const char* iopkt_arg_air[] = {
    "io-pkt-v6-hc",
    "-u",
    "bpf,37:37,0666",
    "-S",
    "-v",
    "-D",
    "-p",
    "tcpip",
    "pkt_typed_mem=/ram/mm_dma,stacksize=65536,mclbytes=4096,pagesize=65536,pkt_cache=1024,mbuf_cache=1024",
    "-ppf-v6",
    "-d",
    "/ifs/lib64/libdevnp-emac-eth.so",
    "inst=1,name=emac,unit=0,phy_switch=88Q5072",			// 88Q5152 使用默认的代码 88Q5072
     "-U",
     create_string(IO_PKT_UID:IO_PKT_GIDS_REQ),
    NULL
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3.2 配置 emac1_config_Makena.conf

qnx/apps/qnx_ap/AMSS/amc/data/ethernet/emac/driver/board/makena/emac1_config_Makena.conf

emac_mac_address=02:00:00:00:10:01

  • 1
  • 2
  • 3

3.3 配置GPIO 中断、RST脚

# qnx/apps/qnx_ap/boards/core/dalconfig/sa8295P_adp_air_v1.0.1/config/pin_config.c
//    {(TLMM_MODULE|54), "/dev/gpio/ephy1_soc_int", TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_INPUT, GPIO_NO_PULL, GPIO_STRENGTH_8MA, 1), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},
//    {(TLMM_MODULE|127), "/dev/gpio/ephy0_soc_int", TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_INPUT, GPIO_NO_PULL, GPIO_STRENGTH_8MA, 1), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},
<span class="token punctuation">{<!-- --></span><span class="token punctuation">(</span>TLMM_MODULE<span class="token operator">|</span><span class="token number">31</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"/dev/gpio/ephy1_soc_int"</span><span class="token punctuation">,</span> TLMM_GPIO_CFG_MASK_IGNORE<span class="token punctuation">,</span> <span class="token function">GPIO_PIN_CFG</span><span class="token punctuation">(</span>GPIO_INPUT<span class="token punctuation">,</span> GPIO_NO_PULL<span class="token punctuation">,</span> GPIO_STRENGTH_8MA<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> TLMM_GPIO_SLEEP_CFG_IGNORE<span class="token punctuation">,</span> IGNORE<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">{<!-- --></span><span class="token punctuation">(</span>TLMM_MODULE<span class="token operator">|</span><span class="token number">37</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"/dev/gpio/ephy0_soc_int"</span><span class="token punctuation">,</span> TLMM_GPIO_CFG_MASK_IGNORE<span class="token punctuation">,</span> <span class="token function">GPIO_PIN_CFG</span><span class="token punctuation">(</span>GPIO_INPUT<span class="token punctuation">,</span> GPIO_NO_PULL<span class="token punctuation">,</span> GPIO_STRENGTH_8MA<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> TLMM_GPIO_SLEEP_CFG_IGNORE<span class="token punctuation">,</span> IGNORE<span class="token punctuation">}</span><span class="token punctuation">,</span>

<span class="token comment">//enet reset</span>

// {(PMIC_2_GPIO_MODULE|1), “/dev/gpio/soc_ephy0_rst”, PMIC_GPIO_SET_OUTPUT_CONF_MASK, PMIC_GPIO_OUTPUT_DEFAULT, TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE },
// {(PMIC_2_GPIO_MODULE|2), “/dev/gpio/soc_ephy1_rst”, PMIC_GPIO_SET_OUTPUT_CONF_MASK, PMIC_GPIO_OUTPUT_DEFAULT, TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE },
{ (TLMM_MODULE|36), “/dev/gpio/soc_ephy0_rst”, TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_OUTPUT, GPIO_PULL_UP, GPIO_STRENGTH_8MA, 0), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},
{ (TLMM_MODULE|27), “/dev/gpio/soc_ephy1_rst”, TLMM_GPIO_CFG_MASK_IGNORE, GPIO_PIN_CFG(GPIO_OUTPUT, GPIO_PULL_UP, GPIO_STRENGTH_8MA, 0), TLMM_GPIO_SLEEP_CFG_IGNORE, IGNORE},

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.4 配置 qc.data.ethernet.early.build 拷贝库到 /ifs中

# qnx/apps/qnx_ap/target/filesets/qc.data.ethernet.early.build

lib64/libdevnp-emac-eth.so=aarch64le/lib/libdevnp-emac-eth.so
lib64/libdevnp-emac1-eth.so=aarch64le/lib/libdevnp-emac-eth.so
lib64/libphy_wrapper.so=aarch64le/lib/libphy_wrapper.so

  • 1
  • 2
  • 3
  • 4
  • 5

3.5 配置启动 emac0 网卡

# qnx/apps/qnx_ap/target/hypervisor/host/startup.qvmhost.tmpl

brconfig bridge0 add emac0 up
ifconfig emac0 198.18.32.1/16 up

  • 1
  • 2
  • 3
  • 4

3.6 修改emac_mdio.c 添加初始化 88Q5152代码

int emac_mdio_register(emac_dev_t *dev){
	...... 省略......
  	do{
    	...... 省略......
    	/* Establish a connection with the created channel */
    	pdata->co_id = ConnectAttach(0, 0, pdata->ch_id, _NTO_SIDE_CHANNEL, 0);
    	/* Assign connection id to event */
    	memset(&mdi_event, 0, sizeof(struct sigevent));
    	mdi_event.sigev_coid = pdata->co_id;
	<span class="token comment">/* Register with QNX MII mgmt library */</span>
	<span class="token function">Phy_Register_Extended</span><span class="token punctuation">(</span>pdata<span class="token punctuation">,</span>
                         emac_mdio_write<span class="token punctuation">,</span>
                         emac_mdio_read<span class="token punctuation">,</span>
                         emac_mdio_callback<span class="token punctuation">,</span>
                         <span class="token punctuation">(</span><span class="token class-name">mdi_t</span> <span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token operator">&amp;</span>pdata<span class="token operator">-&gt;</span>mdi_hdl<span class="token punctuation">,</span>
                         <span class="token operator">&amp;</span>mdi_event<span class="token punctuation">,</span>
                         EMAC_MDI_PULSE_PRIO<span class="token punctuation">,</span>
                         EMAC_MDI_PULSE_FREQ<span class="token punctuation">,</span>
                         pdata<span class="token operator">-&gt;</span>phy_type<span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">/* For qdrive phy_index is 8 */</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>pdata<span class="token operator">-&gt;</span>phy_type <span class="token operator">==</span> MARVELL_88Q5072 <span class="token operator">||</span> pdata<span class="token operator">-&gt;</span>phy_type <span class="token operator">==</span> MARVELL_88EA1512<span class="token punctuation">)</span>
	<span class="token punctuation">{<!-- --></span>
		phy_indx <span class="token operator">=</span> pdata<span class="token operator">-&gt;</span>conf_data<span class="token punctuation">.</span>marvell_phy_index_qdrive<span class="token punctuation">;</span>
		<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch][%s][%d] enter phy_type=0x%x phy_index=0x%x \n"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> pdata<span class="token operator">-&gt;</span>phy_type<span class="token punctuation">,</span> phy_indx<span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">phy_and_switch_status_checking</span><span class="token punctuation">(</span>pdata<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">// 在此初始化 88Q5152 芯片</span>
	<span class="token punctuation">}</span>
	<span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>pdata<span class="token operator">-&gt;</span>phy_type <span class="token operator">==</span> KSZ9131RNX<span class="token punctuation">)</span>
	<span class="token punctuation">{<!-- --></span>
   		phy_indx <span class="token operator">=</span> pdata<span class="token operator">-&gt;</span>conf_data<span class="token punctuation">.</span>micrel_phy_index_adp <span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> 省略<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

3.7 88Q5152驱动代码

/********************************************************************************/
/*********************** 88Q5152 Switch Code Begin ******************************/
/********************************************************************************/
#include "emac_globals.h"
#include <net/ifdrvcom.h>
#define ESM_PHY_R                                0xC0
#define ESM_PHY_W                                0xC1

#define ESM_SWITCH_R 0xD0
#define ESM_SWITCH_W 0xD1

#define ETH_PORT_1 0x01
#define ETH_PORT_2 0x02
#define ETH_PORT_3 0x03
#define ETH_PORT_4 0x04
#define ETH_PORT_5 0x05
#define ETH_PORT_6 0x06
#define ETH_PORT_7 0x07
#define ETH_PORT_8 0x08

typedef struct{
uint16_t smi_addr;
uint16_t reg_addr;
uint16_t reg_value;
} esm_switch_reg_t;

typedef struct{
uint16_t eth_port_no;
uint16_t dev_addr;
uint16_t reg_addr;
uint16_t reg_value;
}esm_phy_reg_t;

void phy_and_switch_status_checking(struct emac_prv_data_t *pdata);

/* definition for MARVELL PHY 88Qxxxx */
#define MARVELL_PHY_OUI 0x002B // Organizationally Unique Identifier
#define PMA_PMD_DEVICE_ID2 0x0981

#define PHY_PMA_PMD_DEV_ADDR 1

/* definition for Ethernet Switch 88Q5050 */
#define SWITCH_VERSION_5050 0xa510 //a51x
#define SWITCH_VERSION_5152 0xb520
#define SWITCH_VER_MASK 0xFFF0

#define Q5050_MULTI_CHIP_MODE 0
#define Q5050_SINGLE_CHIP_MODE 1

/* Access Ethernet Switch registers - multi-chip mode /
#define MULTI_CHIP_SMI_CMD 0x00
#define MULTI_CHIP_SMI_DATA 0x01
/ bit15 - SMIBusy
bit12 - SMIMode. Define SMI frame type.
0 - Not C22 SMI frames;
1 - C22 SMI frames.
bit11:10 - SMIOp. 0x1 - Write Data Register;
0x2 - Read Data Register.

bit9:5 - DevAddr. Used to select C22 SMI device to operate
bit4:0 - RegAddr. Used to select C22 SMI register to operate
/
#define MULTI_CHIP_SMI_CMD_READ ((1 << 15) | (1 << 12) | (2 << 10))
#define MULTI_CHIP_SMI_CMD_WRITE ((1 << 15) | (1 << 12) | (1 << 10))
/
Single-chip Addressing Mode: (SMI Address of Switch is 0)
88Q5050 responds to all the 32 possible SMI device addresses.

Internal PHY and SERDES, as well as external devices attached to the 88Q5050’s SMI_PHY interface,
can be accessed by using SMI PHY Cmd and SMI PHY Data register (GLB2 offset 0x18 and 0x19)

Multi-chip Addressing Mode:
88Q5050 responds to only 1 of the 32 possible SMI device addresses, can share the SMI with multiple other devices.
Only 2 registers are directly accessible: SMI cmd and SMI data register.
These 2 registers are used indirectly access all other registers of 88Q5050 (along with any PHY registers that attached to it).

Internal PHY and SERDES, as well as external devices attached to the 88Q5050’s SMI_PHY interface,
can be accessed by using SMI PHY Cmd and SMI PHY Data register (GLB2 offset 0x18 and 0x19)
*/
unsigned short g_smi_chipmode = Q5050_SINGLE_CHIP_MODE;
static bool bSwitchChipIsFound = TRUE;

/---- Access PHY which is integrated internally in Switch ----/
#define PHY_SWITCH_INTERNAL_READ ((1 << 15) | (0 << 12) | (2 << 10))
#define PHY_SWITCH_INTERNAL_ADDR_WRITE ((1 << 15) | (0 << 14) | (0 << 13) | (0 << 12)| (0 << 11) | (0 << 10))
#define PHY_SWITCH_INTERNAL_DATA_WRITE ((1 << 15) | (0 << 14) | (0 << 13) | (0 << 12)| (0 << 11) | (1 << 10))

/---- Access PHY which is controlled via switch SMI_PHY ----/
#define PHY_SWITCH_EXTERNAL_READ ((1 << 15) | (0 << 14) | (1 << 13) | (0 << 12) |(2 << 10))
#define PHY_SWITCH_EXTERNAL_ADDR_WRITE ((1 << 15) | (0 << 14) | (1 << 13) | (0 << 12) |(0 << 11) | (0 << 10))
#define PHY_SWITCH_EXETERNAL_DATA_WRITE ((1 << 15) | (0 << 14) | (1 << 13) | (0 << 12) |(0 << 11) | (1 << 10))

/* bit15 : SMIBusy - SMI PHY Unit Busy.
bit14:13 : SMIFunc
bit12 : SMIMode - define SMI frame type. 0 - C45; 1 - C22. Here we choose C45
bit11:10 : SMIOp (C45) : 0 - Write Address Reg; 1 - Write Data Reg; 0x2 -
bit9:5 - select port to operate
bit4:0 - select device class to operate
*/

#define GLB2_SMI_DEV_ADDR 0x1C
#define GLB2_SMI_PHY_CMD 0x18
#define GLB2_SMI_PHY_DATA 0x19

/---- Access single external PHY that is connected to EMAC directly ----/
#define EMAC_PHY_C45_CMD_ADDR 0x0d
#define EMAC_PHY_C45_DATA_ADDR 0x0e

/* SMI device address definition for Switch and PHY - dhu */
#define SWITCH_ADDR 3
#define P1_INT_PHY_ADDR 1
#define P7_EXT_PHY_ADDR 2
#define P8_EXT_PHY_ADDR 1

#define PHY_SINGLE_EXTERNAL_ADDR 1

static struct emac_prv_data_t *prv_data = NULL;

void phy_switch_reset1(){
int ret = EOK;
int fd = open(“/dev/gpio/soc_ephy1_rst/value”, O_RDWR);
if (fd < 0) {
EMAC_MSG_ERROR(“[switch]%s: open soc_ephy1_rst errors”, func);
ret = EINVAL;
}else {
EMAC_MSG_ERROR(“[switch]%s: open soc_ephy1_rst success!!”, func);
write(fd, “0”, sizeof(“0”));
usleep(100000);

    <span class="token function">write</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span><span class="token string">"1"</span><span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//set to high</span>
    <span class="token function">usleep</span><span class="token punctuation">(</span><span class="token number">200000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token number">0</span> <span class="token operator">!=</span> <span class="token function">lseek</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token constant">SEEK_SET</span><span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token comment">// Read the pin value back and log it</span>
    <span class="token punctuation">{<!-- --></span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"%s: Error setting seek "</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        ret <span class="token operator">=</span> EINVAL<span class="token punctuation">;</span>
    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">char</span> buf<span class="token punctuation">;</span>
        <span class="token function">memset</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>buf<span class="token punctuation">,</span><span class="token char">'0'</span><span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">read</span><span class="token punctuation">(</span>fd<span class="token punctuation">,</span> <span class="token operator">&amp;</span>buf<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>buf<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]PHY  pin high = %c "</span><span class="token punctuation">,</span>  buf<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">close</span><span class="token punctuation">(</span>fd<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"%s: closing fd failed with %s"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span><span class="token function">strerror</span><span class="token punctuation">(</span>errno<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        ret <span class="token operator">=</span> EINVAL<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">==</span> EINVAL<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"%s: PHY reset encountered errors"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

static int switch_glb2_smi_busy( )
{
uint16_t value;
uint16_t timeout = 1000;
do{
value = emac_mdio_read(prv_data, SWITCH_ADDR, 0x00);
if (!(value & (1 << 15))) {
break;
}
usleep(100);
} while(timeout);

<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
	<span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

uint16_t switch_glb2_smi_read(int smiaddr, int reg)
{
uint16_t regval;
if (g_smi_chipmode == Q5050_SINGLE_CHIP_MODE) {
regval = emac_mdio_read(prv_data, smiaddr, reg);
} else {
uint16_t cmd = MULTI_CHIP_SMI_CMD_READ;

    cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>smiaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>   <span class="token comment">// bit9:5 DevAddr, select C22 SMI device to operate</span>
    cmd <span class="token operator">|=</span> reg <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>              <span class="token comment">// bit4:0 RegAddr, select C22 SMI register to operate</span>

	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">switch_glb2_smi_busy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

    <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>	   <span class="token comment">// SMI Command Register. Accessible only when multi-chip addressing mode</span>

	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">switch_glb2_smi_busy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

    regval <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// SMI Data Register. Accessible only when multi-chip addressing mode</span>

    <span class="token function">EMAC_MSG_DEBUG2</span><span class="token punctuation">(</span><span class="token string">"GLB2_SMI_PHY_DATA 0x%x 0x%x = 0x%x "</span><span class="token punctuation">,</span> smiaddr<span class="token punctuation">,</span> reg<span class="token punctuation">,</span> regval<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> regval<span class="token punctuation">;</span>

}

uint16_t switch_glb2_smi_write(uint16_t smiaddr, uint16_t reg, uint16_t data)
{
if (g_smi_chipmode == Q5050_SINGLE_CHIP_MODE) {
emac_mdio_write(prv_data, smiaddr, reg, data);
} else{
uint16_t cmd = MULTI_CHIP_SMI_CMD_WRITE;
cmd |= (smiaddr & 0x1F) << 5;
cmd |= reg & 0x1F;

	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">switch_glb2_smi_busy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
		<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

	<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_DATA<span class="token punctuation">,</span> data<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> SWITCH_ADDR<span class="token punctuation">,</span> MULTI_CHIP_SMI_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> EMAC_SUCCESS<span class="token punctuation">;</span>

}

static int phy_switch_glb2_smi_busy( )
{
uint16_t value;
uint16_t timeout = 1000;
do {
value = emac_mdio_read(GLB2_SMI_DEV_ADDR, GLB2_SMI_PHY_CMD);
if(!(value & (1 << 15))) {
break;
}
usleep(100);
} while(timeout);

<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>timeout<span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

}

uint16_t Phy_Switch_Clause45_read(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>					<span class="token comment">// 读 0x18</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">// 写19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">// 配置端口 读</span>

cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_READ<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>  <span class="token keyword">return</span> <span class="token number">0xDEAD</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

void Phy_Switch_Clause45_write(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr, uint16_t regvalue)
{
uint16_t cmd = PHY_SWITCH_INTERNAL_ADDR_WRITE;

<span class="token class-name">uint16_t</span> tmp_before<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> tmp_end<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
tmp_before <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>

cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//0x19</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

cmd <span class="token operator">=</span> PHY_SWITCH_INTERNAL_DATA_WRITE<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

tmp_end <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[%s][%d] P%d Port, DevAddr(0x%x), Reg[0x%x]= (0x%x) set to =&gt; (0x%x) , right vlue(0x%x)"</span><span class="token punctuation">,</span>  <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>
		phyaddr<span class="token punctuation">,</span> devaddr<span class="token punctuation">,</span> regaddr<span class="token punctuation">,</span> tmp_before<span class="token punctuation">,</span> tmp_end<span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

uint16_t phy_switch_external_glb2_read(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr)
{
uint16_t cmd = PHY_SWITCH_EXTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

cmd <span class="token operator">=</span> PHY_SWITCH_EXTERNAL_READ<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>

<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

void phy_switch_external_glb2_write(uint16_t phyaddr, uint16_t devaddr, uint16_t regaddr, uint16_t regval)
{
uint16_t cmd = PHY_SWITCH_EXTERNAL_ADDR_WRITE;
cmd |= (phyaddr & 0x1F) << 5;
cmd |= devaddr & 0x1F;

<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

cmd <span class="token operator">=</span> PHY_SWITCH_EXETERNAL_DATA_WRITE<span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> <span class="token punctuation">(</span>phyaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span>
cmd <span class="token operator">|=</span> devaddr <span class="token operator">&amp;</span> <span class="token number">0x1F</span><span class="token punctuation">;</span>

<span class="token function">phy_switch_glb2_smi_busy</span><span class="token punctuation">(</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_DATA<span class="token punctuation">,</span> regval<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>GLB2_SMI_DEV_ADDR<span class="token punctuation">,</span> GLB2_SMI_PHY_CMD<span class="token punctuation">,</span> cmd<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

void phy_switch_status_checking( )
{
uint16_t regvalue = 0;

<span class="token comment">// 1.0002 - PMA_PMD_ID 1; 1.0003 - PMA_PMD_ID 2.</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P7_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0002</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>  regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">==</span> MARVELL_PHY_OUI<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 External PhyID 1.0002 (MARVELL_OUI) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
    regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P7_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0003</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 External PhyID 1.0003 = 0x%04x, Model Number: %x, Revision: %x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&gt;&gt;</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0x003F</span><span class="token punctuation">,</span> regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 Could not find phy chip"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P7_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>  regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P7 External PHY 88Q2122 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"1Gbps"</span><span class="token operator">:</span><span class="token string">"UNKNOW"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 1.0002 - PMA_PMD_ID 1; 1.0003 - PMA_PMD_ID 2.</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P8_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0002</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>  regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">==</span> MARVELL_PHY_OUI<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 External PhyID 1.0002 (MARVELL_OUI) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
    regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P8_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0003</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 External PhyID 1.0003 = 0x%04x, Model Number: %x, Revision: %x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&gt;&gt;</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0x003F</span><span class="token punctuation">,</span> regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span> <span class="token punctuation">{<!-- --></span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 Could not find phy chip"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

regvalue <span class="token operator">=</span> <span class="token function">phy_switch_external_glb2_read</span><span class="token punctuation">(</span>P8_EXT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>  regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P8 External PHY 88Q2120 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"1Gbps"</span><span class="token operator">:</span><span class="token string">"UNKNOW"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

regvalue <span class="token operator">=</span> <span class="token function">Phy_Switch_Clause45_read</span><span class="token punctuation">(</span>P1_INT_PHY_ADDR<span class="token punctuation">,</span> PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: regvalue =0x%x"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span>  regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P1 Internal PHY 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span>regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"UNKNOW"</span><span class="token operator">:</span><span class="token string">"100Mbps"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

/* API to read Clause 45 using Clause 22*/
uint16_t phy_single_external_read(uint16_t devaddr, uint16_t regaddr){
uint16_t phyaddr = PHY_SINGLE_EXTERNAL_ADDR;
/write FN=00 and device address to command reg, indicating address function/
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_CMD_ADDR, devaddr);

<span class="token comment">/*write address to be read to data port reg*/</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> EMAC_PHY_C45_DATA_ADDR<span class="token punctuation">,</span> regaddr<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">/*write FN =01 and device address to command register specifying data function*/</span>
<span class="token function">emac_mdio_write</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> EMAC_PHY_C45_CMD_ADDR<span class="token punctuation">,</span> devaddr <span class="token operator">|</span> <span class="token number">1</span> <span class="token operator">&lt;&lt;</span> <span class="token number">14</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span>prv_data<span class="token punctuation">,</span> phyaddr<span class="token punctuation">,</span> EMAC_PHY_C45_DATA_ADDR<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

/* API to write Clause 45 using Clause 22 */
void phy_single_external_write(uint16_t devaddr, uint16_t regaddr, uint16_t regval)
{
uint16_t phyaddr = PHY_SINGLE_EXTERNAL_ADDR;
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_CMD_ADDR, devaddr);
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_DATA_ADDR, regaddr);
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_CMD_ADDR, devaddr | 1 << 14);
emac_mdio_write(prv_data, phyaddr, EMAC_PHY_C45_DATA_ADDR, regval);
}

void phy_single_status_checking()
{
uint16_t regvalue = 0;

<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: enter+++++"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">phy_single_external_read</span><span class="token punctuation">(</span>PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0002</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]Single External PHY 88Q2120 1.0002 = 0x%04x. (MARVELL OUI is 0x002B)"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

regvalue <span class="token operator">=</span> <span class="token function">phy_single_external_read</span><span class="token punctuation">(</span>PHY_PMA_PMD_DEV_ADDR<span class="token punctuation">,</span> <span class="token number">0x0834</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]Single External PHY 88Q2120 1.0834 = 0x%04x, Mode = %s, Speed = %s"</span><span class="token punctuation">,</span>
               regvalue<span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x4000</span><span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token string">"Master"</span><span class="token operator">:</span><span class="token string">"Slave"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token operator">?</span> <span class="token string">"1Gbps"</span><span class="token operator">:</span><span class="token string">"UNKNOW"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

void phy_and_switch_status_checking(struct emac_prv_data_t *pdata){
prv_data = pdata;
uint16_t regvalue = 0 ;

<span class="token function">phy_switch_reset1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x2</span><span class="token punctuation">,</span> <span class="token number">0x8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">==</span> <span class="token number">0x2080</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
    g_smi_chipmode <span class="token operator">=</span> Q5050_SINGLE_CHIP_MODE<span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{<!-- --></span>
    g_smi_chipmode <span class="token operator">=</span> Q5050_MULTI_CHIP_MODE<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]Switch Addressing Mode: %s,  regvalue=0x%x"</span><span class="token punctuation">,</span> g_smi_chipmode <span class="token operator">?</span> <span class="token string">"Single-chip"</span> <span class="token operator">:</span> <span class="token string">"Multi-chip"</span> <span class="token punctuation">,</span>  regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// try to get SwitchID</span>
regvalue <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x0</span><span class="token punctuation">,</span> <span class="token number">0x03</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//  device's Product Number</span>
<span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]%s:%d: id regvalue=0x%x \n"</span><span class="token punctuation">,</span> <span class="token constant">__func__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>regvalue <span class="token operator">&amp;</span> SWITCH_VER_MASK<span class="token punctuation">)</span> <span class="token operator">==</span> SWITCH_VERSION_5152<span class="token punctuation">)</span> 				<span class="token comment">// 88Q5152</span>
<span class="token punctuation">{<!-- --></span>
    bSwitchChipIsFound <span class="token operator">=</span> TRUE<span class="token punctuation">;</span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]SwitchID Product Number: 0x%x, Revision: %x"</span><span class="token punctuation">,</span> SWITCH_VERSION_5152 <span class="token operator">&gt;&gt;</span> <span class="token number">4</span><span class="token punctuation">,</span> regvalue <span class="token operator">&amp;</span> <span class="token number">0x000F</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">// 88Q5152 P5  0x1  Physical Control Register 0xe03e</span>
	regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PHY_CTRL(0x01) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">!=</span> <span class="token number">0xe03e</span><span class="token punctuation">)</span>
    <span class="token punctuation">{<!-- --></span>
        <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">,</span> <span class="token number">0xA100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 GMAC(0x1A) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">,</span> <span class="token number">0xDEA0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x4</span><span class="token punctuation">,</span> <span class="token number">0x1A</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P4 GMAC(0x1A) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

        regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">,</span> <span class="token number">0x0e07</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x00</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_STAT(0x00) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">,</span> <span class="token number">0xe03e</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PHY_CTRL(0x01) RGMII Timing Control updating......"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x01</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PHY_CTRL(0x01) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>

        regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">if</span><span class="token punctuation">(</span>regvalue <span class="token operator">!=</span> <span class="token number">0x007f</span><span class="token punctuation">)</span>
        <span class="token punctuation">{<!-- --></span>
            <span class="token function">emac_mdio_write</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">,</span> <span class="token number">0x007f</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            regvalue <span class="token operator">=</span> <span class="token function">emac_mdio_read</span><span class="token punctuation">(</span><span class="token number">0x5</span><span class="token punctuation">,</span> <span class="token number">0x04</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token function">EMAC_MSG_ERROR</span><span class="token punctuation">(</span><span class="token string">"[switch]P5 PORT_CTRL(0x04) = 0x%04x"</span><span class="token punctuation">,</span> regvalue<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

	<span class="token comment">// 88Q5152  Port1  1000BT  Slave Mode init</span>
	<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0x8022</span><span class="token punctuation">,</span> <span class="token number">0x0000</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//disable passive sleep mode</span>
	<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">0xFFE4</span><span class="token punctuation">,</span> <span class="token number">0x0007</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">Phy_Switch_Clause45_write</span><span class="token punctuation">(</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctu
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值