summaryrefslogtreecommitdiffstats
path: root/app/ATTIC/debug_eth.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/ATTIC/debug_eth.c')
-rw-r--r--app/ATTIC/debug_eth.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/app/ATTIC/debug_eth.c b/app/ATTIC/debug_eth.c
new file mode 100644
index 0000000..2742eeb
--- /dev/null
+++ b/app/ATTIC/debug_eth.c
@@ -0,0 +1,105 @@
+#include "project.h"
+
+/*---------------------------------------------------------------------------*/
+/** @brief Process pending SMI transaction and wait to be done.
+ */
+static void my_eth_smi_transact(void)
+{
+TRACE;
+ /* Begin transaction. */
+ ETH_MACMIIAR |= ETH_MACMIIAR_MB;
+TRACE;
+
+ /* Wait for not busy. */
+ while (ETH_MACMIIAR & ETH_MACMIIAR_MB);
+TRACE;
+}
+
+/*---------------------------------------------------------------------------*/
+/** @brief Write 16-bit register to the PHY
+ *
+ * @param[in] phy uint8_t ID of the PHY (defaults to 1)
+ * @param[in] reg uint8_t Register address
+ * @param[in] data uint16_t Data to write
+ */
+void my_eth_smi_write(uint8_t phy, uint8_t reg, uint16_t data)
+{
+ /* Write operation MW=1*/
+ ETH_MACMIIAR = (ETH_MACMIIAR & ETH_MACMIIAR_CR) | /* save clocks */
+ (phy << ETH_MACMIIAR_PA_SHIFT) |
+ (reg << ETH_MACMIIAR_MR_SHIFT) |
+ ETH_MACMIIAR_MW;
+
+ ETH_MACMIIDR = data & ETH_MACMIIDR_MD;
+TRACE;
+
+ my_eth_smi_transact();
+TRACE;
+}
+
+/*---------------------------------------------------------------------------*/
+/** @brief Read the 16-bit register from the PHY
+ *
+ * @param[in] phy uint8_t ID of the PHY (defaults to 1)
+ * @param[in] reg uint8_t Register address
+ * @returns uint16_t Readed data
+ */
+uint16_t my_eth_smi_read(uint8_t phy, uint8_t reg)
+{
+ /* Read operation MW=0*/
+ ETH_MACMIIAR = (ETH_MACMIIAR & ETH_MACMIIAR_CR) | /* save clocks */
+ (phy << ETH_MACMIIAR_PA_SHIFT) |
+ (reg << ETH_MACMIIAR_MR_SHIFT);
+
+TRACE;
+ my_eth_smi_transact();
+TRACE;
+
+ return (uint16_t)(ETH_MACMIIDR & ETH_MACMIIDR_MD);
+}
+
+
+void my_phy_reset(uint8_t phy)
+{
+unsigned i;
+TRACE;
+ my_eth_smi_write(phy, PHY_REG_BCR, PHY_REG_BCR_RESET);
+
+
+for (i=0;i<0x20;++i){
+printf("%x %x\n",i,my_eth_smi_read(phy,i));
+}
+
+
+TRACE;
+
+ while (my_eth_smi_read(phy, PHY_REG_BCR) & PHY_REG_BCR_RESET);
+TRACE;
+
+delay_ms(100);
+}
+
+
+void my_eth_init(uint8_t phy, enum eth_clk clock)
+{
+ ETH_MACMIIAR = clock;
+TRACE;
+ my_phy_reset(phy);
+TRACE;
+
+ ETH_MACCR = ETH_MACCR_CSTF | ETH_MACCR_FES | ETH_MACCR_DM |
+ ETH_MACCR_APCS | ETH_MACCR_RD;
+ ETH_MACFFR = ETH_MACFFR_RA | ETH_MACFFR_PM;
+ ETH_MACHTHR = 0; /* pass all frames */
+ ETH_MACHTLR = 0;
+ ETH_MACFCR = (0x100 << ETH_MACFCR_PT_SHIFT);
+ ETH_MACVLANTR = 0;
+ ETH_DMAOMR = ETH_DMAOMR_DTCEFD | ETH_DMAOMR_RSF | ETH_DMAOMR_DFRF |
+ ETH_DMAOMR_TSF | ETH_DMAOMR_FEF | ETH_DMAOMR_OSF;
+ ETH_DMABMR = ETH_DMABMR_AAB | ETH_DMABMR_FB |
+ (32 << ETH_DMABMR_RDP_SHIFT) | (32 << ETH_DMABMR_PBL_SHIFT) |
+ ETH_DMABMR_PM_2_1 | ETH_DMABMR_USP;
+TRACE;
+}
+
+