mirror of https://github.com/efabless/caravel.git
142 lines
4.0 KiB
ReStructuredText
142 lines
4.0 KiB
ReStructuredText
|
.. 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
|
||
|
-->
|
||
|
|
||
|
QSPI Flash interface
|
||
|
====================
|
||
|
|
||
|
Related pins
|
||
|
------------
|
||
|
|
||
|
* :ref:`flash_io[1:0] <flash_io>` - D9 and D10, respectively,
|
||
|
* :ref:`flash_csb <flash_csb>` - C10,
|
||
|
* :ref:`flash_clk <flash_clk>` - D8.
|
||
|
|
||
|
Description
|
||
|
-----------
|
||
|
|
||
|
The QSPI flash controller is automatically enabled on power-up, and will
|
||
|
immediately initiate a read sequence in single-bit mode
|
||
|
with pin :ref:`flash_io0 <flash_io>` acting as ``SDI`` (data from flash to CPU)
|
||
|
and pin :ref:`flash_io1 <flash_io>` acting as ``SDO`` (data from CPU to flash).
|
||
|
Protocol is according to, e.g., `Cypress S25FL256L <https://www.cypress.com/file/316171/download>`_.
|
||
|
|
||
|
The initial SPI instruction sequence is :ref:`as follows: <initial_spi_instruction_sequence>`.
|
||
|
|
||
|
.. list-table:: Initial SPI instruction sequence
|
||
|
:name: initial_spi_instruction_sequence
|
||
|
:widths: auto
|
||
|
|
||
|
* - ``0xFF``
|
||
|
- Mode bit reset
|
||
|
* - ``0xAB``
|
||
|
- Release from deep power-down
|
||
|
* - ``0x03``
|
||
|
- Read w/3 byte address
|
||
|
* - ``0x00``
|
||
|
- Program start address (``0x10000000``) (3 bytes) (upper byte is ignored)
|
||
|
* - ``0x00``
|
||
|
-
|
||
|
* - ``0x00``
|
||
|
-
|
||
|
|
||
|
The QSPI flash continues to read bytes, either sequentially on the same command,
|
||
|
or issuing a new read command to read from a new address.
|
||
|
|
||
|
.. _reg_spictrl:
|
||
|
|
||
|
``reg_spictrl``
|
||
|
---------------
|
||
|
**QSPI control register**
|
||
|
|
||
|
The behaviour of the QSPI flash controller can be modified by changing values in the register below:
|
||
|
|
||
|
Base address: ``0x2d000000``
|
||
|
|
||
|
.. wavedrom::
|
||
|
|
||
|
{ "reg": [
|
||
|
{"name": "FLASH_IO[3:0]", "bits": 4},
|
||
|
{"name": "CLK", "bits": 1},
|
||
|
{"name": "CSB", "bits": 1},
|
||
|
{"bits": 2, "type": 1},
|
||
|
{"name": "OE_FLASH_IO [3:0]", "bits": 4},
|
||
|
{"bits": 4, "type": 1},
|
||
|
{"name": "DUMMY CLK COUNT", "bits": 4},
|
||
|
{"name": "ACCESS MODE", "bits": 3},
|
||
|
{"bits": 8, "type": 1},
|
||
|
{"name": "EN", "bits": 1}],
|
||
|
"config": {"hspace": 1400}
|
||
|
}
|
||
|
|
||
|
.. list-table:: ``reg_spictrl`` register description
|
||
|
:name: reg_spictrl_description
|
||
|
:header-rows: 1
|
||
|
:widths: auto
|
||
|
|
||
|
* - Mask bit
|
||
|
- Default
|
||
|
- Description
|
||
|
* - 31
|
||
|
- 1
|
||
|
- QSPI flash interface enable
|
||
|
* - 22-20
|
||
|
- 0
|
||
|
- Access mode *(including DDR enable, QSPI enable, CRM enable)* (see :ref:`reg_spictrl_access_mode_values`)
|
||
|
* - 19-16
|
||
|
- 8
|
||
|
- Dummy clock cycle count / Read latency cycles
|
||
|
* - 11-8
|
||
|
- 0
|
||
|
- Bit-bang ``OE_FLASH_IO[3:0]`` I/O output enable
|
||
|
* - 5
|
||
|
- 0
|
||
|
- Bit-bang ``FLASH_CSB`` chip select bit
|
||
|
* - 4
|
||
|
- 0
|
||
|
- Bit-bang ``FLASH_CLK`` serial clock line
|
||
|
* - 3-0
|
||
|
- 0
|
||
|
- Bit-bang ``FLASH_IO[3:0]`` data bits
|
||
|
|
||
|
QSPI access modes
|
||
|
-----------------
|
||
|
|
||
|
.. list-table:: ``reg_spictrl`` Access mode bit values
|
||
|
:name: reg_spictrl_access_mode_values
|
||
|
:widths: auto
|
||
|
|
||
|
* - 0
|
||
|
- ``000``
|
||
|
- Single bit per clock
|
||
|
* - 1
|
||
|
- ``001``
|
||
|
- Single bit per clock (same as 0)
|
||
|
|
||
|
All additional modes (QSPI dual and quad modes) cannot be used,
|
||
|
as the management SoC only has pins for data lines 0 and 1.
|
||
|
|
||
|
The SPI flash can be accessed by bit banging when the enable is off.
|
||
|
To do this from the CPU, the entire routine to access the SPI flash
|
||
|
must be read into SRAM and executed from the SRAM.
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
To sum up, the DDR enable, QSPI enable and CRM enable bits cannot be used due to the limited number of data pins.
|