* completely written.
*/
int32_t rpp_sci_printf(const char* format, ...);
-int32_t __rpp_sci_printf(const char* format, va_list args);
+int32_t rpp_sci_vprintf(const char* format, va_list args);
/**
* Field Definition Macros
\**************************************************************************/
+#define EMAC_CTRL_MISC_STATPENDENB (0x00000008u)
+#define EMAC_CTRL_MISC_STATPENDENB_SHIFT (0x00000003u)
+
+#define EMAC_CTRL_MISC_HOSTPENDENB (0x00000004u)
+#define EMAC_CTRL_MISC_HOSTPENDENB_SHIFT (0x00000002u)
+
+#define EMAC_CTRL_MISC_LINKINT0ENB (0x00000002u)
+#define EMAC_CTRL_MISC_LINKINT0ENB_SHIFT (0x00000001u)
+
+#define EMAC_CTRL_MISC_USERINT0ENB (0x00000001u)
+#define EMAC_CTRL_MISC_USERINT0ENB_SHIFT (0x00000000u)
+
#ifdef __cplusplus
}
#endif
extern void spi4LowLevelInterrupt(void);
extern void sciHighLevelInterrupt(void);
extern void i2cInterrupt(void);
+//extern void MDIOMiscInt(void);
extern void EMACCore0RxIsr(void);
extern void EMACCore0TxIsr(void);
/* Address will be used to match incoming packets */
#define EMAC_MACADDR_MATCH (0x00180000u)
+/*
+** Macros which can be passed as eoiFlag to EMACRxThreshIntAckToClear API
+*/
+#define EMAC_INT_CORE0_RX_THRSH (0x0u)
+#define EMAC_INT_CORE1_RX_THRSH (0x4u)
+#define EMAC_INT_CORE2_RX_THRSH (0x8u)
+
/*
** Macros which can be passed as eoiFlag to EMACRxIntAckToClear API
*/
#define EMAC_INT_CORE1_TX (0x6u)
#define EMAC_INT_CORE2_TX (0xAu)
+/*
+** Macros which can be passed as eoiFlag to EMACMiscIntAckToClear API
+** STATPEND, HOSTPEND, MDIO LINKINT0, MDIO USERINT0
+*/
+#define EMAC_INT_CORE0_MISC (0x3u)
+#define EMAC_INT_CORE1_MISC (0x7u)
+#define EMAC_INT_CORE2_MISC (0xBu)
+
/*****************************************************************************/
/*
** Prototypes for the APIs
#define NUM_OF_PHYs 32
#define SIZE_OF_DESC 16 /* in bytes */
#define CHANNEL 0 /* channel number for everything - for rx, tx, unicast, broadcast or damaged frames ; there are different channels for rx and tx operations */
+#define PHY_LINK_MONITOR_INT 0 /* turn on handling interrupt risen when link status is changed (cable out or in) */
#define MAX_TRANSFER_UNIT 1500 /* take in account oversized frames */
#define PBUF_LEN_MAX MAX_TRANSFER_UNIT
return UNKN_DUPLEX_MODE;
}
+ /* TODO: reorganize code for linkint handling and maybe add functions for it */
+#if PHY_LINK_MONITOR_INT
+ /* set PHY number which is monitored for link changes in MDIO and enable interrupt */
+ HWREG(hdkif->mdio_base + MDIO_USERPHYSEL0) = ((hdkif->phy_addr && 0x1f) | MDIO_USERPHYSEL0_LINKINTENB);
+
+ /* enable MISC interrupt for link monitoring in EMAC controle module */
+ HWREG(hdkif->emac_ctrl_base + EMAC_CTRL_CnMISCEN(0)) |= EMAC_CTRL_MISC_LINKINT0ENB;
+#endif
+
/* enable EMAC's Media Independent Interface TX and RX */
EMACMIIEnable(hdkif->emac_base);
/* enable EMAC transmit */
#endif
}
+#if PHY_LINK_MONITOR_INT
+boolean_t LinkIntHandler(void)
+{
+ uint8_t index = MAX_EMAC_INSTANCE, phyFound = FALSE;
+
+ /* check each instance, whether this interrupt was meant for this function */
+ while(index--){
+ struct hdkif *hdkif = &hdkif_data[index];
+ if( hdkif->phy_addr == (HWREG(hdkif->mdio_base + MDIO_USERPHYSEL0) & 0x1f) && (HWREG(hdkif->emac_base + EMAC_MACINVECTOR) & EMAC_MACINVECTOR_LINKINT0) )phyFound = TRUE;
+ }
+ if(!phyFound)return FALSE
+
+ /* do whatever necessary for link status change here */
+
+ /* acknowledge MDIO module */
+ HWREG(hdkif->mdio_base + MDIO_LINKINTRAW) = MDIO_LINKINTMASKED_USERPHY0;
+ HWREG(hdkif->mdio_base + MDIO_LINKINTMASKED) = MDIO_LINKINTMASKED_USERPHY0;
+
+ /* acknowledge EMAC control module by writing appropriate key to MACEOIVECTOR */
+ EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_MISC);
+
+ return TRUE;
+}
+#endif
+
/* --- EMAC DESCRIPTOR FORMAT ---
* bit fields
int32_t rpp_sci_printf(const char* format, ...)
{
- char str[MAX_BUFFER_LEN];
- int length = -1;
-
+ int length = -1;
va_list argList;
va_start(argList, format);
-
- length = vsnprintf(str, sizeof(str), format, argList);
-
+ length = rpp_sci_vprintf(format, argList);
va_end(argList);
- if(length > 0) {
- #if rppCONFIG_DRV == 1
- // According to the C stdlib about vsnprintf:
- // If the resulting string would be longer than n-1 characters, the
- // remaining characters are discarded and not stored, but counted
- // for the value returned by the function.
- // In consequence we need to trim the value if larger than buffer.
- if(length >= sizeof(str)) {
- length = sizeof(str) - 1;
- }
- if(drv_sci_send(
- (uint32_t)length,
- (uint8_t*)str,
- portMAX_DELAY) != SUCCESS) {
- return -1;
- }
- #endif
- }
-
return length;
}
-int32_t __rpp_sci_printf(const char* format, va_list argList)
+int32_t rpp_sci_vprintf(const char* format, va_list argList)
{
char str[MAX_BUFFER_LEN];
int length = -1;
}
}
+#define PHY_LINK_MONITOR_INT 0
+
+#if PHY_LINK_MONITOR_INT
+extern boolean_t LinkIntHandler(void);
+#pragma INTERRUPT(MDIOMiscInt, IRQ)
+void MDIOMiscInt(void)
+{
+ if(LinkIntHandler())return;
+}
+#endif
+
extern void RxIntHandler(uint32_t instNum);
extern void TxIntHandler(uint32_t instNum);
*/
}
-
/* USER CODE BEGIN (38) */
/* USER CODE END */
&phantomInterrupt,
&phantomInterrupt,
&phantomInterrupt, // 75
- &phantomInterrupt,
+ &phantomInterrupt, //MDIOMiscInt
&EMACCore0TxIsr,
&phantomInterrupt,
&EMACCore0RxIsr,
| (SYS_IRQ << 9U)
| (SYS_IRQ << 10U)
| (SYS_IRQ << 11U)
- | (SYS_IRQ << 12U)
+ | (SYS_IRQ << 12U) // MDIOMiscInt
| (SYS_IRQ << 13U) // EMAC
| (SYS_IRQ << 14U)
| (SYS_IRQ << 15U) // EMAC
| (0U << 9U)
| (0U << 10U)
| (0U << 11U)
- | (0U << 12U)
+ | (0U << 12U) // MDIOMiscInt
| (1U << 13U) // EMACCore0TxIsr
| (0U << 14U)
| (1U << 15U) // EMACCore0RxIsr