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