MAX_CARLINK_A270S/MXC_A27-PCB4.5-270T/ArkmicroFiles/libcpu-amt630hv100/source/pinctrl.c

339 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "FreeRTOS.h"
#include "board.h"
#include "chip.h"
#define PINCTL_REG_BASE REGS_SYSCTL_BASE
#define MAX_PINS_PER_GROUP 32
typedef struct {
short muxio;
short pinval;
int drive;
} xPin_t;
typedef struct {
int groupid;
uint32_t mux_reg;
uint32_t mux_offset;
uint32_t mux_mask;
uint32_t mux_val;
short pins_num;
xPin_t pins[MAX_PINS_PER_GROUP];
} xPinGroup_t;
/* typedef struct {
} xPinFunction_t; */
typedef struct {
int reg;
int offset;
int mask;
} xPinmap_t;
static xPinmap_t amt630h_pin_map[] = {
{0xc0, 0, 0x3},
{0xc0, 2, 0x3},
{0xc0, 4, 0x3},
{0xc0, 6, 0x3},
{0xc0, 8, 0x3},
{0xc0, 10, 0x3},
{0xc0, 12, 0x3},
{0xc0, 14, 0x3},
{0xc0, 16, 0x3},
{0xc0, 18, 0x3},
{0xc0, 20, 0x3},
{0xc0, 22, 0x3},
{0xc0, 24, 0x3},
{0xc0, 26, 0x3},
{0xc0, 28, 0x3},
{0xc0, 30, 0x3},
{0xc4, 0, 0x3},
{0xc4, 2, 0x3},
{0xc4, 4, 0x3},
{0xc4, 6, 0x3},
{0xc4, 8, 0x3},
{0xc4, 10, 0x3},
{0xc4, 12, 0x3},
{0xc4, 14, 0x3},
{0xc4, 16, 0x3},
{0xc4, 18, 0x3},
{0xc4, 20, 0x3},
{0xc4, 22, 0x3},
{0xc4, 24, 0x3},
{0xc4, 26, 0x3},
{0xc4, 28, 0x3},
{0xc4, 30, 0x3},
{0xc8, 0, 0x3},
{0xc8, 2, 0x3},
{0xc8, 4, 0x3},
{0xc8, 6, 0x3},
{0xc8, 8, 0x3},
{0xc8, 10, 0x3},
{0xc8, 12, 0x3},
{0xc8, 14, 0x3},
{0xc8, 16, 0x3},
{0xc8, 18, 0x3},
{0xc8, 20, 0x3},
{0xc8, 22, 0x3},
{0xc8, 24, 0x3},
{0xc8, 26, 0x3},
{0xc8, 28, 0x3},
{0xc8, 30, 0x3},
{0xcc, 0, 0x3},
{0xcc, 2, 0x3},
{0xcc, 4, 0x3},
{0xcc, 6, 0x3},
{0xcc, 8, 0x3},
{0xcc, 10, 0x3},
{0xcc, 12, 0x3},
{0xcc, 14, 0x3},
{0xcc, 16, 0x3},
{0xcc, 18, 0x3},
{0xcc, 20, 0x3},
{0xcc, 22, 0x3},
{0xcc, 24, 0x3},
{0xcc, 26, 0x3},
{0xcc, 28, 0x3},
{0xcc, 30, 0x3},
{0xd0, 0, 0x3},
{0xd0, 2, 0x3},
{0xd0, 4, 0x3},
{0xd0, 6, 0x3},
{0xd0, 8, 0x3},
{0xd0, 10, 0x3},
{0xd0, 12, 0x3},
{0xd0, 14, 0x3},
{0xd0, 16, 0x3},
{0xd0, 18, 0x3},
{0xd0, 20, 0x3},
{0xd0, 22, 0x3},
{0xd0, 24, 0x3},
{0xd0, 26, 0x3},
{0xd0, 28, 0x3},
{0xd0, 30, 0x3},
{0xd4, 0, 0x3},
{0xd4, 2, 0x3},
{0xd4, 4, 0x3},
{0xd4, 6, 0x3},
{0xd4, 8, 0x3},
{0xd4, 10, 0x3},
{0xd4, 12, 0x3},
{0xd4, 14, 0x3},
{0xd4, 16, 0x3},
{0xd4, 18, 0x3},
{0xd4, 20, 0x3},
{0xd4, 22, 0x3},
{0xd4, 24, 0x3},
{0xd4, 26, 0x3},
{0xd4, 28, 0x3},
{0xd4, 30, 0x3},
{0xd8, 4, 0x3},
{0xd8, 0, 0x3},
{0xd8, 6, 0x3},
{0xd8, 2, 0x3},
{0xd8, 8, 0x3},
{0xd8, 10, 0x3},
/* pad not mux with gpio */
};
#define PIN_NUM ARRAY_SIZE(amt630h_pin_map)
static xPinGroup_t pin_groups[] = {
/* scl sda */
{.groupid = PGRP_I2C0, .pins_num = 2, .pins = {{48, 1}, {49, 1}}},
/* scl sda */
{.groupid = PGRP_I2C1, .pins_num = 2, .pins = {{50, 1}, {51, 1}}},
{.groupid = PGRP_LCD_TTL_CH0, .pins_num = 28,
/* de clk vynsc hsync */
.pins = {{88, 1}, {89, 1, PAD_DRIVE_2MA}, {90, 0}, {91, 0},
{64, 1}, {65, 1}, {66, 1}, {67, 1}, {68, 1}, {69, 1}, {70, 1}, {71, 1}, /* B0-B7 */
{72, 1}, {73, 1}, {74, 1}, {75, 1}, {76, 1}, {77, 1}, {78, 1}, {79, 1}, /* G0-G7 */
{80, 1}, {81, 1}, {82, 1}, {83, 1}, {84, 1}, {85, 1}, {86, 1}, {87, 1},}}, /* R0-R7 */
{.groupid = PGRP_LCD_TTL_CH1, .pins_num = 28,
/* de clk vynsc hsync */
.pins = {{12, 1}, {13, 1}, {14, 1}, {15, 1},
{64, 1}, {65, 1}, {66, 1}, {67, 1}, {68, 1}, {69, 1}, {70, 1}, {71, 1}, /* r0-r7 */
{72, 1}, {73, 1}, {74, 1}, {75, 1}, {84, 3}, {85, 3}, {86, 3}, {87, 3}, /* g0-g7 */
{88, 3}, {89, 3}, {90, 3}, {91, 3}, {8, 1}, {9, 1}, {10, 1}, {11, 1},}}, /* b0-b7 */
{.groupid = PGRP_LCD_LVDS, .pins_num = 10,
/* dp dn clkp clkn cp cn bp bn */
.pins = {{64, 2}, {65, 2}, {66, 2}, {67, 2}, {68, 2}, {69, 2}, {70, 2}, {71, 2},
/* ap an */
{72, 2}, {73, 2}, }},
{.groupid = PGRP_LCD_SRGB, .pins_num = 8,
.pins = {{74, 1}, {75, 1}, {76, 1}, {77, 1}, {78, 1}, {79, 1}, {80, 1}, {81, 1},}}, /* d0-d7 */
/* 由于uart0有些平台rx没有接上拉电阻需要将rx脚配置成gpio防止收到随机数据导致异常 */
{.groupid = PGRP_UART0, .pins_num = 2, .pins = {{38, 1}, {39, 1}}},
/* rx tx */
{.groupid = PGRP_UART1, .pins_num = 2, .pins = {{40, 1}, {41, 1}}},
/* rx tx */
{.groupid = PGRP_UART2, .pins_num = 2, .pins = {{42, 1}, {43, 1}}},
/* rx tx */
{.groupid = PGRP_UART3, .pins_num = 2, .pins = {{44, 1}, {45, 1}}},
/* cs clk d0 d1 d2 d3 */
{.groupid = PGRP_SPI0, .pins_num = 5, .pins = {/*{32, 1},*/ {33, 1}, {34, 1}, {35, 1}, {36, 1}, {37, 1}}},
/* cs clk txd rxd */
{.groupid = PGRP_SPI1, .pins_num = 3, .pins = {/*{23, 1},*/ {24, 1}, {25, 1}, {26, 1}}},
{.groupid = PGRP_SDMMC0, .pins_num = 7, .pins = {{16, 1}, {17, 1}, {18, 1}, {19, 1},
{20, 1}, {21, 1}, {22, 1}}},
{.groupid = PGRP_PWM0, .pins_num = 1, .pins = {{0, 1}}},
{.groupid = PGRP_PWM1, .pins_num = 1, .pins = {{1, 1}}},
{.groupid = PGRP_PWM2, .pins_num = 1, .pins = {{6, 1}}},
{.groupid = PGRP_PWM3, .pins_num = 1, .pins = {{47, 1}}},//47
{.groupid = PGRP_PWM0_IN, .pins_num = 1, .pins = {{4, 0}},//pin18 GPIO4
.mux_reg = 0x60000120, .mux_offset = 12, .mux_mask = 0x3, .mux_val = 0},
{.groupid = PGRP_PWM1_IN, .pins_num = 1, .pins = {{5, 0}},//pin19 GPIO5
.mux_reg = 0x60000120, .mux_offset = 14, .mux_mask = 0x3, .mux_val = 0},
{.groupid = PGRP_PWM2_IN, .pins_num = 1, .pins = {{6, 0}},//pin47 GPIO6
.mux_reg = 0x60000120, .mux_offset = 28, .mux_mask = 0x3, .mux_val = 0},
{.groupid = PGRP_PWM3_IN, .pins_num = 1, .pins = {{7, 0}},//pin48 GPIO7
.mux_reg = 0x60000120, .mux_offset = 30, .mux_mask = 0x3, .mux_val = 0},
{.groupid = PGRP_ITU_CH0, .pins_num = 11,
.pins = {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {96, 0}, {97, 0}, {98, 0}, {99, 0}, /* d0-d7 */
{100, 0}, {101, 0}, {0, 0}}, /* hs, vs, clk */
.mux_reg = 0x600000dc, .mux_offset = 16, .mux_mask = 0x7, .mux_val = 2},
{.groupid = PGRP_ITU_CH0_INV, .pins_num = 11,
.pins = {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {96, 0}, {97, 0}, {98, 0}, {99, 0}, /* d0-d7 */
{100, 0}, {101, 0}, {0, 0}}, /* hs, vs, clk */
.mux_reg = 0x600000dc, .mux_offset = 16, .mux_mask = 0x7, .mux_val = 6},
{.groupid = PGRP_ITU_CH1, .pins_num = 11,
.pins = {{8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}, /* d0-d7 */
{59, 0}, {60, 0}, {61, 0}}, /* hs, vs, clk */
.mux_reg = 0x600000dc, .mux_offset = 16, .mux_mask = 0x7, .mux_val = 3},
{.groupid = PGRP_ITU_CH1_INV, .pins_num = 11,
.pins = {{8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}, /* d0-d7 */
{59, 0}, {60, 0}, {61, 0}}, /* hs, vs, clk */
.mux_reg = 0x600000dc, .mux_offset = 16, .mux_mask = 0x7, .mux_val = 7},
/* tx rx */
{.groupid = PGRP_CAN0_CH0, .pins_num = 2, .pins = {{0, 2}, {1, 2}},
.mux_reg = 0x600000dc, .mux_offset = 19, .mux_mask = 0x3, .mux_val = 1},
{.groupid = PGRP_CAN0_CH1, .pins_num = 2, .pins = {{12, 2}, {13, 2}},
.mux_reg = 0x600000dc, .mux_offset = 19, .mux_mask = 0x3, .mux_val = 2},
{.groupid = PGRP_CAN0_CH2, .pins_num = 2, .pins = {{96, 2}, {97, 2}},
.mux_reg = 0x600000dc, .mux_offset = 19, .mux_mask = 0x3, .mux_val = 3},
{.groupid = PGRP_CAN1_CH0, .pins_num = 2, .pins = {{2, 2}, {3, 2}},
.mux_reg = 0x600000dc, .mux_offset = 21, .mux_mask = 0x3, .mux_val = 1},
{.groupid = PGRP_CAN1_CH1, .pins_num = 2, .pins = {{14, 2}, {15, 2}},
.mux_reg = 0x600000dc, .mux_offset = 21, .mux_mask = 0x3, .mux_val = 2},
{.groupid = PGRP_CAN1_CH2, .pins_num = 2, .pins = {{98, 2}, {99, 2}},
.mux_reg = 0x600000dc, .mux_offset = 21, .mux_mask = 0x3, .mux_val = 3},
{.groupid = PGRP_I2S0_PLAY, .pins_num = 4, .pins = {{52, 1, PAD_DRIVE_2MA}, {54, 1, PAD_DRIVE_2MA}, {55, 1, PAD_DRIVE_2MA}, {56, 1, PAD_DRIVE_2MA}}},
{.groupid = PGRP_I2S0_RECORD, .pins_num = 4, .pins = {{52, 1, PAD_DRIVE_2MA}, {53, 1, PAD_DRIVE_2MA}, {55, 1, PAD_DRIVE_2MA}, {56, 1, PAD_DRIVE_2MA}}},
{.groupid = PGRP_I2S1_PLAY, .pins_num = 4, .pins = {{23, 1, PAD_DRIVE_2MA}, {24, 1, PAD_DRIVE_2MA}, {25, 1, PAD_DRIVE_2MA}, {26, 1, PAD_DRIVE_2MA}},
//bit2: select i2s1 function(bit[2] 0:ssp1_interface; 1:i2s1_interface).
//bit3: i2s1 data pin output(bit[3] 0:input, 1:output).
.mux_reg = REGS_SYSCTL_BASE + SYS_PAD_CTRL08, .mux_offset = 2, .mux_mask = 0x3, .mux_val = 3},
{.groupid = PGRP_I2S1_RECORD, .pins_num = 4, .pins = {{23, 1, PAD_DRIVE_2MA}, {24, 1, PAD_DRIVE_2MA}, {25, 1, PAD_DRIVE_2MA}, {26, 1, PAD_DRIVE_2MA}},
//bit2: select i2s1 function(bit[2] 0:ssp1_interface; 1:i2s1_interface).
//bit3: i2s1 data pin input(bit[3] 0:input, 1:output).
.mux_reg = REGS_SYSCTL_BASE + SYS_PAD_CTRL08, .mux_offset = 2, .mux_mask = 0x3, .mux_val = 1},
{.groupid = PGRP_RCRT, .pins_num = 1, .pins = {{57, 1}}},
};
#define GROUP_NUM ARRAY_SIZE(pin_groups)
static __INLINE void pinctrl_set_pin(int npin, int val, int drive)
{
xPinmap_t *pctrl;
uint32_t reg;
if (npin >= PIN_NUM)
return;
pctrl = &amt630h_pin_map[npin];
reg = readl(PINCTL_REG_BASE + pctrl->reg);
reg &= ~(pctrl->mask << pctrl->offset);
reg |= val << pctrl->offset;
writel(reg, PINCTL_REG_BASE + pctrl->reg);
if (drive != PAD_DRIVE_DEFAULT) {
uint32_t drv_reg = SYS_IO_DRIVER00 + npin / 16 * 4;
uint32_t offset = (npin % 16) * 2;
uint32_t drv_val = drive - 1;
vSysctlConfigure(drv_reg, offset, 3, drv_val);
}
}
void pinctrl_gpio_request(int gpio)
{
pinctrl_set_pin(gpio, 0, PAD_DRIVE_DEFAULT);
}
void pinctrl_set_group(int groupid)
{
int i, j;
xPinGroup_t *pgrp;
uint32_t reg;
for (i = 0; i < GROUP_NUM; i++) {
pgrp = &pin_groups[i];
if (pgrp->groupid == groupid) {
configASSERT(pgrp->pins_num <= MAX_PINS_PER_GROUP);
for (j = 0; j < pgrp->pins_num; j++)
pinctrl_set_pin(pgrp->pins[j].muxio, pgrp->pins[j].pinval,
pgrp->pins[j].drive);
if (pgrp->mux_reg) {
reg = readl(pgrp->mux_reg);
reg &= ~(pgrp->mux_mask << pgrp->mux_offset);
reg |= pgrp->mux_val << pgrp->mux_offset;
writel(reg, pgrp->mux_reg);
}
break;
}
}
}
void vPinctrlSetup(void)
{
#ifdef HW_I2C0_SUPPORT
pinctrl_set_group(PGRP_I2C0);
#endif
#ifdef HW_I2C1_SUPPORT
pinctrl_set_group(PGRP_I2C1);
#endif
pinctrl_set_group(PGRP_UART0);
pinctrl_set_group(PGRP_UART2);
#ifdef PWM_CAP_SUPPORT
pinctrl_set_group(PGRP_PWM2_IN);
#endif
#if 0
/* 高速串口先初始化再配置pad脚(放在vUartInit()函数中初始化),否则在初始化过程中收到数据会导致串口出错 */
pinctrl_set_group(PGRP_UART1);
pinctrl_set_group(PGRP_UART3);
#endif
pinctrl_set_group(PGRP_SPI0);
pinctrl_set_group(PGRP_SPI1);
pinctrl_set_group(PGRP_SDMMC0);
#ifdef REMOTE_SUPPORT
pinctrl_set_group(PGRP_RCRT);
#endif
#if LCD_INTERFACE_TYPE == LCD_INTERFACE_TTL
pinctrl_set_group(PGRP_LCD_TTL_CH0);
#elif LCD_INTERFACE_TYPE == LCD_INTERFACE_LVDS
pinctrl_set_group(PGRP_LCD_LVDS);
#endif
pinctrl_set_group(PGRP_ITU_CH1_INV);
pinctrl_set_group(PGRP_CAN0_CH0);
#ifdef AUDIO_REPLAY
#if (AUDIO_REPLAY_I2S == I2S_ID1)
pinctrl_set_group(PGRP_I2S1_PLAY);
#else
pinctrl_set_group(PGRP_I2S0_PLAY);
#endif
#endif
#ifdef AUDIO_RECORD
#if (AUDIO_RECORD_I2S == I2S_ID1)
pinctrl_set_group(PGRP_I2S1_RECORD);
#else
pinctrl_set_group(PGRP_I2S0_RECORD);
#endif
#endif
pinctrl_set_group(PGRP_PWM2);
pinctrl_set_group(PGRP_PWM3);
}