Contiki 2.6

ethernet.c

00001 /*
00002  * Copyright (c) 2007, Swedish Institute of Computer Science
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the Institute nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
00028  *
00029  * This file is part of the Contiki operating system.
00030  *
00031  * Author: Oliver Schmidt <ol.sc@web.de>
00032  *
00033  * @(#)$Id: ethernet.c,v 1.7 2010/09/28 23:02:16 oliverschmidt Exp $
00034  */
00035 
00036 #include <modload.h>
00037 
00038 #include "contiki-net.h"
00039 #include "cfs/cfs.h"
00040 #include "sys/log.h"
00041 #include "lib/error.h"
00042 #include "net/ethernet-drv.h"
00043 
00044 #include "net/ethernet.h"
00045 
00046 struct {
00047   char                signature[4];
00048   struct uip_eth_addr ethernet_address;
00049   uint8_t             *buffer;
00050   uint16_t            buffer_size;
00051   void __fastcall__   (* init)(uint16_t reg);
00052   uint16_t            (* poll)(void);
00053   void __fastcall__   (* send)(uint16_t len);
00054   void                (* exit)(void);
00055 } *module;
00056 
00057 /*---------------------------------------------------------------------------*/
00058 void CC_FASTCALL
00059 ethernet_init(struct ethernet_config *config)
00060 {
00061   static const char signature[4] = {0x65, 0x74, 0x68, 0x01};
00062 
00063 #ifndef ETHERNET
00064 
00065   struct mod_ctrl module_control = {cfs_read};
00066   uint8_t byte;
00067 
00068   module_control.callerdata = cfs_open(config->name, CFS_READ);
00069   if(module_control.callerdata < 0) {
00070     log_message(config->name, ": File not found");
00071     error_exit();
00072   }
00073 
00074   byte = mod_load(&module_control);
00075   if(byte != MLOAD_OK) {
00076     log_message(config->name, byte == MLOAD_ERR_MEM? ": Out of memory":
00077                                                      ": No module");
00078     error_exit();
00079   }
00080 
00081   cfs_close(module_control.callerdata);
00082   module = module_control.module;
00083 
00084   for(byte = 0; byte < 4; ++byte) {
00085     if(module->signature[byte] != signature[byte]) {
00086       log_message(config->name, ": No ETH driver");
00087       error_exit();
00088     }
00089   }
00090 
00091 #else /* !ETHERNET */
00092 
00093   extern void ETHERNET;
00094 
00095   module = &ETHERNET;
00096 
00097 #endif /* !ETHERNET */
00098 
00099   module->buffer = uip_buf;
00100   module->buffer_size = UIP_BUFSIZE;
00101   module->init(config->addr);
00102 
00103   uip_setethaddr(module->ethernet_address);
00104 }
00105 /*---------------------------------------------------------------------------*/
00106 uint16_t
00107 ethernet_poll(void)
00108 {
00109   return module->poll();
00110 }
00111 /*---------------------------------------------------------------------------*/
00112 void
00113 ethernet_send(void)
00114 {
00115   module->send(uip_len);
00116 }
00117 /*---------------------------------------------------------------------------*/
00118 void
00119 ethernet_exit(void)
00120 {
00121   module->exit();
00122 
00123 #ifndef ETHERNET
00124   mod_free(module);
00125 #endif /* !ETHERNET */
00126 }
00127 /*---------------------------------------------------------------------------*/