diff options
| -rw-r--r-- | app/Makefile | 2 | ||||
| -rw-r--r-- | app/abs.c | 45 | ||||
| -rw-r--r-- | app/bits.c | 22 | ||||
| -rw-r--r-- | app/dcf77.c | 6 | ||||
| -rw-r--r-- | app/gps.c | 105 | ||||
| -rw-r--r-- | app/main.c | 84 | ||||
| -rw-r--r-- | app/msf.c | 18 | ||||
| -rw-r--r-- | app/ntp.c | 5 | ||||
| -rw-r--r-- | app/pll.c | 12 | ||||
| -rw-r--r-- | app/prototypes.h | 5 | ||||
| -rw-r--r-- | app/steth.c | 547 | ||||
| -rw-r--r-- | app/steth.h | 46 | ||||
| -rw-r--r-- | app/ticker.c | 1 | 
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 @@ -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); +} + + @@ -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 @@ -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"); @@ -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();    } @@ -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();    } @@ -77,3 +77,8 @@ packet (uint8_t *_p)  }  #endif + + +void ntp_init(void) +{ +} @@ -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();  }  | 
