一种使用环形Buffer和自动回收描述符的AIF接收数据处理
方法
技术领域
本发明涉及移动通信的技术领域,更具体地说,涉及一种使用环形Buffer和自动回收描述符的AIF接收数据处理方法。
背景技术
随着人们对通信要求的逐步提高,通信技术在近些年来得到飞速的发展,在经历2G(2rd Generation,第二代移动通信)语音通信、3G(3rd Generation,第三代移动通信)数据与语音通信后,LTE(Long Term Evolution,长期演进)在全球也得到大范围的商用,通信技术的不断革新,刺激越来越复杂的DSP(Digital Signal Processing,数字信号处理器)芯片被开发和应用,这些DSP芯片一方面需要支持更高的基带信号处理速率,另一方面需要更多的通用外设端口来实现数据的互传,如ETH(Ethernet,以太网)、AIF等。随着基站系统逐渐标准化和模块化,越来越多的芯片厂家将一些接口进行规范化,基带处理单元和射频单元之间也逐渐形成了标准的接口,TI公司提供的C66x系列多款芯片都有AIF接口作为支撑DSP基带与射频单元之间的数据接口,AIF驱动接口是DSP芯片传输上下行链路中基带数据的高速接口,支持OBSAI(Open Base Station Architecture Initiative)标准和CPRI(Common Public Radio Interface)标准,同时该驱动在数据传输过程中还需要用到描述符、PacketDMA(Packet Direct Memory Access,一种基于包的直接内存访问技术,简称PKTDMA)、环形Buffer(缓存)等。
描述符是一种数据结构,用于承载消息和消息中包含的数据,分为2类:整体(Monolithic)描述符和宿主(host)描述符,如图1(a)和图1(b)所示。整体描述符的数据直接存在描述符结构体中,多个整体描述符间不能通过指针进行链接,而且整体描述符因为其数据结构的特点,两个整体描述符间的数据必然存在间隙,若想使用多个整体描述符中的接收数据,则需要提前进行数据的拼接,这就增加了CPU(Central Processing Unit,中间处理器)的开销。而宿主描述符之间能通过指针进行link(链接),每个宿主描述符可以通过一个地址来指向任意合法的内存地址作为接收Buffer,若需要将一块连续的内存来存储空口数据,只需要设置每个宿主描述符对应的数据起始地址和长度即可,考虑到一般DSP对空口数据的实际处理流程,往往需要处理连续多帧的数据,所以采用宿主描述符能有效的解决多帧空口数据存放不连续,需要额外进行数据拼接,增加系统开销的问题。
发明内容
本发明的主要目的在于克服现有技术的缺点与不足,提供一种优化配置AIF接收数据的处理方法,通过使用环形Buffer解决接收到的空口数据存储位置不连续的问题。
为了达到上述目的,本发明采用以下技术方案:
本发明提供了一种使用环形Buffer和自动回收描述符的AIF接收数据处理方法,包括下述步骤:
S1、申请一个接收空闲队列RxFDQ,RxFDQ用于将初始化完毕的接收描述符压入到该队列中,
S2、然后配置接收Flow,将接收Flow中的接收目的队列配置成接收空闲队列,使能AIF接收数据,当接收PKTDMA检测到AIF中有数据过来时,从RxFDQ中弹出一个接收描述符用于空口数据的接收;
S3、接收完毕,根据接收Flow的配置,将接收完毕的包压入到接收目的队列中,同时,在配置接收Flow时,指定其接收目的队列为接收空闲队列,这样当接收PKTDMA收到一个包后,会自动把这个包对应的描述符压入到接收空闲队列的尾部,等接收到N个数据包,填充完环形Buffer后,又可以自动使用第一个描述符了,这样不断接收N帧连续的空口数据,在保证接收数据的连续性时减少了内存碎片产生。
作为优选的技术方案,步骤S1中,在初始化时,具体为:
S11、先完成Multicore Navigator的初始化,具体为:
第一步完成QMSS子系统的初始化,包括对QMSS的RAM空间进行初始化、描述符内存初始化,QMSS相关寄存器的初始化;
第二步完成接收PKTDMA的初始化,完成接收PKTDMA使能,对应接收通道的映射;
S12、完成接收空闲队列的初始化,具体为;
第一步申请接收空闲队列,根据系统需求绑定每个队列空闲描述符的个数;
第二步初始化接收描述符,根据系统需求,缓存N帧数据需要大小的环形Buffer,则需要为系统预留相同大小的环形Buffer;
S13、完成AIF驱动的初始化;
第一步配置AIF接收Flow,接收flow相当于一个指令集,用于指示接收PKTDMA对接收到数据包后的处理;
第二步使能AIF接收侧功能,完成AIF的Serdes与射频端Serdes的同步;
第三步接收DSP外部通过Serdes链路发送过来的空口数据,AIF将接收到的空口数据自动存放到AIF内部接收FIFO。
作为优选的技术方案,步骤S2中,在AIF接收数据流程中,通过接收PKTDMA将AIF缓存在驱动内部FIFO中的数据搬移到接收描述符指定的内存环形Buffer中去,接收时,接收PKTDMA先从接收空闲队列中去弹出一个描述符,解析描述符的数据结构,获取接收环形Buffer的起始地址,然后将AIF缓存在驱动内部FIFO中的数据搬移到接收环形Buffer,根据描述符中指示包的长度,当完成整个包的数据搬移时,接收PKTDMA会将接收描述符压入到接收目的队列中,而接收目的队列和接收空闲队列都指向同一个队列,故接收PKTDMA在将接收描述符压入到接收空闲队列中时,实际上已经完成了描述符的自动回收。
作为优选的技术方案,所述接收PKTDMA存在于Multicore Navigator多核领航组件中,Multicore Navigator是TI Keystone架构中的一个组件,能帮助实现数据的移动,提供核间、网络间和外设间的通信,所述接收PKTDMA由Queue Manager Subsystem队列管理子系统和多个配套的接收PKTDMA组成,QMSS是一个负责对队列进行加速管理的硬件子模块,它包括多个队列,内存区和RAM空间,不同的队列完成不同的功能,在多个队列中,有专门用于管理AIF发送和接收的队列,使用时需要对这些队列进行初始化操作,通过向模块中映射好的RAM空间写一个32位的描述符地址,可将一个数据包压入到队列中,而如果在该队列中相同位置进行读取,则可以完成一个数据包的弹出队列,在配置接收PKTDMA时,需要配置接收Flow流,所谓接收Flow,就是一个指令集,用于指示接收PKTDMA对接收到的包做何种操作,在配置接收Flow时,除了使能接收Flow,还需要配置接收目的队列,用于将接收到的包压入到接收目的队列中。
作为优选的技术方案,接收空闲队列和接收目的队列是同一个队列,通过配置接收目的队列指向接收空闲队列,则可在接收PKTDMA将接收包压入到接收目的队列后直接完成描述符的回收,不需要CPU的干预。
作为优选的技术方案,接收空闲队列和接收目的队列是两个不同队列描述符状态迁移图,描述了该方式下描述符在两个队列中描述符的状态,接收第一个包时需要先从接收空闲队列弹出一个描述符,解析接收目的地址,开始搬移数据,然后把接收完成的第一个包压入到接收目的队列中,如果不进行回收,则接收目的队列中描述符逐渐增多,接收空闲队列中描述符逐渐变小,必须在接收空闲队列中描述符个数为0之前回收接收目的队列中的描述符,否则会造成后接收空闲队列没有足够描述符导致接收数据的丢失。
作为优选的技术方案,步骤S3中,所述环形Buffer是指:收包过程中接收空闲队列和接收目的队列是同一个队列下描述符的状态,介绍每次接收一帧数据后描述符在接收空闲队列中位置的变迁,由于描述符是和接收环形Buffer一一映射,该状态迁移同样意味着接收环形Buffer的状态迁移,接收完一轮数据后,状态又回到初始状态,就像一个环形一样,从一个起点转了一圈又回到原来的起点。
本发明与现有技术相比,具有如下优点和有益效果:
本发明利用环形Buffer来实现接收空口数据的连续存储,通过配置接收目的队列和接收空闲队列指向同一个队列,避免每次收到一包数据后需要从接收队列弹出描述符,再压入回接收空闲队列,简化了数据包接收处理的流程,同时不需要产生中断通知CPU去回收描述符,减少对CPU的开销。而且,当接收过程出现总线拥塞,该方法还能保证接收环形Buffer的相对位置保持不变,进而保证接收到的空口数据帧号的连续性,对后续空口数据的解码带来了极大便利。
附图说明
图1(a)、图1(b)分别是宿主描述符结构信息图和整体描述符结构信息图;
图2是本发明环形接收Buffer结构示意图;
图3是本发明收包过程中接收空闲队列和接收目的队列是同一个队列下描述符的状态示意图;
图4是本发明接收空闲队列和接收目的队列是两个不同队列描述符状态迁移图。
具体实施方式
下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。
实施例
本实施例一种使用环形Buffer和自动回收描述符的AIF接收数据处理方法,采用宿主描述符,初始化成一条link来构成一块环形Buffer,本发明采用自动回收描述符方案,由QMSS子系统自动完成接收描述符的回收,具体实现方式包括下述步骤:
S1、申请一个接收空闲队列,该接收空闲队列简称RxFDQ,RxFDQ用于将初始化完毕的接收描述符压入到该队列中;初始化包括下述步骤:
S1.1、先完成Multicore Navigator的初始化,说明如下:
第一步完成QMSS子系统的初始化,包括对QMSS的RAM空间进行初始化、描述符内存初始化,QMSS相关寄存器的初始化等;
第二步完成接收PKTDMA的初始化,主要完成接收PKTDMA使能,对应接收通道的映射;
S1.2、完成接收(空闲)队列的初始化,说明如下:
第一步申请接收空闲队列,根据系统需求绑定每个队列空闲描述符的个数,假设DSP系统需要最大缓存4帧空口数据,每帧空口数据的长度为307200*4Byte,则需要在申请接收空闲队列时申请4个接收描述符,每个接收描述符绑定一块长度为307200*4Byte的环形Buffer,如图2所示,将一块连续的内存按照接收帧的长度均分成N份,这里以4份为例,假设接收的空口数据是LTE空口数据,根据LTE无线协议约定,LTE的无线帧长为10ms,则每个环形Buffer的长度为307200*4Byte。每个环形Buffer被挂接在一个宿主描述符上,当Host_0宿主描述符被接收PKTDMA从接收空闲队列弹出出来时,第一帧数据则被存放在环形Buffer0中,当Host_1宿主描述符被接收PKTDMA从接收空闲队列弹出来时,第二帧数据则被存在环形Buffer1中,以此类推,当接收第4帧空口数据时,则将此帧空口数据存放在环形Buffer3中,这时整块Buffer中已经存满了4帧连续的空口数据,当第5帧数据到来时,根据接收空闲队列的特性,Host_0宿主描述符会被弹出来用于接收第5帧数据,这时从接收帧的顺序来看,接收环形Buffer就像一个环形,第4帧后的数据又指向了环形Buffer0的位置,这就是环形Buffer的由来。
第二步初始化接收描述符,根据系统需求,缓存4帧数据需要4*307200*4Byte大小的环形Buffer,则需要为系统预留一块这么大的环形Buffer,假设预留的环形Buffer起始地址为0x80000000,则4个描述符初始化时对应的环形Buffer地址分别为0x80000000、0x8012c000、0x80258000、0x80384000,长度都为307200*4Byte,然后将此4个接收描述符逐一压入到接收空闲队列。
S1.3、完成AIF驱动的初始化,说明如下:
第一步配置AIF接收Flow,接收flow相当于一个指令集,用于指示接收PKTDMA对接收到数据包后的处理,通过配置接收flow中的接收目的队列指向接收空闲队列,接收PKTDMA会将接收完成的包压入到接收空闲队列的尾端,下次接收新的包时,则会从第二个接收描述符去取,当接收到4个包后,再次接收则会自动取第一个描述符用于接收,这时只需要保证在第5帧数据到来前完成第一帧数据的处理即可,这样还能给系统预留更多的时间来完成接收帧的处理,如图3所示,收包过程中接收空闲队列和接收目的队列是同一个队列下描述符的状态,介绍每次接收一帧(一个包)数据后描述符在接收空闲队列中位置的变迁,由于描述符是和接收环形Buffer一一映射,该状态迁移同样意味着接收环形Buffer的状态迁移,从图中可以看到接收完一轮4帧数据后,状态又回到初始状态,就像一个环形一样,从一个起点转了一圈又回到原来的起点,这就是环形Buffer的由来;
第二步使能AIF接收侧功能,完成AIF的Serdes(Serializer/DeSerializer,串行器/解串器)与射频端Serdes的同步;
第三步接收DSP外部通过Serdes链路发送过来的空口数据,AIF将接收到的空口数据自动存放到AIF内部接收FIFO,然后通知接收PKTDMA去取数据,接收PKTDMA先从接收空闲队列中的头部弹出一个接收描述符,解析接收描述符,得到接收环形Buffer的起始地址和包的长度,然后将AIF内部接收FIFO中的数据搬移到目的环形Buffer,完成整个包的搬移后,接收PKTDMA再将接收描述符压入到接收目的队列的尾部,实际上就是接收空闲队列的尾部,然后会产生一个中断,通过中断计数能知道当前AIF接收数据的最新位置,DSP在根据最新数据的位置完成空口数据的解析处理。
S2、然后配置接收Flow,将接收Flow中的接收目的队列配置成接收空闲队列,使能AIF接收数据,当接收PKTDMA检测到AIF中有数据过来时,则会从RxFDQ中弹出一个接收描述符用于空口数据的接收;
S3、接收完毕,则会根据接收Flow的配置,将接收完毕的包压入到接收目的队列中,同时,在配置接收Flow时,指定其接收目的队列为接收空闲队列,这样当接收PKTDMA收到一个包后,会自动把这个包对应的描述符压入到接收空闲队列的尾部,等接收到N个数据包,填充完环形Buffer后,又可以自动使用第一个描述符了,这样不断接收N帧连续的空口数据,在保证接收数据的连续性时减少了内存碎片产生。
本实施例还需使用接收PKTDMA,而接收PKTDMA存在于Multicore Navigator(多核领航)组件中,Multicore Navigator后面简称Navigator(领航者),是TI Keystone架构中的一个组件,能帮助实现数据的移动,提供核间、网络间和外设间的通信,本实施例利用它来管理外设间的通信。在AIF接收数据流程中,通过接收PKTDMA将AIF缓存在驱动内部FIFO(First In First Out,先入先出缓存)中的数据搬移到接收描述符指定的内存环形Buffer中去。接收时,接收PKTDMA先从接收空闲队列中去弹出一个描述符,解析描述符的数据结构,获取接收环形Buffer的起始地址,然后将AIF缓存在驱动内部FIFO中的数据搬移到接收环形Buffer,根据描述符中指示包的长度,当完成整个包的数据搬移时,接收PKTDMA会将接收描述符压入到接收空闲队列中,供CPU从接收空闲队列中去弹出接收描述符,再根据接收描述符中的接收环形Buffer读取接收完毕的数据,读完数据后则将接收描述符压入到接收空闲队列,完成接收描述符的回收处理,如图4所示。Navigator主要由Queue ManagerSubsystem(QMSS,队列管理子系统)和多个配套的接收PKTDMA组成。QMSS是一个负责对队列进行加速管理的硬件子模块,它包括多个队列,内存区和RAM(Random Access Memory,随机存取存储器)空间,不同的队列完成不同的功能,在多个队列中,有专门用于管理AIF发送和接收的队列,使用时需要对这些队列进行初始化操作。通过向模块中映射好的RAM空间写一个32位的描述符地址,可以将一个数据包(一个描述符和绑定的数据环形Buffer的组合)压入到队列中,而如果在该队列中相同位置进行读取,则可以完成一个数据包的弹出队列,在配置接收PKTDMA时,需要配置接收Flow(流),所谓接收Flow,简单来说就是一个指令集,用于指示接收PKTDMA对接收到的包做何种操作。一般配置接收Flow时,除了使能接收Flow,还需要配置接收目的队列,用于将接收到的包压入到接收目的队列中。通常接收空闲队列和接收目的队列是两个不同的队列,通过配置接收目的队列,则可在接收PKTDMA将接收包压入到接收目的队列后产生一个中断通知CPU去取包,然后把弹出的描述符压入到接收空闲队列,完成接收描述符的回收操作。
如图4所示,接收空闲队列和接收目的队列是两个不同队列描述符状态迁移图,描述了该方式下描述符在两个队列中描述符的状态,收第一个包时需要先从接收空闲队列弹出一个描述符,解析接收目的地址,开始搬移数据,然后把接收完成的第一个包压入到接收目的队列中,如果不进行回收,则接收目的队列中描述符逐渐增多,接收空闲队列中描述符逐渐变小,必须在接收空闲队列中描述符个数为0之前回收接收目的队列中的描述符,否则会造成后接收空闲队列没有足够描述符导致接收数据的丢失。
通过本实施例的技术方案,通过本方法能解决总线拥塞导致接收PKTDMA丢数据后,数据存放位置乱序的问题,同时还解决了需要另起线程或者需要在中断函数中来主动回收接收描述符的问题,简化了接收处理的复杂度,保证了接收系统的稳定性。
上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。