175 lines
6.5 KiB
Go
175 lines
6.5 KiB
Go
// Copyright 2016 The Periph Authors. All rights reserved.
|
|
// Use of this source code is governed under the Apache License, Version 2.0
|
|
// that can be found in the LICENSE file.
|
|
|
|
// This file contains pin mapping information that is specific to the Allwinner
|
|
// A64 model.
|
|
|
|
package allwinner
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"periph.io/x/periph/conn/pin"
|
|
"periph.io/x/periph/host/sysfs"
|
|
)
|
|
|
|
// A64 specific pins.
|
|
var (
|
|
X32KFOUT *pin.BasicPin // Clock output of 32Khz crystal
|
|
KEY_ADC *pin.BasicPin // 6 bits resolution ADC for key application; can work up to 250Hz conversion rate; reference voltage is 2.0V
|
|
EAROUTP *pin.BasicPin // Earpiece amplifier negative differential output
|
|
EAROUTN *pin.BasicPin // Earpiece amplifier positive differential output
|
|
)
|
|
|
|
//
|
|
|
|
func init() {
|
|
X32KFOUT = &pin.BasicPin{N: "X32KFOUT"}
|
|
// BUG(maruel): These need to be converted to an analog.PinIO implementation
|
|
// once analog support is implemented.
|
|
KEY_ADC = &pin.BasicPin{N: "KEY_ADC"}
|
|
EAROUTP = &pin.BasicPin{N: "EAROUTP"}
|
|
EAROUTN = &pin.BasicPin{N: "EAROUTN"}
|
|
}
|
|
|
|
// mappingA64 describes the mapping of the A64 processor gpios to their
|
|
// alternate functions.
|
|
//
|
|
// It omits the in & out functions which are available on all gpio.
|
|
//
|
|
// The mapping comes from the datasheet page 23:
|
|
// http://files.pine64.org/doc/datasheet/pine64/A64_Datasheet_V1.1.pdf
|
|
//
|
|
// - The datasheet uses TWI instead of I2C but it is renamed here for
|
|
// consistency.
|
|
// - AIF is an audio interface, i.e. to connect to S/PDIF.
|
|
// - RGMII means Reduced gigabit media-independent interface.
|
|
// - SDC means SDCard?
|
|
// - NAND connects to a NAND flash controller.
|
|
// - CSI and CCI are for video capture.
|
|
var mappingA64 = map[string][5]pin.Func{
|
|
"PB0": {"UART2_TX", "", "JTAG0_TMS", "", "PB_EINT0"},
|
|
"PB1": {"UART2_RX", "", "JTAG0_TCK", "SIM_PWREN", "PB_EINT1"},
|
|
"PB2": {"UART2_RTS", "", "JTAG0_TDO", "SIM_VPPEN", "PB_EINT2"},
|
|
"PB3": {"UART2_CTS", "I2S0_MCLK", "JTAG0_TDI", "SIM_VPPPP", "PB_EINT3"},
|
|
"PB4": {"AIF2_SYNC", "I2S0_WS", "", "SIM_CLK", "PB_EINT4"},
|
|
"PB5": {"AIF2_BCLK", "I2S0_SCK", "", "SIM_DATA", "PB_EINT5"},
|
|
"PB6": {"AIF2_DOUT", "I2S0_DOUT", "", "SIM_RST", "PB_EINT6"},
|
|
"PB7": {"AIF2_DIN", "I2S0_DIN", "", "SIM_DET", "PB_EINT7"},
|
|
"PB8": {"", "", "UART0_TX", "", "PB_EINT8"},
|
|
"PB9": {"", "", "UART0_RX", "", "PB_EINT9"},
|
|
"PC0": {"NAND_WE", "", "SPI0_MOSI"},
|
|
"PC1": {"NAND_ALE", "SDC2_DS", "SPI0_MISO"},
|
|
"PC2": {"NAND_CLE", "", "SPI0_CLK"},
|
|
"PC3": {"NAND_CE1", "", "SPI0_CS0"},
|
|
"PC4": {"NAND_CE0"},
|
|
"PC5": {"NAND_RE", "SDC2_CLK"},
|
|
"PC6": {"NAND_RB0", "SDC2_CMD"},
|
|
"PC7": {"NAND_RB1"},
|
|
"PC8": {"NAND_DQ0", "SDC2_D0"},
|
|
"PC9": {"NAND_DQ1", "SDC2_D1"},
|
|
"PC10": {"NAND_DQ2", "SDC2_D2"},
|
|
"PC11": {"NAND_DQ3", "SDC2_D3"},
|
|
"PC12": {"NAND_DQ4", "SDC2_D4"},
|
|
"PC13": {"NAND_DQ5", "SDC2_D5"},
|
|
"PC14": {"NAND_DQ6", "SDC2_D6"},
|
|
"PC15": {"NAND_DQ7", "SDC2_D7"},
|
|
"PC16": {"NAND_DQS", "SDC2_RST"},
|
|
"PD0": {"LCD_D2", "UART3_TX", "SPI1_CS0", "CCIR_CLK"},
|
|
"PD1": {"LCD_D3", "UART3_RX", "SPI1_CLK", "CCIR_DE"},
|
|
"PD2": {"LCD_D4", "UART4_TX", "SPI1_MOSI", "CCIR_HSYNC"},
|
|
"PD3": {"LCD_D5", "UART4_RX", "SPI1_MISO", "CCIR_VSYNC"},
|
|
"PD4": {"LCD_D6", "UART4_RTS", "", "CCIR_D0"},
|
|
"PD5": {"LCD_D7", "UART4_CTS", "", "CCIR_D1"},
|
|
"PD6": {"LCD_D10", "", "", "CCIR_D2"},
|
|
"PD7": {"LCD_D11", "", "", "CCIR_D3"},
|
|
"PD8": {"LCD_D12", "", "RGMII_RXD3", "CCIR_D4"},
|
|
"PD9": {"LCD_D13", "", "RGMII_RXD2", "CCIR_D5"},
|
|
"PD10": {"LCD_D14", "", "RGMII_RXD1"},
|
|
"PD11": {"LCD_D15", "", "RGMII_RXD0"},
|
|
"PD12": {"LCD_D18", "LVDS_VP0", "RGMII_RXCK"},
|
|
"PD13": {"LCD_D19", "LVDS_VN0", "RGMII_RXCT"},
|
|
"PD14": {"LCD_D20", "LVDS_VP1", "RGMII_RXER"},
|
|
"PD15": {"LCD_D21", "LVDS_VN1", "RGMII_TXD3", "CCIR_D6"},
|
|
"PD16": {"LCD_D22", "LVDS_VP2", "RGMII_TXD2", "CCIR_D7"},
|
|
"PD17": {"LCD_D23", "LVDS_VN2", "RGMII_TXD1"},
|
|
"PD18": {"LCD_CLK", "LVDS_VPC", "RGMII_TXD0"},
|
|
"PD19": {"LCD_DE", "LVDS_VNC", "RGMII_TXCK"},
|
|
"PD20": {"LCD_HSYNC", "LVDS_VP3", "RGMII_TXCT"},
|
|
"PD21": {"LCD_VSYNC", "LVDS_VN3", "RGMII_CLKI"},
|
|
"PD22": {"PWM0", "", "MDC"},
|
|
"PD23": {"", "", "MDIO"},
|
|
"PD24": {""},
|
|
"PE0": {"CSI_PCLK", "", "TS_CLK"},
|
|
"PE1": {"CSI_MCLK", "", "TS_ERR"},
|
|
"PE2": {"CSI_HSYNC", "", "TS_SYNC"},
|
|
"PE3": {"CSI_VSYNC", "", "TS_DVLD"},
|
|
"PE4": {"CSI_D0", "", "TS_D0"},
|
|
"PE5": {"CSI_D1", "", "TS_D1"},
|
|
"PE6": {"CSI_D2", "", "TS_D2"},
|
|
"PE7": {"CSI_D3", "", "TS_D3"},
|
|
"PE8": {"CSI_D4", "", "TS_D4"},
|
|
"PE9": {"CSI_D5", "", "TS_D5"},
|
|
"PE10": {"CSI_D6", "", "TS_D6"},
|
|
"PE11": {"CSI_D7", "", "TS_D7"},
|
|
"PE12": {"CSI_SCK"},
|
|
"PE13": {"CSI_SDA"},
|
|
"PE14": {"PLL_LOCK_DBG", "I2C2_SCL"},
|
|
"PE15": {"", "I2C2_SDA"},
|
|
"PE16": {""},
|
|
"PE17": {""},
|
|
"PF0": {"SDC0_D1", "JTAG1_TMS"},
|
|
"PF1": {"SDC0_D0", "JTAG1_TDI"},
|
|
"PF2": {"SDC0_CLK", "UART0_TX"},
|
|
"PF3": {"SDC0_CMD", "JTAG1_TDO"},
|
|
"PF4": {"SDC0_D3", "UART0_RX"},
|
|
"PF5": {"SDC0_D2", "JTAG1_TCK"},
|
|
"PF6": {""},
|
|
"PG0": {"SDC1_CLK", "", "", "", "PG_EINT0"},
|
|
"PG1": {"SDC1_CMD", "", "", "", "PG_EINT1"},
|
|
"PG2": {"SDC1_D0", "", "", "", "PG_EINT2"},
|
|
"PG3": {"SDC1_D1", "", "", "", "PG_EINT3"},
|
|
"PG4": {"SDC1_D2", "", "", "", "PG_EINT4"},
|
|
"PG5": {"SDC1_D3", "", "", "", "PG_EINT5"},
|
|
"PG6": {"UART1_TX", "", "", "", "PG_EINT6"},
|
|
"PG7": {"UART1_RX", "", "", "", "PG_EINT7"},
|
|
"PG8": {"UART1_RTS", "", "", "", "PG_EINT8"},
|
|
"PG9": {"UART1_CTS", "", "", "", "PG_EINT9"},
|
|
"PG10": {"AIF3_SYNC", "I2S1_WS", "", "", "PG_EINT10"},
|
|
"PG11": {"AIF3_BCLK", "I2S1_SCK", "", "", "PG_EINT11"},
|
|
"PG12": {"AIF3_DOUT", "I2S1_DOUT", "", "", "PG_EINT12"},
|
|
"PG13": {"AIF3_DIN", "I2S1_DIN", "", "", "PG_EINT13"},
|
|
"PH0": {"I2C0_SCL", "", "", "", "PH_EINT0"},
|
|
"PH1": {"I2C0_SDA", "", "", "", "PH_EINT1"},
|
|
"PH2": {"I2C1_SCL", "", "", "", "PH_EINT2"},
|
|
"PH3": {"I2C1_SDA", "", "", "", "PH_EINT3"},
|
|
"PH4": {"UART3_TX", "", "", "", "PH_EINT4"},
|
|
"PH5": {"UART3_RX", "", "", "", "PH_EINT5"},
|
|
"PH6": {"UART3_RTS", "", "", "", "PH_EINT6"},
|
|
"PH7": {"UART3_CTS", "", "", "", "PH_EINT7"},
|
|
"PH8": {"OWA_OUT", "", "", "", "PH_EINT8"},
|
|
"PH9": {"", "", "", "", "PH_EINT9"},
|
|
"PH10": {"MIC_CLK", "", "", "", "PH_EINT10"},
|
|
"PH11": {"MIC_DATA", "", "", "", "PH_EINT11"},
|
|
}
|
|
|
|
// mapA64Pins uses mappingA64 to actually set the altFunc fields of all gpio
|
|
// and mark them as available.
|
|
//
|
|
// It is called by the generic allwinner processor code if an A64 is detected.
|
|
func mapA64Pins() error {
|
|
for name, altFuncs := range mappingA64 {
|
|
pin := cpupins[name]
|
|
pin.altFunc = altFuncs
|
|
pin.available = true
|
|
if strings.Contains(string(altFuncs[4]), "_EINT") {
|
|
pin.supportEdge = true
|
|
}
|
|
|
|
// Initializes the sysfs corresponding pin right away.
|
|
pin.sysfsPin = sysfs.Pins[pin.Number()]
|
|
}
|
|
return nil
|
|
}
|