|
@@ -0,0 +1,286 @@
|
|
|
|
+ MFP Configuration for PXA2xx/PXA3xx Processors
|
|
|
|
+
|
|
|
|
+ Eric Miao <eric.miao@marvell.com>
|
|
|
|
+
|
|
|
|
+MFP stands for Multi-Function Pin, which is the pin-mux logic on PXA3xx and
|
|
|
|
+later PXA series processors. This document describes the existing MFP API,
|
|
|
|
+and how board/platform driver authors could make use of it.
|
|
|
|
+
|
|
|
|
+ Basic Concept
|
|
|
|
+===============
|
|
|
|
+
|
|
|
|
+Unlike the GPIO alternate function settings on PXA25x and PXA27x, a new MFP
|
|
|
|
+mechanism is introduced from PXA3xx to completely move the pin-mux functions
|
|
|
|
+out of the GPIO controller. In addition to pin-mux configurations, the MFP
|
|
|
|
+also controls the low power state, driving strength, pull-up/down and event
|
|
|
|
+detection of each pin. Below is a diagram of internal connections between
|
|
|
|
+the MFP logic and the remaining SoC peripherals:
|
|
|
|
+
|
|
|
|
+ +--------+
|
|
|
|
+ | |--(GPIO19)--+
|
|
|
|
+ | GPIO | |
|
|
|
|
+ | |--(GPIO...) |
|
|
|
|
+ +--------+ |
|
|
|
|
+ | +---------+
|
|
|
|
+ +--------+ +------>| |
|
|
|
|
+ | PWM2 |--(PWM_OUT)-------->| MFP |
|
|
|
|
+ +--------+ +------>| |-------> to external PAD
|
|
|
|
+ | +---->| |
|
|
|
|
+ +--------+ | | +-->| |
|
|
|
|
+ | SSP2 |---(TXD)----+ | | +---------+
|
|
|
|
+ +--------+ | |
|
|
|
|
+ | |
|
|
|
|
+ +--------+ | |
|
|
|
|
+ | Keypad |--(MKOUT4)----+ |
|
|
|
|
+ +--------+ |
|
|
|
|
+ |
|
|
|
|
+ +--------+ |
|
|
|
|
+ | UART2 |---(TXD)--------+
|
|
|
|
+ +--------+
|
|
|
|
+
|
|
|
|
+NOTE: the external pad is named as MFP_PIN_GPIO19, it doesn't necessarily
|
|
|
|
+mean it's dedicated for GPIO19, only as a hint that internally this pin
|
|
|
|
+can be routed from GPIO19 of the GPIO controller.
|
|
|
|
+
|
|
|
|
+To better understand the change from PXA25x/PXA27x GPIO alternate function
|
|
|
|
+to this new MFP mechanism, here are several key points:
|
|
|
|
+
|
|
|
|
+ 1. GPIO controller on PXA3xx is now a dedicated controller, same as other
|
|
|
|
+ internal controllers like PWM, SSP and UART, with 128 internal signals
|
|
|
|
+ which can be routed to external through one or more MFPs (e.g. GPIO<0>
|
|
|
|
+ can be routed through either MFP_PIN_GPIO0 as well as MFP_PIN_GPIO0_2,
|
|
|
|
+ see arch/arm/mach-pxa/mach/include/mfp-pxa300.h)
|
|
|
|
+
|
|
|
|
+ 2. Alternate function configuration is removed from this GPIO controller,
|
|
|
|
+ the remaining functions are pure GPIO-specific, i.e.
|
|
|
|
+
|
|
|
|
+ - GPIO signal level control
|
|
|
|
+ - GPIO direction control
|
|
|
|
+ - GPIO level change detection
|
|
|
|
+
|
|
|
|
+ 3. Low power state for each pin is now controlled by MFP, this means the
|
|
|
|
+ PGSRx registers on PXA2xx are now useless on PXA3xx
|
|
|
|
+
|
|
|
|
+ 4. Wakeup detection is now controlled by MFP, PWER does not control the
|
|
|
|
+ wakeup from GPIO(s) any more, depending on the sleeping state, ADxER
|
|
|
|
+ (as defined in pxa3xx-regs.h) controls the wakeup from MFP
|
|
|
|
+
|
|
|
|
+NOTE: with such a clear separation of MFP and GPIO, by GPIO<xx> we normally
|
|
|
|
+mean it is a GPIO signal, and by MFP<xxx> or pin xxx, we mean a physical
|
|
|
|
+pad (or ball).
|
|
|
|
+
|
|
|
|
+ MFP API Usage
|
|
|
|
+===============
|
|
|
|
+
|
|
|
|
+For board code writers, here are some guidelines:
|
|
|
|
+
|
|
|
|
+1. include ONE of the following header files in your <board>.c:
|
|
|
|
+
|
|
|
|
+ - #include <mach/mfp-pxa25x.h>
|
|
|
|
+ - #include <mach/mfp-pxa27x.h>
|
|
|
|
+ - #include <mach/mfp-pxa300.h>
|
|
|
|
+ - #include <mach/mfp-pxa320.h>
|
|
|
|
+ - #include <mach/mfp-pxa930.h>
|
|
|
|
+
|
|
|
|
+ NOTE: only one file in your <board>.c, depending on the processors used,
|
|
|
|
+ because pin configuration definitions may conflict in these file (i.e.
|
|
|
|
+ same name, different meaning and settings on different processors). E.g.
|
|
|
|
+ for zylonite platform, which support both PXA300/PXA310 and PXA320, two
|
|
|
|
+ separate files are introduced: zylonite_pxa300.c and zylonite_pxa320.c
|
|
|
|
+ (in addition to handle MFP configuration differences, they also handle
|
|
|
|
+ the other differences between the two combinations).
|
|
|
|
+
|
|
|
|
+ NOTE: PXA300 and PXA310 are almost identical in pin configurations (with
|
|
|
|
+ PXA310 supporting some additional ones), thus the difference is actually
|
|
|
|
+ covered in a single mfp-pxa300.h.
|
|
|
|
+
|
|
|
|
+2. prepare an array for the initial pin configurations, e.g.:
|
|
|
|
+
|
|
|
|
+ static unsigned long mainstone_pin_config[] __initdata = {
|
|
|
|
+ /* Chip Select */
|
|
|
|
+ GPIO15_nCS_1,
|
|
|
|
+
|
|
|
|
+ /* LCD - 16bpp Active TFT */
|
|
|
|
+ GPIOxx_TFT_LCD_16BPP,
|
|
|
|
+ GPIO16_PWM0_OUT, /* Backlight */
|
|
|
|
+
|
|
|
|
+ /* MMC */
|
|
|
|
+ GPIO32_MMC_CLK,
|
|
|
|
+ GPIO112_MMC_CMD,
|
|
|
|
+ GPIO92_MMC_DAT_0,
|
|
|
|
+ GPIO109_MMC_DAT_1,
|
|
|
|
+ GPIO110_MMC_DAT_2,
|
|
|
|
+ GPIO111_MMC_DAT_3,
|
|
|
|
+
|
|
|
|
+ ...
|
|
|
|
+
|
|
|
|
+ /* GPIO */
|
|
|
|
+ GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ a) once the pin configurations are passed to pxa{2xx,3xx}_mfp_config(),
|
|
|
|
+ and written to the actual registers, they are useless and may discard,
|
|
|
|
+ adding '__initdata' will help save some additional bytes here.
|
|
|
|
+
|
|
|
|
+ b) when there is only one possible pin configurations for a component,
|
|
|
|
+ some simplified definitions can be used, e.g. GPIOxx_TFT_LCD_16BPP on
|
|
|
|
+ PXA25x and PXA27x processors
|
|
|
|
+
|
|
|
|
+ c) if by board design, a pin can be configured to wake up the system
|
|
|
|
+ from low power state, it can be 'OR'ed with any of:
|
|
|
|
+
|
|
|
|
+ WAKEUP_ON_EDGE_BOTH
|
|
|
|
+ WAKEUP_ON_EDGE_RISE
|
|
|
|
+ WAKEUP_ON_EDGE_FALL
|
|
|
|
+ WAKEUP_ON_LEVEL_HIGH - specifically for enabling of keypad GPIOs,
|
|
|
|
+
|
|
|
|
+ to indicate that this pin has the capability of wake-up the system,
|
|
|
|
+ and on which edge(s). This, however, doesn't necessarily mean the
|
|
|
|
+ pin _will_ wakeup the system, it will only when set_irq_wake() is
|
|
|
|
+ invoked with the corresponding GPIO IRQ (GPIO_IRQ(xx) or gpio_to_irq())
|
|
|
|
+ and eventually calls gpio_set_wake() for the actual register setting.
|
|
|
|
+
|
|
|
|
+ d) although PXA3xx MFP supports edge detection on each pin, the
|
|
|
|
+ internal logic will only wakeup the system when those specific bits
|
|
|
|
+ in ADxER registers are set, which can be well mapped to the
|
|
|
|
+ corresponding peripheral, thus set_irq_wake() can be called with
|
|
|
|
+ the peripheral IRQ to enable the wakeup.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ MFP on PXA3xx
|
|
|
|
+===============
|
|
|
|
+
|
|
|
|
+Every external I/O pad on PXA3xx (excluding those for special purpose) has
|
|
|
|
+one MFP logic associated, and is controlled by one MFP register (MFPR).
|
|
|
|
+
|
|
|
|
+The MFPR has the following bit definitions (for PXA300/PXA310/PXA320):
|
|
|
|
+
|
|
|
|
+ 31 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
|
|
+ +-------------------------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
|
|
+ | RESERVED |PS|PU|PD| DRIVE |SS|SD|SO|EC|EF|ER|--| AF_SEL |
|
|
|
|
+ +-------------------------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
|
|
+
|
|
|
|
+ Bit 3: RESERVED
|
|
|
|
+ Bit 4: EDGE_RISE_EN - enable detection of rising edge on this pin
|
|
|
|
+ Bit 5: EDGE_FALL_EN - enable detection of falling edge on this pin
|
|
|
|
+ Bit 6: EDGE_CLEAR - disable edge detection on this pin
|
|
|
|
+ Bit 7: SLEEP_OE_N - enable outputs during low power modes
|
|
|
|
+ Bit 8: SLEEP_DATA - output data on the pin during low power modes
|
|
|
|
+ Bit 9: SLEEP_SEL - selection control for low power modes signals
|
|
|
|
+ Bit 13: PULLDOWN_EN - enable the internal pull-down resistor on this pin
|
|
|
|
+ Bit 14: PULLUP_EN - enable the internal pull-up resistor on this pin
|
|
|
|
+ Bit 15: PULL_SEL - pull state controlled by selected alternate function
|
|
|
|
+ (0) or by PULL{UP,DOWN}_EN bits (1)
|
|
|
|
+
|
|
|
|
+ Bit 0 - 2: AF_SEL - alternate function selection, 8 possibilities, from 0-7
|
|
|
|
+ Bit 10-12: DRIVE - drive strength and slew rate
|
|
|
|
+ 0b000 - fast 1mA
|
|
|
|
+ 0b001 - fast 2mA
|
|
|
|
+ 0b002 - fast 3mA
|
|
|
|
+ 0b003 - fast 4mA
|
|
|
|
+ 0b004 - slow 6mA
|
|
|
|
+ 0b005 - fast 6mA
|
|
|
|
+ 0b006 - slow 10mA
|
|
|
|
+ 0b007 - fast 10mA
|
|
|
|
+
|
|
|
|
+ MFP Design for PXA2xx/PXA3xx
|
|
|
|
+==============================
|
|
|
|
+
|
|
|
|
+Due to the difference of pin-mux handling between PXA2xx and PXA3xx, a unified
|
|
|
|
+MFP API is introduced to cover both series of processors.
|
|
|
|
+
|
|
|
|
+The basic idea of this design is to introduce definitions for all possible pin
|
|
|
|
+configurations, these definitions are processor and platform independent, and
|
|
|
|
+the actual API invoked to convert these definitions into register settings and
|
|
|
|
+make them effective there-after.
|
|
|
|
+
|
|
|
|
+ Files Involved
|
|
|
|
+ --------------
|
|
|
|
+
|
|
|
|
+ - arch/arm/mach-pxa/include/mach/mfp.h
|
|
|
|
+
|
|
|
|
+ for
|
|
|
|
+ 1. Unified pin definitions - enum constants for all configurable pins
|
|
|
|
+ 2. processor-neutral bit definitions for a possible MFP configuration
|
|
|
|
+
|
|
|
|
+ - arch/arm/mach-pxa/include/mach/mfp-pxa3xx.h
|
|
|
|
+
|
|
|
|
+ for PXA3xx specific MFPR register bit definitions and PXA3xx common pin
|
|
|
|
+ configurations
|
|
|
|
+
|
|
|
|
+ - arch/arm/mach-pxa/include/mach/mfp-pxa2xx.h
|
|
|
|
+
|
|
|
|
+ for PXA2xx specific definitions and PXA25x/PXA27x common pin configurations
|
|
|
|
+
|
|
|
|
+ - arch/arm/mach-pxa/include/mach/mfp-pxa25x.h
|
|
|
|
+ arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
|
|
|
|
+ arch/arm/mach-pxa/include/mach/mfp-pxa300.h
|
|
|
|
+ arch/arm/mach-pxa/include/mach/mfp-pxa320.h
|
|
|
|
+ arch/arm/mach-pxa/include/mach/mfp-pxa930.h
|
|
|
|
+
|
|
|
|
+ for processor specific definitions
|
|
|
|
+
|
|
|
|
+ - arch/arm/mach-pxa/mfp-pxa3xx.c
|
|
|
|
+ - arch/arm/mach-pxa/mfp-pxa2xx.c
|
|
|
|
+
|
|
|
|
+ for implementation of the pin configuration to take effect for the actual
|
|
|
|
+ processor.
|
|
|
|
+
|
|
|
|
+ Pin Configuration
|
|
|
|
+ -----------------
|
|
|
|
+
|
|
|
|
+ The following comments are copied from mfp.h (see the actual source code
|
|
|
|
+ for most updated info)
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * a possible MFP configuration is represented by a 32-bit integer
|
|
|
|
+ *
|
|
|
|
+ * bit 0.. 9 - MFP Pin Number (1024 Pins Maximum)
|
|
|
|
+ * bit 10..12 - Alternate Function Selection
|
|
|
|
+ * bit 13..15 - Drive Strength
|
|
|
|
+ * bit 16..18 - Low Power Mode State
|
|
|
|
+ * bit 19..20 - Low Power Mode Edge Detection
|
|
|
|
+ * bit 21..22 - Run Mode Pull State
|
|
|
|
+ *
|
|
|
|
+ * to facilitate the definition, the following macros are provided
|
|
|
|
+ *
|
|
|
|
+ * MFP_CFG_DEFAULT - default MFP configuration value, with
|
|
|
|
+ * alternate function = 0,
|
|
|
|
+ * drive strength = fast 3mA (MFP_DS03X)
|
|
|
|
+ * low power mode = default
|
|
|
|
+ * edge detection = none
|
|
|
|
+ *
|
|
|
|
+ * MFP_CFG - default MFPR value with alternate function
|
|
|
|
+ * MFP_CFG_DRV - default MFPR value with alternate function and
|
|
|
|
+ * pin drive strength
|
|
|
|
+ * MFP_CFG_LPM - default MFPR value with alternate function and
|
|
|
|
+ * low power mode
|
|
|
|
+ * MFP_CFG_X - default MFPR value with alternate function,
|
|
|
|
+ * pin drive strength and low power mode
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ Examples of pin configurations are:
|
|
|
|
+
|
|
|
|
+ #define GPIO94_SSP3_RXD MFP_CFG_X(GPIO94, AF1, DS08X, FLOAT)
|
|
|
|
+
|
|
|
|
+ which reads GPIO94 can be configured as SSP3_RXD, with alternate function
|
|
|
|
+ selection of 1, driving strength of 0b101, and a float state in low power
|
|
|
|
+ modes.
|
|
|
|
+
|
|
|
|
+ NOTE: this is the default setting of this pin being configured as SSP3_RXD
|
|
|
|
+ which can be modified a bit in board code, though it is not recommended to
|
|
|
|
+ do so, simply because this default setting is usually carefully encoded,
|
|
|
|
+ and is supposed to work in most cases.
|
|
|
|
+
|
|
|
|
+ Register Settings
|
|
|
|
+ -----------------
|
|
|
|
+
|
|
|
|
+ Register settings on PXA3xx for a pin configuration is actually very
|
|
|
|
+ straight-forward, most bits can be converted directly into MFPR value
|
|
|
|
+ in a easier way. Two sets of MFPR values are calculated: the run-time
|
|
|
|
+ ones and the low power mode ones, to allow different settings.
|
|
|
|
+
|
|
|
|
+ The conversion from a generic pin configuration to the actual register
|
|
|
|
+ settings on PXA2xx is a bit complicated: many registers are involved,
|
|
|
|
+ including GAFRx, GPDRx, PGSRx, PWER, PKWR, PFER and PRER. Please see
|
|
|
|
+ mfp-pxa2xx.c for how the conversion is made.
|