mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			
		
			
				
	
	
		
			165 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
/* mbed Microcontroller Library
 | 
						|
 * Copyright (c) 2006-2015 ARM Limited
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#include "ethernet_api.h"
 | 
						|
#include "mps2_ethernet_api.h"
 | 
						|
#include "cmsis.h"
 | 
						|
#include "mbed_interface.h"
 | 
						|
#include "mbed_toolchain.h"
 | 
						|
#include "mbed_error.h"
 | 
						|
#include "ETH_MPS2.h"
 | 
						|
#include "mbed_wait_api.h"
 | 
						|
 | 
						|
#define TX_PKT_SIZE 256
 | 
						|
#define RX_PKT_SIZE 300
 | 
						|
 | 
						|
// Types
 | 
						|
#undef FALSE
 | 
						|
#undef TRUE
 | 
						|
#define FALSE   0
 | 
						|
#define TRUE    1
 | 
						|
 | 
						|
/*----------------------------------------------------------------------------
 | 
						|
  Ethernet Device initialize
 | 
						|
 *----------------------------------------------------------------------------*/
 | 
						|
int ethernet_init()
 | 
						|
{
 | 
						|
      int error;
 | 
						|
    error = 0;
 | 
						|
 | 
						|
    if(smsc9220_check_id()) {
 | 
						|
        error = TRUE;
 | 
						|
    }
 | 
						|
 | 
						|
    if(smsc9220_soft_reset()) {
 | 
						|
        error = TRUE;
 | 
						|
    }
 | 
						|
 | 
						|
    smsc9220_set_txfifo(5);
 | 
						|
 | 
						|
    // Sets automatic flow control thresholds, and backpressure
 | 
						|
    // threshold to defaults specified.
 | 
						|
    SMSC9220->AFC_CFG = 0x006E3740;
 | 
						|
 | 
						|
    if(smsc9220_wait_eeprom()) {
 | 
						|
        error = TRUE;
 | 
						|
    }
 | 
						|
 | 
						|
    // Configure GPIOs as LED outputs.
 | 
						|
    SMSC9220->GPIO_CFG = 0x70070000;
 | 
						|
 | 
						|
    smsc9220_init_irqs();
 | 
						|
 | 
						|
    /* Configure MAC addresses here if needed. */
 | 
						|
 | 
						|
    if(smsc9220_check_phy()) {
 | 
						|
        error = TRUE;
 | 
						|
    }
 | 
						|
 | 
						|
    if(smsc9220_reset_phy()) {
 | 
						|
        error = TRUE;
 | 
						|
        return error;
 | 
						|
    }
 | 
						|
 | 
						|
    wait_ms(100);
 | 
						|
    // Checking whether phy reset completed successfully.
 | 
						|
    {
 | 
						|
        unsigned short phyreset;
 | 
						|
        phyreset = 0;
 | 
						|
        smsc9220_phy_regread(SMSC9220_PHY_BCONTROL, &phyreset);
 | 
						|
        if(phyreset & (1 << 15)) {
 | 
						|
            error = TRUE;
 | 
						|
            return error;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /* Advertise capabilities */
 | 
						|
    smsc9220_advertise_cap();
 | 
						|
 | 
						|
 | 
						|
    /* Begin to establish link */
 | 
						|
    smsc9220_establish_link();      // bit [12] of BCONTROL seems self-clearing.
 | 
						|
                                    // Although it's not so in the manual.
 | 
						|
 | 
						|
    /* Interrupt threshold */
 | 
						|
    SMSC9220->FIFO_INT = 0xFF000000;
 | 
						|
 | 
						|
    smsc9220_enable_mac_xmit();
 | 
						|
 | 
						|
    smsc9220_enable_xmit();
 | 
						|
 | 
						|
    SMSC9220->RX_CFG = 0;
 | 
						|
 | 
						|
    smsc9220_enable_mac_recv();
 | 
						|
 | 
						|
    // Rx status FIFO level irq threshold
 | 
						|
    SMSC9220->FIFO_INT &= ~(0xFF);  // Clear 2 bottom nibbles
 | 
						|
 | 
						|
    // This sleep is compulsory otherwise txmit/receive will fail.
 | 
						|
    wait_ms(2000);
 | 
						|
    return error;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/*----------------------------------------------------------------------------
 | 
						|
  Ethernet Device Uninitialize
 | 
						|
 *----------------------------------------------------------------------------*/
 | 
						|
void ethernet_free() {
 | 
						|
}
 | 
						|
 | 
						|
int ethernet_write(const char *data, int size)
 | 
						|
{
 | 
						|
        return 0;
 | 
						|
}
 | 
						|
 | 
						|
int ethernet_send() 
 | 
						|
{
 | 
						|
 return 0;
 | 
						|
}
 | 
						|
 | 
						|
int ethernet_receive() 
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
// Read from an recevied ethernet packet.
 | 
						|
// After receive returnd a number bigger than 0 it is
 | 
						|
// possible to read bytes from this packet.
 | 
						|
// Read will write up to size bytes into data.
 | 
						|
// It is possible to use read multible times.
 | 
						|
// Each time read will start reading after the last read byte before.
 | 
						|
 | 
						|
int ethernet_read(char *data, int dlen) 
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void ethernet_address(char *mac) {
 | 
						|
    mbed_mac_address(mac);
 | 
						|
}
 | 
						|
 | 
						|
int ethernet_link(void) 
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void ethernet_set_link(int speed, int duplex)
 | 
						|
{
 | 
						|
    smsc9220_establish_link();
 | 
						|
}
 | 
						|
 |