| <!--- |
| # 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 |
| --> |
| |
| A quick documentation of the Caravel memory map and operation |
| --------------------------------------------------------------- |
| |
| Caravel pinout: |
| --------------- |
| |
| vddio 3.3V supply for all I/O and ESD |
| vssio Ground for all I/O and ESD |
| vdda 3.3V supply for management area |
| vssa Ground for management area |
| vccd 1.8V supply for management area |
| vssd Digital ground for management area |
| |
| vdda1 3.3V supply for user area 1 |
| vdda2 3.3V supply for user area 2 |
| vssa1 Ground for user area 1 |
| vssa2 Ground for user area 2 |
| vccd1 1.8 supply for user area 1 |
| vccd2 1.8 supply for user area 2 |
| vssd1 Digital ground for user area 1 |
| vssd2 Digital ground for user area 2 |
| |
| clock Master clock input |
| gpio 1 bit, mainly used for external LDO control of user power supply |
| mprj_io 32 bits general purpose programmable digital or analog I/O |
| resetb Master reset (sense inverted) input |
| flash_csb SPI flash controller chip select (sense inverted) |
| flash_clk SPI flash controller clock |
| flash_io0 SPI flash controller data out |
| flash_io1 SPI flash controller data in |
| |
| Special-use pins for the management SoC: |
| ---------------------------------------- |
| |
| On power-up, the "mprj_io" GPIO are under complete control of the managment |
| SoC. The first 8 user GPIO are special-purpose pads with dedicated functions |
| for the management SoC: |
| |
| mprj_io[0] JTAG I/O |
| mprj_io[1] SDO, housekeeping SPI |
| mprj_io[2] SDI, housekeeping SPI |
| mprj_io[3] CSB, housekeeping SPI |
| mprj_io[4] SCK, housekeeping SPI |
| mprj_io[5] Rx, UART |
| mprj_io[6] Tx, UART |
| mprj_io[7] IRQ |
| |
| The next 4 user GPIO are designed to be used with an SPI flash controller in |
| the user space. They allow the four pins to be overridden by the housekeeping |
| SPI to access the SPI flash in pass-through mode. |
| |
| mprj_io[8] user flash CSB |
| mprj_io[9] user flash SCK |
| mprj_io[10] user flash IO0 |
| mprj_io[11] user flash IO1 |
| |
| The last 2 GPIO pins can be used by the management SoC to drive the SPI flash |
| io2 and io3 pins for quad and DDR access, although they are set as inputs by |
| default and whenever the SPI flash is not in quad mode: |
| |
| mprj_io[36] SPI flash io2 |
| mprj_io[37] SPI flash io3 |
| |
| The user may additionally use any available GPIO for the SPI flash IO2 and IO3 |
| lines; the pass-through mode only uses the basic 4-pin SPI mode. |
| |
| All of the special-use pins are configured through a memory-mapped region. But |
| to avoid a large number of wires in the user space to reach all of the GPIO |
| pad controls, each user GPIO pad has a corresponding local control block. The |
| control block holds the configuration data for the corresponding pad. This |
| configuration data is a mirror of the data in the memory-mapped region, and is |
| loaded by a "transfer" bit in another memory-mapped register. In addition to |
| all of the static control bits for the GPIO, each block contains a single bit |
| that specifies whether that pad is under the control of the user or the management |
| area. All pins are configured from the management area. However, the configuration |
| of static control bits leaves three dynamic signals: input, output, and output |
| enable. One set of these three signals is available to the user when the pad is |
| under user control. The other set of these three signals is available to the |
| management SoC. Again, to reduce wiring, only the two pads for JTAG and the |
| housekeeping SDO have all three pins under control of the SoC; the remaining |
| pads have a single wire to the management SoC which is either an input wire |
| or an output wire, depending on how the control signals for the pad are set. |
| |
| This setup gives a simplified view of the pad to the user: For digital |
| applications, the user can treat the pad as a simple bidirectional digital |
| pad with an output enable to switch between output and input functions. |
| The user can set the output enable line high or low for a static input or |
| output function. The user will also have access to the ESD-protected |
| pad connections for analog signals, and can connect to the VDDA domain |
| input digital signal if needed. |
| |
| Memory map: |
| ----------- |
| |
| The Caravel memory map is as follows: |
| |
| SRAM: 0000 0000 |
| |
| Flash: Config: 1000 0000 |
| |
| UART: Clock divider: 2000 0000 |
| Data: 2000 0004 |
| Enable 2000 0008 |
| |
| GPIO: Data: 2100 0000 |
| Output enable: 2100 0004 |
| Pullup 2100 0008 |
| Pulldown 2100 000c |
| |
| Counter 1: Config: 2200 0000 |
| Value: 2200 0004 |
| Data: 2200 0008 |
| |
| Counter 2: Config: 2300 0000 |
| Value: 2300 0004 |
| Data: 2300 0008 |
| |
| SPI master: Config: 2400 0000 |
| Data: 2400 0004 |
| |
| Logic analyzer: Data 0: 2500 0000 |
| Data 1: 2500 0004 |
| Data 2: 2500 0008 |
| Data 3: 2500 000c |
| Enable 0: 2500 0010 |
| Enable 1: 2500 0014 |
| Enable 2: 2500 0018 |
| Enable 3: 2500 001c |
| |
| Project ctrl: Data (L): 2600 0000 |
| Data (H): 2600 0004 |
| Transfer: 2600 0008 |
| I/O Config: 2600 000c |
| to 2600 009c |
| Power Config: 2600 00a0 |
| to 2600 0130 |
| |
| Flash ctrl: Config: 2D00 0000 |
| |
| System: PLL out: 2F00 0000 |
| Trap out: 2F00 0004 |
| IRQ7 source: 2F00 0008 |
| |
| User area base: 3000 0000 |
| |
| Crossbar: QSPI control 8000 0000 |
| Storage area 9000 0000 |
| Any slave 1 a000 0000 |
| Any slave 2 b000 0000 |
| |
| Project I/O Control: |
| --------------------- |
| |
| Configuration bits per I/O (13 bits for each GPIO pad): |
| Global Default |
| Bits 12-10: digital mode (3 bits) 001 |
| Bit 9: voltage trip point select 0 |
| Bit 8: slow slew select 0 |
| Bit 7: analog bus polarity 0 |
| Bit 6: analog bus select 0 |
| Bit 5: analog bus enable 0 |
| Bit 4: IB mode select 0 |
| Bit 3: input disable 0 |
| Bit 2: holdover value 0 |
| Bit 1: output disable 1 |
| Bit 0: management control enable 1 |
| |
| Default I/O modes: |
| ------------------ |
| mprj_io[0] JTAG I/O 110 0 0 0 0 0 0 0 0 0 1 |
| mprj_io[1] SDO, housekeeping SPI 110 0 0 0 0 0 0 0 0 0 1 |
| all others: 001 0 0 0 0 0 0 0 0 1 1 |
| |
| |
| Standard GPIO output configuration: |
| mprj_io[6] Tx, UART 110 0 0 0 0 0 0 1 0 0 1 |
| |
| Standard GPIO input configuration: |
| mprj_io[*] 001 0 0 0 0 0 0 0 0 1 1 |
| |
| Standard GPIO input configuration with pullup: |
| mprj_io[*] 010 0 0 0 0 0 0 0 0 1 1 |
| |
| Standard GPIO input configuration with pulldown: |
| mprj_io[*] 011 0 0 0 0 0 0 0 0 1 1 |
| |
| Specifically: |
| JTAG and SDO are set to output. The output enable configure bit |
| is a don't-care, since the output enable line is directly controlled |
| by the module (JTAG or housekeeping SPI, respectively). |
| |
| All other I/O are set as input mode only, with output disabled. |
| |
| Tx is set to input like the others; before enabling the UART |
| from a program in flash, the I/O must be set to an output configuration. |
| |
| Note that the standard input configurations with pull-up and pull-down |
| require that "out" be set 1 or 0, respectively; since the I/O are |
| designed with minimal wiring, there is only one wire for input and |
| output, so the wire is used for input in these cases, and special |
| signal handling is done locally to set the value of "out" equal to |
| ~dm[0]. This is a (minor) restriction on the available I/O modes. |
| |
| Other possible modes are open-drain (for I2C), weak drive strength |
| output (5k up + down), and analog mode (digital disabled) |