500 lines
11 KiB
C
500 lines
11 KiB
C
|
/* Copyright 2017 The Chromium OS Authors. All rights reserved.
|
||
|
* Use of this source code is governed by a BSD-style license that can be
|
||
|
* found in the LICENSE file.
|
||
|
*/
|
||
|
|
||
|
/** @file tfdp.c
|
||
|
*MCHP Trace FIFO Data Port hardware access
|
||
|
*/
|
||
|
/** @defgroup MCHP Peripherals TFDP
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
#include "common.h"
|
||
|
#include "gpio.h"
|
||
|
#include "registers.h"
|
||
|
#include "tfdp_chip.h"
|
||
|
|
||
|
#ifdef CONFIG_MCHP_TFDP
|
||
|
|
||
|
|
||
|
static uint32_t get_disable_intr(void)
|
||
|
{
|
||
|
uint32_t m;
|
||
|
|
||
|
__asm__ __volatile__ ("mrs %0, primask;cpsid i" : "=r" (m));
|
||
|
|
||
|
return m;
|
||
|
}
|
||
|
|
||
|
static void restore_intr(uint32_t m)
|
||
|
{
|
||
|
if (!m)
|
||
|
__asm__ __volatile__ ("cpsie i" : : : "memory");
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* tfdp_power - Gate clocks On/Off to TFDP block when idle
|
||
|
*
|
||
|
* @param pwr_on (0=Gate clocks when idle), (1=Do not gate
|
||
|
* clocks when idle)
|
||
|
*/
|
||
|
void tfdp_power(uint8_t pwr_on)
|
||
|
{
|
||
|
if (pwr_on)
|
||
|
MCHP_PCR_SLP_DIS_DEV(MCHP_PCR_TFDP);
|
||
|
else
|
||
|
MCHP_PCR_SLP_EN_DEV(MCHP_PCR_TFDP);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* tfdp_enable - Init Trace FIFO Data Port
|
||
|
* @param uint8_t non-zero=enable TFDP, false=disable TFDP
|
||
|
* @param uint8_t non-zero=change TFDP pin configuration.
|
||
|
* If TFDP is enabled then GPIO170/171 set to Alt. Func. 1
|
||
|
* Else GPIO170/171 set to GPIO input, internal pull-up enabled.
|
||
|
* @note -
|
||
|
*/
|
||
|
#define MCHP_TFDP_DATA REG8(MCHP_TFDP_BASE + 0x00)
|
||
|
#define MCHP_TFDP_CTRL REG8(MCHP_TFDP_BASE + 0x04)
|
||
|
|
||
|
void tfdp_enable(uint8_t en, uint8_t pin_cfg)
|
||
|
{
|
||
|
if (en) {
|
||
|
MCHP_TFDP_CTRL = 0x01u;
|
||
|
if (pin_cfg)
|
||
|
gpio_config_module(MODULE_TFDP, 1);
|
||
|
} else {
|
||
|
MCHP_TFDP_CTRL = 0x00u;
|
||
|
if (pin_cfg)
|
||
|
gpio_config_module(MODULE_TFDP, 0);
|
||
|
}
|
||
|
} /* end tfdp_enable() */
|
||
|
|
||
|
|
||
|
/**
|
||
|
* TFDPTrace0 - TRACE0: transmit 16-bit trace number lsb first
|
||
|
* over TFDP.
|
||
|
*
|
||
|
* @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)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* TRDPTrace1 - TRACE1: transmit 16-bit trace number lsb first
|
||
|
* and 16-bit data lsb first over TFDP.
|
||
|
*
|
||
|
* @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, uint32_t p1)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* TFDPTrace2 - TRACE2: transmit 16-bit trace number lsb first
|
||
|
* and two 16-bit data parameters lsb first over TFDP.
|
||
|
*
|
||
|
* @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, uint32_t p1, uint32_t p2)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p2;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* TFDPTrace3 - TRACE3: transmit 16-bit trace number lsb first
|
||
|
* and three 16-bit data parameters lsb first over TFDP.
|
||
|
*
|
||
|
* @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, uint32_t p1,
|
||
|
uint32_t p2, uint32_t p3)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p2;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p3;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* TFDPTrace4 - TRACE3: transmit 16-bit trace number lsb first
|
||
|
* and four 16-bit data parameters lsb first over TFDP.
|
||
|
*
|
||
|
* @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, uint32_t p1, uint32_t p2,
|
||
|
uint32_t p3, uint32_t p4)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p2;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p3;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p4;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p4 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#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, uint32_t p1)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#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, uint32_t p1, uint32_t p2)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p2;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* TFDPTrace13 - Transmit three 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
|
||
|
* @param uint32_t p3 32-bit data3 to be transmitted
|
||
|
*
|
||
|
*/
|
||
|
void TFDPTrace13(uint16_t nbr, uint32_t p1,
|
||
|
uint32_t p2, uint32_t p3)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p2;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p3;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* TFDPTrace14 - Transmit four 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
|
||
|
* @param uint32_t p3 32-bit data3 to be transmitted
|
||
|
* @param uint32_t p4 32-bit data4 to be transmitted
|
||
|
*/
|
||
|
void TFDPTrace14(uint16_t nbr, uint32_t p1, uint32_t p2,
|
||
|
uint32_t p3, uint32_t p4)
|
||
|
{
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
uint32_t prim;
|
||
|
|
||
|
prim = get_disable_intr();
|
||
|
#endif
|
||
|
|
||
|
MCHP_TFDP_DATA = (TFDP_FRAME_START);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)nbr;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(nbr >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p1;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p1 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p2;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p2 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p3;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p3 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)p4;
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p4 >> 8);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p4 >> 16);
|
||
|
TFDP_DELAY();
|
||
|
MCHP_TFDP_DATA = (uint8_t)(p4 >> 24);
|
||
|
TFDP_DELAY();
|
||
|
|
||
|
#ifdef MCHP_TRACE_MASK_IRQ
|
||
|
restore_intr(prim);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#endif /* #ifdef CONFIG_MCHP_TFDP */
|
||
|
|
||
|
|
||
|
/* end tfdp.c */
|
||
|
/** @}
|
||
|
*/
|