米尔RK3506 DSMC实战,Local Bus高速互联
在工业控制场景中,芯片间的高速数据交互是一个核心需求。传统方案要么依赖串口/网络等低速通道,要么需要昂贵的共享内存架构。米尔RK3506核心板的DSMC接口提供了一种新选择——通过 Local Bus 协议,用少量引脚实现跨芯片的高速地址空间访问。
本文基于 MYD-YR3506 Host + MYD-YR3506 Slave的实板联调验证,确认DSMC Local Bus链路能够稳定建立,并在 512B、8-bit模式持续压测中达到了 16.77 GB 累计校验数据量、误码率为0的结果。DSMC 在 米尔RK3506核心板(MYC-YR3506) 的Local Bus应用场景下已具备明确的工程应用价值——既能承担寄存器通知与控制交互,也能提供可重复验证、可量化性能的数据访问通道。
图:米尔基于RK3506核心板开发板
第一章:DSMC是什么?
名词预先了解
DSMC:Double Data Rate Serial Memory Controller,双倍速率串行存储器控制器
Local Bus:DSMC的一种应用模式,用于与另一颗 Rockchip 芯片的 Slave DSMC 组成主从访问链路
PSRAM:DSMC的另一种模式,作为存储器控制器为系统提供外部存储空间
CS / region:CS为片选(最多4个),region为CS下的访问窗口(每个CS可分1/2/4个region)
DSMC 全称 Double Data Rate Serial Memory Controller,用于实现Host侧对外部从设备地址空间的访问。它采用命令、地址、数据线分时复用的方式,并支持DDR(双沿)数据传输,核心优势:引脚数量少、带宽较高。
在 米尔RK3506核心板(MYC-YR3506)平台上,DSMC有两种典型用法:
应用模式 | 从设备类型 | 说明 |
PSRAM 模式 | 外部 PSRAM 器件 | 作为存储器控制器,提供可直接寻址的外部存储空间 |
Local Bus 模式 | RK3506 Slave DSMC | 与另一颗 RK3506 组成主从链路,实现跨芯片地址空间访问 |
本文重点介绍 Local Bus 模式。DSMC接口支持x8 和x16 两种位宽,同一CS下的位宽必须统一,属于接口设计阶段需要首先确定的基础参数。
1.1 DSMC 的系统定位
DSMC 既不是普通内存,也不是上层通信协议,而是一条面向对端地址空间的硬件访问通道:
视角 | DSMC 的作用 |
Host 软件 | 提供一片可访问的对端地址空间,允许 Host 进行读写操作 |
Slave 软件 | 提供被 Host 访问的寄存器窗口和数据落地区,通过更新本地内存及控制寄存器向 Host 提供数据和状态 |
硬件层 | 组织地址、数据、时钟、片选及中断关系,建立主从访问链路 |
1.2 DSMC vs 常见访问方式
核心区别:Host 与 Slave 运行在独立地址空间和独立内存系统中,数据通过硬件链路、FIFO 和寄存器机制完成传递,而非通过共享地址空间直接访问。
第二章:Local Bus 空间模型
2.1 两个基本维度
DSMC 的地址空间组织围绕两个维度展开:
CS(片选):CS0~CS3 共4个片选入口,每个CS可连接一个从设备
region(访问窗口):当外设类型为 Local Bus 时,一个CS 的访问空间可以继续划分为多个 region,由设备树(DTS)决定哪些 region 生效
2.2 四类 region 类型
在 rk3506.dtsi 中预定义了4个region的属性模板:
egion | 属性 | 用途 |
region0 | Merged FIFO | FIFO 数据窗口(双向数据通路) |
region1 | No-Merge FIFO | FIFO 数据窗口(不合并访问) |
region2 | DPRA | 从设备 DPRAM 访问模型 |
region3 | Register | 寄存器控制窗口(从设备寄存器) |
典型实践:采用 "region0 传输数据 + region3 控制握手" 的划分。region0 为双向数据通路,双方的数据同步通过 region3 中的控制寄存器完成通知与应答。
2.3 硬件地址体系
项目 | 地址/容量 |
DSMC_MEM 基址 | 0xC0000000 |
DSMC_MEM 容量 | 1008 MB |
Master DSMC 控制器 | 0xFF8B0000 |
Slave DSMC 控制器 | 0xFF880000 |
项目 | 地址/容量 |
该地址空间为硬件固定映射,Host侧DSMC 窗口起始地址固定为 0xC0000000,软件仅能在既定地址范围内进行配置与访问。
FIFO 路径回压机制:RDYN 信号用于表征FIFO满/空状态,Master需根据该信号进行传输等待或恢复。FIFO路径受硬件流控约束,并非简单内存复制。
第三章:FIFO与Register 的协作机制
3.1 两类访问通路
Local Bus 主从交互可划分为两类:
Ø FIFO 访问:当 region属性为Merged FIFO或 No-MergeFIFO 时,Host 访问的是数据通路,数据经Slave侧FIFO后最终写入 Slave 内存
Ø Register 访问:当 region 属性为Register 时,Host访问的是Slave CSR寄存器窗口,用于主从控制信息交互
3.2 双向寄存器通知
Local Bus 提供两组寄存器,实现主从双向中断通知:
寄存器组 | 偏移范围 | 写入方 | 读取方 | 触发中断 |
APP_CONx | 0x0000 ~ 0x003C | Slave | Host | Slave→Host |
LBC_CONx | 0x0100 ~ 0x013C | Host | Slave | Host→Slave |
在 region3 中,Host 侧地址映射:
寄存器 | Host 窗口地址 | 说明 | 寄存器 | Host 窗口地址 |
APP_CON0 | 0xC2000000 | Slave 写入 → Host 读取 | APP_CON0 | 0xC2000000 |
LBC_CON0 | 0xC2000100 | Host 写入 → Slave 读取 | LBC_CON0 | 0xC2000100 |
第四章:板级配置与 DTS 适配
4.1 硬件连接
米尔RK3506开发板上,DSMC信号通过特定排针引出,Host与 Slave之间需要连接以下信号:
Ø 数据线:DSMC_DATA[7:0](8-bit 模式)或 DSMC_DATA[15:0](16-bit 模式)
Ø 控制线:CLK、CS、RDYN、DSMC_CMD等
Ø 中断线:用于主从中断通知
注意:两块板的GND 必须可靠连接。8-bit模式下,数据线只需连接DSMC_DATA[7:0];16-bit 模式需连接全部 16 根数据线。同一CS下的位宽必须统一。
4.2 Host 侧 DTS 配置
/* Host 侧 DSMC 节点 */
&dsmc {
status = "okay";
rockchip,ranges = <0x0 0xc0000000 0x0 0x2000000>;
/* CS0 配置为 Local Bus, 8-bit 模式 */
cs0 {
status = "okay";
rockchip,cs-type = <LB>;
rockchip,bus-width = <8>;
};
};
4.3 Slave 侧 DTS 配置
/* Slave 侧 DSMC 节点 */
&dsmc {
status = "okay";
/* 配置 memory-region 和中断 */
memory-region = <&dsmc_region>;
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
};
4.4 启动日志确认
正确配置后,启动时会在内核日志中看到以下关键信息:
DSMC: init cs0 LB device DSMC: cs0 byte dll delay line result 0x2d DSMC: clk_sys: Enabled, frequency: 196608000 Hz DSMC: CS0: LB device DSMC: CS0 virt: (ptrval), phys: 0xc0000000, size:0x2000000
第五章:用户态访问方式
5.1 设备节点
驱动加载后,会在 /dev/dsmc/ 下创建用户态访问节点:
/dev/dsmc/cs0/region0 # FIFO 数据窗口
/dev/dsmc/cs0/region3 # Register 控制窗口
5.2 FIFO 数据读写
通过 region0 进行数据读写的核心流程:
int fd = open("/dev/dsmc/cs0/region0", O_RDWR); /* 写入数据到 Slave 内存 */ write(fd, write_buf, write_size); /* 从 Slave 内存读取数据 */
read(fd, read_buf, read_size);
close(fd);
5.3 Register 控制交互
通过 mmap 映射 region3 后,以寄存器方式完成主从握手:
int reg_fd = open("/dev/dsmc/cs0/region3", O_RDWR);
volatile uint32_t *reg = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, reg_fd, 0); /* Host 写 LBC_CON0,下发控制请求 */ reg[LBC_CON(0) / 4] = request_value; /* Host 读 APP_CON0,获取 Slave 应答 */
ack = reg[APP_CON(0) / 4];
munmap((void*)reg, 0x1000);
close(reg_fd);
关键细节:APP_CON0 偏移为 0x0000,LBC_CON0 偏移为 0x0100。由于 reg 按 uint32_t 访问,因此使用"寄存器偏移 / 4"作为数组下标。
第六章:性能实测
6.1 测试条件
参数 | 值 |
测试平台 | MYD-YR3506 Host + MYD-YR3506 Slave |
传输位宽 | 8-bit |
数据块大小 | 512 Bytes |
单次请求数据量 | 16.777 MB |
累计校验数据量 | 16,774.656 MB |
6.2 测试结果
结论:在 512B + 8-bit 参数组合下,链路能够支持长时间、大规模重复访问而不出现误码,平均写速率约 340 MB/s,平均读速率约 344 MB/s。
6.3 驱动核心文件
文件 | 作用 |
dsmc-host.c | Host 侧驱动入口,DTS 解析、地址映射、访问接口 |
dsmc-controller.c | 控制器层面配置,底层寄存器配置 |
dsmc-lb-device.c | 创建 /dev/dsmc/csX/regionY 用户态节点 |
dsmc-lb-slave.c | Slave 侧驱动,memory-region、中断、寄存器联动 |
总结与展望
本文围绕米尔RK3506核心板DSMC的Local Bus 应用进行了完整说明与验证,涵盖接口定义、空间模型、板级连接、驱动配置、用户态访问以及性能测试。
从测试结果来看,DSMC已能够同时支撑FIFO 数据面传输和Register 控制面交互。Host 可通过 /dev/dsmc/cs0/region0直接访问Slave侧落地内存,也可通过 region3 完成寄存器通知与控制握手,形成一条兼具数据访问与控制交互能力的跨芯片通信通道。
总体来看,DSMC 在米尔RK3506核心板 Local Bus场景下已具备明确的工程应用价值,可为工业控制等场景中的低延迟控制交互和中高频数据交换提供可靠支撑
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码