git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@280 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2008-05-05 15:23:14 +00:00
parent 2bd8e76a70
commit 0b4c75e411
2 changed files with 47 additions and 21 deletions

View File

@ -24,9 +24,16 @@
#include "mii.h"
#include "at91lib/aic.h"
#define EMAC_RECEIVE_BUFFERS 25
#define EMAC_RECEIVE_BUFFERS_SIZE 128
#define EMAC_TRANSMIT_BUFFERS 2
#define EMAC_TRANSMIT_BUFFERS_SIZE 1518
static BufDescriptorEntry rent[EMAC_RECEIVE_BUFFERS] __attribute__((aligned(4)));
//static BufDescriptorEntry tent[EMAC_TRANSMIT_BUFFERS] __attribute__((aligned(4)));
static uint8_t rbuffers[128 * EMAC_RECEIVE_BUFFERS] __attribute__((aligned(4)));
static uint8_t rbuffers[EMAC_RECEIVE_BUFFERS * EMAC_RECEIVE_BUFFERS_SIZE] __attribute__((aligned(4)));
static BufDescriptorEntry tent[EMAC_TRANSMIT_BUFFERS] __attribute__((aligned(4)));
static uint8_t tbuffers[EMAC_TRANSMIT_BUFFERS * EMAC_TRANSMIT_BUFFERS_SIZE] __attribute__((aligned(4)));
EventSource TransmitDone, ReceiveNotEmpty;
@ -75,12 +82,21 @@ static void phy_put(uint8_t regno, uint32_t val) {
void InitEMAC(int prio) {
int i;
/*
* Buffers initialization.
*/
for (i = 0; i < EMAC_RECEIVE_BUFFERS; i++) {
rent[i].w1 = (uint32_t)&rbuffers[i * 128];
rent[i].w1 = (uint32_t)&rbuffers[i * EMAC_RECEIVE_BUFFERS_SIZE];
rent[i].w2 = 0;
}
rent[EMAC_RECEIVE_BUFFERS - 1].w1 |= W1_R_WRAP;
for (i = 0; i < EMAC_TRANSMIT_BUFFERS; i++) {
rent[i].w1 = ((uint32_t)&tbuffers[i * EMAC_TRANSMIT_BUFFERS_SIZE]) | W2_T_USED;
tent[i].w2 = 0;
}
tent[EMAC_TRANSMIT_BUFFERS - 1].w1 |= W2_T_WRAP;
/*
* Disables default pullups, the PHY has an internal pulldowns.
* Selects MII mode.
@ -90,9 +106,9 @@ void InitEMAC(int prio) {
/*
* PHY powerdown.
*/
AT91C_BASE_PIOB->PIO_OER = PIOB_PHY_PD; // Becomes an output.
AT91C_BASE_PIOB->PIO_PPUDR = PIOB_PHY_PD; // Default pullup disabled.
AT91C_BASE_PIOB->PIO_CODR = PIOB_PHY_PD; // Output to low level.
AT91C_BASE_PIOB->PIO_OER = PIOB_PHY_PD; // Becomes an output.
AT91C_BASE_PIOB->PIO_PPUDR = PIOB_PHY_PD; // Default pullup disabled.
AT91C_BASE_PIOB->PIO_CODR = PIOB_PHY_PD; // Output to low level.
/*
* PHY reset by pulsing the NRST pin.
@ -107,23 +123,34 @@ void InitEMAC(int prio) {
*/
AT91C_BASE_PIOB->PIO_ASR = EMAC_PIN_MASK;
AT91C_BASE_PIOB->PIO_PDR = EMAC_PIN_MASK;
AT91C_BASE_PIOB->PIO_PPUDR = EMAC_PIN_MASK; // ?????
AT91C_BASE_PIOB->PIO_PPUDR = EMAC_PIN_MASK; // Really needed ?????
/*
* EMAC setup.
*/
AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_MPE; // Enable Management Port
AT91C_BASE_EMAC->EMAC_NCFGR |= 2 << 10; // CLK = MCK / 32
chThdSleep(5);
AT91C_BASE_EMAC->EMAC_NCR = AT91C_EMAC_MPE; // Enable Management Port
AT91C_BASE_EMAC->EMAC_NCFGR = 2 << 10; // MDC-CLK = MCK / 32
chThdSleep(5); // It could perform one or more dummy phy_get() instead.
(void)phy_get(MII_BMCR);
phy_put(MII_BMCR, phy_get(MII_BMCR) & ~BMCR_ISOLATE); // Disable ISOLATE
AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE; // Disable Management Port
AT91C_BASE_EMAC->EMAC_NCR = 0; // Disable Management Port
AT91C_BASE_EMAC->EMAC_USRIO = AT91C_EMAC_CLKEN; // Enable EMAC in MII mode
AT91C_BASE_EMAC->EMAC_RBQP = (AT91_REG)rent; // RX buffers list
AT91C_BASE_EMAC->EMAC_TBQP = (AT91_REG)tent; // TX buffers list
AT91C_BASE_EMAC->EMAC_RSR = AT91C_EMAC_OVR |
AT91C_EMAC_REC |
AT91C_EMAC_BNA; // Clears RSR
AT91C_BASE_EMAC->EMAC_NCFGR |= AT91C_EMAC_CAF |
AT91C_EMAC_NBC |
AT91C_EMAC_DRFCS; // Initial NCFGR settings
AT91C_BASE_EMAC->EMAC_NCR |= AT91C_EMAC_TE |
AT91C_EMAC_RE |
AT91C_EMAC_CLRSTAT; // Initial NCR settings
}
@ -138,7 +165,9 @@ void EMACSetAddress(uint8_t *eaddr) {
}
/*
* Transmits a data buffer (whole ethernet frame).
* Transmits an ethernet frame.
*/
//bool_t EMACTransmit(uint8_t *buf, size_t size) {
//}
bool_t EMACTransmit(uint8_t *hdr, size_t hsize, uint8_t *data, size_t dsize) {
return FALSE;
}

View File

@ -20,9 +20,6 @@
#ifndef _SAM7X_EMAC_H_
#define _SAM7X_EMAC_H_
#define EMAC_RECEIVE_BUFFERS 60
#define EMAC_TRANSMIT_BUFFERS 12
typedef struct {
uint32_t w1;
uint32_t w2;
@ -66,7 +63,7 @@ extern "C" {
#endif
void InitEMAC(int prio);
void EMACSetAddress(uint8_t *eaddr);
bool_t EMACTransmit(uint8_t *buf, size_t size);
bool_t EMACTransmit(uint8_t *hdr, size_t hsize, uint8_t *data, size_t dsize);
#ifdef __cplusplus
}
#endif