167 lines
5.7 KiB
YAML
167 lines
5.7 KiB
YAML
# Copyright (c) 2020, Teslabs Engineering S.L.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
description: |
|
|
STM32 Flexible Memory Controller (SDRAM controller).
|
|
|
|
The FMC SDRAM controller can be used to interface with external SDRAM
|
|
memories. Up to 2 SDRAM banks are supported with independent configuration. It
|
|
is worth to note that while settings are independent, some are shared or are
|
|
required to be set according to the most constraining device. Refer to the
|
|
properties description or the datasheet for more details.
|
|
|
|
The FMC SDRAM controller is defined below the FMC node and SDRAM banks are
|
|
defined as child nodes of the FMC SDRAM node. You can either have bank 1 (@0),
|
|
bank 2 (@1) or both. You can enable the FMC SDRAM controller in your board
|
|
DeviceTree file like this:
|
|
|
|
&fmc {
|
|
status = "okay";
|
|
pinctrl-0 = <&fmc_nbl0_pe0 &fmc_nbl1_pe1 &fmc_nbl2_pi4...>;
|
|
|
|
sdram {
|
|
status = "okay";
|
|
|
|
power-up-delay = <100>;
|
|
num-auto-refresh = <8>;
|
|
mode-register = <0x220>;
|
|
refresh-rate = <603>;
|
|
|
|
bank@0 {
|
|
reg = <0>;
|
|
|
|
st,sdram-control = <STM32_FMC_SDRAM_NC_9
|
|
STM32_FMC_SDRAM_NR_12
|
|
STM32_FMC_SDRAM_MWID_32
|
|
STM32_FMC_SDRAM_NB_4
|
|
STM32_FMC_SDRAM_CAS_2
|
|
STM32_FMC_SDRAM_SDCLK_PERIOD_2
|
|
STM32_FMC_SDRAM_RBURST_ENABLE
|
|
STM32_FMC_SDRAM_RPIPE_0>;
|
|
st,sdram-timing = <2 6 4 6 2 2 2>;
|
|
};
|
|
|
|
bank@1 {
|
|
reg = <1>;
|
|
...
|
|
};
|
|
};
|
|
};
|
|
|
|
Note that you will find definitions for the st,sdram-control field at
|
|
dt-bindings/memory-controller/stm32-fmc-sdram.h. This file is already included
|
|
in the SoC DeviceTree files.
|
|
|
|
Finally, in order to make the memory available you will need to define new
|
|
memory device/s in DeviceTree:
|
|
|
|
sdram1: sdram@c0000000 {
|
|
compatible = "zephyr,memory-region", "mmio-sram";
|
|
device_type = "memory";
|
|
reg = <0xc000000 DT_SIZE_M(X)>;
|
|
zephyr,memory-region = "SDRAM1";
|
|
};
|
|
|
|
sdram2: sdram@d0000000 {
|
|
compatible = "zephyr,memory-region", "mmio-sram";
|
|
device_type = "memory";
|
|
reg = <0xd000000 DT_SIZE_M(X)>;
|
|
zephyr,memory-region = "SDRAM2";
|
|
};
|
|
|
|
It is important to use sdram1 and sdram2 node labels for bank 1 and bank 2
|
|
respectively. Memory addresses are 0xc0000000 and 0xd0000000 for bank 1 and
|
|
bank 2 respectively.
|
|
|
|
compatible: "st,stm32-fmc-sdram"
|
|
|
|
include: base.yaml
|
|
|
|
properties:
|
|
"#address-cells":
|
|
required: true
|
|
const: 1
|
|
|
|
"#size-cells":
|
|
required: true
|
|
const: 0
|
|
|
|
power-up-delay:
|
|
type: int
|
|
default: 100
|
|
description: Power-up delay in microseconds.
|
|
|
|
num-auto-refresh:
|
|
type: int
|
|
default: 8
|
|
description: Number of auto-refresh commands issued.
|
|
|
|
mode-register:
|
|
type: int
|
|
required: true
|
|
description:
|
|
A 14-bit field that defines the SDRAM Mode Register content. The mode
|
|
register bits are also used to program the extended mode register for
|
|
mobile SDRAM.
|
|
|
|
refresh-rate:
|
|
type: int
|
|
required: true
|
|
description:
|
|
A 13-bit field defines the refresh rate of the SDRAM device. It is
|
|
expressed in number of memory clock cycles. It must be set at least to
|
|
41 SDRAM clock cycles.
|
|
|
|
child-binding:
|
|
description: SDRAM bank.
|
|
|
|
properties:
|
|
reg:
|
|
type: int
|
|
required: true
|
|
|
|
st,sdram-control:
|
|
type: array
|
|
required: true
|
|
description: |
|
|
SDRAM control configuration. Expected fields, in order, are,
|
|
|
|
- NC: Number of bits of a column address.
|
|
- NR: Number of bits of a row address.
|
|
- MWID: Memory device width.
|
|
- NB: Number of internal banks.
|
|
- CAS: SDRAM CAS latency in number of memory clock cycles.
|
|
- SDCLK: SDRAM clock period. If two SDRAM devices are used both should
|
|
have the same value.
|
|
- RBURST: Enable burst read mode. If two SDRAM devices are used both
|
|
should have the same value.
|
|
- RPIPE: Delay, in fmc_ker_ck clock cycles, for reading data after CAS
|
|
latency. If two SDRAM devices are used both should have the same
|
|
value.
|
|
|
|
st,sdram-timing:
|
|
type: array
|
|
required: true
|
|
description: |
|
|
SDRAM timing configuration. Expected fields, in order, are,
|
|
|
|
- TMRD: Delay between a Load Mode Register command and an Active or
|
|
Refresh command in number of memory clock cycles.
|
|
- TXSR: Delay from releasing the Self-refresh command to issuing the
|
|
Activate command in number of memory clock cycles. If two SDRAM
|
|
devices are used, the FMC_SDTR1 and FMC_SDTR2 must be programmed with
|
|
the same TXSR timing corresponding to the slowest SDRAM device
|
|
- TRAS: Minimum Self-refresh period in number of memory clock cycles.
|
|
- TRC: Delay between the Refresh command and the Activate command, as
|
|
well as the delay between two consecutive Refresh commands. It is
|
|
expressed in number of memory clock cycles. If two SDRAM devices are
|
|
used, the TRC must be programmed with the timings of the slowest
|
|
device in both banks.
|
|
- TWP: Delay between a Write and a Precharge command in number of memory
|
|
clock cycles
|
|
- TRP: Delay between a Precharge command and another command in number
|
|
of memory clock cycles. If two SDRAM devices are used, the TRP must be
|
|
programmed with the timing of the slowest device in both banks.
|
|
- TRCD: Delay between the Activate command and a Read/Write command in
|
|
number of memory clock cycles.
|