一、简介

tsi721 芯片进行doorbell 和message 收发时,驱动执行的流程分析。测试代码和驱动代码来自github:Releases · RapidIO/kernel-rapidio

驱动编译,对于驱动高手和内核高手,就很简单了;这里先说一下 如何基于SDK 来编译 上层的测试应用程序:

1.1 先下载上面链接里的源码包

# cd  kernel-rapidio-master/libmport

# vim Makefile

修改Makefile 里面的交叉工具链:

 

# make samples

# ls

编译的源码是 samples 目录下的测试应用程序,会有很多和rapidio 功能相关测试程序。

二、doorbell

        在rapidio 种, doorbell 是rapidio  消息事务的一种。rapidio 的事务有很多种,像doorbell, maitence (维护事务);但是在这些事务中,如何选择传输的方式,在rapidio 的驱动中已经实现了。比如,doorbell 门铃事务,使用 rapidio 的message 的驱动来传输;比如 维护事务MAINTENCE是 使用 rapidio 的dma 驱动传输;这些都是驱动源码写好了,是驱动工程师根据datasheet 实现的。

        对于message  驱动的实现,用于两个功能,第一个是传输 doorbell  message ,另一个是传输 data message 。注意,在rapidio 驱动中, 传输数据有三个方式可以选,第一是DMA传输,第二就是 data message  传输;第三就是 data stream 的功能传输;目前 tsi721 芯片不支持 data stream 的驱动。

2.1 doorbell介绍:

第10类包格式是门铃事务格式。它没有数据载荷。门铃事务的请求包格式如下图所示:

        上图中Ftype字段固定为10,表示这是一个门铃事务,8位的Reserved字段应该置0,Source TID指的是请求方的事务ID, info(msb)表示的是发送信息的高8位,info(lsb)表示的是发送信息的低8位。如果信息是用数字表示的,而且长度大于8位,那么数据符合低地址存放高字节(big-endian)的格式。比特流中先到达的是高字节。门铃事务适合向处理器递送中断信息,在这种情况下,信息字段用来向接收者传递中断级别和目标信息,除此以外,还可以在处理器件间发送信号量

        一个完整的门铃操作由DOORBELL事务和RESPONSE事务(通常是DONE响应)组成。处理单元用这个操作将非常短的消息通过互连结构发送到另一个处理器部件。门铃事务包括用于保持事务信息的信息字段。该事务没有数据载荷。它的信息字段是由软件定义的,可以用于任何目的。通常,运行在处理器上的操作系统会定义门铃事务使用的信息字段的意义。收到门铃事务的处理器部件将包放进处理器部件中的门铃消息队列,该队列可以在硬件或者本地存储器中实现。一个完整的门铃操作如下图所示

2.2 doorbell 代码是如何实现的?

先说明一下,实际测试时,是如何测试?

2.2.1 接收端命令

#./rio_test_db -M 0 -S 0x1a1a -E 0x5a5a -r

备注:数据只有在0x1a1a~0x5a5a 之间才会被接收到,不然就不行; r 是接收的意思

具体的log 就不展示了。

2.2.2 发送端命令

#./rio_test_db -M 0 -D 0x1(接收端 hdid)  -I 0x1a5a

log省略了。

2.2.3 rio_test_db 是如何调用驱动的?

A 接收端

上层打开文件后,是处于等待事件的到来;只有接收到doorbell 数据,产生中断。

 

 B 发送端

tsi721_dsend 函数中有循环:

三、message 

3.1 简介

第11类包为消息事务格式包。第11类包总有数据载荷,并且数据载荷长度总是双字(64-bits或8-bytes)长度的整数倍。没有规定子双字(sub-double-word)消息,如果需要的话,可以由软件管理子双字消息。一个消息请求包的格式如下图所示

 

 

    尽管RapidIO规范使用信箱(MailBox)、信件(Letter)和消息分段(Message Segment)之类的术语,但是这些字段在逻辑上指的是一个8位的消息标识符信息。消息标识符信息可以用来惟一的标识和管理任意两个处理部件之间最多256个不同的消息流。接收处理部件的消息传递硬件会根据该信息计算应该把事务数据存放在本地存储器的什么位置。

  例如,假设接受处理部件的信箱0、信箱1、信箱2和信箱3的起始地址分别为地址0x1000、0x2000、0x3000和0x4000,处理部件接收到的消息事务带有下列字段:

  A、消息长度为6个包(msglen = 4’b0110)

  B、消息段是第3个包(msgseg = 4’b0011)

  C、信箱为信箱2(mbox = 2’b10)

  D、信件为1(letter = 2’b01)

  E、标准大小为32字节(ssize = 4’b1011)

  F、数据载荷为32字节(由于这不是最后一个事务, 所以数据载荷应该是32字节)

  处理部件的消息传递硬件使用这些信息来决定将这部分数据消息所含32字节数据存放到本地存储器地址0x3040。

  目标地址 = 信箱2基地址(Mailbox_2_base) + (消息分段x标准长度)

  0x3040  =    0x3000                   + (0x0002 x 0x0020)

  这个简单的寻址结构使得接收处理部件很容易计算存储消息数据的目标存储结构的地址。不仅计算起来容易,而且接收者的目标存储器结构的位置对发送者也是不可见的。这允许仅在处理器部件间提供基于消息通信的安全系统研发工作。

消息的响应事务也是由第13类包产生,与NREAD事务和NWRITE_R事务响应包不同的是,消息事务的响应包中的target_info字段占用了普通响应包中的target ID字段的位置,具体的响应包格式见下图

其中消息响应包中逻辑层Ftype字段,Ttype字段,Status字段以及Data Payload字段的含义与普通响应包中各字段的含义完全相同, Target_info字段由letter,mbox和msgseg三个字段组成,这三个字段的含义与消息请求包中这三个字段的含义完全相同,这里不再赘述。

  由消息和响应(一般是DONE响应)事务组成的数据消息操作如下图所示,处理部件的支持消息传递的硬件用它向另一个处理部件发送数据消息。完成一次数据消息操作最多需要16个单独的消息事务。消息事务数据载荷的大小是双字长度(8个字节)的整数倍。最大的消息操作载荷是4096字节,该载荷由16个消息事务组成,每个事务携带256字节的数据载荷。信件( letter),信箱(mbox)和消息段(msgseg)组合在一起,惟一地标识系统中每个请求和响应部件对的消息包,与其他请求类型使用的事务 ID的作用一样。

3.2  发送message

3.3 接收message

 

 

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐