Subversion Repositories svn.mios32

Rev

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

Rev Author Line No. Line
810 philetaylo 1
// $Id: uip_task.c 387 2009-03-04 23:15:36Z 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
 
33
/////////////////////////////////////////////////////////////////////////////
34
// Task Priorities
35
/////////////////////////////////////////////////////////////////////////////
36
 
37
// lower priority than MIOS32 hooks
38
#define PRIORITY_TASK_UIP       ( tskIDLE_PRIORITY + 2 )
39
 
40
 
41
// for mutual exclusive access to uIP functions
42
// The mutex is handled with MUTEX_UIP_TAKE and MUTEX_UIP_GIVE macros
43
xSemaphoreHandle xUIPSemaphore;
44
 
45
/////////////////////////////////////////////////////////////////////////////
46
// Local defines
47
/////////////////////////////////////////////////////////////////////////////
48
 
49
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
50
 
51
 
52
/////////////////////////////////////////////////////////////////////////////
53
// Local prototypes
54
/////////////////////////////////////////////////////////////////////////////
55
static void UIP_TASK_Handler(void *pvParameters);
56
 
57
 
58
 
59
/////////////////////////////////////////////////////////////////////////////
60
// Initialize the uIP task
61
/////////////////////////////////////////////////////////////////////////////
62
s32 UIP_TASK_Init(u32 mode)
63
{
64
  if( mode > 0 )
65
    return -1; // only mode 0 supported yet
66
 
67
  xUIPSemaphore = xSemaphoreCreateMutex();
68
 
2425 tk 69
  xTaskCreate(UIP_TASK_Handler, "uIP", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK_UIP, NULL);
810 philetaylo 70
 
71
  return 0; // no error
72
}
73
 
74
 
75
 
76
 
77
/////////////////////////////////////////////////////////////////////////////
78
// The uIP Task is executed each mS
79
/////////////////////////////////////////////////////////////////////////////
80
static void UIP_TASK_Handler(void *pvParameters)
81
{
82
  int i;
83
  uip_ipaddr_t ipaddr;
84
  struct timer periodic_timer, arp_timer;
85
 
86
  // Initialise the xLastExecutionTime variable on task entry
87
  portTickType xLastExecutionTime = xTaskGetTickCount();
88
 
89
  // take over exclusive access to UIP functions
90
  MUTEX_UIP_TAKE;
91
 
92
  // init uIP timers
93
  timer_set(&periodic_timer, CLOCK_SECOND / 2);
94
  timer_set(&arp_timer, CLOCK_SECOND * 10);
95
 
96
  // init the network driver
97
  network_device_init();
98
 
99
  // init uIP
100
  uip_init();
101
 
102
  // set my ethernet address
103
  unsigned char *mac_addr = network_device_mac_addr();
104
  {
105
    int i;
106
    for(i=0; i<6; ++i)
107
      uip_ethaddr.addr[i] = mac_addr[i];
108
  }
109
  uip_arp_init();
110
 
111
  dhcpc_init(uip_ethaddr.addr, sizeof(uip_ethaddr.addr));
112
  //dhcpc_request();
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
  // release exclusive access to UIP functions
139
  MUTEX_UIP_GIVE;
140
 
141
  // endless loop
142
  while( 1 ) {
143
    vTaskDelayUntil(&xLastExecutionTime, 1 / portTICK_RATE_MS);
144
 
145
    // take over exclusive access to UIP functions
146
    MUTEX_UIP_TAKE;
147
 
148
    if( !(clock_time_tick() % 100) ) {
149
      // each 100 mS: check availablility of network device
150
      network_device_check();
151
    }
152
 
153
    if( network_device_available() ) {
154
      uip_len = network_device_read();
155
 
156
      if( uip_len > 0 ) {
157
    if(BUF->type == htons(UIP_ETHTYPE_IP) ) {
158
      uip_arp_ipin();
159
      uip_input();
160
 
161
      /* If the above function invocation resulted in data that
162
         should be sent out on the network, the global variable
163
         uip_len is set to a value > 0. */
164
      if( uip_len > 0 ) {
165
        uip_arp_out();
166
        network_device_send();
167
      }
168
    } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
169
      uip_arp_arpin();
170
      /* If the above function invocation resulted in data that
171
         should be sent out on the network, the global variable
172
         uip_len is set to a value > 0. */
173
      if(uip_len > 0) {
174
        network_device_send();
175
      }
176
    }
177
 
178
      } else if(timer_expired(&periodic_timer)) {
179
    timer_reset(&periodic_timer);
180
    for(i = 0; i < UIP_CONNS; i++) {
181
      uip_periodic(i);
182
      /* If the above function invocation resulted in data that
183
         should be sent out on the network, the global variable
184
         uip_len is set to a value > 0. */
185
      if(uip_len > 0) {
186
        uip_arp_out();
187
        network_device_send();
188
      }
189
    }
190
 
191
#if UIP_UDP
192
    for(i = 0; i < UIP_UDP_CONNS; i++) {
193
      uip_udp_periodic(i);
194
      /* If the above function invocation resulted in data that
195
         should be sent out on the network, the global variable
196
         uip_len is set to a value > 0. */
197
      if(uip_len > 0) {
198
        uip_arp_out();
199
        network_device_send();
200
      }
201
    }
202
#endif /* UIP_UDP */
203
 
204
    /* Call the ARP timer function every 10 seconds. */
205
    if(timer_expired(&arp_timer)) {
206
      timer_reset(&arp_timer);
207
      uip_arp_timer();
208
    }
209
      }
210
    }
211
 
212
    // release exclusive access to UIP functions
213
    MUTEX_UIP_GIVE;
214
 
215
  }
216
}
217
 
218
 
219
 
220
 
221
void uip_log(char *msg)
222
{
223
  MIOS32_MIDI_SendDebugMessage(msg);
224
}