
在工业控制场景中,芯片间的高速数据交互是一个核心需求。传统方案要么依赖串口/网络等低速通道,要么需要昂贵的共享内存架构。米尔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有两种典型用法:

本文重点介绍Local Bus模式。DSMC接口支持x8和x16两种位宽,同一CS下的位宽必须统一,属于接口设计阶段需要首先确定的基础参数。
1.1 DSMC的系统定位
DSMC既不是普通内存,也不是上层通信协议,而是一条面向对端地址空间的硬件访问通道:
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的属性模板:

典型实践:采用"region0传输数据+region3控制握手"的划分。region0为双向数据通路,双方的数据同步通过region3中的控制寄存器完成通知与应答。
2.3 硬件地址体系

该地址空间为硬件固定映射,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提供两组寄存器,实现主从双向中断通知:

在region3中,Host侧地址映射:
第四章:板级配置与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 = ; rockchip,bus-width = <8>; }; };
4.3 Slave 侧 DTS 配置
/* Slave 侧 DSMC 节点 */ &dsmc { status = "okay"; /* 配置 memory-region 和中断 */ memory-region = <&dsmc_region>; interrupts =
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 测试条件

6.2 测试结果

结论:在512B+8-bit参数组合下,链路能够支持长时间、大规模重复访问而不出现误码,平均写速率约340 MB/s,平均读速率约344 MB/s。
6.3 驱动核心文件
总结与展望
本文围绕米尔RK3506核心板DSMC的Local Bus应用进行了完整说明与验证,涵盖接口定义、空间模型、板级连接、驱动配置、用户态访问以及性能测试。
从测试结果来看,DSMC已能够同时支撑 FIFO数据面传输和Register控制面交互。Host可通过/dev/dsmc/cs0/region0直接访问Slave侧落地内存,也可通过 region3完成寄存器通知与控制握手,形成一条兼具数据访问与控制交互能力的跨芯片通信通道。
总体来看,DSMC在米尔RK3506核心板Local Bus场景下已具备明确的工程应用价值,可为工业控制等场景中的低延迟控制交互和中高频数据交换提供可靠支撑。
全部0条评论
快来发表一下你的评论吧 !