OSDN Git Service

LANドライバの共通関数を集約
[mimic/MiMicSDK.git] / lib / src / driver / ethernet / lpc17xx / EthDev_LPC17xx.c
index 2fc9a62..9f3fc37 100644 (file)
@@ -11,8 +11,9 @@
 #include "NyLPC_os.h"\r
 #include "LPC17xx.h"\r
 /* If no buffers are available, then wait this long before looking again.... */\r
-#define emacBUFFER_WAIT_DELAY_MS               3\r
-#define emacBUFFER_WAIT_EMPTY_DELAY_MS 10\r
+#define emacBUFFER_WAIT_DELAY_MS                3\r
+#define emacBUFFER_WAIT_EMPTY_DELAY_MS 10\r
+#define emacSHORT_DELAY_MS                             10\r
 //--------------------------------------------------\r
 // common function.\r
 //--------------------------------------------------\r
@@ -192,5 +193,80 @@ void EthDev_LPC17xx_nextRxEthFrame(void)
                LPC_EMAC->RxConsumeIndex = lIndex;\r
        }\r
 }\r
+\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+\r
+/*-----------------------------------------------------------*/\r
+#define ETHDEV_PHY_DEF_ADR             0x0100  /* Default PHY device address        */\r
+\r
+NyLPC_TBool EthDev_LPC17xx_prvWritePHY( long lPhyReg, long lValue )\r
+{\r
+    const long lMaxTime = 10;\r
+    long x;\r
+\r
+    LPC_EMAC->MCMD = 0;\r
+    LPC_EMAC->MADR = ETHDEV_PHY_DEF_ADR | lPhyReg;\r
+    LPC_EMAC->MWTD = lValue;\r
+\r
+    for( x = 0; x < lMaxTime; x++ )\r
+    {\r
+        if( ( LPC_EMAC->MIND & MIND_BUSY ) == 0 )\r
+        {\r
+            /* Operation has finished. */\r
+            break;\r
+        }\r
+\r
+        NyLPC_cThread_sleep( emacSHORT_DELAY_MS );\r
+    }\r
+\r
+    if( x < lMaxTime )\r
+    {\r
+        return NyLPC_TBool_TRUE;\r
+    }\r
+    else\r
+    {\r
+        return NyLPC_TBool_FALSE;\r
+    }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+unsigned short EthDev_LPC17xx_prvReadPHY( unsigned int ucPhyReg, NyLPC_TBool* plStatus )\r
+{\r
+    long x;\r
+    const long lMaxTime = 10;\r
+\r
+    LPC_EMAC->MCMD = 1;\r
+    LPC_EMAC->MADR = ETHDEV_PHY_DEF_ADR | ucPhyReg;\r
+    LPC_EMAC->MCMD = MCMD_READ;\r
+\r
+    for( x = 0; x < lMaxTime; x++ )\r
+    {\r
+        /* Operation has finished. */\r
+        if( ( LPC_EMAC->MIND & MIND_BUSY ) == 0 )\r
+        {\r
+            break;\r
+        }\r
+        NyLPC_cThread_sleep( emacSHORT_DELAY_MS );\r
+    }\r
+\r
+    LPC_EMAC->MCMD = 0;\r
+\r
+    if( x >= lMaxTime )\r
+    {\r
+        *plStatus = NyLPC_TBool_FALSE;\r
+    }\r
+\r
+    return( LPC_EMAC->MRDD );\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
 #endif\r
 \r