summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorroot <root@lab.panaceas.james.local>2019-02-19 18:08:31 +0000
committerroot <root@lab.panaceas.james.local>2019-02-19 18:08:31 +0000
commit9bbf1d200534cd946c4776e29457f989147b45b2 (patch)
tree6d167a3bede4ae9da3912562ad9fb5baf76d6770
parentb3c6320899d6b27899ab3c67c745e8d3b29af3a2 (diff)
downloadclock-9bbf1d200534cd946c4776e29457f989147b45b2.tar.gz
clock-9bbf1d200534cd946c4776e29457f989147b45b2.tar.bz2
clock-9bbf1d200534cd946c4776e29457f989147b45b2.zip
everything working, even with fucked phy
-rw-r--r--app/Makefile2
-rw-r--r--app/abs.c45
-rw-r--r--app/bits.c22
-rw-r--r--app/dcf77.c6
-rw-r--r--app/gps.c105
-rw-r--r--app/main.c84
-rw-r--r--app/msf.c18
-rw-r--r--app/ntp.c5
-rw-r--r--app/pll.c12
-rw-r--r--app/prototypes.h5
-rw-r--r--app/steth.c547
-rw-r--r--app/steth.h46
-rw-r--r--app/ticker.c1
13 files changed, 509 insertions, 389 deletions
diff --git a/app/Makefile b/app/Makefile
index dd4b6e7..7a0f1a9 100644
--- a/app/Makefile
+++ b/app/Makefile
@@ -25,7 +25,7 @@ PROG=msf
V=1
default: ${PROG}.elf
-CSRCS=led.c ticker.c ring.c usart.c stdio.c lwip_glue.c steth.c msf.c abs.c pll.c main.c time_fn.c ntp.c dcf77.c util.c stats.c gps.c hexdump.c bits.c debug_eth.c
+CSRCS=led.c ticker.c ring.c usart.c stdio.c lwip_glue.c steth.c msf.c abs.c pll.c main.c time_fn.c ntp.c dcf77.c util.c stats.c gps.c hexdump.c bits.c
HSRCS=project.h ring.h pins.h gps.h ubx.h
diff --git a/app/abs.c b/app/abs.c
index 769da7a..a91787c 100644
--- a/app/abs.c
+++ b/app/abs.c
@@ -3,28 +3,55 @@
static uint32_t high_tick;
+#define QUARTER (1UL << 29)
+#define HALF (1UL << 30)
+#define THREE_QUARTERS (HALF+QUARTER)
+#define ONE (~(uint32_t)0)
uint64_t abs_extend (uint32_t now)
{
- static uint32_t then;
+ static int m;
+ uint64_t ret;
- uint64_t ret;
+ if (!m) {
+ ret = high_tick;
+ ret <<= 32;
+ ret |= now;
- if (now < then)
- high_tick++;
+ if ((now>THREE_QUARTERS) &&( now<=ONE)) {
+ high_tick++;
+ m=1;
+ }
- then = now;
+ } else {
- ret = high_tick;
- ret <<= 32;
- ret |= now;
+ if (now<HALF) {
+ ret = high_tick;
+ ret <<= 32;
+ ret |= now;
+ } else {
+ ret = high_tick-1;
+ ret <<= 32;
+ ret |= now;
+ }
- return ret;
+ if ((now>QUARTER) &&( now<HALF))
+ m=0;
}
+ return ret;
+}
+
+
+void abs_meh(void)
+{
+printf("HT %d\n",(int) high_tick);
+}
+
+
diff --git a/app/bits.c b/app/bits.c
index 03d5c31..6978c74 100644
--- a/app/bits.c
+++ b/app/bits.c
@@ -1,22 +1,22 @@
#include "project.h"
-void dump_bits(char *wot,uint8_t *bits)
+void dump_bits (char *wot, uint8_t *bits)
{
-char buf[128];
-char *ptr=buf;
-unsigned i=60;
+ char buf[128];
+ char *ptr = buf;
+ unsigned i = 60;
-ptr+=sprintf(buf,"%s bits: ",wot);
+ ptr += sprintf (buf, "%s bits: ", wot);
-while (i--)
-*(ptr++)=*(bits++) ? '1':'0';
+ while (i--)
+ * (ptr++) = * (bits++) ? '1' : '0';
-*(ptr++)='\r';
-*(ptr++)='\n';
-*ptr=0;
-usart1_write(buf,(unsigned) (ptr-buf),1);
+ * (ptr++) = '\r';
+ * (ptr++) = '\n';
+ *ptr = 0;
+ usart1_write (buf, (unsigned) (ptr - buf), 1);
}
diff --git a/app/dcf77.c b/app/dcf77.c
index edc152b..361e4ca 100644
--- a/app/dcf77.c
+++ b/app/dcf77.c
@@ -34,7 +34,6 @@ void exti15_10_isr (void)
static uint8_t bits[60];
-static int time_known;
static void process_bits (uint64_t abs)
{
@@ -68,12 +67,11 @@ static void process_bits (uint64_t abs)
#if 0
pll_set_offset (dcf77_time, abs);
#endif
- time_known = 1;
printf ("DCF77: Next minute is: %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute);
time_print_epoch ("DCF77: ", dcf77_time);
- dump_bits("dcf77",bits);
+ dump_bits ("dcf77", bits);
}
@@ -91,7 +89,7 @@ static void report_bit (uint64_t abs, int second, int b)
static void report_time (uint64_t abs)
{
-#if 0
+#if 1
EPOCH e = pll_decompose (abs);
time_print_epoch ("DCF77: ", e);
#endif
diff --git a/app/gps.c b/app/gps.c
index 9fc60de..b0bc433 100644
--- a/app/gps.c
+++ b/app/gps.c
@@ -10,12 +10,12 @@
static int ubx_ack = 0;
static int ubx_ack_xfer = 0;
-static int current_ref_hz=1;
+static int current_ref_hz = 1;
int gps_locked;
int gps_happy;
-static char fix,fix2;
+static char fix, fix2;
static int32_t freq = 0;
static const int fish[] = { 1, 2, 3, 4, 5, 6, 7 };
@@ -72,47 +72,47 @@ ubx_recv_nav_status (uint8_t *ptr, unsigned len)
switch (gps_fix) {
case 0:
case 1:
- fix='-';
+ fix = '-';
gps_locked = 0;
break;
case 2:
- fix='2';
+ fix = '2';
gps_locked = 0;
break;
case 3:
- fix='L';
+ fix = 'L';
gps_locked = 1;
break;
case 4:
- fix='R';
+ fix = 'R';
gps_locked = 0;
break;
case 5:
- fix='T';
+ fix = 'T';
gps_locked = 0;
break;
default:
- fix='?';
+ fix = '?';
gps_locked = 0;
}
switch (flags & 3) {
case 0:
case 2:
- fix2='!';
+ fix2 = '!';
break;
case 1:
- fix2='-';
+ fix2 = '-';
break;
case 3:
- fix2='D';
+ fix2 = 'D';
if (gps_locked == 1)
gps_locked = 2;
@@ -120,11 +120,11 @@ ubx_recv_nav_status (uint8_t *ptr, unsigned len)
break;
default:
- fix2='?';
+ fix2 = '?';
}
-// printf ("fix: %c%c\r\n",fix,fix2);
+ // printf ("fix: %c%c\r\n",fix,fix2);
if ((gps_locked) && (gps_happy < 10000))
@@ -152,7 +152,7 @@ ubx_recv_clock_stats (uint8_t *ptr, unsigned len)
ptr += ubx_get_u32 (ptr, &d); //time acc estimate
ptr += ubx_get_i32 (ptr, &freq); //freq acc estimate
-// printf ("TCXO %+8dE-12\r\n", (int) freq);
+ // printf ("TCXO %+8dE-12\r\n", (int) freq);
#if 0
sprintf (buf, "TCXO %+8dE-12", (int) freq);
lcd_erase_line (18, 0);
@@ -185,7 +185,26 @@ ubx_recv_utc (uint8_t *ptr, unsigned len)
ptr += ubx_get_u8 (ptr, &min);
ptr += ubx_get_u8 (ptr, &sec);
-// printf ("gps %02d:%02d:%02d %09d\r\n", (int) hour, (int) min, (int) sec, (int) nano);
+// printf ("gps %02d:%02d:%02d %09d\r\n", (int) hour, (int) min, (int) sec, (int) nano);
+
+{
+ UTC u;
+ EPOCH gps_time;
+
+ u.jday = 0;
+ u.year = year;
+ u.month = month;
+ u.mday = day;
+ u.hour = hour;
+ u.minute = min;
+ u.second = sec;
+ u.nanosecond = 0;
+
+ gps_time = time_utc_to_epoch (u);
+
+ pll_set_offset (gps_time, abs);
+}
+
#if 0
sprintf (buf, "%+6dE-12 %02d%02d%02d", (int) freq,
@@ -266,8 +285,9 @@ ubx_recv (uint8_t class, uint8_t id, uint8_t *payload, unsigned len)
default:
printf ("RX> %02x.%02x (%d bytes)\r\n", class, id, len);
- if (class!=0x03)
- hexdump (payload, len);
+
+ if (class != 0x03)
+ hexdump (payload, len);
}
@@ -401,8 +421,8 @@ ubx_dispatch_search (int s_class, int s_id, unsigned *len_ptr)
static void gps_pps_dispatch (void)
{
char buf[80];
- uint64_t abs;
uint32_t now;
+ uint64_t abs;
int v;
EPOCH e;
UTC u;
@@ -417,22 +437,25 @@ static void gps_pps_dispatch (void)
if (!v) return;
-
-
- abs = abs_extend (now);
- pll_dispatch(abs);
+ abs=abs_extend(now);
+
+
+
+ pll_dispatch (abs);
e = pll_decompose (abs);
- u=time_epoch_to_utc(e);
- printf ("GPS %02d:%02d:%02d.%09d Fix:%c%c TXCO %+8dE-12\r\n",
+ u = time_epoch_to_utc (e);
+
+ printf (" GPS %02d:%02d:%02d.%09d Fix:%c%c TXCO %+8dE-12\r\n",
u.hour,
u.minute,
u.second,
u.nanosecond,
- fix,fix2,(int) freq);
+ fix, fix2, (int) freq);
+ time_print_epoch ("GPS : ", e);
}
@@ -491,7 +514,7 @@ ubx_handshake (uint8_t class, uint8_t id, const void *payload, unsigned len)
if (ticks > timeout) {
printf ("GPS timeout resending packet\r\n");
- usart3_drain();
+ usart3_drain();
ubx_send (class, id, payload, len);
timeout = ticks + TIMEOUT;
}
@@ -512,7 +535,7 @@ ubx_handshake_xfer (uint8_t class, uint8_t id, const void *payload,
uint32_t timeout;
ubx_ack_xfer = 0;
-// usart3_drain();
+ // usart3_drain();
ubx_send (class, id, payload, len);
@@ -523,7 +546,7 @@ ubx_handshake_xfer (uint8_t class, uint8_t id, const void *payload,
if (ticks > timeout) {
printf ("GPS timeout resending packet\r\n");
-// usart3_drain();
+ // usart3_drain();
ubx_send (class, id, payload, len);
timeout = ticks + TIMEOUT;
}
@@ -609,7 +632,7 @@ gps_set_ref (int ref_hz)
ptr += ubx_put_u8 (ptr, 0); //reserved
ptr += ubx_put_u16 (ptr, 0); //reserved
-// ptr += ubx_put_u16 (ptr, 32); //ant cable delay ns
+ // ptr += ubx_put_u16 (ptr, 32); //ant cable delay ns
ptr += ubx_put_u16 (ptr, 0); //ant cable delay ns
ptr += ubx_put_u16 (ptr, 0); //rf group delay ns
ptr += ubx_put_u32 (ptr, 1000000 / ref_hz); //period unlocked/us
@@ -668,9 +691,9 @@ gps_init (void)
printf ("configured GNSS protocol\r\n");
#if 1
-ptr = buf;
- ptr += ubx_put_u16 (ptr, 0x14);
- ptr += ubx_put_u16 (ptr, 0x00);
+ ptr = buf;
+ ptr += ubx_put_u16 (ptr, 0x14);
+ ptr += ubx_put_u16 (ptr, 0x00);
ubx_handshake (0x06, 0x13, buf, (unsigned) (ptr - buf));
printf ("configured antenna pins\r\n");
@@ -738,12 +761,12 @@ ptr = buf;
#endif
#if 1
-ptr = buf;
- ptr += ubx_put_u8 (ptr, 0x1);
- ptr += ubx_put_u8 (ptr, 0x7);
- ptr += ubx_put_u8 (ptr, 0x1);
- ptr += ubx_put_u8 (ptr, 0xf);
- ptr += ubx_put_u32 (ptr, 0xffffffff);
+ ptr = buf;
+ ptr += ubx_put_u8 (ptr, 0x1);
+ ptr += ubx_put_u8 (ptr, 0x7);
+ ptr += ubx_put_u8 (ptr, 0x1);
+ ptr += ubx_put_u8 (ptr, 0xf);
+ ptr += ubx_put_u32 (ptr, 0xffffffff);
ubx_handshake (0x06, 0x16, buf, (unsigned) (ptr - buf));
printf ("configured SBAS\r\n");
@@ -809,10 +832,10 @@ gps_reset (void)
#define RPOS (1UL << 4)
#define RRTC (1UL << 8)
- ubx_cfg_rst (REPHEMERIDIES | RALMANAC | RPOS | RRTC);
+ ubx_cfg_rst (REPHEMERIDIES | RALMANAC | RPOS | RRTC);
-delay_ms(1000);
-usart3_drain();
+ delay_ms (1000);
+ usart3_drain();
printf ("Testing GNSS...\r\n");
diff --git a/app/main.c b/app/main.c
index 368839c..984e74b 100644
--- a/app/main.c
+++ b/app/main.c
@@ -1,23 +1,31 @@
#include "project.h"
+int time_known;
+
static void cmd_dispatch()
{
-uint8_t c;
-while (!ring_read_byte(&rx1_ring,&c)) {
+ uint8_t c;
- printf("KEY> %c\r\n",c);
+ while (!ring_read_byte (&rx1_ring, &c)) {
-switch(c) {
+ printf ("KEY> %c\r\n", c);
+ switch (c) {
case 'R':
- gps_reset ();
+ scb_reset_system();
+
+ break;
+
+ case 'G':
+ gps_reset();
break;
+
case 'A':
- gps_almanac ();
+ gps_almanac();
break;
-}
-}
+ }
+ }
}
@@ -25,22 +33,29 @@ static void
board_setup (void)
{
rcc_clock_setup_hse_3v3 (&hse_8mhz_3v3[CLOCK_3V3_168MHZ]);
+
rcc_periph_clock_enable (RCC_SYSCFG);
rcc_periph_clock_enable (RCC_GPIOA);
rcc_periph_clock_enable (RCC_GPIOB);
rcc_periph_clock_enable (RCC_GPIOC);
rcc_periph_clock_enable (RCC_GPIOD);
+ rcc_periph_clock_enable (RCC_GPIOE);
rcc_periph_clock_enable (RCC_USART1);
rcc_periph_clock_enable (RCC_USART3);
- rcc_periph_clock_enable (RCC_SYSCFG);
+ rcc_periph_clock_enable (RCC_ETHMAC);
+ rcc_periph_clock_enable (RCC_ETHMACTX);
+ rcc_periph_clock_enable (RCC_ETHMACRX);
+ rcc_periph_clock_enable (RCC_ETHMACPTP);
+
- nvic_set_priority (NVIC_EXTI2_IRQ, 0);
- nvic_set_priority (NVIC_EXTI0_IRQ, 1);
- nvic_set_priority (NVIC_EXTI15_10_IRQ, 2);
- nvic_set_priority (NVIC_USART1_IRQ, 3);
- nvic_set_priority (NVIC_ETH_IRQ, 4);
- nvic_set_priority (NVIC_SYSTICK_IRQ, 5) ;
+ nvic_set_priority (NVIC_EXTI2_IRQ, 0x0);
+ nvic_set_priority (NVIC_EXTI0_IRQ, 0x10);
+ nvic_set_priority (NVIC_EXTI15_10_IRQ, 0x20);
+ nvic_set_priority (NVIC_USART1_IRQ, 0x30);
+ nvic_set_priority (NVIC_USART3_IRQ, 0x30);
+ nvic_set_priority (NVIC_ETH_IRQ, 0x40);
+ nvic_set_priority (NVIC_SYSTICK_IRQ, 0x50);
}
@@ -51,6 +66,7 @@ system_init (void)
board_setup();
led_init();
ticker_init();
+
usart_init();
msf_init();
@@ -61,7 +77,7 @@ system_init (void)
printf ("STETH\r\n");
steth_init();
- //gps_init();
+ gps_init();
}
@@ -74,17 +90,41 @@ main (void)
printf ("Boot\r\n");
+#if 0
+ while (1) {
+ uint32_t now = SCS_DWT_CYCCNT;
+ uint64_t abs= abs_extend (now);
+ EPOCH e = pll_decompose (abs);
+ time_print_epoch ("TEST: ", e);
+ delay_ms(100);
+}
+#endif
+
+
+
+
+
while (1) {
-// msf_dispatch();
-// dcf77_dispatch();
+#if 0
+ {
+ uint32_t now = SCS_DWT_CYCCNT;
+ uint64_t abs= abs_extend (now);
+ EPOCH e = pll_decompose (abs);
+ time_print_epoch ("TEST: ", e);
+ delay_ms(100);
+ }
- //gps_dispatch();
-
- cmd_dispatch();
+ abs_meh();
+#endif
+
+ msf_dispatch();
+ dcf77_dispatch();
+
+ gps_dispatch();
+ cmd_dispatch();
dispatch_lwip();
- steth_dispatch();
}
diff --git a/app/msf.c b/app/msf.c
index 241998e..72ad024 100644
--- a/app/msf.c
+++ b/app/msf.c
@@ -1,10 +1,10 @@
#include "project.h"
#define P1 (GPIO1)
-#define P1_PORT GPIOB
+#define P1_PORT GPIOE
#define T (GPIO0)
-#define T_PORT GPIOB
+#define T_PORT GPIOE
static Event_ring msf_ring;
@@ -34,7 +34,6 @@ void exti0_isr (void)
static uint8_t bitsa[60], bitsb[60];
-static int time_known;
@@ -91,12 +90,11 @@ static void process_bits (uint64_t abs)
msf_time = time_utc_to_epoch (u);
msf_time.s -= 59;
- pll_set_offset (msf_time, abs);
- time_known = 1;
+// pll_set_offset (msf_time, abs);
stats_stamp (u, abs);
- dump_bits("msfa",bitsa);
- dump_bits("msfb",bitsb);
+ dump_bits ("msfa", bitsa);
+ dump_bits ("msfb", bitsb);
printf ("MSF: Next minute is: %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute);
//time_print_epoch (msf_time);
@@ -116,9 +114,9 @@ static void report_bits (uint64_t abs, int second, int a, int b)
static void report_time (uint64_t abs)
{
-#if 0
+#if 1
EPOCH e = pll_decompose (abs);
- time_print_epoch ("MSF: ", e);
+ time_print_epoch ("MSF : ", e);
#endif
}
@@ -185,7 +183,7 @@ void msf_dispatch (void)
if (time_known)
report_time (abs);
- stats();
+// stats();
}
diff --git a/app/ntp.c b/app/ntp.c
index 1c109ce..44002cc 100644
--- a/app/ntp.c
+++ b/app/ntp.c
@@ -77,3 +77,8 @@ packet (uint8_t *_p)
}
#endif
+
+
+void ntp_init(void)
+{
+}
diff --git a/app/pll.c b/app/pll.c
index 742aad0..56e8e21 100644
--- a/app/pll.c
+++ b/app/pll.c
@@ -19,6 +19,13 @@ int pll_valid = 0;
static int warming_up = WARM_UP;
+void pll_meh(void)
+{
+ printf (" %"PRId64" %"PRId64" %" PRId64 "\r\n",
+ pll_freq,offset,phase);
+
+}
+
static void modify_pll_freq (uint64_t now, int d)
{
@@ -50,6 +57,7 @@ void pll_dispatch (uint64_t edge)
return;
}
+
{
int diff, hf;
@@ -73,7 +81,7 @@ void pll_dispatch (uint64_t edge)
else if (out_of_lock <= JUMP_TICKS)
out_of_lock = 0;
-#if 0
+#if 1
printf ("PLL pd %.3f pll_freq %d phase %d\r\n", (float) f, (int) pll_freq, (int) phase);
#endif
@@ -106,6 +114,8 @@ void pll_set_offset (EPOCH epoch, uint64_t abs)
offset = epoch.s - abs;
pll_valid = 1;
+time_known=1;
+
}
diff --git a/app/prototypes.h b/app/prototypes.h
index 48ad192..a7d2bae 100644
--- a/app/prototypes.h
+++ b/app/prototypes.h
@@ -48,8 +48,10 @@ extern _Bool phy_link_an_done(uint8_t phy);
extern void eth_isr(void);
extern void steth_isr(void);
extern err_t steth_lwip_init(struct netif *netif);
+extern void eth_reset(void);
+extern void eth_start_an(void);
extern void steth_init(void);
-extern void steth_dispatch(void);
+extern void steth_slow_tick(void);
/* msf.c */
extern uint64_t msf_last_second;
extern void exti0_isr(void);
@@ -69,6 +71,7 @@ extern EPOCH _pll_decompose(uint64_t abs);
extern EPOCH pll_decompose_diff(int64_t diff);
extern EPOCH pll_decompose(uint64_t abs);
/* main.c */
+extern int time_known;
extern int main(void);
/* time_fn.c */
extern UTC time_epoch_to_utc(EPOCH epoch);
diff --git a/app/steth.c b/app/steth.c
index 8672163..afd68ed 100644
--- a/app/steth.c
+++ b/app/steth.c
@@ -1,52 +1,20 @@
#include <project.h>
+#include "steth.h"
-#define PHY PHY0
+#define FUCKED
-#define RXER GPIO10
-#define RXER_PORT GPIOB
+static int fucked;
-#define TXEN GPIO11
-#define TXEN_PORT GPIOB
-#define TXD0 GPIO12
-#define TXD0_PORT GPIOB
+#define AN_RETRY 6
-#define TXD1 GPIO13
-#define TXD1_PORT GPIOB
-
-#define RXD0 GPIO4
-#define RXD0_PORT GPIOC
-
-#define RXD1 GPIO5
-#define RXD1_PORT GPIOC
-
-#define CRS_DV GPIO7
-#define CRS_DV_PORT GPIOA
-
-#define MDIO GPIO2
-#define MDIO_PORT GPIOA
-
-#define MDC GPIO1
-#define MDC_PORT GPIOC
-
-#define REF_CLK GPIO1
-#define REF_CLK_PORT GPIOA
-
-#define NRST GPIO2
-#define NRST_PORT GPIOE
-
-
-#define DESC_SZ ETH_DES_EXT_SIZE
-#define FRAME_SZ 1516
-
-#define TX_BUFS 4
-#define RX_BUFS 4
-
-#define ETH_BUF_LEN ((TX_BUFS+ RX_BUFS) * (DESC_SZ+FRAME_SZ))
+static int running;
+static int an_clock;
+static int an_happy;
+static int ready;
-static int running;
static uint8_t __attribute__ ((aligned (4))) eth_buf[ETH_BUF_LEN];
@@ -56,80 +24,82 @@ extern uint32_t TxBD;
extern uint32_t RxBD;
-static void mac_stat(void)
+#define FOO(a) \
+ do { static uint32_t w; \
+ uint32_t v=a; \
+ if (v!=w) {\
+ printf (" " #a": %08x (%08x +%08x -%08x)\r\n", \
+ (unsigned) v,(unsigned) (v^w),(unsigned) ((v^w) &v),(unsigned) ((v^w)&w)); \
+ }\
+ w=v; \
+ } while (0)
+
+
+
+static void mac_stat (void)
{
- uint32_t d, s;
+ //uint32_t d, s;
printf ("Net:\r\n");
- printf (" ETH_MACCR: %08" PRIx32 "\r\n", ETH_MACCR);
-#if 0
- printf (" ETH_MACFFR: %08" PRIx32 "\r\n", ETH_MACFFR);
- printf (" ETH_MACFCR: %08" PRIx32 "\r\n", ETH_MACFCR);
- printf (" ETH_MACDBGR: %08" PRIx32 "\r\n", ETH_MACDBGR);
- printf (" ETH_MACSR: %08" PRIx32 "\r\n", ETH_MACSR);
-#endif
- printf (" ETH_DMAOMR: %08" PRIx32 "\r\n", ETH_DMAOMR);
- printf (" ETH_DMASR: %08" PRIx32 " ebs=%x tps=%x rps=%x\r\n", ETH_DMASR,
- (ETH_DMASR >>23) & 7 ,
- (ETH_DMASR >>20) & 7 ,
- (ETH_DMASR >>17) & 7 );
- printf (" ETH_DMAIER: %08" PRIx32 "\r\n", ETH_DMAIER);
- printf (" ETH_DMACHTDR: %08" PRIx32 "\r\n", ETH_DMACHTDR);
- printf (" ETH_DMACHRDR: %08" PRIx32 "\r\n", ETH_DMACHRDR);
- printf (" ETH_DMAOMR: %08" PRIx32 "\r\n", ETH_DMAOMR);
- printf (" ETH_DMATDLAR: %08" PRIx32 "\r\n", ETH_DMATDLAR);
- printf (" ETH_DMARDLAR: %08" PRIx32 "\r\n", ETH_DMARDLAR);
- printf (" ETH_DMABMR: %08" PRIx32 "\r\n", ETH_DMABMR);
-
- s = d = RxBD;
+ FOO (ETH_MACCR);
+ FOO (ETH_MACFFR);
+ FOO (ETH_MACFCR);
+ FOO (ETH_MACDBGR);
+ FOO (ETH_MACSR);
+ FOO (ETH_DMAOMR);
+ FOO (ETH_DMASR);
+ FOO (ETH_DMAIER);
+ FOO (ETH_DMACHTDR);
+ FOO (ETH_DMACHRDR);
+ FOO (ETH_DMAOMR);
+ FOO (ETH_DMATDLAR);
+ FOO (ETH_DMARDLAR);
+ FOO (ETH_DMABMR);
-if (running)
- do {
- printf (" %08" PRIx32 ": %08" PRIx32 " %08" PRIx32 " %08" PRIx32 " %08"
- PRIx32 "\r\n", d, ETH_DES0 (d), ETH_DES1 (d), ETH_DES2 (d),
- ETH_DES3 (d));
- d = ETH_DES3 (d);
+#if 0
+ s = d = RxBD;
- } while (d != s);
-}
+ if (running)
+ do {
+ printf (" %08" PRIx32 ": %08" PRIx32 " %08" PRIx32 " %08" PRIx32 " %08"
+ PRIx32 "\r\n", d, ETH_DES0 (d), ETH_DES1 (d), ETH_DES2 (d),
+ ETH_DES3 (d));
-static void phy_stat_reg(unsigned i)
-{
-static uint16_t last_phy[0x20];
-uint16_t cur=eth_smi_read(PHY,i);
+ d = ETH_DES3 (d);
-if (cur==last_phy[i]) return;
+ } while (d != s);
-printf(" phy:%02x %4x (was %4x +%4x -%4x)\r\n",
- i,(unsigned) cur,(unsigned) last_phy[i],
- (unsigned) ((last_phy[i] ^ cur) & cur),
- (unsigned) ((last_phy[i] ^ cur) & last_phy[i]));
+#endif
-last_phy[i]=cur;
}
-static void phy_stat(void)
-{
- phy_stat_reg(0x0);
- phy_stat_reg(0x1);
- phy_stat_reg(0x4);
- phy_stat_reg(0x5);
- phy_stat_reg(0x6);
- phy_stat_reg(0x11);
- phy_stat_reg(0x12);
- phy_stat_reg(0x1f);
-
+#define PHY_REGS 0x20
+static void phy_stat_reg (unsigned i)
+{
+ static uint16_t last_phy[PHY_REGS];
+ uint16_t cur = eth_smi_read (PHY, i);
+ if (cur == last_phy[i]) return;
+ printf (" phy:%02x %4x (was %4x +%4x -%4x)\r\n",
+ i, (unsigned) cur, (unsigned) last_phy[i],
+ (unsigned) ((last_phy[i] ^ cur) & cur),
+ (unsigned) ((last_phy[i] ^ cur) & last_phy[i]));
+ last_phy[i] = cur;
}
+static void phy_stat (void)
+{
+ unsigned i;
-
+ for (i = 0; i < PHY_REGS; ++i)
+ phy_stat_reg (i);
+}
bool
phy_link_an_done (uint8_t phy)
@@ -138,84 +108,22 @@ phy_link_an_done (uint8_t phy)
}
-
static err_t
steth_tx (struct netif *netif, struct pbuf *p)
{
-#if 0
- static uint8_t tx_buf[FRAME_SZ];
- uint32_t len, left;
-
- len = 0;
- left = FRAME_SZ;
-
- for (; p != NULL; p = p->next) {
- uint32_t sz = (left > p->len) ? p->len : left;
- memcpy (&tx_buf[len], (u8_t *) p->payload, sz);
- len += sz;
- left -= sz;
- }
-
- // usart6_write ("X", 1, 0);
-
- // hexdump(tx_buf,len);
-
- while (!eth_tx (tx_buf, len));
-
-#else
-
if (p->next) return ERR_IF;
while (!eth_tx (p->payload, p->len));
-#endif
-
-#if 0
- {
- static int tx_cnt = 0;
- printf ("TX %d\r\n", tx_cnt++);
- }
-#endif
-
return ERR_OK;
}
static err_t
steth_rx (void)
{
- //err_t err;
struct pbuf *p;
uint32_t len;
-//printf("Packet\r\n");
-
-#if 0
- struct pbuf *q;
- static uint8_t rx_buf[FRAME_SZ];
-
- len = 0;
-
- if (!eth_rx (rx_buf, &len, sizeof (rx_buf))) {
- usart6_write ("?", 1, 0);
- return ERR_OK;
- }
-
- /* We allocate a pbuf chain of pbufs from the Lwip buffer pool */
- p = pbuf_alloc (PBUF_RAW, len, PBUF_POOL);
-
- if (!p) {
- usart6_write ("!", 1, 0);
- return ERR_MEM;
- }
-
- len = 0;
-
- for (q = p; q != NULL; q = q->next) {
- memcpy ((u8_t *) q->payload, (u8_t *) & rx_buf[len], q->len);
- len += q->len;
- }
-
-#else
p = pbuf_alloc (PBUF_RAW, MTU, PBUF_POOL);
if (!p) return ERR_MEM;
@@ -228,25 +136,11 @@ steth_rx (void)
}
pbuf_realloc (p, len);
-#endif
-
-
-
- // usart6_write (".", 1, 0);
-
-#if 0
- {
- static int rx_cnt = 0;
- printf ("RX %d\r\n", rx_cnt++);
- }
-#endif
-
return if0.input (p, &if0);
}
-
static void
steth_nis (void)
{
@@ -264,14 +158,8 @@ eth_isr (void)
void
steth_isr (void)
{
-#if 1
- //printf ("eth\r\n");
-
if (eth_irq_ack_pending (ETH_DMASR_NIS))
steth_nis();
-
-#endif
-
}
@@ -310,182 +198,263 @@ steth_lwip_init (struct netif *netif)
}
-void
-steth_init (void)
+#ifdef FUCKED
+
+static void fucked_phy_reset(uint8_t phy)
+{
+unsigned i;
+ eth_smi_write(phy, PHY_REG_BCR, PHY_REG_BCR_RESET);
+ for (i=0;(eth_smi_read(phy, PHY_REG_BCR) & PHY_REG_BCR_RESET) && (i<1000);++i) delay_us(1000);
+
+}
+
+static void fucked_eth_init(uint8_t phy, enum eth_clk clock)
+{
+ ETH_MACMIIAR = clock;
+ fucked_phy_reset(phy);
+
+ 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;
+}
+#endif
+
+
+void eth_reset (void)
{
unsigned i;
- rcc_periph_clock_enable (RCC_GPIOA);
- rcc_periph_clock_enable (RCC_GPIOB);
- rcc_periph_clock_enable (RCC_GPIOC);
- rcc_periph_clock_enable (RCC_SYSCFG);
- rcc_periph_clock_enable (RCC_ETHMAC);
- rcc_periph_clock_enable (RCC_ETHMACTX);
- rcc_periph_clock_enable (RCC_ETHMACRX);
- rcc_periph_clock_enable (RCC_ETHMACPTP);
+ printf("Eth_reset()\r\n");
+
+ rcc_periph_reset_hold (RST_ETHMAC);
+ delay_ms (1);
+#ifndef SYSCFG_PMC_MII_RMII_SEL
+#define SYSCFG_PMC_MII_RMII_SEL (1UL << 23)
+#endif
+
+ SYSCFG_PMC |= SYSCFG_PMC_MII_RMII_SEL;
+ delay_ms (1);
+ rcc_periph_reset_release (RST_ETHMAC);
+
+
+ delay_ms (1);
+ CLEAR (NRST);
+ delay_us (1);
+ SET (NRST);
+ delay_ms (1);
+
+ TRACE;
+ ETH_DMABMR |= ETH_DMABMR_SR;
+
+ i=0;
+ while (ETH_DMABMR & ETH_DMABMR_SR) {
+ delay_ms(1);
+ i++;
+
+ if (i>1000) {
+ printf("No 50MHz clock to ethernet MAC\n");
+ return;
+ }
+ }
+
+ /*MDC = HCLK / 102 (0b100) => 1.6MHz */
+ TRACE;
+#ifdef FUCKED
+ fucked_eth_init (PHY, ETH_CLK_150_168MHZ);
+#else
+ eth_init (PHY, ETH_CLK_150_168MHZ);
+#endif
+
+ if (eth_smi_read (PHY, 0)==0xffff) {
+ fucked=1;
+ printf("WARNING: PHY is AWOL\r\n");
+ }
+
+ TRACE;
+ phy_stat();
+
+ eth_set_mac (sa);
+ eth_enable_checksum_offload();
+ eth_desc_init (eth_buf, TX_BUFS, RX_BUFS, FRAME_SZ, FRAME_SZ, 1);
+
+ eth_irq_enable (ETH_DMAIER_NISE);
+ eth_irq_enable (ETH_DMAIER_RIE);
+ eth_irq_enable (ETH_DMASR_TS);
+
+
+}
+
+void eth_start_an (void)
+{
+ printf ("starting autonegociation\r\n");
+ eth_smi_write (PHY, PHY_REG_ANTX, 0x1e1);
+ phy_autoneg_enable (PHY);
+}
+
+void
+steth_init (void)
+{
- rcc_periph_reset_hold(RST_ETHMAC);
- delay_ms(1);
+ rcc_periph_reset_hold (RST_ETHMAC);
+ delay_ms (1);
#ifndef SYSCFG_PMC_MII_RMII_SEL
#define SYSCFG_PMC_MII_RMII_SEL (1UL << 23)
#endif
SYSCFG_PMC |= SYSCFG_PMC_MII_RMII_SEL;
- delay_ms(1);
- rcc_periph_reset_release(RST_ETHMAC);
+ delay_ms (1);
+ rcc_periph_reset_release (RST_ETHMAC);
MAP_OUTPUT_PP (NRST);
- MAP_OUTPUT_PP (RXD0 );
- MAP_OUTPUT_PP (RXD1 );
- MAP_OUTPUT_PP (CRS_DV );
+ MAP_OUTPUT_PP (RXD0);
+ MAP_OUTPUT_PP (RXD1);
+ MAP_OUTPUT_PP (CRS_DV);
+
+ MAP_AF_100 (REF_CLK, GPIO_AF11);
- SET(RXD0);
- SET(RXD1);
- SET(CRS_DV);
+ SET (RXD0);
+ SET (RXD1);
+ SET (CRS_DV);
- CLEAR(NRST);
- delay_ms(1);
+ delay_ms (1);
+ CLEAR (NRST);
+ delay_ms (1);
SET (NRST);
+ delay_ms (1);
- MAP_AF_100 (REF_CLK, GPIO_AF11);
MAP_AF_100 (MDIO, GPIO_AF11);
MAP_AF_100 (CRS_DV, GPIO_AF11);
- MAP_AF_100(RXER,GPIO_AF11);
- MAP_AF_100(TXEN,GPIO_AF11);
- MAP_AF_100(TXD0,GPIO_AF11);
- MAP_AF_100(TXD1,GPIO_AF11);
+ MAP_AF_100 (RXER, GPIO_AF11);
+ MAP_AF_100 (TXEN, GPIO_AF11);
+ MAP_AF_100 (TXD0, GPIO_AF11);
+ MAP_AF_100 (TXD1, GPIO_AF11);
MAP_AF_100 (MDC, GPIO_AF11);
MAP_AF_100 (RXD0, GPIO_AF11);
MAP_AF_100 (RXD1, GPIO_AF11);
- /* The switch to RMII has be done with steth under reset, with no clock */
-
- rcc_periph_reset_hold(RST_ETHMAC);
- delay_ms(1);
-#ifndef SYSCFG_PMC_MII_RMII_SEL
-#define SYSCFG_PMC_MII_RMII_SEL (1UL << 23)
-#endif
+ /* The switch to RMII has be done with steth under reset, with no clock */
- SYSCFG_PMC |= SYSCFG_PMC_MII_RMII_SEL;
- delay_ms(1);
- rcc_periph_reset_release(RST_ETHMAC);
- ETH_DMABMR|=1;
+ eth_reset();
- TRACE;
- while (ETH_DMABMR & 1) {
- mac_stat();
- delay_ms(1000);
- }
-TRACE;
+ phy_stat();
+ mac_stat();
- /*MDC = HCLK / 102 (0b100) => 1.6MHz */
- eth_init (PHY, 0x4);
-TRACE;
- phy_stat();
#if 0
-// eth_smi_write (PHY, PHY_REG_BCR, 0x2100);
+ eth_smi_write (PHY, PHY_REG_BCR, 0x2100);
printf ("Waiting for link\r\n");
while (!phy_link_isup (PHY)) {
- phy_stat();
- delay_ms(1000);
- }
-#else
- eth_smi_write (PHY, PHY_REG_ANTX, 0x1e1);
- phy_autoneg_enable (PHY);
- printf ("Waiting for autonegociation\r\n");
+ phy_stat();
+ delay_ms (1000);
+ }
-i=0;
- while (!phy_link_an_done (PHY)) {
- phy_stat();
- delay_ms(1000);
+#endif
+
+ eth_start_an();
+ if (fucked) delay_ms(1000);
+
+
+
+ //
+ //eth_start();
+ nvic_enable_irq (NVIC_ETH_IRQ);
+
+
+ ready++;
-#if 0
-if (i>4) {
- phy_autoneg_enable (PHY);
- i=0;
}
-#endif
-i++;
- }
+
+
+static void eth_stop (void)
+{
+ ETH_MACCR &= (ETH_MACCR_TE & ETH_MACCR_RE);
+ ETH_DMAOMR &= ~ (ETH_DMAOMR_FTF | ETH_DMAOMR_ST | ETH_DMAOMR_SR);
+}
+
+void steth_slow_tick (void)
+{
+ phy_stat();
+
+#if 0
+ mac_stat();
#endif
- switch (phy_link_status (PHY)) {
- case LINK_HD_10M:
- TRACE;
- case LINK_FD_10M:
- TRACE;
- ETH_MACCR &= ~ETH_MACCR_FES;
- break;
-
- default:
- TRACE;
- ;
- }
+ if (!ready) return;
- printf("phy link status %x\r\n",phy_link_status(PHY));
+ an_happy = phy_link_an_done (PHY);
- switch (phy_link_status (PHY)) {
- case LINK_HD_10M:
- TRACE;
- case LINK_HD_100M:
- TRACE;
- ETH_MACCR &= ~ETH_MACCR_DM;
- ETH_MACCR |= ETH_MACCR_ROD;
- break;
+ if ((!phy_link_isup (PHY) || !an_happy) && running) {
- default:
- ;
- }
+ printf ("stopping nic\r\n");
+ eth_reset();
-TRACE;
- eth_set_mac (sa);
-TRACE;
- eth_enable_checksum_offload();
-TRACE;
- eth_desc_init (eth_buf, TX_BUFS, RX_BUFS, FRAME_SZ, FRAME_SZ, 1);
-TRACE;
+ running = 0;
+ }
- ETH_MACCR &= ~ETH_MACCR_RD;
+ if (!phy_link_isup (PHY) && an_happy) {
+ eth_start_an();
+ an_clock = 0;
+ }
+ if (!an_happy) {
+ an_clock++;
+ if (an_clock > AN_RETRY) {
+ eth_start_an();
+ an_clock = 0;
+ }
- nvic_disable_irq (NVIC_ETH_IRQ);
+ } else
+ an_clock = 0;
- eth_irq_enable (ETH_DMAIER_NISE);
- eth_irq_enable (ETH_DMAIER_RIE);
- eth_irq_enable (ETH_DMASR_TS);
- //
- eth_start();
+ if (phy_link_isup (PHY) && an_happy && !running) {
+ printf ("autonegociation done\r\n");
+ printf ("phy link status %x\r\n", phy_link_status (PHY));
- running++;
- nvic_enable_irq (NVIC_ETH_IRQ);
+ switch (phy_link_status (PHY)) {
+ case LINK_HD_10M:
+ TRACE;
- printf ("Running\r\n");
+ case LINK_HD_100M:
+ TRACE;
+ ETH_MACCR &= ~ETH_MACCR_DM;
+ ETH_MACCR |= ETH_MACCR_ROD;
+ break;
-}
+ default:
+ ;
+ }
+ ETH_MACCR &= ~ETH_MACCR_RD;
+ eth_start();
+ printf ("starting nic\r\n");
+ running++;
+ }
-void
-steth_dispatch (void)
-{
- if (!running)
- return;
}
diff --git a/app/steth.h b/app/steth.h
new file mode 100644
index 0000000..d2a1352
--- /dev/null
+++ b/app/steth.h
@@ -0,0 +1,46 @@
+
+#define PHY PHY0
+
+#define RXER GPIO10
+#define RXER_PORT GPIOB
+
+#define TXEN GPIO11
+#define TXEN_PORT GPIOB
+
+#define TXD0 GPIO12
+#define TXD0_PORT GPIOB
+
+#define TXD1 GPIO13
+#define TXD1_PORT GPIOB
+
+#define RXD0 GPIO4
+#define RXD0_PORT GPIOC
+
+#define RXD1 GPIO5
+#define RXD1_PORT GPIOC
+
+#define CRS_DV GPIO7
+#define CRS_DV_PORT GPIOA
+
+#define MDIO GPIO2
+#define MDIO_PORT GPIOA
+
+#define MDC GPIO1
+#define MDC_PORT GPIOC
+
+#define REF_CLK GPIO1
+#define REF_CLK_PORT GPIOA
+
+#define NRST GPIO2
+#define NRST_PORT GPIOE
+
+
+#define DESC_SZ ETH_DES_EXT_SIZE
+#define FRAME_SZ 1516
+
+#define TX_BUFS 4
+#define RX_BUFS 4
+
+#define ETH_BUF_LEN ((TX_BUFS+ RX_BUFS) * (DESC_SZ+FRAME_SZ))
+
+
diff --git a/app/ticker.c b/app/ticker.c
index af91d14..f5bece6 100644
--- a/app/ticker.c
+++ b/app/ticker.c
@@ -33,6 +33,7 @@ sys_tick_handler (void)
led_slow_tick();
abs_slow_tick();
+ steth_slow_tick();
}