summaryrefslogtreecommitdiffstats
path: root/netdemo/init.c
blob: b6d42a8a1666f167e4235482dfec0c8b12eafc59 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/*
 * RTEMS configuration/initialization
 * 
 * This program may be distributed and used for any purpose.
 * I ask only that you:
 *	1. Leave this author information intact.
 *	2. Document any changes you make.
 *
 * W. Eric Norum
 * Saskatchewan Accelerator Laboratory
 * University of Saskatchewan
 * Saskatoon, Saskatchewan, CANADA
 * eric@skatter.usask.ca
 *
 * $Id$
 */

/*
 *  Include user provided information
 */

#include "../usercfg.h"

#include <bsp.h>

#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE

#define CONFIGURE_EXECUTIVE_RAM_SIZE	(512*1024)
#define CONFIGURE_MAXIMUM_SEMAPHORES	20
#define CONFIGURE_MAXIMUM_TASKS		20
#define CONFIGURE_MAXIMUM_TIMERS	10
#define CONFIGURE_MAXIMUM_PERIODS	1

#define CONFIGURE_MICROSECONDS_PER_TICK	10486

#define CONFIGURE_INIT_TASK_STACK_SIZE	(10*1024)
#define CONFIGURE_INIT_TASK_PRIORITY	100
#define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \
                                           RTEMS_NO_TIMESLICE | \
                                           RTEMS_NO_ASR | \
                                           RTEMS_INTERRUPT_LEVEL(0))

#define CONFIGURE_INIT
rtems_task Init (rtems_task_argument argument);

#include <confdefs.h>

#include <stdio.h>
#include <rtems_ka9q.h>


#if (defined (USE_BOOTP))
#include <bootp.h>
#endif

/*
 * Suspend execution for the specified number of seconds
 */
static void
delay_task (int seconds)
{
	rtems_interval ticksPerSecond;

	rtems_clock_get (RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticksPerSecond);
	rtems_task_wake_after (seconds * ticksPerSecond);
}

/*
 * RTEMS Startup Task
 */
rtems_task
Init (rtems_task_argument ignored)
{
	printf( "\n\n*** ETHERNET DEMO TEST ***\n" );

	/*
	 * Start KA9Q
	 */
	puts( "Starting KA9Q" );
	rtems_ka9q_start (50);

	/*
	 * Hook up drivers
	 */
	puts( "Attaching to the network" );
#if (defined (USE_BOOTP))
	if (rtems_ka9q_execute_command ("attach rtems broadcast y"
					" ether " MY_ETHERNET_ADDRESS))
#else
	if (rtems_ka9q_execute_command ("attach rtems broadcast y"
					" ip " MY_IP_ADDRESS
					" ether " MY_ETHERNET_ADDRESS))
#endif
		rtems_panic ("Can't attach Ethernet driver.\n");

#if (defined (TRACE_NETWORK_DRIVER))
	/*
	 * Turn on debugging
	 */
	puts( "Enabling debug mode of KA9Q" );
	if (rtems_ka9q_execute_command ("trace rtems input <stdout>")
	 || rtems_ka9q_execute_command ("trace rtems output <stdout>")
	 || rtems_ka9q_execute_command ("trace rtems ascii <stdout>"))
		rtems_panic ("Can't set tracing for Ethernet driver.\n");
#endif

	/*
	 * Configure the driver
	 */
	if (rtems_ka9q_execute_command ("ifconfig rtems broadcast 255.255.255.255"))
		rtems_panic ("Can't configure Ethernet driver.\n");

	/*
	 * Add the ethernet broadcast address to the ARP table.
	 */
	if (rtems_ka9q_execute_command ("arp add 255.255.255.255 ether FF:FF:FF:FF:FF:FF"))
		rtems_panic ("Can't add broadcast entry to ARP table.\n");

#if (defined (USE_BOOTP))
	{
	int i;
	/*
	 * Get BOOTP information
	 */
	for (i = 0 ; ; ) {
		if (rtems_ka9q_execute_command ("bootp") == 0)
			break;
		if (++i == 10)
			rtems_panic ("Can't get information from BOOTP server.\n");
		delay_task (i);
	}
	if (BootpFileName)
		printf ("BOOTP filename: `%s'\n", BootpFileName);
	else
		printf ("BOOTP -- No filename!\n");
	}
#else
	if (rtems_ka9q_execute_command ("ifconfig rtems netmask 255.255.255.0"))
		rtems_panic ("Can't set netmask.\n");
	if (rtems_ka9q_execute_command ("route add default rtems"))
		rtems_panic ("Can't add default route.\n");
	printf ("Routing table after adding default route\n");
	rtems_ka9q_execute_command ("route");
#endif

	/*
	 * Issue a gratuitous ARP request to update tables in
	 * other hosts on this network.
	 */
	if (rtems_ka9q_execute_command ("arp gratuitous rtems"))
		rtems_panic ("Can't send gratuitous ARP.\n");
	
	/*
	 * Everything is now running
	 */
	printf ("NETWORK INITIALIZED!\n");

	/*
	 * See if sockets work properly
	 */
	doSocket ();

	/*
	 * Wind things up
	 */
	delay_task (2);
	rtems_ka9q_execute_command ("detach rtems");
	exit (0);
}