[ZLG-MCU] 哪位有 KEIL RL-TCPnet 在LPC23xx+ksz8041nl中成功移置的驱动包

[复制链接]
6001|5
 楼主| pubstar 发表于 2009-2-18 23:50 | 显示全部楼层 |阅读模式
/*----------------------------------------------------------------------------<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;T&nbsp;L&nbsp;&nbsp;-&nbsp;&nbsp;T&nbsp;C&nbsp;P&nbsp;N&nbsp;E&nbsp;T<br />&nbsp;*----------------------------------------------------------------------------<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;&nbsp;&nbsp;&nbsp;LPC23_EMAC.C<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Purpose:&nbsp;Driver&nbsp;for&nbsp;Philips&nbsp;LPC2378&nbsp;EMAC&nbsp;Ethernet&nbsp;Controller<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rev.:&nbsp;&nbsp;&nbsp;&nbsp;V3.20<br />&nbsp;*----------------------------------------------------------------------------<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;code&nbsp;is&nbsp;part&nbsp;of&nbsp;the&nbsp;RealView&nbsp;Run-Time&nbsp;Library.<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2004-2008&nbsp;KEIL&nbsp;-&nbsp;An&nbsp;ARM&nbsp;Company.&nbsp;All&nbsp;rights&nbsp;reserved.<br />&nbsp;*---------------------------------------------------------------------------*/<br /><br />#include&nbsp;&ltNet_Config.h&gt<br />#include&nbsp;&quot;LPC23_EMAC.h&quot;<br />#include&nbsp;&ltLPC23xx.H&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;LPC23xx&nbsp;definitions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />/*&nbsp;The&nbsp;following&nbsp;macro&nbsp;definitions&nbsp;may&nbsp;be&nbsp;used&nbsp;to&nbsp;select&nbsp;the&nbsp;speed<br />&nbsp;&nbsp;&nbsp;of&nbsp;the&nbsp;physical&nbsp;link:<br /><br />&nbsp;&nbsp;_10MBIT_&nbsp;&nbsp;&nbsp;-&nbsp;connect&nbsp;at&nbsp;10&nbsp;MBit&nbsp;only<br />&nbsp;&nbsp;_100MBIT_&nbsp;&nbsp;-&nbsp;connect&nbsp;at&nbsp;100&nbsp;MBit&nbsp;only<br /><br />&nbsp;&nbsp;By&nbsp;default&nbsp;an&nbsp;autonegotiation&nbsp;of&nbsp;the&nbsp;link&nbsp;speed&nbsp;is&nbsp;used.&nbsp;This&nbsp;may&nbsp;take<br />&nbsp;&nbsp;longer&nbsp;to&nbsp;connect,&nbsp;but&nbsp;it&nbsp;works&nbsp;for&nbsp;10MBit&nbsp;and&nbsp;100MBit&nbsp;physical&nbsp;links.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />/*&nbsp;Net_Config.c&nbsp;*/<br />extern&nbsp;U8&nbsp;own_hw_adr[];<br /><br />/*&nbsp;Local&nbsp;variables&nbsp;*/<br /><br />/*&nbsp;EMAC&nbsp;local&nbsp;DMA&nbsp;Descriptors.&nbsp;*/<br />static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RX_Desc&nbsp;Rx_Desc[NUM_RX_FRAG];<br />static&nbsp;__align(8)&nbsp;RX_Stat&nbsp;Rx_Stat[NUM_RX_FRAG];&nbsp;/*&nbsp;Must&nbsp;be&nbsp;8-Byte&nbsp;alligned&nbsp;&nbsp;&nbsp;*/<br />static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX_Desc&nbsp;Tx_Desc[NUM_TX_FRAG];<br />static&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TX_Stat&nbsp;Tx_Stat[NUM_TX_FRAG];<br /><br />/*&nbsp;EMAC&nbsp;local&nbsp;DMA&nbsp;buffers.&nbsp;*/<br />static&nbsp;U32&nbsp;rx_buf[NUM_RX_FRAG][ETH_FRAG_SIZE&gt&gt2];<br />static&nbsp;U32&nbsp;tx_buf[NUM_TX_FRAG][ETH_FRAG_SIZE&gt&gt2];<br /><br />/*----------------------------------------------------------------------------<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMAC&nbsp;Ethernet&nbsp;Driver&nbsp;Functions<br />&nbsp;*----------------------------------------------------------------------------<br />&nbsp;*&nbsp;&nbsp;Required&nbsp;functions&nbsp;for&nbsp;Ethernet&nbsp;driver&nbsp;module:<br />&nbsp;*&nbsp;&nbsp;a.&nbsp;Polling&nbsp;mode:&nbsp;-&nbsp;void&nbsp;init_ethernet&nbsp;()<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;void&nbsp;send_frame&nbsp;(OS_FRAME&nbsp;*frame)<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;void&nbsp;poll_ethernet&nbsp;(void)<br />&nbsp;*&nbsp;&nbsp;b.&nbsp;Interrupt&nbsp;mode:&nbsp;-&nbsp;void&nbsp;init_ethernet&nbsp;()<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;void&nbsp;send_frame&nbsp;(OS_FRAME&nbsp;*frame)<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;void&nbsp;int_enable_eth&nbsp;()<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;void&nbsp;int_disable_eth&nbsp;()<br />&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;interrupt&nbsp;function<br />&nbsp;*---------------------------------------------------------------------------*/<br /><br />/*&nbsp;Local&nbsp;Function&nbsp;Prototypes&nbsp;*/<br />static&nbsp;void&nbsp;interrupt_ethernet&nbsp;(void)&nbsp;__irq;<br />static&nbsp;void&nbsp;rx_descr_init&nbsp;(void);<br />static&nbsp;void&nbsp;tx_descr_init&nbsp;(void);<br />static&nbsp;void&nbsp;write_PHY&nbsp;(U32&nbsp;PhyReg,&nbsp;U16&nbsp;Value);<br />static&nbsp;U16&nbsp;&nbsp;read_PHY&nbsp;(U32&nbsp;PhyReg);<br /><br />/*---------------------------&nbsp;init_ethernet&nbsp;---------------------------------*/<br /><br />void&nbsp;init_ethernet&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;the&nbsp;EMAC&nbsp;ethernet&nbsp;controller.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U32&nbsp;regv,tout,id1,id2;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Power&nbsp;Up&nbsp;the&nbsp;EMAC&nbsp;controller.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;PCONP&nbsp;|=&nbsp;0x40000000;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;P1&nbsp;Ethernet&nbsp;Pins.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if&nbsp;(MAC_MODULEID&nbsp;==&nbsp;OLD_EMAC_MODULE_ID)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;For&nbsp;the&nbsp;first&nbsp;silicon&nbsp;rev.'-'&nbsp;ID&nbsp;P1.6&nbsp;should&nbsp;be&nbsp;set.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PINSEL2&nbsp;=&nbsp;0x50151105;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;on&nbsp;rev.&nbsp;'A'&nbsp;and&nbsp;later,&nbsp;P1.6&nbsp;should&nbsp;NOT&nbsp;be&nbsp;set.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PINSEL2&nbsp;=&nbsp;0x50150105;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;PINSEL3&nbsp;=&nbsp;(PINSEL3&nbsp;&&nbsp;~0x0000000F)&nbsp;|&nbsp;0x00000005;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Reset&nbsp;all&nbsp;EMAC&nbsp;internal&nbsp;modules.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_MAC1&nbsp;=&nbsp;MAC1_RES_TX&nbsp;|&nbsp;MAC1_RES_MCS_TX&nbsp;|&nbsp;MAC1_RES_RX&nbsp;|&nbsp;MAC1_RES_MCS_RX&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC1_SIM_RES&nbsp;|&nbsp;MAC1_SOFT_RES;<br />&nbsp;&nbsp;&nbsp;MAC_COMMAND&nbsp;=&nbsp;CR_REG_RES&nbsp;|&nbsp;CR_TX_RES&nbsp;|&nbsp;CR_RX_RES;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;A&nbsp;short&nbsp;delay&nbsp;after&nbsp;reset.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;100;&nbsp;tout;&nbsp;tout--);<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;MAC&nbsp;control&nbsp;registers.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_MAC1&nbsp;=&nbsp;MAC1_PASS_ALL;<br />&nbsp;&nbsp;&nbsp;MAC_MAC2&nbsp;=&nbsp;MAC2_CRC_EN&nbsp;|&nbsp;MAC2_PAD_EN;<br />&nbsp;&nbsp;&nbsp;MAC_MAXF&nbsp;=&nbsp;ETH_MAX_FLEN;<br />&nbsp;&nbsp;&nbsp;MAC_CLRT&nbsp;=&nbsp;CLRT_DEF;<br />&nbsp;&nbsp;&nbsp;MAC_IPGR&nbsp;=&nbsp;IPGR_DEF;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;Reduced&nbsp;MII&nbsp;interface.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_COMMAND&nbsp;=&nbsp;CR_RMII&nbsp;|&nbsp;CR_PASS_RUNT_FRM;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Reset&nbsp;Reduced&nbsp;MII&nbsp;Logic.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_SUPP&nbsp;=&nbsp;SUPP_RES_RMII;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;100;&nbsp;tout;&nbsp;tout--);<br />&nbsp;&nbsp;&nbsp;MAC_SUPP&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Put&nbsp;the&nbsp;DP83848C&nbsp;in&nbsp;reset&nbsp;mode&nbsp;*/<br />&nbsp;&nbsp;&nbsp;write_PHY&nbsp;(PHY_REG_BMCR,&nbsp;0x8000);<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;for&nbsp;hardware&nbsp;reset&nbsp;to&nbsp;end.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;0;&nbsp;tout&nbsp;&lt&nbsp;0x100000;&nbsp;tout++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regv&nbsp;=&nbsp;read_PHY&nbsp;(PHY_REG_BMCR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!(regv&nbsp;&&nbsp;0x8800))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Reset&nbsp;complete,&nbsp;device&nbsp;not&nbsp;Power&nbsp;Down.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Check&nbsp;if&nbsp;this&nbsp;is&nbsp;a&nbsp;DP83848C&nbsp;PHY.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;id1&nbsp;=&nbsp;read_PHY&nbsp;(PHY_REG_IDR1);<br />&nbsp;&nbsp;&nbsp;id2&nbsp;=&nbsp;read_PHY&nbsp;(PHY_REG_IDR2);<br /><br />&nbsp;&nbsp;&nbsp;if&nbsp;(((id1&nbsp;&lt&lt&nbsp;16)&nbsp;|&nbsp;(id2&nbsp;&&nbsp;0xFFF0))&nbsp;==&nbsp;DP83848C_ID)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Configure&nbsp;the&nbsp;PHY&nbsp;device&nbsp;*/<br />#if&nbsp;defined&nbsp;(_10MBIT_)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Connect&nbsp;at&nbsp;10MBit&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_PHY&nbsp;(PHY_REG_BMCR,&nbsp;PHY_FULLD_10M);<br />#elif&nbsp;defined&nbsp;(_100MBIT_)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Connect&nbsp;at&nbsp;100MBit&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_PHY&nbsp;(PHY_REG_BMCR,&nbsp;PHY_FULLD_100M);<br />#else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Use&nbsp;autonegotiation&nbsp;about&nbsp;the&nbsp;link&nbsp;speed.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_PHY&nbsp;(PHY_REG_BMCR,&nbsp;PHY_AUTO_NEG);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;to&nbsp;complete&nbsp;Auto_Negotiation.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;0;&nbsp;tout&nbsp;&lt&nbsp;0x100000;&nbsp;tout++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regv&nbsp;=&nbsp;read_PHY&nbsp;(PHY_REG_BMSR);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(regv&nbsp;&&nbsp;0x0020)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Autonegotiation&nbsp;Complete.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#endif<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Check&nbsp;the&nbsp;link&nbsp;status.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;0;&nbsp;tout&nbsp;&lt&nbsp;0x10000;&nbsp;tout++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regv&nbsp;=&nbsp;read_PHY&nbsp;(PHY_REG_STS);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(regv&nbsp;&&nbsp;0x0001)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Link&nbsp;is&nbsp;on.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Configure&nbsp;Full/Half&nbsp;Duplex&nbsp;mode.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if&nbsp;(regv&nbsp;&&nbsp;0x0004)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Full&nbsp;duplex&nbsp;is&nbsp;enabled.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_MAC2&nbsp;&nbsp;&nbsp;&nbsp;|=&nbsp;MAC2_FULL_DUP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_COMMAND&nbsp;|=&nbsp;CR_FULL_DUP;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_IPGT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;IPGT_FULL_DUP;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Half&nbsp;duplex&nbsp;mode.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_IPGT&nbsp;=&nbsp;IPGT_HALF_DUP;<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Configure&nbsp;100MBit/10MBit&nbsp;mode.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if&nbsp;(regv&nbsp;&&nbsp;0x0002)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;10MBit&nbsp;mode.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_SUPP&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;100MBit&nbsp;mode.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_SUPP&nbsp;=&nbsp;SUPP_SPEED;<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Set&nbsp;the&nbsp;Ethernet&nbsp;MAC&nbsp;Address&nbsp;registers&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_SA0&nbsp;=&nbsp;((U32)own_hw_adr[5]&nbsp;&lt&lt&nbsp;8)&nbsp;|&nbsp;(U32)own_hw_adr[4];<br />&nbsp;&nbsp;&nbsp;MAC_SA1&nbsp;=&nbsp;((U32)own_hw_adr[3]&nbsp;&lt&lt&nbsp;8)&nbsp;|&nbsp;(U32)own_hw_adr[2];<br />&nbsp;&nbsp;&nbsp;MAC_SA2&nbsp;=&nbsp;((U32)own_hw_adr[1]&nbsp;&lt&lt&nbsp;8)&nbsp;|&nbsp;(U32)own_hw_adr[0];<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;Tx&nbsp;and&nbsp;Rx&nbsp;DMA&nbsp;Descriptors&nbsp;*/<br />&nbsp;&nbsp;&nbsp;rx_descr_init&nbsp;();<br />&nbsp;&nbsp;&nbsp;tx_descr_init&nbsp;();<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Receive&nbsp;Broadcast,&nbsp;Multicast&nbsp;and&nbsp;Perfect&nbsp;Match&nbsp;Packets&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_RXFILTERCTRL&nbsp;=&nbsp;RFC_MCAST_EN&nbsp;|&nbsp;RFC_BCAST_EN&nbsp;|&nbsp;RFC_PERFECT_EN;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;EMAC&nbsp;interrupts.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_INTENABLE&nbsp;=&nbsp;INT_RX_DONE&nbsp;|&nbsp;INT_TX_DONE;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Reset&nbsp;all&nbsp;interrupts&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_INTCLEAR&nbsp;&nbsp;=&nbsp;0xFFFF;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Enable&nbsp;receive&nbsp;and&nbsp;transmit&nbsp;mode&nbsp;of&nbsp;MAC&nbsp;Ethernet&nbsp;core&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_COMMAND&nbsp;&nbsp;|=&nbsp;(CR_RX_EN&nbsp;|&nbsp;CR_TX_EN);<br />&nbsp;&nbsp;&nbsp;MAC_MAC1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|=&nbsp;MAC1_REC_EN;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Configure&nbsp;VIC&nbsp;for&nbsp;EMAC&nbsp;interrupt.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;VICVectAddr21&nbsp;=&nbsp;(U32)interrupt_ethernet;<br />}<br /><br /><br />/*---------------------------&nbsp;int_enable_eth&nbsp;--------------------------------*/<br /><br />void&nbsp;int_enable_eth&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Ethernet&nbsp;Interrupt&nbsp;Enable&nbsp;function.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;|=&nbsp;1&nbsp;&lt&lt&nbsp;21;<br />}<br /><br /><br />/*---------------------------&nbsp;int_disable_eth&nbsp;-------------------------------*/<br /><br />void&nbsp;int_disable_eth&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Ethernet&nbsp;Interrupt&nbsp;Disable&nbsp;function.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;VICIntEnClr&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;21;<br />}<br /><br /><br />/*---------------------------&nbsp;send_frame&nbsp;------------------------------------*/<br /><br />void&nbsp;send_frame&nbsp;(OS_FRAME&nbsp;*frame)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Send&nbsp;frame&nbsp;to&nbsp;EMAC&nbsp;ethernet&nbsp;controller&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U32&nbsp;idx,len;<br />&nbsp;&nbsp;&nbsp;U32&nbsp;*sp,*dp;<br /><br />&nbsp;&nbsp;&nbsp;idx&nbsp;=&nbsp;MAC_TXPRODUCEINDEX;<br />&nbsp;&nbsp;&nbsp;sp&nbsp;&nbsp;=&nbsp;(U32&nbsp;*)&frame-&gtdata[0];<br />&nbsp;&nbsp;&nbsp;dp&nbsp;&nbsp;=&nbsp;(U32&nbsp;*)Tx_Desc[idx].Packet;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Copy&nbsp;frame&nbsp;data&nbsp;to&nbsp;EMAC&nbsp;packet&nbsp;buffers.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;for&nbsp;(len&nbsp;=&nbsp;(frame-&gtlength&nbsp;+&nbsp;3)&nbsp;&gt&gt&nbsp;2;&nbsp;len;&nbsp;len--)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*dp++&nbsp;=&nbsp;*sp++;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;Tx_Desc[idx].Ctrl&nbsp;=&nbsp;(frame-&gtlength-1)&nbsp;|&nbsp;(TCTRL_INT&nbsp;|&nbsp;TCTRL_LAST);<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Start&nbsp;frame&nbsp;transmission.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;if&nbsp;(++idx&nbsp;==&nbsp;NUM_TX_FRAG)&nbsp;idx&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;MAC_TXPRODUCEINDEX&nbsp;=&nbsp;idx;<br />}<br /><br /><br />/*---------------------------&nbsp;interrupt_ethernet&nbsp;----------------------------*/<br /><br />static&nbsp;void&nbsp;interrupt_ethernet&nbsp;(void)&nbsp;__irq&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;EMAC&nbsp;Ethernet&nbsp;Controller&nbsp;Interrupt&nbsp;function.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;OS_FRAME&nbsp;*frame;<br />&nbsp;&nbsp;&nbsp;U32&nbsp;idx,int_stat,RxLen,info;<br />&nbsp;&nbsp;&nbsp;U32&nbsp;*sp,*dp;<br /><br />&nbsp;&nbsp;&nbsp;while&nbsp;((int_stat&nbsp;=&nbsp;(MAC_INTSTATUS&nbsp;&&nbsp;MAC_INTENABLE))&nbsp;!=&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_INTCLEAR&nbsp;=&nbsp;int_stat;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(int_stat&nbsp;&&nbsp;INT_RX_DONE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Packet&nbsp;received,&nbsp;check&nbsp;if&nbsp;packet&nbsp;is&nbsp;valid.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idx&nbsp;=&nbsp;MAC_RXCONSUMEINDEX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(idx&nbsp;!=&nbsp;MAC_RXPRODUCEINDEX)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;Rx_Stat[idx].Info;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!(info&nbsp;&&nbsp;RINFO_LAST_FLAG))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;rel;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RxLen&nbsp;=&nbsp;(info&nbsp;&&nbsp;RINFO_SIZE)&nbsp;-&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(RxLen&nbsp;&gt&nbsp;ETH_MTU&nbsp;||&nbsp;(info&nbsp;&&nbsp;RINFO_ERR_MASK))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Invalid&nbsp;frame,&nbsp;ignore&nbsp;it&nbsp;and&nbsp;free&nbsp;buffer.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;rel;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Flag&nbsp;0x80000000&nbsp;to&nbsp;skip&nbsp;sys_error()&nbsp;call&nbsp;when&nbsp;out&nbsp;of&nbsp;memory.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame&nbsp;=&nbsp;alloc_mem&nbsp;(RxLen&nbsp;|&nbsp;0x80000000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;if&nbsp;'alloc_mem()'&nbsp;has&nbsp;failed,&nbsp;ignore&nbsp;this&nbsp;packet.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(frame&nbsp;!=&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp&nbsp;=&nbsp;(U32&nbsp;*)&frame-&gtdata[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp&nbsp;=&nbsp;(U32&nbsp;*)Rx_Desc[idx].Packet;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(RxLen&nbsp;=&nbsp;(RxLen&nbsp;+&nbsp;3)&nbsp;&gt&gt&nbsp;2;&nbsp;RxLen;&nbsp;RxLen--)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*dp++&nbsp;=&nbsp;*sp++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;put_in_queue&nbsp;(frame);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />rel:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++idx&nbsp;==&nbsp;NUM_RX_FRAG)&nbsp;idx&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Release&nbsp;frame&nbsp;from&nbsp;EMAC&nbsp;buffer.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAC_RXCONSUMEINDEX&nbsp;=&nbsp;idx;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(int_stat&nbsp;&&nbsp;INT_TX_DONE)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Frame&nbsp;transmit&nbsp;completed.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Acknowledge&nbsp;the&nbsp;interrupt.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;<br />}<br /><br /><br />/*---------------------------&nbsp;rx_descr_init&nbsp;---------------------------------*/<br /><br />static&nbsp;void&nbsp;rx_descr_init&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;Receive&nbsp;Descriptor&nbsp;and&nbsp;Status&nbsp;array.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U32&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;NUM_RX_FRAG;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_Desc.Packet&nbsp;&nbsp;=&nbsp;(U32)&rx_buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_Desc.Ctrl&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;RCTRL_INT&nbsp;|&nbsp;(ETH_FRAG_SIZE-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_Stat.Info&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rx_Stat.HashCRC&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Set&nbsp;EMAC&nbsp;Receive&nbsp;Descriptor&nbsp;Registers.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_RXDESCRIPTOR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(U32)&Rx_Desc[0];<br />&nbsp;&nbsp;&nbsp;MAC_RXSTATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(U32)&Rx_Stat[0];<br />&nbsp;&nbsp;&nbsp;MAC_RXDESCRIPTORNUM&nbsp;=&nbsp;NUM_RX_FRAG-1;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Rx&nbsp;Descriptors&nbsp;Point&nbsp;to&nbsp;0&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_RXCONSUMEINDEX&nbsp;&nbsp;=&nbsp;0;<br />}<br /><br /><br />/*---------------------------&nbsp;tx_descr_init&nbsp;----&nbsp;----------------------------*/<br /><br />static&nbsp;void&nbsp;tx_descr_init&nbsp;(void)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Initialize&nbsp;Transmit&nbsp;Descriptor&nbsp;and&nbsp;Status&nbsp;array.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U32&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;NUM_TX_FRAG;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_Desc.Packet&nbsp;=&nbsp;(U32)&tx_buf;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_Desc.Ctrl&nbsp;&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_Stat.Info&nbsp;&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Set&nbsp;EMAC&nbsp;Transmit&nbsp;Descriptor&nbsp;Registers.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_TXDESCRIPTOR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(U32)&Tx_Desc[0];<br />&nbsp;&nbsp;&nbsp;MAC_TXSTATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(U32)&Tx_Stat[0];<br />&nbsp;&nbsp;&nbsp;MAC_TXDESCRIPTORNUM&nbsp;=&nbsp;NUM_TX_FRAG-1;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Tx&nbsp;Descriptors&nbsp;Point&nbsp;to&nbsp;0&nbsp;*/<br />&nbsp;&nbsp;&nbsp;MAC_TXPRODUCEINDEX&nbsp;&nbsp;=&nbsp;0;<br />}<br /><br /><br />/*---------------------------&nbsp;write_PHY&nbsp;-------------------------------------*/<br /><br />static&nbsp;void&nbsp;write_PHY&nbsp;(U32&nbsp;PhyReg,&nbsp;U16&nbsp;Value)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Write&nbsp;a&nbsp;data&nbsp;'Value'&nbsp;to&nbsp;PHY&nbsp;register&nbsp;'PhyReg'.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U32&nbsp;tout;<br /><br />&nbsp;&nbsp;&nbsp;MAC_MADR&nbsp;=&nbsp;DP83848C_DEF_ADR&nbsp;|&nbsp;PhyReg;<br />&nbsp;&nbsp;&nbsp;MAC_MWTD&nbsp;=&nbsp;Value;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;Wait&nbsp;utill&nbsp;operation&nbsp;completed&nbsp;*/<br />&nbsp;&nbsp;&nbsp;tout&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;0;&nbsp;tout&nbsp;&lt&nbsp;MII_WR_TOUT;&nbsp;tout++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((MAC_MIND&nbsp;&&nbsp;MIND_BUSY)&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />/*---------------------------&nbsp;read_PHY&nbsp;--------------------------------------*/<br /><br />static&nbsp;U16&nbsp;read_PHY&nbsp;(U32&nbsp;PhyReg)&nbsp;{<br />&nbsp;&nbsp;&nbsp;/*&nbsp;Read&nbsp;a&nbsp;PHY&nbsp;register&nbsp;'PhyReg'.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;U32&nbsp;tout;<br /><br />&nbsp;&nbsp;&nbsp;MAC_MADR&nbsp;=&nbsp;DP83848C_DEF_ADR&nbsp;|&nbsp;PhyReg;<br />&nbsp;&nbsp;&nbsp;MAC_MCMD&nbsp;=&nbsp;MCMD_READ;<br /><br />&nbsp;&nbsp;/*&nbsp;Wait&nbsp;until&nbsp;operation&nbsp;completed&nbsp;*/<br />&nbsp;&nbsp;&nbsp;tout&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(tout&nbsp;=&nbsp;0;&nbsp;tout&nbsp;&lt&nbsp;MII_RD_TOUT;&nbsp;tout++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((MAC_MIND&nbsp;&&nbsp;MIND_BUSY)&nbsp;==&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;MAC_MCMD&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;return&nbsp;(MAC_MRDD);<br />}<br /><br />/*----------------------------------------------------------------------------<br />&nbsp;*&nbsp;end&nbsp;of&nbsp;file<br />&nbsp;*---------------------------------------------------------------------------*/<br /><br /><br />
xiaoxin1986 发表于 2009-2-19 13:28 | 显示全部楼层

哇,好长啊

  
linhai1986 发表于 2009-2-19 13:44 | 显示全部楼层

没有试过

  
xiepengchenghn 发表于 2010-11-15 23:01 | 显示全部楼层
liwenz 发表于 2010-11-16 10:08 | 显示全部楼层
这个代码干什么,也没个说明。 我用的是lpc1768 的tcpnet
3B1105 发表于 2010-11-16 22:39 | 显示全部楼层
楼上到底什么意思?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

81

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部