AHSATA模块之AHCI HBA卡开发,结合SPEC文档和项目实际底层FW开发总结(一)

news2024/11/17 5:49:33

目录

    • 一、简介
    • 二、总体架构和常用术语总结
      • 2.1 总结介绍
      • 2.2 常用术语解析
    • 三、详细流程
      • 3.1 总结
      • 3.2 物理层详解
      • 3.3 链路层、传输层详解
      • 3.4 命令层详解
    • 四、FW开发
      • 4.1 pcie header配置
      • 4.2 PMCAP和MSICAP配置
      • 4.3 pcie capbility配置
      • 4.4 Generic Host Control配置
      • 4.5 Port Registers配置
    • 五、总结
    • 六、其他链接
      • 1、PCIe物理层总结-PCIE专题知识(一)
      • 2、PCIe数据链路层图文总结-PCIe专题知识(二)
      • 3、SSD硬盘SATA接口和M.2接口区别总结

一、简介

本次开发是基于ARM A55芯片AHSATA模块开发firware实现AHCI HBA功能,本篇文章主要讲解AHCI HBA底层的实现流程,具体细节再后续文章中进行针对性的总结。

二、总体架构和常用术语总结

2.1 总结介绍

AHCI HBA独立于SOC芯片以外的AHCI HBA是一个PCI类设备。在主机下为一个SATA controller PCI设备,在controller下可以外挂多个ATA DEVICE。
在linux下输入lspci可以看到controller设备
在这里插入图片描述AHCI HBA在SOC整体位置如下:
在这里插入图片描述

2.2 常用术语解析

常用命令释义

定义解析
HBAHBA是“主机总线适配器”的缩写。,即AHCI HBA(AHCI的主机控制器),可以集成在SOC芯片中,也可以是单独的AHCI主机控制器芯片。主机总线适配器是指实现AHCI规范,用于在系统内存和串行ATA设备之间进行通信。
AHCI HBA独立于SOC芯片以外的AHCI HBA是一个PCI类设备。集成在SOC芯片中的AHCI HBA则使用内部总线访问,只是AHCI寄存器偏移量和功能复合AHCI规范标准。
OOB(Out of Band)信号解析SATA信号链结的建立主要是靠OOB(Out Of Band)的检测实现的,并且向上层Link Layer提供了物理层的链结情况。
FISFIS是“框架信息结构”的缩写。FIS是指在主机和设备之间传输。传输层不必关心需要传输或接收资讯的多少,只需把要传输的资料封装成FIS 格式,发送到Link Layer,或者把收到的FIS去除封装,提交给Application Layer。
command list定义HBA处理的位于系统内存中的命令。这是一个列表,可能包含1到32个条目(称为命令槽),并且可以包含任何类型的ATA或ATAPI命令。命令当串行ATA设备的BSY、DRQ和ERR位被清除时,列表将被提前。
command slot命令槽是命令列表中的一个条目。命令槽包含执行命令,列表中最多支持32个插槽(即条目)。
device直接连接的物理设备,如硬盘驱动器(HDD)或光盘驱动器(ODD)连接到HBA端口,或通过端口倍增器连接到HBA港口。
cscs用于描述具有特定命令含义的字段。
D2HD2H是“设备到HBA”的缩写。在串行ATA规范中,此缩写词与“设备到主机”。D2H通常用于描述FIS的传输方向。
H2DH2D是“HBA到设备”的缩写
portHBA上的一个物理端口,带有一组控制DMA和链路操作的寄存器。一个物理端口可能有几个设备通过端口倍增器连接到它。
PRD“Physical Region Descriptor”是“物理区域描述符”的缩写。PRD条目描述了物理位置和要传输的数据长度。描述了在DMA传输期间用作数据来源或目标的内存区域。PRD表通常称为散/聚集列表(scatter/gather list)。
PIOPIO模式是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式。是最早先的硬盘数据传输模式,数据传输速率低下。分PIO mode0-6,速率从3.3MB/s到16.6MB/s不等。
Port Multiplier端口倍增器。SATA 1.0的一个缺点就是可连接性不好,即连接多个硬盘的扩展性不好。因为在SATA 1.0规范中,一个SATA接口只能连接一个设备。SATA的制定者们显然也意识到了这个问题,于是他们在SATA2.0中引入了Port Multiplier的概念。Port Multiplier是一种可以在一个控制器上扩展多个SATA设备的技术,它采用4位(bit)宽度的Port Multiplier端口字段,其中控制端口占用一个地址,因此最多能输出15个设备连接----与并行SCSI相当。
NCQNative Command Queuing 原生指令序列,对多个命令进行重新排序,减少机械硬盘磁头切换耗时。
queue显示Serial ATA设备内部的ATA命令队列。这与命令列表的区别在于,当HBA命令列表中的所有命令都是Serial ATA本机排队命令时,队列只能存在于Serial ATA设备中。
Task File接口寄存器用于向设备发送命令或从设备发送状态。在串行ATA,这些寄存器作为FIS有效载荷字段的一部分进行通信。在ATA规范的后期版本中,这些寄存器可以称为命令和控制块寄存器。
System Memory计算机系统的DRAM或“主”存储器,用于在主处理器和串行ATA设备之间传递数据和命令信息
n/an/a用于描述对于特定命令不适用或未使用的字段。

三、详细流程

3.1 总结

SATA3协议一共分为五层:应用层、命令层、传输层、链路层和物理层。
应用层:负责所有ATA命令的解析和执行,向处理器报告硬盘的运行状态,发起数据读写请求,完成硬盘工作模式的设置和读取等。

命令层:负责解析ATA指令,做出相应的回应,并指导传输层构建FIS。

传输层:负责构建和解析FIS,完成组帧和解帧,调整命令层和链路层之间的数据格式,完成主机和设备的命令交互和数据传递。

链路层:SATA链路层执行过程为:主机端发送数据,计算其32bit的CRCR校验和,并将该校验和与发送的有效数据进行加扰,放在有效数据帧的最后一帧,经过8B/10B编码后传输至物理层;设备端接收数据,对接收的有效数据进行8B/10B解码以及解扰操作,计算本组数据的CRC校验和,并与设备端接收的校验和比较。

物理层:物理层位于协议的最底层,其功能是通过OOB(Out-of-Band)信号的检测以及原语交互,实现主机端控制器与设备端控制器的链路初始化和速度协商,并将主机和设备的链路状态向链路层反馈,建立数据通道,实现串并转换、并串转换等操作。目前,Xilinx的高速收发器可支持物理层设计与实现,并且包含了8B/10B编解码等功能。
在这里插入图片描述

具体功能如下:
在这里插入图片描述

3.2 物理层详解

物理层的下游用两对串行差分信号对连接 SATA device ,上游与链路层之间传输并行信号。物理层进行的主要工作包括:

时钟恢复:与常见的低速通信(例如几十MHz的老式硬盘的ATA并口)和中速通信(例如几百MHz的DDR3、MIPI LVDS)不同,在SATA这种几Gbps的高速率下,各个信号间难以进行对齐,因此SATA不是用用不同的信号线传输时钟,而通过8b10b编码把时钟和数据调制到同一对差分对上,因此物理层的 RX 通道需要使用锁相环 (PLL, 一种模拟电路) 对串行信号的时钟恢复,有了恢复出的时钟,才能对 RX 数据进行正确的采样。串并转换:物理层的 RX 通道需要用恢复出的时钟把RX数据转换成以 10bit 为单位的并行信号;TX通道需要把链路层提供的 10bit 为单位的并行信号转换为串行信号发送出去。例如,对于 3Gbps 的 SATA Gen2 ,转换成的并行信号可以是 150MHz 20bit 位宽,也可以是 75MHz 40bit 位宽。字节对齐:串并转换涉及到如何在串行的 bit 流中界定 10bit 并行单位的边界的问题,SATA 使用一种特殊的 ALIGN 原语来界定 byte 边界,在 8b10b 编码下,ALIGN 原语会产生一种独一无二的 10bit 组合模式,物理层负责识别这种模式,每当遇到这种模式,接收方就知道当前处于一个 10bit 的边界。

3.3 链路层、传输层详解

本文将链路层和传输层合起来讲,因为二者间耦合度较大,个人认为合起来更好理解。链路层和传输层需要实现:8b10b 编解码、原语生成和检测(包括FIS包边界识别)、加扰/解扰、CRC生成和检验、流控。最后,传输层与上游的命令层使用一种叫 Frame Information Structures (FIS) 的数据包结构进行交互。链路、传输层功能分别说明如下:

8b10b 编解码:物理层RX通道的并行数据是以 10bit 为单位的 8b10b 编码数据,链路层需要把它解码为 8bit (1byte) 的数据;而TX通道需要把 8bit 数据编码为 10bit 。显然 8b10b 编码会导致五分之一的带宽浪费,之所以设计这种冗余,是为了让 0 和 1 尽量均匀地分布,这样接收方才能对信号进行时钟恢复。原语插入和检测:SATA 规定了几种原语 (Primitive) ,每个原语的长度都为 4byte 。原语并不携带数据,而是用来进行通信控制。本文涉及的原语包括 ALIGN, CONT, SYNC, R_RDY, R_IP, R_OK, R_ERR, X_RDY, SOF, EOF, WTRM, HOLD, HOLDA。原语有各自的功能,例如 ALIGN 原语用来进行字节对齐、X_RDY 原语用来告诉对方自己想发送一个 FIS 给对方,SOF 原语用来指示 FIS 的开头、EOF 原语用来指示 FIS 的结尾(通过 SOF 和 EOF 原语,RX通道才能正确地解析出 FIS 数据包的边界)。对于 TX 通道,需要正确地插入原语。对于 RX 通道,需要检测原语,并按原语规定的功能来进行状态机的状态转移。FIS加扰/解扰:加扰器 (Scrambler) 和解扰器能生成一个伪随机数序列,每次复位后,生成的伪随机数序列是固定的。在 TX 通道,待发送的 FIS 数据需要与加扰器生成的伪随机数序列进行按位异或运算,称为加扰;在 RX 通道,收到的 FIS 数据需要与解扰器生成的伪随机序列也进行按位异或运算,称为解扰。因为两次异或后数据不变,确保了先加扰、后解扰后数据能够正确地被恢复。加扰的目的是让 SATA 电缆上传输的数据更加杂乱,从而让电磁辐射更加接近白噪声(而不是集中分布于某个频率),从而减少电磁干扰(EMI)。原语的重复加扰:FIS 加扰只能减少FIS传输过程中的 EMI 。当SATA在传输大量重复原语时,为了减少EMI,需要使用另一种类似的机制:原语的重复加扰。该过程会用到 CONT 原语。CRC生成和检验:TX 通道需要根据 FIS 数据计算出 CRC 并追加在 FIS 的最后;RX 通道需要根据收到的 FIS 数据生成 CRC ,并与收到的 CRC 进行对比(也即CRC检验)。若不匹配,说明 FIS 传输中出现误码,需要丢弃该 FIS 并向上游报告错误。流控:硬盘介质的读写速率与 SATA 接口的速率往往并不匹配,因此传输层规定了流控(Flow Control)机制,流控依赖于 HOLD 和 HOLDA 原语,包括两种流控:
发送方流控:当发送方暂未准备好待发送的 FIS 数据时(例如读硬盘的速率慢于SATA接口速率),发送方可以插入 HOLD 原语来填空,这样就能支持“断断续续”地发送数据。接收方流控:当接收方暂不能接收 FIS 数据时(例如写硬盘的速率慢于SATA接口速率),接收方可以向发送方发送 HOLD 原语,告诉发送方“不要发的这么快,我接受不了了”,发送方就会暂停发送数据并向接收方发送 HOLDA 原语来填空。

3.4 命令层详解

命令层:接受上游的读写命令,生成和解析命令FIS,实现硬盘读写操作。SATA 支持 ATA 和 ATAPI 命令集,每个命令集包含多种硬盘读写方式,比如 PIO 方式、 DMA 方式等,因此一个完整的命令层需要实现众多繁杂的命令的状态机,但其目的并不复杂,都是为了用各种方式来实现硬盘读写。本文仅会简单地介绍 DMA 方式:包括如何用 DMA 方式发送和接收 FIS ,从而进行硬盘的读写。

四、FW开发

4.1 pcie header配置

在这里插入图片描述

在这里插入图片描述

4.2 PMCAP和MSICAP配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.3 pcie capbility配置

在这里插入图片描述

4.4 Generic Host Control配置

作为HBA卡,AHCI驱动会根据FW提供的golobal sata base寄存器地址(0x25000000)对全局和每个port进行配置。
在这里插入图片描述
注意在进行pcie配置时要使能bar5,disable 其他bar空间
在这里插入图片描述
在这里插入图片描述

4.5 Port Registers配置

port寄存器是针对每个port进行的配置,在SATA GLOBAL BASE的基础上偏移0x100,然后每个port直接间隔0x80,公式如下:
在这里插入图片描述
相关寄存器如下:
在这里插入图片描述

五、总结

本文主要讲解了底层firware在开发controller过程中PCIE相关的配置,主要是通过PCIE接口在PCIE建链完成后通过主机Linux内核AHCI驱动去配置controller设备,最终实现在host下可以认到sata controller设备。后续文章会详细介绍底层OOB进行phy link过程以及FIS命令的解析和使用。

六、其他链接

1、PCIe物理层总结-PCIE专题知识(一)

2、PCIe数据链路层图文总结-PCIe专题知识(二)

3、SSD硬盘SATA接口和M.2接口区别总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1250507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【腾讯云云上实验室】向量数据库+LangChain+LLM搭建智慧辅导系统实践

目录 一、搭建智慧辅导系统——向量数据库实践指南1.1、创建向量数据库并新建集合1.2、使用 TKE 快速部署 ChatGLM1.3、部署 LangChain PyPDFVectorDB等组件1.4、配置知识库语料1.5、基于 VectorDB LLM 的智能辅导助手 二、LLM时代的次世代引擎——向量数据库2.1、向量数据库L…

CleanMyMacX4.14.5macOS电脑系统免费清理工具

CleanMyMac X是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件,修复系统漏洞,一键扫描和优化Mac系统,…

Swagger在php和java项目中的应用

Swagger在php和java项目中的应用 Swagger简介Swagger在java项目中的应用步骤常用注解 Swagger在php项目中的应用 Swagger简介 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以…

Windows环境搭建

Windows环境搭建 一. jdk1.8安装1. 资源链接2. 安装3. 配置环境变量 一. jdk1.8安装 1. 资源链接 资源链接 提取码:tfms 2. 安装 1.双击下载好的JDK,点击下一步。 2.修改默认目录(可不修改),点击下一步, 3. 点击下…

Matplotlib图形配置与样式表_Python数据分析与可视化

Matplotlib图形配置与样式表 配置图形修改默认配置rcParams样式表 Matplotlib的默认图形设置经常被用户诟病。虽然2.0版本已经有了很大改善,但是掌握自定义配置的方法可以让我们打造自己的艺术风格。 配置图形 我们可以通过修个单个图形配置,使得最终图…

CH01_适应设计模式

Iterator模式(迭代器模式) 迭代器模式(Iterator),提供一种方法,顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。 类图结构 说明 Iterator(迭代器) 该角色负责定义按…

洛谷P1049装箱问题 ————递归+剪枝+回溯

没没没没没没没没没错,又是一道简单的递归,只不过加了剪枝,我已经不想再多说,这道题写了一开始写了普通深搜,然后tle了一个点,后面改成剪枝,就ac了,虽然数据很水,但是不妨…

基于光纤环形激光器的optisystem仿真及其传感应用

近年来,光纤传感器在航空航天领域,工业制造,医疗等领域引起了越来越多的关注,因为他们体积小,结构简单,灵敏度高,抗电磁干扰强,防腐性能好的特点。各种各样的传感器结构被设计出来&a…

VMware Workstation Pro 安装虚拟机,无法打开此虚拟机电源 因为它需要使用x86架构,架构冲突

本来我下的iso文件,可以看到他是64的,但是ubuntu没有86的,我只能去下载cenos的 用这个去安装虚拟机就好了

在 vue3 中使用 Recorder 实现录音并上传(mp3、wav)兼容 PC 和移动端

一、Recorder 介绍 使用 Recorder插件可以在网页中进行录音。生成 blob 文件并可以自定义上传,同时,录音过程中会显示可视化波形,同时能够做到兼容PC端、Android、和iOS,十分好用! Recorder github 首页 插件效果展…

深入理解MySQL索引及事务

✏️✏️✏️今天给各位带来的是关于数据库索引以及事务方面的基础知识 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手&#…

[Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具

一.Docker Swarm集群raft算法讲解 Raft :一致性算法,在保证大多数管理节点存活的情况下,集群才能使用, 所以就要求如果集群的话, manager 节点必须 >3 台 ,如果是两个台,其中一台宕机&#…

安卓 Android Studio更换app的图标

大概完成了一个app,在测试机的界面app的icon显示的是默认安卓图标,找了一个简单的更换方法 打开 Androidmanifest.xml 文件,在 application 找到代码 android:icon"mipmap/ic_launcher" 按下Ctrl鼠标左键转到相应位置 如图在背景…

BUUCTF [GXYCTF2019]gakki 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,解压得到一张.jpg图片。 解题思路: 1、放到010 Editor中看一下,找到rar压缩包的文件头。使用Kali中的binwalk工具…

selenium的基础语法

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️山水速疾来去易,襄樊镇固永难开 ☁️定位页面的元素 参数:抽象类By里…

迈巴赫S480升级电动后门 手势控制开关 更加方便

安装了电动后门的迈巴赫S480,从原来的触摸门把手和门内拉手开关门,增加了钥匙控制、前排显示屏控制、后门按键开关控制、后排娱乐屏控制等多种开关门方式,将一个待客之礼体现出多种不一样的尊贵感受。 中控显示屏由驾驶者控制,可以…

ruoyi-plus-vue docker 部署

本文以 ruoyi-vue-plus 5.x docker 部署为基础 安装虚拟机 部署文档 安装docker 安装docker 安装docker-compose 配置idea环境 上传 /doicker 文件夹 到服务器;赋值 777权限 chmod -R 777 /docker idea构建 jar 包 利用 idea 构建镜像; 创建基础服务 docker…

[SWPUCTF 2021 新生赛]PseudoProtocols

题目很明确了就是伪协议 php://filter/convert.base64-encode/resourcehint.php 提交的伪协议的内容需要是 I want flag,就会echo flag 方法1:adata://text/plain,I want flag 方法2:adata://text/plain;base64,SSB3YW50IGZsYWc

NET 8.0 中新的变化

1性能提升 .NET 8在整个堆栈中带来了数千项性能改进 。默认情况下会启用一种名为动态配置文件引导优化 (PGO) 的新代码生成器,它可以根据实际使用情况优化代码,并且可以将应用程序的性能提高高达 20%。现在支持的 AVX-512 指令集能够对 512 位数据向量执…

从零开始学优惠券样式代码编写,让你的网站焕然一新!

样式1&#xff1a; 代码实例&#xff1a; <div class"box"><div class"itemBox"><div class"leftBox">全额抵扣</div><div class"rightBotton"><button>立即使用</button></div><…