[Top][All Lists]
[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 {
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r6558 - gnuradio/branches/developers/matt/u2f/firmware,
eb <=