Subversion Repositories svn.mios32

Rev

Rev 1118 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
392 tk 1
// $Id: uip_task.c 2425 2016-11-03 00:44:22Z tk $
2
/*
3
 * uIP handler as FreeRTOS task
4
 *
5
 * Framework taken from $MIOS32_PATH/modules/uip/doc/example-mainloop-with-arp.c
6
 *
7
 * ==========================================================================
8
 *
9
 *  Copyright (C) 2009 Thorsten Klose (tk@midibox.org)
10
 *  Licensed for personal non-commercial use only.
11
 *  All other rights reserved.
12
 *
13
 * ==========================================================================
14
 */
15
 
16
/////////////////////////////////////////////////////////////////////////////
17
// Include files
18
/////////////////////////////////////////////////////////////////////////////
19
#include <mios32.h>
20
 
21
#include <FreeRTOS.h>
22
#include <task.h>
23
#include <queue.h>
24
 
25
#include "uip.h"
26
#include "uip_arp.h"
27
#include "network-device.h"
28
#include "timer.h"
29
 
30
#include "uip_task.h"
31
 
32
#include "osc_server.h"
33
#include "osc_client.h"
1118 tk 34
#include "telnetd.h"
392 tk 35
 
36
 
37
/////////////////////////////////////////////////////////////////////////////
38
// Task Priorities
39
/////////////////////////////////////////////////////////////////////////////
40
 
41
// lower priority than MIOS32 hooks
42
#define PRIORITY_TASK_UIP       ( tskIDLE_PRIORITY + 2 )
43
 
44
 
45
// for mutual exclusive access to uIP functions
46
// The mutex is handled with MUTEX_UIP_TAKE and MUTEX_UIP_GIVE macros
47
xSemaphoreHandle xUIPSemaphore;
48
 
49
 
50
/////////////////////////////////////////////////////////////////////////////
51
// Local defines
52
/////////////////////////////////////////////////////////////////////////////
53
 
54
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
55
 
56
 
57
/////////////////////////////////////////////////////////////////////////////
58
// Local prototypes
59
/////////////////////////////////////////////////////////////////////////////
60
static void UIP_TASK_Handler(void *pvParameters);
61
 
62
 
63
/////////////////////////////////////////////////////////////////////////////
64
// Initialize the uIP task
65
/////////////////////////////////////////////////////////////////////////////
66
s32 UIP_TASK_Init(u32 mode)
67
{
68
  if( mode > 0 )
69
    return -1; // only mode 0 supported yet
70
 
71
  xUIPSemaphore = xSemaphoreCreateMutex();
72
 
2425 tk 73
  xTaskCreate(UIP_TASK_Handler, "uIP", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_UIP, NULL);
392 tk 74
 
75
  return 0; // no error
76
}
77
 
78
 
79
/////////////////////////////////////////////////////////////////////////////
80
// The uIP Task is executed each mS
81
/////////////////////////////////////////////////////////////////////////////
82
static void UIP_TASK_Handler(void *pvParameters)
83
{
84
  int i;
85
  uip_ipaddr_t ipaddr;
86
  struct timer periodic_timer, arp_timer;
87
 
1118 tk 88
#if 0
392 tk 89
  // Initialise the xLastExecutionTime variable on task entry
90
  portTickType xLastExecutionTime = xTaskGetTickCount();
1118 tk 91
#endif
392 tk 92
 
93
  // take over exclusive access to UIP functions
94
  MUTEX_UIP_TAKE;
95
 
96
  // init uIP timers
97
  timer_set(&periodic_timer, CLOCK_SECOND / 2);
98
  timer_set(&arp_timer, CLOCK_SECOND * 10);
99
 
100
  // init the network driver
101
  network_device_init();
102
 
103
  // init uIP
104
  uip_init();
105
 
106
  // set my ethernet address
107
  unsigned char *mac_addr = network_device_mac_addr();
108
  {
109
    int i;
110
    for(i=0; i<6; ++i)
111
      uip_ethaddr.addr[i] = mac_addr[i];
112
  }
113
 
114
  // set my IP address
115
  uip_ipaddr(ipaddr,
116
         ((MY_IP_ADDRESS)>>24) & 0xff,
117
         ((MY_IP_ADDRESS)>>16) & 0xff,
118
         ((MY_IP_ADDRESS)>> 8) & 0xff,
119
         ((MY_IP_ADDRESS)>> 0) & 0xff);
120
  uip_sethostaddr(ipaddr);
121
 
122
  // set my netmask
123
  uip_ipaddr(ipaddr,
124
         ((MY_NETMASK)>>24) & 0xff,
125
         ((MY_NETMASK)>>16) & 0xff,
126
         ((MY_NETMASK)>> 8) & 0xff,
127
         ((MY_NETMASK)>> 0) & 0xff);
128
  uip_setnetmask(ipaddr);
129
 
130
  // default router
131
  uip_ipaddr(ipaddr,
132
         ((MY_GATEWAY)>>24) & 0xff,
133
         ((MY_GATEWAY)>>16) & 0xff,
134
         ((MY_GATEWAY)>> 8) & 0xff,
135
         ((MY_GATEWAY)>> 0) & 0xff);
136
  uip_setdraddr(ipaddr);
137
 
138
  // start telnet daemon
139
  telnetd_init();
140
 
141
  // start OSC daemon and client
142
  OSC_CLIENT_Init(0);
143
  OSC_SERVER_Init(0);
144
 
145
 
146
  // release exclusive access to UIP functions
147
  MUTEX_UIP_GIVE;
148
 
149
  // endless loop
150
  while( 1 ) {
151
#if 0
152
    vTaskDelayUntil(&xLastExecutionTime, 1 / portTICK_RATE_MS);
153
#endif
154
 
155
    // take over exclusive access to UIP functions
156
    MUTEX_UIP_TAKE;
157
 
158
    if( !(clock_time_tick() % 100) ) {
159
      // each 100 mS: check availablility of network device
160
      network_device_check();
161
    }
162
 
163
    if( network_device_available() ) {
164
      uip_len = network_device_read();
165
 
166
      if( uip_len > 0 ) {
167
    if(BUF->type == htons(UIP_ETHTYPE_IP) ) {
168
      uip_arp_ipin();
169
      uip_input();
170
 
171
      /* If the above function invocation resulted in data that
172
         should be sent out on the network, the global variable
173
         uip_len is set to a value > 0. */
174
      if( uip_len > 0 ) {
175
        uip_arp_out();
176
        network_device_send();
177
      }
178
    } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
179
      uip_arp_arpin();
180
      /* If the above function invocation resulted in data that
181
         should be sent out on the network, the global variable
182
         uip_len is set to a value > 0. */
183
      if(uip_len > 0) {
184
        network_device_send();
185
      }
186
    }
187
      } else if(timer_expired(&periodic_timer)) {
188
    timer_reset(&periodic_timer);
189
    for(i = 0; i < UIP_CONNS; i++) {
190
      uip_periodic(i);
191
      /* If the above function invocation resulted in data that
192
         should be sent out on the network, the global variable
193
         uip_len is set to a value > 0. */
194
      if(uip_len > 0) {
195
        uip_arp_out();
196
        network_device_send();
197
      }
198
    }
199
#if UIP_UDP
200
    for(i = 0; i < UIP_UDP_CONNS; i++) {
201
      uip_udp_periodic(i);
202
      /* If the above function invocation resulted in data that
203
         should be sent out on the network, the global variable
204
         uip_len is set to a value > 0. */
205
      if(uip_len > 0) {
206
        uip_arp_out();
207
        network_device_send();
208
      }
209
    }
210
#endif /* UIP_UDP */
211
 
212
    /* Call the ARP timer function every 10 seconds. */
213
    if(timer_expired(&arp_timer)) {
214
      timer_reset(&arp_timer);
215
      uip_arp_timer();
216
    }
217
      }
218
    }
219
 
220
    // release exclusive access to UIP functions
221
    MUTEX_UIP_GIVE;
222
  }
223
}
224
 
225
 
226
 
227
 
228
void uip_log(char *msg)
229
{
230
  MIOS32_MIDI_SendDebugMessage(msg);
231
}
232
 
233