/***************************************************************************** | |
* © 2014 Microchip Technology Inc. and its subsidiaries. | |
* You may use this software and any derivatives exclusively with | |
* Microchip products. | |
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". | |
* NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, | |
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, | |
* AND FITNESS FOR A PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP | |
* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION. | |
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, | |
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND | |
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS | |
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. | |
* TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL | |
* CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF | |
* FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. | |
* MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE | |
* OF THESE TERMS. | |
*****************************************************************************/ | |
/** @file mec14xx_tfdp.c | |
*MEC14xx Trace FIFO Data Port hardware access | |
*/ | |
/** @defgroup MEC14xx Peripherals TFDP | |
* @{ | |
*/ | |
#include "appcfg.h" | |
#include "platform.h" | |
#include "MEC14xx/mec14xx.h" | |
#include "MEC14xx/mec14xx_pcr.h" | |
#include "MEC14xx/mec14xx_gpio.h" | |
#include "MEC14xx/mec14xx_trace_func.h" | |
#ifdef ENABLE_TFDP_TRACE | |
#undef TFDP_PIN_1 | |
#undef TFDP_PIN_2 | |
#define TFDP_PIN_1 (GPIO_0116_ID) // Func1 PullUp enabled | |
#define TFDP_PIN_2 (GPIO_0117_ID) // Func1 PullUp enabled | |
static void tfdp_xmit_header(uint16_t nbr) | |
{ | |
TFDP->DATA = TFDP_FRAME_START; | |
TFDP_DELAY(); | |
TFDP->DATA = (uint8_t)nbr; | |
TFDP_DELAY(); | |
TFDP->DATA = (uint8_t)(nbr >> 8); | |
TFDP_DELAY(); | |
} | |
static void tfdp_xmit_hword(uint16_t hword) | |
{ | |
TFDP->DATA = (uint8_t)hword; | |
TFDP_DELAY(); | |
TFDP->DATA = (uint8_t)(hword >> 8); | |
TFDP_DELAY(); | |
} | |
static void tfdp_xmit_word(uint32_t word) | |
{ | |
uint8_t i; | |
for (i = 0u; i < 4; i++) { | |
TFDP->DATA = (uint8_t)word; | |
word >>= 8; | |
TFDP_DELAY(); | |
} | |
} | |
/** | |
* tfdp_sleep_en - Gate clocks On/Off to TFDP block when idle | |
* | |
* @author C21969 (2/4/2014) | |
* | |
* @param sleep_en (1=Gate clocks when idle), (0=Do not gate | |
* clocks when idle) | |
*/ | |
void tfdp_sleep_en(uint8_t sleep_en) | |
{ | |
if ( sleep_en ) { | |
PCR->EC_SLEEP_EN |= (PCR_EC_TFDP_SLP_CLK); | |
} else { | |
PCR->EC_SLEEP_EN &= ~(PCR_EC_TFDP_SLP_CLK); | |
} | |
} | |
/** | |
* tfdp_enable - Init Trace FIFO Data Port | |
* @param boolean true=enable TFDP, false=disable TFDP | |
* @param boolean true=change TFDP pin configuration. | |
* If TFDP is enabled then GPIO103/104 set to Alt. Func. 1 | |
* Else GPIO103/104 set to GPIO input, internal PU enabled. | |
* @note - | |
*/ | |
void tfdp_enable(uint8_t en, uint8_t pin_cfg) | |
{ | |
uint32_t delay; | |
if (en) { | |
if (pin_cfg) { | |
// Input with AltOut=1 to drive high when switched to output | |
GPIO_CTRL->REG[TFDP_PIN_1].w = (1ul << 16); | |
GPIO_CTRL->REG[TFDP_PIN_2].w = (1ul << 16); | |
delay = 128; | |
while ( delay-- ) | |
{ | |
CPU_NOP(); | |
} | |
// GPIO Output enabled (drive based on above settings) | |
GPIO_CTRL->REG[TFDP_PIN_1].w |= (1ul << 9); | |
GPIO_CTRL->REG[TFDP_PIN_2].w |= (1ul << 9); | |
delay = 128; | |
while ( delay-- ) | |
{ | |
CPU_NOP(); | |
} | |
// Switch to Function 1 (TFDP mode b[13:12]=01b) | |
GPIO_CTRL->REG[TFDP_PIN_1].w = (1ul << 16) + (1ul << 12); | |
GPIO_CTRL->REG[TFDP_PIN_2].w = (1ul << 16) + (1ul << 12); | |
} | |
/* b[0]=1(Enable) | |
* b[1]=0(Shift data out on rising edge) | |
* b[3:2]=00b TFDP shift clocks = AHB_CLK/2 | |
* b[6:4]=000b 1 clock inter-packet delay | |
*/ | |
TFDP->CONTROL = 0x01u; | |
} | |
else | |
{ | |
TFDP->CONTROL = 0x00u; | |
if (pin_cfg) | |
{ /* Set to POR value (tri-stated input) */ | |
GPIO_CTRL->REG[TFDP_PIN_1].w = 0; | |
GPIO_CTRL->REG[TFDP_PIN_2].w = 0; | |
} | |
} | |
} // end tfdp_enable() | |
/** | |
* TFDPTrace0 - TRACE0: transmit 16-bit trace number lsb first | |
* over TFDP. | |
* | |
* @author sworley | |
* | |
* @param nbr 16-bit trace number | |
* @param b unused | |
* | |
* @return uint8_t always TRUE | |
* @note Function implements critical section. | |
* Uses tool kit __disable_irq()/__enable_irq() pair which may use | |
* priviledged Cortex-Mx instructions. | |
*/ | |
void TFDPTrace0 ( uint16_t nbr, uint8_t b ) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
mips32r2_restore_intr(isave); | |
#endif | |
} | |
/** | |
* TRDPTrace1 - TRACE1: transmit 16-bit trace number lsb first | |
* and 16-bit data lsb first over TFDP. | |
* | |
* @author sworley | |
* | |
* @param nbr 16-bit trace number | |
* @param b unused | |
* @param uint32_t p1 16-bit data1 in b[15:0] | |
* | |
* @return uint8_t always TRUE | |
* @note Function implements critical section. | |
* Uses tool kit __disable_irq()/__enable_irq() pair which may use | |
* priviledged Cortex-Mx instructions. | |
*/ | |
void TFDPTrace1 ( uint16_t nbr, uint8_t b, uint32_t p1 ) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
tfdp_xmit_hword(p1); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
mips32r2_restore_intr(isave); | |
#endif | |
} | |
/** | |
* TFDPTrace2 - TRACE2: transmit 16-bit trace number lsb first | |
* and two 16-bit data parameters lsb first over TFDP. | |
* | |
* @author sworley | |
* | |
* @param nbr trace number | |
* @param b unused | |
* @param uint32_t p1 16-bit data1 in b[15:0] | |
* @param uint32_t p2 16-bit data2 in b[15:0] | |
* | |
* @return uint8_t always TRUE | |
* @note Uses tool kit functions to save/disable/restore | |
* interrupts for critical section. These may use | |
* priviledged instructions. | |
*/ | |
void TFDPTrace2 ( uint16_t nbr, uint8_t b, uint32_t p1, uint32_t p2 ) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
tfdp_xmit_hword(p1); | |
tfdp_xmit_hword(p2); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
mips32r2_restore_intr(isave); | |
#endif | |
} | |
/** | |
* TFDPTrace3 - TRACE3: transmit 16-bit trace number lsb first | |
* and three 16-bit data parameters lsb first over TFDP. | |
* | |
* @author sworley | |
* | |
* @param nbr trace number | |
* @param b unused | |
* @param uint32_t p1 16-bit data1 in b[15:0] | |
* @param uint32_t p2 16-bit data2 in b[15:0] | |
* @param uint32_t p3 16-bit data3 in b[15:0] | |
* | |
* @return uint8_t always TRUE | |
* @note Uses tool kit functions to save/disable/restore | |
* interrupts for critical section. These may use | |
* priviledged instructions. | |
*/ | |
void TFDPTrace3 ( uint16_t nbr, uint8_t b, uint32_t p1, uint32_t p2, uint32_t p3) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
tfdp_xmit_hword(p1); | |
tfdp_xmit_hword(p2); | |
tfdp_xmit_hword(p3); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
if ( isave & (1ul<<0) ) | |
{ | |
mips32r2_en_intr(); | |
} | |
#endif | |
} | |
/** | |
* TFDPTrace4 - TRACE3: transmit 16-bit trace number lsb first | |
* and four 16-bit data parameters lsb first over TFDP. | |
* | |
* @author sworley | |
* | |
* @param nbr trace number | |
* @param b unused | |
* @param uint32_t p1 16-bit data1 in b[15:0] | |
* @param uint32_t p2 16-bit data2 in b[15:0] | |
* @param uint32_t p3 16-bit data3 in b[15:0] | |
* @param uint32_t p4 16-bit data4 in b[15:0] | |
* | |
* @return uint8_t always TRUE | |
* @note Uses tool kit functions to save/disable/restore | |
* interrupts for critical section. These may use | |
* priviledged instructions. | |
*/ | |
void TFDPTrace4 ( uint16_t nbr, uint8_t b, uint32_t p1, uint32_t p2, uint32_t p3, uint32_t p4) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
tfdp_xmit_hword(p1); | |
tfdp_xmit_hword(p2); | |
tfdp_xmit_hword(p3); | |
tfdp_xmit_hword(p4); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
if ( isave & (1ul<<0) ) | |
{ | |
mips32r2_en_intr(); | |
} | |
#endif | |
} | |
/** | |
* TFDPTrace11 - Transmit one 32-bit data item over TFDP | |
* | |
* @param nbr trace number | |
* @param b unused | |
* @param uint32_t p1 32-bit data to be transmitted | |
* | |
*/ | |
void TFDPTrace11( uint16_t nbr, uint8_t b, uint32_t p1) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
tfdp_xmit_word(p1); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
if ( isave & (1ul<<0) ) | |
{ | |
mips32r2_en_intr(); | |
} | |
#endif | |
} | |
/** | |
* TFDPTrace12 - Transmit two 32-bit data items over TFDP | |
* | |
* @param nbr trace number | |
* @param b unused | |
* @param uint32_t p1 32-bit data1 to be transmitted | |
* @param uint32_t p2 32-bit data2 to be transmitted | |
* | |
*/ | |
void TFDPTrace12( uint16_t nbr, uint8_t b, uint32_t p1, uint32_t p2 ) | |
{ | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
uint32_t isave; | |
isave = mips32r2_dis_intr(); | |
#endif | |
(void)b; | |
tfdp_xmit_header(nbr); | |
tfdp_xmit_word(p1); | |
tfdp_xmit_word(p2); | |
#ifdef ENABLE_TRACE_MASK_IRQ | |
if ( isave & (1ul<<0) ) | |
{ | |
mips32r2_en_intr(); | |
} | |
#endif | |
} | |
#endif // #ifdef ENABLE_TFDP_TRACE | |
/* end mec14xx_tfdp.c */ | |
/** @} | |
*/ |