aboutsummaryrefslogtreecommitdiffstats
path: root/ports
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-05-05 15:23:14 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2008-05-05 15:23:14 +0000
commit0b4c75e411941009a3376949c6c0c1b2f6eb57c7 (patch)
treee75d054015a68f6dd2bb23d7ef9a511aadd28881 /ports
parent2bd8e76a705d6a64b853064f6b698706fcd77e43 (diff)
downloadChibiOS-0b4c75e411941009a3376949c6c0c1b2f6eb57c7.tar.gz
ChibiOS-0b4c75e411941009a3376949c6c0c1b2f6eb57c7.tar.bz2
ChibiOS-0b4c75e411941009a3376949c6c0c1b2f6eb57c7.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@280 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'ports')
-rw-r--r--ports/ARM7-AT91SAM7X/sam7x_emac.c63
-rw-r--r--ports/ARM7-AT91SAM7X/sam7x_emac.h5
2 files changed, 47 insertions, 21 deletions
diff --git a/ports/ARM7-AT91SAM7X/sam7x_emac.c b/ports/ARM7-AT91SAM7X/sam7x_emac.c
index 1ffa9b547..0a680860e 100644
--- a/ports/ARM7-AT91SAM7X/sam7x_emac.c
+++ b/ports/ARM7-AT91SAM7X/sam7x_emac.c
@@ -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;
+}
diff --git a/ports/ARM7-AT91SAM7X/sam7x_emac.h b/ports/ARM7-AT91SAM7X/sam7x_emac.h
index ede932d05..7fb5e4517 100644
--- a/ports/ARM7-AT91SAM7X/sam7x_emac.h
+++ b/ports/ARM7-AT91SAM7X/sam7x_emac.h
@@ -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