caravel/docs/source/gpio.rst

389 lines
10 KiB
ReStructuredText
Executable File

.. raw:: html
<!---
# SPDX-FileCopyrightText: 2020 Efabless Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
-->
General Purpose Input/Output
============================
The GPIO pin is a single assignable general-purpose digital input or output that is available only to the management SoC and cannot be assigned to the user project area.
On the test board provided with the completed user projects, this pin is used to enable the voltage regulators generating the user area power supplies.
The basic function of the GPIO is illustrated in :ref:`gpio_structure`.
All writes to :ref:`reg_gpio_data` are registered.
All reads from :ref:`reg_gpio_data` are immediate.
.. figure:: _static/gpio.svg
:name: gpio_structure
:alt: GPIO channel structure
:align: center
GPIO channel structure
Register descriptions
~~~~~~~~~~~~~~~~~~~~~
.. list-table:: GPIO memory address map
:name: gpio_memory_address_map
:header-rows: 1
* - C header name
- Address
- Description
* - :ref:`reg_gpio_data`
- ``0x21000000``
- GPIO input/output (low bit)
GPIO output readback (16th bit)
* - :ref:`reg_gpio_ena`
- ``0x21000004``
- GPIO output enable (`0 = output`, `1 = input`)
* - :ref:`reg_gpio_pu`
- ``0x21000008``
- GPIO pullup enable (`0 = none`, `1 = pullup`)
* - :ref:`reg_gpio_pd`
- ``0x2100000c``
- GPIO pulldown enable (`0 = none`, `1 = pulldown`)
* - :ref:`reg_pll_out_dest`
- ``0x2f000000``
- PLL clock output destination (low bit)
* - :ref:`reg_trap_out_dest`
- ``0x2f000004``
- Trap output destination (low bit)
* - :ref:`reg_irq7_source`
- ``0x2f000008``
- IRQ 7 input source (low bit)
.. note::
In the registers description below, each register is shown as 32 bits corresponding
to the data bus width of the wishbone bus. Depending on the instruction and data type,
the entire 32-bit register can be read in one instruction, or one 16-bit word,
or one 8-bit byte.
.. _reg_gpio_data:
``reg_gpio_data``
-----------------
Base address: ``0x21000000``
.. wavedrom::
{ "reg": [
{"name": "GPIO input/output", "bits": 16},
{"name": "GPIO output readback", "bits": 16}]
}
|
* Writing to the address low bit always sets the registered value at the GPIO.
* Writing to address bit 16 has no effect.
* Reading from the address low bit reads the value at the chip pin.
* Reading from address bit 16 reads the value at the multiplexer output (see :ref:`gpio_structure`).
.. _reg_gpio_ena:
``reg_gpio_ena``
----------------
Base address: ``0x21000004``
.. wavedrom::
{ "reg": [
{"name": "GPIO output enable", "bits": 16},
{"name": "(undefined, reads zero)", "bits": 16, "type": 1}]
}
|
* Bit 0 corresponds to the GPIO channel enable.
* Bit value 1 indicates an output channel; 0 indicates an input.
.. _reg_gpio_pu:
``reg_gpio_pu``
---------------
Base address: ``0x21000008``
.. wavedrom::
{ "reg": [
{"name": "GPIO pin pull-up", "bits": 16},
{"name": "(undefined, reads zero)", "bits": 16, "type": 1}]
}
|
* Bit 0 corresponds to the GPIO channel pull-up state.
* Bit value 1 indicates pullup is active; 0 indicates pullup is inactive.
.. _reg_gpio_pd:
``reg_gpio_pd``
---------------
Base address: ``0x2100000c``
.. wavedrom::
{ "reg": [
{"name": "GPIO pin pull-down (inverted)", "bits": 16},
{"name": "(undefined, reads zero)", "bits": 16, "type": 1}]
}
|
.. todo:: The statement below (second sentence) seems to be invalid.
* Bit 0 corresponds to the GPIO channel pull-down state.
* Bit value 1 indicates pullup is active; 0 indicates pulldown is inactive.
.. _reg_pll_out_dest:
``reg_pll_out_dest``
--------------------
Base address: ``0x2f000000``
.. wavedrom::
{ "reg": [
{"name": "PLL clock dest.", "bits": 8},
{"name": "(undefined, reads zero)", "bits": 24, "type": 1}]
}
|
The PLL clock (crystal oscillator clock multiplied up by PLL) can be viewed on the GPIO pin.
The GPIO pin cannot be used as general-purpose I/O when selected for PLL clock output.
The low bit of this register directs the output of the core clock to the GPIO channel, according to the :ref:`reg_pll_out_dest_table`.
.. list-table:: ``reg_pll_out_dest`` register settings
:name: reg_pll_out_dest_table
:header-rows: 1
* - ``0x2f000000`` value
- Clock output directed to this channel
* - ``0``
- (none)
* - ``1``
- Core PLL clock to GPIO output
.. note::
High rate core clock (e.g. 80MHz) may be unable to generate a full swing on the GPIO output, but is detectable.
.. _reg_trap_out_dest:
``reg_trap_out_dest``
---------------------
Base address: ``0x2f000004``
.. wavedrom::
{ "reg": [
{"name": "trap signal dest.", "bits": 8},
{"name": "(undefined, reads zero)", "bits": 24, "type": 1}]
}
|
The CPU fault state (trap) can be viewed at the GPIO pin as a way to monitor the CPU trap state externally.
The low bit of this register directs the output of the processor trap signal to the GPIO channel, according to the :ref:`reg_trap_out_dest_table`.
.. list-table:: ``reg_trap_out_dest`` register settings
:name: reg_trap_out_dest_table
:header-rows: 1
* - ``0x2f000004`` value
- Trap signal output directed to this channel
* - ``0``
- (none)
* - ``1``
- GPIO
.. _reg_irq7_source:
``reg_irq7_source``
-------------------
Base address: ``0x2f000008``
.. wavedrom::
{ "reg": [
{"name": "IRQ 7 source", "bits": 8},
{"name": "(undefined, reads zero)", "bits": 24, "type": 1}]
}
|
The GPIO input can be used as an IRQ event source and passed to the CPU through IRQ channel 7 (see :doc:`irq`).
When used as an IRQ source, the GPIO pin must be configured as an input.
The low bit of this register directs the input of the GPIO to the processor's IRQ7 channel, according to the :ref:`reg_irq7_source_table`.
.. list-table:: ``reg_irq7_source`` register settings
:name: reg_irq7_source_table
:header-rows: 1
* - Register byte
- ``0x2f000008`` value
- This channel directed to IRQ channel 7
* - 0
- ``00``
- (none)
* - 1
- ``01``
- GPIO
User project area GPIO
~~~~~~~~~~~~~~~~~~~~~~
.. todo::
This section is based on Memory mapped I/O summary by address from PDF documentation.
It needs some elaboration.
.. _reg_mprj_io_configure:
User project area GPIO ``mprj_io[37:0]`` configure registers
------------------------------------------------------------
Each of 38 ``mprj_io`` GPIOs has a configuration register.
.. csv-table:: Base addresses for ``mprj_io`` configuration registers
:name: reg_mprj_io_configure_addresses
:widths: auto
:header-rows: 1
:delim: ;
User project area GPIO ; Address
``mprj_io[00]`` ; ``0x2600000c``
``mprj_io[01]`` ; ``0x26000010``
``mprj_io[02]`` ; ``0x26000014``
``mprj_io[03]`` ; ``0x26000018``
``mprj_io[04]`` ; ``0x2600001c``
``mprj_io[05]`` ; ``0x26000020``
``mprj_io[06]`` ; ``0x26000024``
``mprj_io[07]`` ; ``0x26000028``
``mprj_io[08]`` ; ``0x2600002c``
``mprj_io[09]`` ; ``0x26000030``
``mprj_io[10]`` ; ``0x26000034``
``mprj_io[11]`` ; ``0x26000038``
``mprj_io[12]`` ; ``0x2600003c``
``mprj_io[13]`` ; ``0x26000040``
``mprj_io[14]`` ; ``0x26000044``
``mprj_io[15]`` ; ``0x26000048``
``mprj_io[16]`` ; ``0x2600004c``
``mprj_io[17]`` ; ``0x26000050``
``mprj_io[18]`` ; ``0x26000054``
``mprj_io[19]`` ; ``0x26000058``
``mprj_io[20]`` ; ``0x2600005c``
``mprj_io[21]`` ; ``0x26000060``
``mprj_io[22]`` ; ``0x26000064``
``mprj_io[23]`` ; ``0x26000068``
``mprj_io[24]`` ; ``0x2600006c``
``mprj_io[25]`` ; ``0x26000070``
``mprj_io[26]`` ; ``0x26000074``
``mprj_io[27]`` ; ``0x26000078``
``mprj_io[28]`` ; ``0x2600007c``
``mprj_io[29]`` ; ``0x26000080``
``mprj_io[30]`` ; ``0x26000084``
``mprj_io[31]`` ; ``0x26000088``
``mprj_io[32]`` ; ``0x2600008c``
``mprj_io[33]`` ; ``0x26000090``
``mprj_io[34]`` ; ``0x26000094``
``mprj_io[35]`` ; ``0x26000098``
``mprj_io[36]`` ; ``0x2600009c``
``mprj_io[37]`` ; ``0x260000a0``
.. wavedrom::
{ "reg": [
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"bits": 1, "type": 2},
{"name": "mode", "bits": 3, "type": 1},
{"bits": 19, "type": 1}]
}
|
.. todo:: Missing default values
.. todo:: Missing setting descriptions
.. list-table:: ``mprj_io[i]`` control register descriptions
:name: reg_mprj_io_configure_description
:header-rows: 1
:widths: auto
* - Mask bit
- Default
- Description
* - 10-12
- ``001``
- Digital mode
* - 9
- TODO
- input voltage trip point select
* - 8
- 0
- slow slew (0 - fast slew, 1 - slow slew)
* - 7
- TODO
- analog bus polarity
* - 6
- TODO
- analog bus select
* - 5
- TODO
- analog bus enable (0 - disabled, 1 - enabled)
* - 4
- TODO
- IB mode select
* - 3
- 0
- input disable (0 - input enabled, 1 - input disabled)
* - 2
- 0
- hold override value (value is the value during hold mode)
* - 1
- 1
- output disable (0 - output enabled, 1 - output disabled)
* - 0
- 1
- management control enable (0 - user control, 1 - management control)
.. todo:: Missing *digital mode* description