DSMC
芯片名称:RK3576
内核版本:kernel 6.10
前言
本文档为 ROCKHIP DSMC 模块的 kernel 开发提供说明和使用方法。
读者对象
本文档(本指南)主要适用于以下工程师:
- 技术支持工程师
- 软件开发工程师
1. 名称解释
- DSMC:Double Data Rate Serial Memory Controller,双倍速率串行存储器控制器
- PSRAM:Pseudo static random access memory,伪静态随机存储器
- DPRAM:Dual Port Random Access Memory,双向随机存取存储器
2. 概述
Double Data Rate Serial Memory Controller(DSMC),双倍速率串行存储器控制器,通过命令、地址、数据线分时复用,数据上下沿传输,具有少引脚数、高带宽的特点。数据线位宽支持 x8、x16,最多支持 4 个 chip select。传输协议支持 Hyperbus PSRAM、Xccela PSRAM 和 Local bus。若使用 Local bus 协议,从设备需使用 RK 开发的 slave 模型,或者传输协议相同。若使用 HYPERBUS PSRAM、XCCELA PSRAM 协议,从设备支持 winbond、AP memory、Cypress、ISSI 等厂家生产的 PSRAM 颗粒。
3. DSMC驱动
3.1 驱动文件
DSMC 驱动文件位置:
drivers/memory/rockchip/dsmc-host.c
/* 主要驱动程序 */drivers/memory/rockchip/dsmc-controller.c
/* DSMC 控制器行为配置 */drivers/memory/rockchip/dsmc-lb-device.c
/* DSMC Local bus 设备 */
3.2 DTS节点配置
dsmc: dsmc@2a280000 {
...
clock-frequency = <100000000>; /* DSMC 接口频率设置 */
...
/* 从设备属性 */
slave {
rockchip,dqs-dll = <0x20 0x20 /* 从设备 cs0 的 DQS0、DQS1 DLL 延迟参数 */
0x20 0x20 /* 从设备 cs1 的 DQS0、DQS1 DLL 延迟参数 */
0x20 0x20 /* 从设备 cs2 的 DQS0、DQS1 DLL 延迟参数 */
0x20 0x20>; /* 从设备 cs3 的 DQS0、DQS1 DLL 延迟参数 */
/*
* rockchip,ranges:DSMC 访问从设备内存的基地址,大小;
* 若不同 CS 的内存空间大小不同,那么需要配置最大的。
* rockchip,ranges = <0x0 0x10000000 0x0 0x2000000> 含义:若外设是 PSRAM,
* 那么每个 CS 都分配 0x2000000 大小的内存空间;
* 若外设是 Local Bus,那么每个 region 都分配 0x2000000 大小的内存空间。
*/
rockchip,ranges = <0x0 0x10000000 0x0 0x2000000>;
rockchip,slave-dev = <&dsmc_slave>;
};
};
dsmc_slave: dsmc_slave {
compatible = "rockchip,dsmc-slave";
rockchip,clk-mode = <0>; /* clk 模式,仅限 Local bus */
status = "disabled";
/* 从设备是 PSRAM(Hyperbus Psram 或 Xccela Psram)时,开启对应从设备 cs 的节点 */
psram {
psram0 {
status = "disabled"; /* 若从设备 cs0 为 PSRAM,则改为“okay” */
};
psram1 {
status = "disabled"; /* 若从设备 cs1 为 PSRAM,则改为“okay” */
};
psram2 {
status = "disabled"; /* 若从设备 cs2 为 PSRAM,则改为“okay” */
};
psram3 {
status = "disabled"; /* 若从设备 cs3 为 PSRAM,则改为“okay” */
};
};
/* 从设备是 Local bus 设备时,开启、配置对应节点 */
lb-slave {
dsmc_lb_slave0: lb-slave0 {
status = "disabled"; /* 若从设备 cs0 为 Local bus 设备,则改为“okay” */
dsmc_p0_region: region {
dsmc_p0_region0: region0 { /* 此从设备 region0 的属性 */
rockchip,attribute = "Merged FIFO";/* region0 为从设备可 merge FIFO */
rockchip,ca-addr-width = <0>; /* CA 传输格式,0:为 32bit,1:为 16bit */
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>; /* 从设备 cs0 被从设备 cs1、2、3 控制 */
rockchip,cs0-ctrl = <0>; /* 从设备 cs0 控制从设备 cs1、2、3 */
status = "disabled";
};
dsmc_p0_region1: region1 { /* 此从设备 region1 的属性 */
rockchip,attribute = "No-Merge FIFO";/* region1 为从设备不可 merge FIFO */
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p0_region2: region2 { /* 此从设备 region2 的属性 */
rockchip,attribute = "DPRA"; /* region2 为从设备 DPRAM */
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p0_region3: region3 { /* 此从设备 region3 的属性 */
rockchip,attribute = "Register"; /* region3 为从设备寄存器 */
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
};
};
dsmc_lb_slave1: lb-slave1 {
status = "disabled"; /* 若从设备 cs1 为 Local bus 设备,则改为“okay” */
dsmc_p1_region: region {
dsmc_p1_region0: region0 {
rockchip,attribute = "Merged FIFO";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p1_region1: region1 {
rockchip,attribute = "No-Merge FIFO";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p1_region2: region2 {
rockchip,attribute = "DPRA";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p1_region3: region3 {
rockchip,attribute = "Register";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
};
};
dsmc_lb_slave2: lb-slave2 {
status = "disabled"; /* 若从设备 cs2 为 Local bus 设备,则改为“okay” */
dsmc_p2_region: region {
dsmc_p2_region0: region0 {
rockchip,attribute = "Merged FIFO";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p2_region1: region1 {
rockchip,attribute = "No-Merge FIFO";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p2_region2: region2 {
rockchip,attribute = "DPRA";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p2_region3: region3 {
rockchip,attribute = "Register";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
};
};
dsmc_lb_slave3: lb-slave3 {
status = "disabled"; /* 若从设备 cs3 为 Local bus 设备,则改为“okay” */
dsmc_p3_region: region {
dsmc_p3_region0: region0 {
rockchip,attribute = "Merged FIFO";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p3_region1: region1 {
rockchip,attribute = "No-Merge FIFO";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p3_region2: region2 {
rockchip,attribute = "DPRA";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
dsmc_p3_region3: region3 {
rockchip,attribute = "Register";
rockchip,ca-addr-width = <0>;
rockchip,dummy-clk-num = <1>;
rockchip,cs0-be-ctrled = <0>;
rockchip,cs0-ctrl = <0>;
status = "disabled";
};
};
};
};
};