zephyr/boards/arc/em_starterkit/pmodmux.c

157 lines
5.0 KiB
C

/*
* Copyright (c) 2018 Synopsys
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <soc.h>
#include <init.h>
#define PMODMUX_BASE_ADDR 0xF0000000
/*
* 32-bits, offset 0x0, This register controls mapping of the peripheral device
* signals on Pmod connectors
*/
#define PMOD_MUX_CTRL 0
/* 32-bits, offset 0x4 */
#define I2C_MAP_CTRL 1
/*
* 32-bits, offset 0x8, SPI_MAP_CTRL[0] selects the mode of operation of the SPI
* Slave: Normal operation, SPI_MAP_CTRL[0]=0: SPI Slave is connected to Pmod1
* at connector J1. Loop-back mode, SPI_MAP_CTRL[0]=1: SPI Slave is connected to
* the SPI Master inside the FPGA using CS4.
*/
#define SPI_MAP_CTRL 2
/*
* 32-bits, offset 0x8, This register controls the mapping of the UART signals
* on the Pmod1 connector.
*/
#define UART_MAP_CTRL 3
#define BIT0 (0)
#define BIT1 (1)
#define BIT2 (2)
#define BIT3 (3)
#define PM1_OFFSET (0)
#define PM2_OFFSET (4)
#define PM3_OFFSET (8)
#define PM4_OFFSET (12)
#define PM5_OFFSET (16)
#define PM6_OFFSET (20)
#define PM7_OFFSET (24)
#define PM1_MASK (0xf << PM1_OFFSET)
#define PM2_MASK (0xf << PM2_OFFSET)
#define PM3_MASK (0xf << PM3_OFFSET)
#define PM4_MASK (0xf << PM4_OFFSET)
#define PM5_MASK (0xf << PM5_OFFSET)
#define PM6_MASK (0xf << PM6_OFFSET)
#define PM7_MASK (0xf << PM7_OFFSET)
#define SPI_MAP_NORMAL (0)
#define SPI_MAP_LOOPBACK (1)
#define UART_MAP_TYPE4 (0xE4)
#define UART_MAP_TYPE3 (0x6C)
/* all pins are configured as GPIO inputs */
#define PMOD_MUX_CTRL_DEFAULT (0)
/* normal SPI mode */
#define SPI_MAP_CTRL_DEFAULT (SPI_MAP_NORMAL)
/* TYPE4 PMOD compatible */
#define UART_MAP_CTRL_DEFAULT (UART_MAP_TYPE4)
/* Pmod1[4:1] are connected to DW GPIO Port C[11:8] */
#define PM1_UR_GPIO_C ((0 << BIT0) << PM1_OFFSET)
/* Pmod1[4:1] are connected to DW UART0 signals */
#define PM1_UR_UART_0 ((1 << BIT0) << PM1_OFFSET)
/* Pmod1[10:7] are connected to DW GPIO Port A[11:8] */
#define PM1_LR_GPIO_A ((0 << BIT2) << PM1_OFFSET)
/* Pmod1[10:7] are connected to DW SPI Slave signals */
#define PM1_LR_SPI_S ((1 << BIT2) << PM1_OFFSET)
/*
* Pmod2[4:1] are connected to DW GPIO Port C[15:12],
* Pmod2[10:7] are connected to DW GPIO Port A[15:12]
*/
#define PM2_GPIO_AC ((0 << BIT0) << PM2_OFFSET)
/* connect I2C to Pmod2[4:1] and halt/run interface to Pmod2[10:7] */
#define PM2_I2C_HRI ((1 << BIT0) << PM2_OFFSET)
/*
* Pmod3[4:1] are connected to DW GPIO Port C[19:16],
* Pmod3[10:7] are connected to DW GPIO Port A[19:16]
*/
#define PM3_GPIO_AC ((0 << BIT0) << PM3_OFFSET)
/*
* Pmod3[4:3] are connected to DW I2C signals,
* Pmod3[2:1] are connected to DW GPIO Port D[1:0],
* Pmod3[10:7] are connected to DW GPIO Port D[3:2]
*/
#define PM3_I2C_GPIO_D ((1 << BIT0) << PM3_OFFSET)
/*
* Pmod4[4:1] are connected to DW GPIO Port C[23:20],
* Pmod4[10:7] are connected to DW GPIO Port A[23:20]
*/
#define PM4_GPIO_AC ((0 << BIT0) << PM4_OFFSET)
/*
* Pmod4[4:3] are connected to DW I2C signals,
* Pmod4[2:1] are connected to DW GPIO Port D[5:4],
* Pmod4[10:7] are connected to DW GPIO Port D[7:6]
*/
#define PM4_I2C_GPIO_D ((1 << BIT0) << PM4_OFFSET)
/* Pmod5[4:1] are connected to DW GPIO Port C[27:24] */
#define PM5_UR_GPIO_C ((0 << BIT0) << PM5_OFFSET)
/* Pmod5[4:1] are connected to DW SPI Master signals using CS1_N */
#define PM5_UR_SPI_M1 ((1 << BIT0) << PM5_OFFSET)
/* Pmod5[10:7] are connected to DW GPIO Port A[27:24] */
#define PM5_LR_GPIO_A ((0 << BIT2) << PM5_OFFSET)
/* Pmod5[10:7] are connected to DW SPI Master signals using CS2_N */
#define PM5_LR_SPI_M2 ((1 << BIT2) << PM5_OFFSET)
/* Pmod6[4:1] are connected to DW GPIO Port C[31:28] */
#define PM6_UR_GPIO_C ((0 << BIT0) << PM6_OFFSET)
/* Pmod6[4:1] are connected to DW SPI Master signals using CS0_N */
#define PM6_UR_SPI_M0 ((1 << BIT0) << PM6_OFFSET)
/* Pmod6[10:7] are connected to DW GPIO Port A[31:28] */
#define PM6_LR_GPIO_A ((0 << BIT2) << PM6_OFFSET)
/*
* Pmod6[8:7] are connected to the DW SPI Master chip select signals CS1_N and
* CS2_N, Pmod6[6:5] are connected to the ARC EM halt and sleep status signals
*/
#define PM6_LR_CSS_STAT ((1 << BIT2) << PM6_OFFSET)
static int pmod_mux_init(const struct device *dev)
{
volatile uint32_t *mux_regs = (uint32_t *)(PMODMUX_BASE_ADDR);
mux_regs[SPI_MAP_CTRL] = SPI_MAP_CTRL_DEFAULT;
mux_regs[UART_MAP_CTRL] = UART_MAP_CTRL_DEFAULT;
/**
* + Please refer to corresponding EMSK User Guide for detailed
* information -> Appendix: A Hardware Functional Description ->
* Pmods Configuration summary
* + Set up pin-multiplexer of all PMOD connections
* - PM1 J1: Upper row as UART 0, lower row as SPI Slave
* - PM2 J2: IIC 0 and run/halt signals
* - PM3 J3: GPIO Port A and Port C
* - PM4 J4: IIC 1 and Port D
* - PM5 J5: Upper row as SPI Master, lower row as Port A
* - PM6 J6: Upper row as SPI Master, lower row as Port A
*/
mux_regs[PMOD_MUX_CTRL] = PM1_UR_UART_0 | PM1_LR_SPI_S
| PM2_I2C_HRI | PM3_GPIO_AC
| PM4_I2C_GPIO_D | PM5_UR_SPI_M1
| PM5_LR_GPIO_A | PM6_UR_SPI_M0
| PM6_LR_GPIO_A;
return 0;
}
SYS_INIT(pmod_mux_init, PRE_KERNEL_1,
CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);