commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r6558 - gnuradio/branches/developers/matt/u2f/firmware


From: eb
Subject: [Commit-gnuradio] r6558 - gnuradio/branches/developers/matt/u2f/firmware
Date: Thu, 27 Sep 2007 14:08:07 -0600 (MDT)

Author: eb
Date: 2007-09-27 14:08:07 -0600 (Thu, 27 Sep 2007)
New Revision: 6558

Modified:
   gnuradio/branches/developers/matt/u2f/firmware/eth_driver.c
   gnuradio/branches/developers/matt/u2f/firmware/eth_driver.h
   gnuradio/branches/developers/matt/u2f/firmware/eth_phy.h
   gnuradio/branches/developers/matt/u2f/firmware/memory_map.h
Log:
work-in-progress on ethernet driver

Modified: gnuradio/branches/developers/matt/u2f/firmware/eth_driver.c
===================================================================
--- gnuradio/branches/developers/matt/u2f/firmware/eth_driver.c 2007-09-27 
19:23:06 UTC (rev 6557)
+++ gnuradio/branches/developers/matt/u2f/firmware/eth_driver.c 2007-09-27 
20:08:07 UTC (rev 6558)
@@ -23,9 +23,116 @@
 #include "memory_map.h"
 #include "eth_phy.h"
 #include "eth_mac.h"
+#include "eth_mac_regs.h"
+#include "pic.h"
+#include "sim_io.h"
 
+static eth_driver_t ed_state;
+
+static void
+ed_link_up(eth_speed_t speed)
+{
+}
+
+static void
+ed_link_down(void)
+{
+}
+
+static void
+ed_link_speed_change(eth_speed_t speed)
+{
+}
+
+/*
+ * Read the PHY state register to determine link state and speed
+ */
+static void
+ed_check_phy_state(void)
+{
+  int lansr = eth_mac_miim_read(PHY_LINK_AN);
+  eth_link_state_t new_state = LS_UNKNOWN;
+  eth_speed_t      new_speed = S_UNKNOWN;
+
+  sim_puts("LANSR: "); sim_puthex_nl(lansr);
+
+  if (lansr & LANSR_LINK_GOOD){                // link's up
+    sim_puts_nl("  LINK_GOOD");
+
+    new_state = LS_UP;
+    switch (lansr & LANSR_SPEED_MASK){
+    case LANSR_SPEED_10:
+      new_speed = S_10;
+      break;
+      
+    case LANSR_SPEED_100:
+      new_speed = S_100;
+      break;
+      
+    case LANSR_SPEED_1000:
+      new_speed = S_1000;
+      break;
+
+    default:
+      new_speed = S_UNKNOWN;
+      break;
+    }
+  }
+  else {                               // link's down
+    sim_puts_nl("  NOT LINK_GOOD");
+    
+    new_state = LS_DOWN;
+    new_speed = S_UNKNOWN;
+  }
+
+  if (new_state != ed_state.link_state){
+    ed_state.link_state = new_state;           // remember new state
+    if (new_state == LS_UP)
+      ed_link_up(new_speed);
+    else if (new_state == LS_DOWN)
+      ed_link_down();
+  }
+  else if (new_speed != ed_state.link_speed){
+    ed_state.link_speed = new_speed;           // remember new speed
+    sim_puts_nl("  New Speed: "); sim_puthex_nl(new_speed);
+    ed_link_speed_change(new_speed);
+  }
+}
+
+/*
+ * This is fired when the ethernet PHY state changes
+ */
+static void
+eth_phy_irq_handler(unsigned irq)
+{
+  ed_check_phy_state();
+  eth_mac_miim_write(PHY_INT_CLEAR, ~0);       // clear all ints
+}
+
+
 void
 eth_driver_init(void)
 {
+  ed_state.link_state = LS_UNKNOWN;
+  ed_state.link_speed = S_UNKNOWN;
+
+  // setup PHY to interrupt us on changes
+
+  unsigned mask =
+    (PHY_INT_AN_CMPL           // auto-neg completed
+     | PHY_INT_NO_LINK         // no link after auto-neg
+     | PHY_INT_NO_HCD          // no highest common denominator
+     | PHY_INT_MAS_SLA_ERR     // couldn't resolve master/slave 
+     | PHY_INT_PRL_DET_FLT     // parallel detection fault
+     | PHY_INT_LNK_CNG         // link established or broken
+     | PHY_INT_SPD_CNG         // speed changed
+     );
+
+  eth_mac_miim_write(PHY_INT_CLEAR, ~0);       // clear all pending interrupts
+  eth_mac_miim_write(PHY_INT_MASK, mask);      // enable the ones we want
+
+  pic_register_handler(IRQ_PHY, eth_phy_irq_handler);
+
+  ed_check_phy_state();
 }
 

Modified: gnuradio/branches/developers/matt/u2f/firmware/eth_driver.h
===================================================================
--- gnuradio/branches/developers/matt/u2f/firmware/eth_driver.h 2007-09-27 
19:23:06 UTC (rev 6557)
+++ gnuradio/branches/developers/matt/u2f/firmware/eth_driver.h 2007-09-27 
20:08:07 UTC (rev 6558)
@@ -25,11 +25,11 @@
 void eth_driver_init(void);
 
 typedef enum { LS_UNKNOWN, LS_DOWN, LS_UP } eth_link_state_t;
-typedef enum { S_10, S_100, S_1000 } eth_speed_t;
+typedef enum { S_UNKNOWN, S_10, S_100, S_1000 } eth_speed_t;
 
 typedef struct {
   eth_link_state_t     link_state;
-  eth_speed_t          current_speed;
+  eth_speed_t          link_speed;
 } eth_driver_t;
 
 #endif /* INCLUDED_ETH_DRIVER_H */

Modified: gnuradio/branches/developers/matt/u2f/firmware/eth_phy.h
===================================================================
--- gnuradio/branches/developers/matt/u2f/firmware/eth_phy.h    2007-09-27 
19:23:06 UTC (rev 6557)
+++ gnuradio/branches/developers/matt/u2f/firmware/eth_phy.h    2007-09-27 
20:08:07 UTC (rev 6558)
@@ -45,9 +45,9 @@
 /* The part implements 0x00 thru 0x1f; we use these. */
 
 #define        PHY_LINK_AN      0x11 /* Link and Auto Negotiation Status Reg */
-#define PHY_INT_STATUS  0x14 /* Interupt Status Reg */
-#define PHY_INT_MASK    0x15 /* Interrupt Mask Reg */
-#define PHY_INT_CLEAR    0x16 /* Interrupt Clear Reg */
+#define PHY_INT_STATUS  0x14 /* Interupt Status Reg (RO) */
+#define PHY_INT_MASK    0x15 /* Interrupt Mask Reg  (RW) */
+#define PHY_INT_CLEAR    0x17 /* Interrupt Clear Reg (RW) */
 
 
 /* Bit definitions for some of the registers above */

Modified: gnuradio/branches/developers/matt/u2f/firmware/memory_map.h
===================================================================
--- gnuradio/branches/developers/matt/u2f/firmware/memory_map.h 2007-09-27 
19:23:06 UTC (rev 6557)
+++ gnuradio/branches/developers/matt/u2f/firmware/memory_map.h 2007-09-27 
20:08:07 UTC (rev 6558)
@@ -287,13 +287,13 @@
 
 #define IRQ_TO_MASK(x) (1 << (x))
 
-#define PIC_BUFFER_INT IRQ_TO_MASK(IRQ_BUFFER)
-#define PIC_TIMER_INT  IRQ_TO_MASK(IRQ_TIMER)
-#define PIC_SPI_INT    IRQ_TO_MASK(IRQ_SPI)
-#define PIC_I2C_INT    IRQ_TO_MASK(IRQ_I2C)
-#define PIC_PHY_INT    IRQ_TO_MASK(IRQ_PHY)
-#define PIC_UNDERRUN_INT    IRQ_TO_MASK(IRQ_UNDERRUN)
-#define PIC_OVERRUN_INT    IRQ_TO_MASK(IRQ_OVERRUN)
+#define PIC_BUFFER_INT    IRQ_TO_MASK(IRQ_BUFFER)
+#define PIC_TIMER_INT     IRQ_TO_MASK(IRQ_TIMER)
+#define PIC_SPI_INT       IRQ_TO_MASK(IRQ_SPI)
+#define PIC_I2C_INT       IRQ_TO_MASK(IRQ_I2C)
+#define PIC_PHY_INT       IRQ_TO_MASK(IRQ_PHY)
+#define PIC_UNDERRUN_INT  IRQ_TO_MASK(IRQ_UNDERRUN)
+#define PIC_OVERRUN_INT   IRQ_TO_MASK(IRQ_OVERRUN)
 
 
 typedef struct {





reply via email to

[Prev in Thread] Current Thread [Next in Thread]