wrc_main.c 3.4 KB
Newer Older
1 2 3
#include <stdio.h>
#include <inttypes.h>

4 5
#include <stdarg.h>

6
#include "syscon.h"
7 8 9 10
#include "uart.h"
#include "endpoint.h"
#include "minic.h"
#include "pps_gen.h"
11
#include "ptpd.h"
12
#include "ptpd_netif.h"
Grzegorz Daniluk's avatar
Grzegorz Daniluk committed
13
#include "i2c.h"
14
//#include "eeprom.h"
15
#include "softpll_ng.h"
16
#include "onewire.h"
17
#include "shell.h"
Wesley W. Terpstra's avatar
Wesley W. Terpstra committed
18
#include "lib/ipv4.h"
Grzegorz Daniluk's avatar
Grzegorz Daniluk committed
19

20
#include "wrc_ptp.h"
21

22
int wrc_ui_mode = UI_SHELL_MODE;
23

24 25
///////////////////////////////////
//Calibration data (from EEPROM if available)
26
int32_t sfp_alpha = -73622176;	//default values if could not read EEPROM
27 28 29
int32_t sfp_deltaTx = 46407;
int32_t sfp_deltaRx = 167843;
uint32_t cal_phase_transition = 2389;
30

31
void wrc_initialize()
32
{
33 34 35
	int ret, i;
	uint8_t mac_addr[6], ds18_id[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
	char sfp_pn[17];
36

37 38
	sdb_find_devices();
	uart_init();
39

40
	mprintf("WR Core: starting up...\n");
41

42 43
	timer_init(1);
	owInit();
44

45 46 47
	mac_addr[0] = 0x08;	//
	mac_addr[1] = 0x00;	// CERN OUI
	mac_addr[2] = 0x30;	//
48

49 50 51 52 53 54 55 56 57 58
	own_scanbus(ONEWIRE_PORT);
	if (get_persistent_mac(ONEWIRE_PORT, mac_addr) == -1) {
		mprintf("Unable to determine MAC address\n");
		mac_addr[0] = 0x11;	//
		mac_addr[1] = 0x22;	//
		mac_addr[2] = 0x33;	// fallback MAC if get_persistent_mac fails
		mac_addr[3] = 0x44;	//
		mac_addr[4] = 0x55;	//
		mac_addr[5] = 0x66;	//
	}
59

60 61 62
	TRACE_DEV("Local MAC address: %x:%x:%x:%x:%x:%x\n", mac_addr[0],
		  mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4],
		  mac_addr[5]);
63

64 65
	ep_init(mac_addr);
	ep_enable(1, 1);
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
66

67 68 69
	minic_init();
	pps_gen_init();
	wrc_ptp_init();
70

71
#if WITH_ETHERBONE
72 73
	ipv4_init("wru1");
	arp_init("wru1");
74
#endif
75
}
76

77 78 79 80
#define LINK_WENT_UP 1
#define LINK_WENT_DOWN 2
#define LINK_UP 3
#define LINK_DOWN 4
81 82 83 84

int wrc_check_link()
{
	static int prev_link_state = -1;
85
	int link_state = ep_link_up(NULL);
86 87
	int rv = 0;

88 89 90 91 92 93 94 95 96 97 98 99 100
	if (!prev_link_state && link_state) {
		TRACE_DEV("Link up.\n");
		gpio_out(GPIO_LED_LINK, 1);
		rv = LINK_WENT_UP;
	} else if (prev_link_state && !link_state) {
		TRACE_DEV("Link down.\n");
		gpio_out(GPIO_LED_LINK, 0);
		rv = LINK_WENT_DOWN;
	} else
		rv = (link_state ? LINK_UP : LINK_DOWN);
	prev_link_state = link_state;

	return rv;
101
}
102

103
int wrc_extra_debug = 0;
104

105 106 107
void wrc_debug_printf(int subsys, const char *fmt, ...)
{
	va_list ap;
108

109 110
	if (wrc_ui_mode)
		return;
111

112
	va_start(ap, fmt);
113

114 115
	if (wrc_extra_debug || (!wrc_extra_debug && (subsys & TRACE_SERVO)))
		vprintf(fmt, ap);
116

117 118 119 120
	va_end(ap);
}

static int wrc_enable_tracking = 1;
121
static int ptp_enabled = 1;
122 123
int wrc_man_phase = 0;

124
static void ui_update()
125 126
{

127 128 129 130 131
	if (wrc_ui_mode == UI_GUI_MODE) {
		wrc_mon_gui();
		if (uart_read_byte() == 27) {
			shell_init();
			wrc_ui_mode = UI_SHELL_MODE;
132
		}
133 134 135 136 137 138 139 140
	} else if (wrc_ui_mode == UI_STAT_MODE) {
		wrc_log_stats(0);
		if (uart_read_byte() == 27) {
			shell_init();
			wrc_ui_mode = UI_SHELL_MODE;
		}
	} else
		shell_interactive();
141 142

}
143 144 145

int main(void)
{
146 147
	wrc_extra_debug = 1;
	wrc_ui_mode = UI_SHELL_MODE;
148

149 150
	wrc_initialize();
	shell_init();
151

152 153
	wrc_ptp_set_mode(WRC_MODE_SLAVE);
	wrc_ptp_start();
154

155 156
	//try to read and execute init script from EEPROM
	shell_boot_script();
157

158 159
	for (;;) {
		int l_status = wrc_check_link();
160

161
		switch (l_status) {
162
#if WITH_ETHERBONE
163 164 165
		case LINK_WENT_UP:
			needIP = 1;
			break;
166
#endif
167

168 169
		case LINK_UP:
			update_rx_queues();
170
#if WITH_ETHERBONE
171 172
			ipv4_poll();
			arp_poll();
173
#endif
174 175 176 177 178 179 180 181 182 183 184 185
			break;

		case LINK_WENT_DOWN:
			if (wrc_ptp_get_mode() == WRC_MODE_SLAVE)
				spll_init(SPLL_MODE_FREE_RUNNING_MASTER, 0, 1);
			break;
		}

		ui_update();
		wrc_ptp_update();
		spll_update_aux_clocks();
	}
186
}