1 /*- 2 * Copyright (c) 2006 M. Warner Losh. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * 24 * This software is derived from software provide by Kwikbyte who specifically 25 * disclaimed copyright on the code. 26 * 27 * $FreeBSD$ 28 */ 29 30 /****************************************************************************** 31 * 32 * Filename: emac.c 33 * 34 * Instantiation of routines for MAC/ethernet functions supporting tftp. 35 * 36 * Revision information: 37 * 38 * 28AUG2004 kb_admin initial creation 39 * 08JAN2005 kb_admin added tftp download 40 * also adapted from external sources 41 * 42 * BEGIN_KBDD_BLOCK 43 * No warranty, expressed or implied, is included with this software. It is 44 * provided "AS IS" and no warranty of any kind including statutory or aspects 45 * relating to merchantability or fitness for any purpose is provided. All 46 * intellectual property rights of others is maintained with the respective 47 * owners. This software is not copyrighted and is intended for reference 48 * only. 49 * END_BLOCK 50 ******************************************************************************/ 51 52 #include "at91rm9200.h" 53 #include "at91rm9200_lowlevel.h" 54 #include "emac.h" 55 #include "lib.h" 56 57 /* ****************************** GLOBALS *************************************/ 58 59 unsigned localMACSet; 60 unsigned char localMACAddr[6]; 61 unsigned localMAClow, localMAChigh; 62 63 /* ********************** PRIVATE FUNCTIONS/DATA ******************************/ 64 65 /* 66 * .KB_C_FN_DEFINITION_START 67 * void EMAC_SetMACAddress(unsigned low_address, unsigned high_address) 68 * This global function sets the MAC address. low_address is the first 69 * four bytes while high_address is the last 2 bytes of the 48-bit value. 70 * .KB_C_FN_DEFINITION_END 71 */ 72 void 73 EMAC_SetMACAddress(unsigned char mac[6]) 74 { 75 AT91PS_PMC pPMC = AT91C_BASE_PMC; 76 AT91PS_EMAC pEmac = AT91C_BASE_EMAC; 77 78 /* enable the peripheral clock before using EMAC */ 79 pPMC->PMC_PCER = ((unsigned) 1 << AT91C_ID_EMAC); 80 81 memcpy(localMACAddr, mac, 6); 82 localMAClow = (mac[3] << 24) | (mac[2] << 16) | (mac[1] << 8) | mac[0]; 83 localMAChigh = (mac[5] << 8) | mac[4]; 84 localMACSet = 1; 85 86 AT91C_BASE_PMC->PMC_PCER = 1u << AT91C_ID_EMAC; 87 AT91C_BASE_PIOA->PIO_ASR = 88 AT91C_PIO_PA14 | AT91C_PIO_PA12 | AT91C_PIO_PA13 | 89 AT91C_PIO_PA8 | AT91C_PIO_PA16 | AT91C_PIO_PA9 | 90 AT91C_PIO_PA10 | AT91C_PIO_PA11 | AT91C_PIO_PA15 | 91 AT91C_PIO_PA7; 92 AT91C_BASE_PIOA->PIO_PDR = 93 AT91C_PIO_PA14 | AT91C_PIO_PA12 | AT91C_PIO_PA13 | 94 AT91C_PIO_PA8 | AT91C_PIO_PA16 | AT91C_PIO_PA9 | 95 AT91C_PIO_PA10 | AT91C_PIO_PA11 | AT91C_PIO_PA15 | 96 AT91C_PIO_PA7; 97 #if defined(BOOT_KB920X) | defined(BOOT_BWCT) /* Really !RMII */ 98 AT91C_BASE_PIOB->PIO_BSR = 99 AT91C_PIO_PB12 | AT91C_PIO_PB13 | AT91C_PIO_PB14 | 100 AT91C_PIO_PB15 | AT91C_PIO_PB16 | AT91C_PIO_PB17 | 101 AT91C_PIO_PB18 | AT91C_PIO_PB19; 102 AT91C_BASE_PIOB->PIO_PDR = 103 AT91C_PIO_PB12 | AT91C_PIO_PB13 | AT91C_PIO_PB14 | 104 AT91C_PIO_PB15 | AT91C_PIO_PB16 | AT91C_PIO_PB17 | 105 AT91C_PIO_PB18 | AT91C_PIO_PB19; 106 #endif 107 pEmac->EMAC_CTL = 0; 108 109 pEmac->EMAC_CFG = (pEmac->EMAC_CFG & ~(AT91C_EMAC_CLK)) | 110 #ifdef BOOT_TSC 111 AT91C_EMAC_RMII | 112 #endif 113 AT91C_EMAC_CLK_HCLK_32 | AT91C_EMAC_CAF; 114 // the sequence write EMAC_SA1L and write EMAC_SA1H must be respected 115 pEmac->EMAC_SA1L = localMAClow; 116 pEmac->EMAC_SA1H = localMAChigh; 117 } 118