|  | <!--- | 
|  | # 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 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) |