bleSDK_expansion_board/drivers/api/iopad.h

356 lines
12 KiB
C

/**
****************************************************************************************
*
* @file iopad.h
*
* @brief Header file - IOPAD with CSC Driver
*
****************************************************************************************
*/
#ifndef _IOPAD_H_
#define _IOPAD_H_
#include <stdint.h>
/*
* DEFINES
****************************************************************************************
*/
/// Indexs of pad
enum pad_idx
{
// gpio pad
PA00 = 0,
PA01 = 1,
PA02 = 2,
PA03 = 3,
PA04 = 4,
PA05 = 5,
PA06 = 6,
PA07 = 7,
PA08 = 8,
PA09 = 9,
PA10 = 10,
PA11 = 11,
PA12 = 12,
PA13 = 13,
PA14 = 14,
PA15 = 15,
PA16 = 16,
PA17 = 17,
PA18 = 18,
PA19 = 19,
PA_MAX,
// pad of special func
PA_SWCLK = PA00,
PA_SWDIO = PA01,
PA_CLKOUT = PA05,
PA_RSTPIN = PA19,
// pad of USB signal
PA_USB_DP = PA06,
PA_USB_DM = PA07,
PA_SOF_SG = PA15,
// pad of analog func
PA_ADCIN0 = PA00,
PA_ADCIN1 = PA01,
PA_ADCIN2 = PA02,
PA_MICIN = PA03,
PA_ADCIN3 = PA04,
PA_ADCIN4 = PA05,
PA_ADCIN5 = PA06,
PA_ADCIN6 = PA07,
PA_ADCIN7 = PA08,
PA_ADCIN8 = PA09,
PA_ADCIN9 = PA10,
PA_ADCIN0_B = PA11,
PA_ADCIN1_B = PA12,
PA_ADCIN2_B = PA13,
PA_ADCIN4_B = PA14,
PA_ADCIN5_B = PA15,
PA_ADCIN6_B = PA16,
PA_LDOTESTA = PA17,
PA_AT0 = PA18,
PA_AT1 = PA19,
};
/// Bits Field of IO Mode @see CSC_IO_CTRL_TypeDef
enum iom_bfs
{
// set 0 to Hi-Z
IOM_HIZ = 0x00,
// bit[2:0] -- IO Function Select
IOM_SEL_GPIO = (0 << 0), // default function
IOM_SEL_CSC = (1 << 0), // cross switch connect
IOM_SEL_SPECL = (2 << 0), // swd/clk_out
IOM_SEL_TIMER = (3 << 0), // timer function
IOM_SEL_DEBUG = (4 << 0),
IOM_SEL_RFTEST = (5 << 0),
IOM_SEL_ADC_DBG = (6 << 0),
IOM_SEL_USB = (7 << 0),
// bit[5] -- IO Drive Strength
IOM_DRV_LVL0 = (0 << 5), // default Driver Strength
IOM_DRV_LVL1 = (1 << 5), // Max Driver Strength
// bit[11:6] -- IO Enable Mode
IOM_PULLDOWN = (1 << 6), // Pull Down Control
IOM_PULLUP = (1 << 7), // IO Pull Up
IOM_INPUT = (1 << 8), // IO Input Enable
IOM_CURSRC = (1 << 9), // IO 1ma Current Source Enable
IOM_ANALOG = (1 << 10), // IO Analog Enable
IOM_OPENDRAIN = (1 << 11), // IO Open Drain Enable
};
/// Selected functions of CSC (I:Input, O:Output)
enum csc_fsel
{
// Both Output and Input func
CSC_UART1_TXD = 0, // O/I can Swap
CSC_UART1_RXD = 1, // I/O can Swap
CSC_UART2_TXD = 2, // O/I can Swap
CSC_UART2_RXD = 3, // I/O can Swap
CSC_I2C_SCL = 4, // I&O OpenDrain
CSC_I2C_SDA = 5, // I&O OpenDrain
CSC_CTMR_CH1 = 6, // I/O pwc/pwm
CSC_CTMR_CH2 = 7, // I/O pwc/pwm
// Output func
CSC_UART1_RTS = 8, // O
CSC_UART2_RTS = 9, // O
CSC_UART1_SCK = 10, // O
CSC_UART2_SCK = 11, // O
CSC_SPIM_CLK = 12, // O
CSC_SPIM_MOSI = 13, // O
CSC_SPIS_MISO = 14, // O
// Input func
CSC_UART1_CTS = 8, // I
CSC_UART2_CTS = 9, // I
CSC_SPIM_MISO = 10, // I
CSC_SPIS_CLK = 11, // I
CSC_SPIS_MOSI = 12, // I
CSC_SPIS_CSN = 13, // I
// Output global bist indicate
CSC_GLB_BIST_DONE = 15, // O
CSC_GLB_BIST_FAIL = 16, // O
// Output analog observe func
CSC_OSCEN_FLAG = 17, // O
CSC_RFEN_FLAG = 18, // O
CSC_BLE_SLEEP_FLAG = 19, // O
CSC_CM0P_DEEPSLEEP = 20, // O
CSC_BB_TX_EN = 21, // O
CSC_BB_RX_EN = 22, // O
CSC_MDM_TX_EN = 23, // O
CSC_MDM_RX_EN = 24, // O
};
enum clk_out
{
CLK_OUT_NONE = 0,
CLK_OUT_HSI = 1,
CLK_OUT_XO16M = 2,
CLK_OUT_DPLL = 3,
CLK_OUT_LSI = 4,
CLK_OUT_SYSCLK = 5,
CLK_OUT_AHB = 6,
CLK_OUT_APB1 = 7,
CLK_OUT_APB2 = 8,
CLK_OUT_FSHC = 9,
CLK_OUT_USB = 10,
};
/*
* MACROS DECLARATION
****************************************************************************************
*/
#include "reg_csc.h"
/// CSC peripheral function enable @see CSC_OUTPUT_CTRL_TypeDef & CSC_INPUT_CTRL_TypeDef
#define CSC_FEN_BIT (1UL << 7) /* Note Diff*/
#define CSC_EN(fsel) ((fsel) | CSC_FEN_BIT)
/**
****************************************************************************************
* @brief Base IO Mode Control
*
* @param[in] pad Index of pad used @see enum pad_idx
* @param[in] ctrl value of mode @see enum iom_bfs
*
****************************************************************************************
*/
#define iom_ctrl(pad, ctrl) CSC->CSC_PIO[pad].Word = ctrl
/**
****************************************************************************************
* @brief Base CSC Input Connect
*
* @param[in] pad Index of pad used @see enum pad_idx
* @param[in] fsel value of func @see enum csc_fsel -I
*
****************************************************************************************
*/
#define csc_input(pad, fsel) CSC->CSC_INPUT[fsel].Word = CSC_EN(pad)
/**
****************************************************************************************
* @brief Base CSC Output Connect
*
* @param[in] pad Index of pad used @see enum pad_idx
* @param[in] fsel value of func @see enum csc_fsel -O
*
****************************************************************************************
*/
#define csc_output(pad, fsel) CSC->CSC_OUTPUT[pad].Word = CSC_EN(fsel)
/*
* FUNCTION DECLARATION
****************************************************************************************
*/
/**
****************************************************************************************
* @brief Composite CSC for UART Txd and Rxd
*
* @param[in] port uart port(0-UART1, 1-UART2)
* @param[in] pad_tx pad used for uart txd @see enum pad_idx
* @param[in] pad_rx pad used for uart rxd @see enum pad_idx
*
****************************************************************************************
*/
void iocsc_uart(uint8_t port, uint8_t pad_tx, uint8_t pad_rx);
/**
****************************************************************************************
* @brief Composite CSC for UART HW Flow-Control
*
* @param[in] port uart port(0-UART1, 1-UART2)
* @param[in] pad_rts pad used for uart rts @see enum pad_idx
* @param[in] pad_cts pad used for uart cts @see enum pad_idx
*
****************************************************************************************
*/
void iocsc_uart_hwfc(uint8_t port, uint8_t pad_rts, uint8_t pad_cts);
/**
****************************************************************************************
* @brief Composite CSC for I2C
*
* @param[in] pad_scl pad used for I2C scl @see enum pad_idx
* @param[in] pad_sda pad used for I2C sda @see enum pad_idx
*
****************************************************************************************
*/
void iocsc_i2c(uint8_t pad_scl, uint8_t pad_sda);
/**
****************************************************************************************
* @brief Composite CSC for SPI Master Role
*
* @param[in] pad_clk pad used for SPI clk @see enum pad_idx
* @param[in] pad_miso pad used for SPI miso @see enum pad_idx
* @param[in] pad_mosi pad used for SPI mosi @see enum pad_idx
*
****************************************************************************************
*/
void iocsc_spim(uint8_t pad_clk, uint8_t pad_miso, uint8_t pad_mosi);
/**
****************************************************************************************
* @brief Composite CSC for SPI Slave Role
*
* @param[in] pad_cs pad used for SPI cs @see enum pad_idx
* @param[in] pad_clk pad used for SPI clk @see enum pad_idx
* @param[in] pad_miso pad used for SPI miso @see enum pad_idx
* @param[in] pad_mosi pad used for SPI mosi @see enum pad_idx
*
****************************************************************************************
*/
void iocsc_spis(uint8_t pad_cs, uint8_t pad_clk, uint8_t pad_miso, uint8_t pad_mosi);
/**
****************************************************************************************
* @brief Composite CSC for CTMR PWM/PWC channel
*
* @param[in] pad_ch1 pad used for CTMR CH1 @see enum pad_idx
* @param[in] pad_ch2 pad used for CTMR CH2 @see enum pad_idx
*
****************************************************************************************
*/
void iocsc_ctmr_chnl(uint8_t pad_ch1, uint8_t pad_ch2);
/**
****************************************************************************************
* @brief Analog observe via pad
*
* @param[in] pad pad used for observe @see enum pad_idx
* @param[in] fsel Func of analog @see enum csc_fsel (17~24)
*
****************************************************************************************
*/
void iocsc_observe(uint8_t pad, uint8_t fsel);
/**
****************************************************************************************
* @brief Special Clock output via PA05(Fixed)
*
* @param[in] clk Type of Clock Out @see enum clk_out
*
****************************************************************************************
*/
void iospc_clkout(uint8_t clk);
/**
****************************************************************************************
* @brief Special USB DP/DM via PA06 PA07(Fixed, HiZ mode)
*
****************************************************************************************
*/
void iospc_usbpin(void);
/**
****************************************************************************************
* @brief Special SWCLK SWDIO via PA00 PA01(Fixed, default)
*
****************************************************************************************
*/
void iospc_swdpin(void);
/**
****************************************************************************************
* @brief Special nRESET via PA19(Fixed, default)
*
* @param[in] as_gpio true as GPIO, false as nRESET
*
****************************************************************************************
*/
void iospc_rstpin(bool as_gpio);
// Macro for Deprecated Functions {
#define ioSelUartTxRx iocsc_uart
#define ioSelUartRtsCts iocsc_uart_hwfc
#define ioSelI2c iocsc_i2c
#define ioSelSpiMaster iocsc_spim
#define ioSelSpiSlave iocsc_spis
#define ioClkOut(clk) iospc_clkout(clk)
#define ioOscen(pad) iocsc_observe(pad, CSC_OSCEN_FLAG)
#define ioRFen(pad) iocsc_observe(pad, CSC_RFEN_FLAG)
#define ioCoreSleep(pad) iocsc_observe(pad, CSC_CM0P_DEEPSLEEP)
#define ioBleSleep(pad) iocsc_observe(pad, CSC_BLE_SLEEP_FLAG)
#define ioBleTxRx(pad_tx, pad_rx) do{iocsc_observe(pad_tx, CSC_BB_TX_EN);iocsc_observe(pad_rx, CSC_BB_RX_EN);}while(0)
#define ioModemTxRx(pad_tx, pad_rx) do{iocsc_observe(pad_tx, CSC_MDM_TX_EN);iocsc_observe(pad_rx, CSC_MDM_RX_EN);}while(0)
// }
#endif // _IOPAD_H_