From d158e16ed86a5617ef748f69cede95a32a1526df Mon Sep 17 00:00:00 2001 From: gdisirio Date: Wed, 7 May 2008 12:00:55 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@282 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- ports/ARM7-AT91SAM7X/sam7x_emac.c | 38 +++++++++++++++++++++++++++++-------- ports/ARM7-AT91SAM7X/sam7x_serial.c | 2 +- readme.txt | 4 +++- src/templates/chcore.h | 16 +++++++++++----- src/templates/chtypes.h | 6 +++--- 5 files changed, 48 insertions(+), 18 deletions(-) diff --git a/ports/ARM7-AT91SAM7X/sam7x_emac.c b/ports/ARM7-AT91SAM7X/sam7x_emac.c index 61b387820..6472bbff2 100644 --- a/ports/ARM7-AT91SAM7X/sam7x_emac.c +++ b/ports/ARM7-AT91SAM7X/sam7x_emac.c @@ -82,16 +82,16 @@ static uint32_t phy_get(uint8_t regno) { }*/ /* - * Returns TRUE if the link is active else FALSE. + * Returns FALSE if the link is not established. * It also setup the link-related EMAC registers. */ -static bool_t check_link_status(void) { +static bool_t get_link_status(void) { uint32_t ncfgr, bmsr, bmcr, lpa; (void)phy_get(MII_BMSR); bmsr = phy_get(MII_BMSR); if (!(bmsr & BMSR_LSTATUS)) - return TRUE; + return FALSE; ncfgr = AT91C_BASE_EMAC->EMAC_NCFGR & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD); bmcr = phy_get(MII_BMCR); @@ -109,20 +109,41 @@ static bool_t check_link_status(void) { ncfgr |= AT91C_EMAC_FD; } AT91C_BASE_EMAC->EMAC_NCFGR = ncfgr; - return FALSE; + return TRUE; } +#define RSR_BITS (AT91C_EMAC_BNA | AT91C_EMAC_REC | AT91C_EMAC_OVR) +#define TSR_BITS (AT91C_EMAC_UBR | AT91C_EMAC_COL | AT91C_EMAC_RLES | \ + AT91C_EMAC_BEX | AT91C_EMAC_COMP | AT91C_EMAC_UND) + __attribute__((noinline)) static void ServeInterrupt(void) { + uint32_t isr, rsr, tsr; + + /* Fix for the EMAC errata */ + isr = AT91C_BASE_EMAC->EMAC_ISR; + rsr = AT91C_BASE_EMAC->EMAC_RSR; + tsr = AT91C_BASE_EMAC->EMAC_TSR; + + if ((isr & AT91C_EMAC_RCOMP) || (rsr & RSR_BITS)) { + if (rsr & AT91C_EMAC_REC) + chEvtSendI(&EMACFrameReceived); + AT91C_BASE_EMAC->EMAC_RSR = RSR_BITS; + } + + if ((isr & AT91C_EMAC_TCOMP) || (tsr & TSR_BITS)) { + if (tsr & AT91C_EMAC_COMP) + chEvtSendI(&EMACFrameTransmitted); + AT91C_BASE_EMAC->EMAC_TSR = TSR_BITS; + } + AT91C_BASE_AIC->AIC_EOICR = 0; } -__attribute__((naked, weak)) +__attribute__((naked)) void EMACIrqHandler(void) { chSysIRQEnterI(); - ServeInterrupt(); - chSysIRQExitI(); } @@ -216,13 +237,14 @@ void InitEMAC(int prio) { if ((phy_get(MII_PHYSID1) != (MII_MICREL_ID >> 16)) || (phy_get(MII_PHYSID2 & 0xFFF0) != (MII_MICREL_ID & 0xFFF0))) chDbgPanic("Wrong PHY identifier"); - if (check_link_status()) + if (!get_link_status()) chDbgPanic("No link"); AT91C_BASE_EMAC->EMAC_NCR &= ~AT91C_EMAC_MPE; /* * Interrupt setup. */ + AT91C_BASE_EMAC->EMAC_IER = AT91C_EMAC_RCOMP; AIC_ConfigureIT(AT91C_ID_EMAC, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | prio, EMACIrqHandler); diff --git a/ports/ARM7-AT91SAM7X/sam7x_serial.c b/ports/ARM7-AT91SAM7X/sam7x_serial.c index c401be168..9534e287a 100644 --- a/ports/ARM7-AT91SAM7X/sam7x_serial.c +++ b/ports/ARM7-AT91SAM7X/sam7x_serial.c @@ -63,7 +63,7 @@ static void ServeInterrupt(AT91PS_USART u, FullDuplexDriver *com) { SetError(u->US_CSR, com); u->US_CR = AT91C_US_RSTSTA; } - AT91C_BASE_AIC->AIC_EOICR = 0; \ + AT91C_BASE_AIC->AIC_EOICR = 0; } __attribute__((naked, weak)) diff --git a/readme.txt b/readme.txt index a2cea3cf8..abb8ecb87 100644 --- a/readme.txt +++ b/readme.txt @@ -70,7 +70,9 @@ Win32-MinGW - ChibiOS/RT simulator and demo into a WIN32 process, produce better code. - In the ARM7 and ARMCM3 ports chanced the bool_t base type from int8_t to int32_t, this produces a bit faster and smaller code. - +- Small fixes to the template files, there were some leftovers of the old + type names. + *** 0.6.3 *** - NEW: ARM Cortex-M3 port completed. The demo program targets the STM32F103 chip from ST Microelectronics on an Olimex STM32-P103 board. diff --git a/src/templates/chcore.h b/src/templates/chcore.h index c13ee59ed..879e2732c 100644 --- a/src/templates/chcore.h +++ b/src/templates/chcore.h @@ -76,7 +76,7 @@ typedef struct { * Macro used to allocate a thread working area aligned as both position and * size. */ -#define WorkingArea(s, n) BYTE8 s[UserStackSize(n)]; +#define WorkingArea(s, n) uint8_t s[UserStackSize(n)]; /** * Enters the ChibiOS/RT system mutual exclusion zone, the implementation is @@ -115,10 +115,16 @@ typedef struct { */ #define chSysIRQExitI() -void _IdleThread(void *p); -void chSysHalt(void); -void chSysSwitchI(Thread *otp, Thread *ntp); -void chSysPuts(char *msg); +#ifdef __cplusplus +extern "C" { +#endif + void _IdleThread(void *p); + void chSysHalt(void); + void chSysSwitchI(Thread *otp, Thread *ntp); + void chSysPuts(char *msg); +#ifdef __cplusplus +} +#endif #endif /* _CHCORE_H_ */ diff --git a/src/templates/chtypes.h b/src/templates/chtypes.h index 1c4004c6d..b333c1a49 100644 --- a/src/templates/chtypes.h +++ b/src/templates/chtypes.h @@ -33,9 +33,9 @@ #include #endif -typedef int8_t bool_t; /* Signed byte boolean. */ -typedef uint8_t tmode_t; /* Thread mode flags, BYTE8 is ok. */ -typedef uint8_t tstate_t; /* Thread state, BYTE8 is ok. */ +typedef int32_t bool_t; /* Signed boolean. */ +typedef uint8_t tmode_t; /* Thread mode flags, uint8_t is ok. */ +typedef uint8_t tstate_t; /* Thread state, uint8_t is ok. */ typedef uint16_t tid_t; /* Thread id. */ typedef uint32_t tprio_t; /* Priority, use the fastest unsigned type. */ typedef int32_t msg_t; /* Message, use signed pointer equivalent.*/ -- cgit v1.2.3