FFTC驱动软件概要设计.doc_第1页
FFTC驱动软件概要设计.doc_第2页
FFTC驱动软件概要设计.doc_第3页
FFTC驱动软件概要设计.doc_第4页
FFTC驱动软件概要设计.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FFTCFFTCFFTC 协处理器概要设计协处理器概要设计协处理器概要设计协处理器概要设计 书书书书 Version: 0.1 1. 版权声明版权声明 北京星河亮点技术股份有限公司 2012。版权所有,保留一切权利。 未经北京星河亮点技术股份有限公司的书面许可,任何人或组织不得以任何形式修改或摘录 本文档的任何部分。 Copyright 2012 Beijing Starpoint Technology Company Limited. All Rights Reserved. No part of this manual may be reproduced in any form, written or otherwise, without the express written permission of Beijing Starpoint Technology Company Limited. 2. 修改记录修改记录 修改人修改人日期日期修改内容修改内容版本号版本号 石楠2012.6.28创建文档0.1 3. 目录目录 1. 版权声明版权声明 II 2. 修改记录修改记录 .III 3. 目录目录I 4. 引言引言.2 4.1 编写目的 2 4.2 定义2 4.3 参考资料 2 5. 概述概述.3 5.1 硬件组成 3 5.2 特点3 5.3 FFTC 驱动功能3 5.4 CPPI/QM 用法.4 6. 设计设计.5 6.1 数据结构 5 6.2 API 使用5 6.2.1 系统级初始化.5 6.2.2 应用级初始化.5 6.2.3 发送通路.7 6.2.4 接收通路.8 6.2.5 关闭释放 FFTC 资源.8 6.2.6 其它.8 6.3 资源分配 9 7. 单元测试单元测试11 4. 引言引言 4.1编写目的编写目的 本文档给出 EBP 项目中 DSP C6670 FFTC 协处理器的设计及使用方法。便于 DSP 研 发人员进行协处理器的开发。 4.2项目背景项目背景 EBP 使用了 C6670 DSP 作为基带系统处理器。C6670 DPS 带有 3 个 FFTC 协处理器, 可以支持 LTE 以及 WIMAX 的 FFT/IFFT 处理。为了使应用程序能够快捷有效的利用 FFTC,决定开发 FFTC 驱动程序。用 FFTC 代替目前产品中的软件实现,对提高系统性能 有重大意义。 4.3定义定义 FFTFast Fourier Transform IFFTInverse Fase Fourier Transform CPPICommunications Port Programming Interface QMQueue Manager QMSSQueue Manager Subsystem HCHardware Coprocessor PSProtocol Specific DMADirect Memory Access SOP Start of Packet FDQFree Descriptor Queue CPCyclic Prefix LTELong Term Evolution 4.4参考资料参考资料 1.EBP 系统设计书 v0.1 2.Multicore Navigator (CPPI) for KeyStone Devices Users Guide (Rev. D) 3.FFTC for KenStone Devices Users Guide 4 FFTC_SDS 5. 软件概述软件概述 5.1功能概述功能概述 FFTC 驱动软件为应用程序提供一系列 API,供应用程序控制 FFTC 协处理器完成上下 行 FFT/IFFT 处理,从而代替了应用通过软件程序实现算法,有利于提高处理效率和缩减 开发时间。 高度的封装 该驱动程序封装了 Packet DMA、操作系统、多核同步等实现,应用无需关注这些细节, 只需要关注算法相关的配置。 独立的操作系统 操作系统的独立可以使驱动程序方便从一个操作系统移植到另一个操作系统。 多核意识 C6670 FFTC 协处理器的驱动程序支持多核,可以在多核系统上运行。应用在调用驱动 API 时,无需考虑跨核问题。 5.1.1FFTC 实现功能实现功能 实现 FFT 与 IFFT LTE 中的 7.5kHz 频移 添加/去除 CP 补零操作 对每级蝶形运算实现动态或用户自定义方式的缩放 5.1.2FFTC 驱动功能驱动功能 FFTC 协处理器由如下子模块构成: 配置寄存器 FFTC 有 4 组配置寄存器。4 组寄存器的设置是相同的,且都包含 5 个寄存器。每 组对应一个发送队列。配置寄存器用于设置 DFT/IDFT 计算时所需的配置参数。 FFT engine 执行 DFT/IDFT 运算处理的模块。 CPPI DMA FFT engine 的 I/O 口,FFTC 使用多核导航仪接收输入数据,发送输出数据。多核 导航仪搬运数据时,我不需要 CPU 的参与。 FFTC 流接口 FFTC 流接口用于连接多核导航仪与 FFT engine。 FFTC 调度器 FFTC 多核导航仪给 FFT engine 提供了多个发送队列。FFTC 调度器的任务是要 根据优先级选择出这些发送队列里下一个将要处理的数据包。 FFT engine 与 CPPI/QM 子系统有着密切的关系,CPPI/QM 子系统是用来发送 FFT 请 求和接收输出结果的唯一途径。 5.2组成与结构组成与结构 5.2.1硬件组成硬件组成 FFTC 的驱动程序包括三个功能: FFTC 外设管理 驱动程序初始化 FFTC 例程,并管理 FFTC 例程的配置及资源。驱动将每个 FFTC 例 程相互间视为独立的,并分别管理它们。 CPPI 资源管理 当需要如 CPPI 通道,流,buffer 描述符等内部资源时,驱动程序将对所有 CPPI 资源 进行管理,对应用程序仅提供相应配置。 QMSS 队列管理 当需要使用队列来发送和接收数据时,驱动会建立并管理这些队列。 5.2.2软件结构软件结构 FFTC 驱动软件结构为: FFTC 的驱动分两层,低级驱动(LLD, Low Level Driver)和高级驱动(HLD, High Level Driver) 。低级驱动通过调用 CSL API 直接访问芯片寄存器;高级驱动则以功能为出 发点,对低级驱动进行封装,对上层应用提供功能 API。考虑到可调可测需求,LLD 也对 上层应用开放。 5.3软件外部环境软件外部环境 5.3.1硬件方面硬件方面 本软件运行于 EBP 基带板上的 C6670DSP。 5.3.2软件方面软件方面 该驱动软件基于 TI 提供的开发包(PDK)进行开发。开发包版本为: pdk_C6670_1_0_0_20。IDE:Code Composer Studio 5.2。 5.4设计约束设计约束 5.4.1需求约束需求约束 FFTC 驱动软件设计基于 EBP 系统设计框架。 6. 驱动软件设计驱动软件设计 6.1数据结构数据结构 FFTC 发送对象 FFTC 发送对象是利用驱动程序来发送或提交发送请求数据时使用的。 发送对象决定了用于提交请求的发送队列号、发送队列打开的模式(共享/专用) 、 发送对象也被发送描述符用来提交请求数据。 一个应用程序建立一个发送对象。 当由驱动程序来管理发送描述符时,驱动程序为发送对象创建一个发送自由描述 符 队列,同时为其分配 buffer,并预先将发送自由描述符及附带的 buffer 放在发送自 由描 述符队列里。 FFTC 接收对象 FFTC 接收对象是利用驱动程序来接收 FFT engine 处理后的输出结果。 接收对象了决定用于接收处理结果的接收队列号、接收处理结果的方式(中断 /poll) 、用于接收对象的终端配置、流配置。 一个应用程序建立一个接收对象,不同的接收对象对应一个接收队列,但是多个 应用程序可以共用同一个流和接收自由描述符队列。 FFTC 例程对象 FFTC 例程对象用于保存 FFTC 例程号。 一个 FFTC 例程对象包含如下数据结构:FFTC 发送对象、FFTC 流对象、FFTC 接收对象信息。 C6670 中,FFTC 有 3 个例程(FFTC_A、FFTC_B、FFTC_C) 。每个例程对应有 4 个 发送队列(TxQ) ,4 个接收队列(RxQ),8 个流(flow)。 6.2资源分配资源分配 FFTC 协处理器用到的资源有:发送队列,接收队列,收集器通道,流。对资源合理 的分配有利于高效的使用协处理器。C6670 中有 3 个 FFTC 协处理器,合理的分配这 3 个 协处理器也是必要的。 C6670 共有 8192 个队列,其中用于 FFTC 的 3 个例程的发送队列已做了明确的划分, FFTC 协处理器将能够被高优先级收集器使用的队列用作接收队列,需要对接收队列和收 集器通道进行分配。且每个接收队列都有其对应的一个中断事件,每个接收队列和中断事 件映射到一个特定 DSP core。 设计中使用一个变量名为 process ID 的参数来映射使用的资源。process ID 的取值为 011,一个 process ID 对应一个 FFTC 进程,其映射的资源包括:FFTC 例程号,发送队列 号,接收队列号,对应于接收队列的中断事件号,接收端使用的收集器通道号。资源分配 如表 6-1 中所示。 表 6-1 FFTC 资源分配 核号FFTC 0不使用 1不使用 FFTC_Aprocess ID:03 ACC Channel: 2,6,10,14 Rx Queue: 706,710,714,718 Tx Queue:688691 Event:48,49,50,51 FFTC_Bprocess ID:47 ACC Channel: 18,22,26,30 Queue: 722,726,730,734 Tx Queue:692695 Event:52,53,54,55 2 FFTC_C不使用 FFTC_A不使用 FFTC_B不使用 3 FFTC_Cprocess ID:811 ACC Channel: 3,7,11,15 Queue: 707,711,715,719 Tx Queue:864867 Event:48,49,50,51 6.3CPPI/QM 在 FFTC 协处理器架构中,多核导航仪(CPDMA)用来使能 FFT engine,并用一种简 单的方式使 FFT engine 被各个核共享,并访问各个核上运行的多个应用。为此,给每个 FFTC 例程的 CPDMA 分配 4 个 CPPI/QM 队列,8 个 CPPI 流。 FFTC 发送队列 FFTC 发送队列属于 QMSS 队列。一个 FFTC 例程有 4 个发送队列,每个发送队列可 以被设置为不同的优先级。 发送队列有两种模式:共享和专用。 专用模式下,发送队列仅在队列打开时配置一次。应用程序运行中所有的 FFT 请求都 使用相同的配置。当应用的 FFT 数据有固定的模式时,适合采用专用模式。这种模式的缺 点是队列设置了配置后,队列的配置无法更改,只有关闭队列并重新打开队列后,才能够 更改队列的配置。 共享模式下,在队列使用时进行配置,这种模式下,多个应用程序的不同的 FFT 请求 可以使用同一个队列,因此每个包可以通过独立的配置来处理具体的数据包。共享模式适 用于不固定的 FFT 数据配置。这种模式的缺点是每个由驱动发送给 engine 的 FFT 请求都 必须配置其所使用的 FFT 队列。 FFTC CPPI 流 FFTC CPPI 流指定了输出 FFT 结果需要的目标队列和将输出结果组合在一起的接收自 由描述符队列。FFTC CPDMA 中有 8 个流,每个流都对应有一个目标队列号。运行过程中, 流不能被重新配置,除非关闭后重新打开进行配置。 6.4数据格式数据格式 FFTC 的输入输出数据格式为 32bit 的复数数据,其中包括 16bit 实部,16bit 虚部。 7. 驱动驱动 API 设计设计 7.1使能使能 默认情况下,FFTC 处于断电状态。要使用 FFTC,必须调用 HC_FftcEnable()对 FFTC 恢复供电。 7.2系统级初始化系统级初始化 使用 FFTC 驱动程序时,首先要进行初始化。在系统启动时调用 API 函数 “HC_FftcInit()” 。 此 API 函数将进程号 process ID 作为输入参数,根据当前 FFTC 应用程序使用的进程 号 process ID,根据资源分配可以获取当前 FFTC 应用程序使用的例程号,系统初始化会对 将要使用的 FFTC 例程进行初始化。初始化过程中会打开此 FFTC 例程的 CPDMA,并建 立全局配置寄存器并初始化所有例程相关的内部数据结构。 7.3应用级初始化应用级初始化 FFTC 系统初始化后,需要对应用程序进行初始化。 应用级初始化首先调用 API 函“HC_FftcOpen()“设置当前 FFTC 应用程序使用的描述符 配置,同时打开相应驱动程序。对 FFTC 应用程序使用的自由描述符进行初始化时, 初始化内容包括一个 FFTC 应用程序需要使用的自由描述符的个数,描述符的内存区 域,描述符的大小,描述符的类型(描述符有两种类型:host 和 monolithic。设计中 FFTC 应用程序使用的描述符均采用 host 类型) 。然后打开驱动,分配并建立一些自由 描述符队列(FDQ) ,这些 FDQ 将用于发送对象,接收对象。初始化成功后,API 函 数会返回一个句柄,这个句柄标识了本次应用程序所使用的 FFTC 例程号以及建立并 使用的自由描述符的相关信息,句柄中带出的信息在后续处理过程中会继续使用。 发送端初始化 发送端主要是向 FFT engine 提交需要进行处理的当前 FFTC 应用程序请求。 当需要进行发送请求时,首先需要对发送端进行初始化。通过调用 API 函数 “HC_FftcTxOpen()“,建立一个发送对象“Tx Object”来给 FFT engine 发送请求。 初始化中,根据当前 FFTC 应用程序使用的进程号 process ID,确定发送端使用的发送 队列号,并根据描述了 FFT 具体参数配置的数据结构,分配这个发送对象需要使用的 buffer 大小。同时,设置发送队列的的打开模式(共享/专用,设计中均采用共享模式) ,以 及用于这个发送对象的发送自由描述符的个数(目前配置为 1 个 FDQ) ,自由描述符的类 型等。 对于发送 FFT 请求所需的发送自由描述符和 buffer,设计中采用由 FFTC 驱动程序管 理的方式。 对于 PS 信息,发送端为不向接收端发送 PS 信息。 在发送端初始化成功后,会得到关于发送对象的句柄,这个句柄在发送端提交发送请 求时使用。 接收端初始化 当 FFT engine 处理完发送端提交的请求后,接收端为了能够正确接收 FFT engine 的输 出结果,需要通过调用 API 函数“HC_FftcRxOpen()“进行接收端初始化,建立一个接收对象 “Rx Object”来指示 FFT 后的结果需要向哪个 buffer 输出。 接收端初始化时,根据当前 FFTC 应用程序使用的进程号 process ID,确定接收端使用 的接收队列号,收集器通道号,中断事件号,并根据描述了 FFT 具体参数配置的数据结构, 分配这个接收对象需要使用的 buffer 大小。 接收端建立一个接收对象时,对于接收流或接收自由描述符队列都需要重新建立,而 不是采用已有的流;由 FFTC 驱动程序建立接收自由描述符队列和流;采用 FFTC 驱动程 序分配并管理收集器列表。 对于 PS 信息,接收端不接收发送端的 PS 信息。 接收对象建立成功后,根据由 process ID 获得的相应的 FFTC 中断事件号,在初始化 中为这个接收对象注册触发接收端接收结果时需要使用的中断。 7.4发送通路发送通路 发送通路用于提交一个 FFT 处理请求。成功建立了发送对象后,调用 API 函数为 “HC_FftcSend()” ,建立一个发送描述符,并将其发送给 FFT engine 进行处理。发送过程 采用驱动管理发送描述符的方式。发送通路的步骤如下: 首先,根据已获得的发送对象、DFT 块大小配置信息、FFTC 相关参数配置、接收端 放置处理结果的接收流等信息,获取发送所需的数据 buffer,数据 buffer 的长度。同时构 造一个 FFTC 控制头,将其添加到所获取的数据 buffer,再将发送描述符附着在数据 buffer 上。 最后,将发送对象中的发送自由描述符放入发送队列,发送至 FFTengine。此时,发 送请求即已提交完成。 7.5接收通路接收通路 接收通路是用来接收 FFT engine 处理完发送端提交的 FFT 请求的输出结果。 接收端采用收集器方式。驱动在接收通路使用了收集器固件(Accumulator Firmware) , 收集器可以从接收队列中搜集处理完的数据包,并存放在收集器缓存中。当搜集的数据包 达到指定数量后,收集器向应用发送中断,通知应用从缓存中取出数据包。接收端使用驱 动提供的 API 函数“HC_FftcRecv()”实现,该 API 内部由于等待信号量阻塞任务,当收集 器得到数据包发起中断处理,信号量将得以释放,此时,接收端的处理则可以继续运行。 最后需要将当前 FFTC 应用程序接收端使用的接收描述符进行释放,将其归还给接收自由 描述符队列。 7.6关闭释放关闭释放 FFTC 资源资源 所有的 FFTC 应用程序在运行后均需要对驱动资源进行释放和关闭,方法如下: 发送对象创建并使用完之后,需要对其使用的发送描述符和分配 buffer 进行释放,同 时关闭这个发送对象。通过调用 API 函数“HC_FftcTxClose()” ,在 API 中对 FFTC 应 用程序所使用的发送队列的计数器进行递减,当计数达到零时,驱动关闭所有队列, 并清除所有相关的资源。 接收对象创建并使用完之后,需要通过调用 API 函数“HC_FftcRxClose()”,释放这个 接收对象所使用的 buffer 和描述符,并关闭与其相关的发送队列和接收流。 随后,调用 API 函数“HC_FftcClose()” ,关闭由当前 FFTC 应用程序通过 “HC_FftcOpen()”打开的 FFTC 例程。 最后释放驱动程序,调用 API 函数“HC_Fftc_deInit()“。当 FFTC 例程的计数器达到零 时,驱动关闭 FFTC 多核导航仪,并复位 FFTC engine 的状态。此时,系统中没有可 以供应用程序使用 FFTC 多核导航仪,除非对 FFTC 再次进行初始化。 7.7其它其它 对于某个 FFTC 队列的寄存器参数,可以通过调用 API 函数“HC_FftcCfgParams“配置 该队列的目标队列寄存器、缩放和移位寄存器、循环前缀寄存器 控制寄存器、LTE 频移寄存器。 需要清除 FFTC 错误中断使能和设置寄存器中相应的各种中断使能位时,调用 API 函 数“HC_FftcDisableErrInt“。 使能错误状态位时,调用 API 函数“HC_FftcEnableErrInt“. 读取 FFTC 块的状态寄存器相关信息时,通过调用 API 函数“HC_FftcGetBlockStatus“ 获得。 获取 FFTC 的相关错误信息时,调用 API 函数“HC_FftcGetErrInfo“。 配置 DFT 块大小列表时,调用 API 函数“HC_FftcCfgDftSizeList“。 7.8API 调用流程调用流程 对于一个 FFTC 应用程序,主要包括对 FFTC 驱动的使能,初始化,FFTC 发送端、接 收端处理,以及最后的资源关闭与释放。FFTC 应用对驱动 API 的调用过程如图 6-1 所示。 App Init 当前core是否为 master core? HC_FftcInit() HC_FftcOpen() HC_FftcTxOpen() HC_FftcRxOpen() HC_FftcSend() HC_FftcClose() HC_FftcRecv() HC_FftcRxClose() HC_FftcTxClose() FFT Rx Open failed? FFT Tx Open failed? YES NO FFT send failed? FFT receive failed? YES YES YES YES HC_FftcEnable() NO NO NO NO 图 6-1 FFTC API 调用步骤 8. 测试测试 8.1单元测试单元测试 分别对每一个 FFTC 对外提供的 API 进行,当函数运行正确时返回 0、错误时返回 1, 该单元测试主要是验证在给正确和错误的输入时能否返回预期的值。 8.2功能测试功能测试 FFTC 协处理器的功能测试,是利用 FTTC 的驱动的 API 在 C6670 多核情况下完成 FFT 运算的过程。 有前面章节可知:一个进程号 process ID 对应可得到 FFTC 例程号,发送端使用的队 列号,接收端使用的队列号,对应于接收队列的中断 eventId,发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论