CN101937406A - 一种VxWorks操作系统中实现驱动1394设备的方法和系统 - Google Patents

一种VxWorks操作系统中实现驱动1394设备的方法和系统 Download PDF

Info

Publication number
CN101937406A
CN101937406A CN2009101081611A CN200910108161A CN101937406A CN 101937406 A CN101937406 A CN 101937406A CN 2009101081611 A CN2009101081611 A CN 2009101081611A CN 200910108161 A CN200910108161 A CN 200910108161A CN 101937406 A CN101937406 A CN 101937406A
Authority
CN
China
Prior art keywords
dma
register
descriptor
packet
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN2009101081611A
Other languages
English (en)
Other versions
CN101937406B (zh
Inventor
熊威
匡尧文
陈超
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Yanxiang Smart Technology Co ltd
Original Assignee
EVOC Intelligent Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by EVOC Intelligent Technology Co Ltd filed Critical EVOC Intelligent Technology Co Ltd
Priority to CN2009101081611A priority Critical patent/CN101937406B/zh
Publication of CN101937406A publication Critical patent/CN101937406A/zh
Application granted granted Critical
Publication of CN101937406B publication Critical patent/CN101937406B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Communication Control (AREA)

Abstract

本发明提供了一种VxWorks操作系统中实现驱动1394设备的方法和系统,其中方法包括步骤:a)初始化;b)中断处理;c)使能DMA读写,接收和发送数据。系统包括:初始化单元,用于设置链路层芯片的相关寄存器和物理层寄存器的相关位,使处于准备状态,初始化DMA接收描述符和DMA发送描述符;中断处理单元,用于处理各类中断;数据发送单元,以DMA方式发送数据;数据接收单元,以DMA方式接收数据。本发明实现了在VxWorks操作系统下驱动1394设备。

Description

一种VxWorks操作系统中实现驱动1394设备的方法和系统
技术领域
本发明涉及计算机技术领域,更具体地说,涉及一种VxWorks操作系统中实现驱动1394设备的方法和系统。
背景技术
IEEE(Institute of Electrical and Electronics Engineers,美国电气和电子工程师协会)1394是由苹果(APPLE)公司提出的一种高速串行接口标准,苹果公司称之为FireWire(火线),索尼(Sony)称之为i.Link,德州仪器(Texas Instruments)称之为Lynx。1995年,IEEE制定并颁布了IEEE 1394-1995标准,并在2000年推出了IEEE 1394A标准,可以支持100Mbps、200Mbps和400Mbps的传输速率。在最新的IEEE1394B标准中,支持的传输速率提高到了800Mbps、1.6Gbps和3.2Gbps。
IEEE1394总线除了传输速率高外,还具有接口简单,使用方便,良好的兼容性和可升级性等优点,并且可以独立于主机,支持点到点的连接,各个节点可以脱离主机自主执行事务。该标准自发布以来已经得到了很多国内外的知名IT厂商的关注和大力的支持,许多厂商为了使该技术能够广泛应用和推广,而设计出基于OHCI规范的链路层芯片,使得通过CPU控制链路层芯片来实现点到点的数据交互成为一种可能。
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(Real-Time Operating System,RTOS),是嵌入式开发环境的关键组成部分。其良好的持续发展能力、高性能的内核、高可靠性和卓越的实时性被广泛应用在通信、军事、航空、航天等精尖技术及实时性要求极高的领域中。作为一个计算机系统,不可避免的需要使用外部I/O设备,正是I/O设备的驱动程序为其提供了可访问性和可操作性。目前,VxWorks操作系统提供了对多种I/O设备驱动程序包括串口、并口、网卡、ATA等的支持,但是没有提供对具有1394标准接口的外部设备(简称1394设备)的驱动支持,而鉴于1394设备的应用日益广泛和诸多的优越性,在VxWorks操作系统中实现驱动1394设备是非常有必要的。
发明内容
本发明的目的在于针对现有技术的不足和缺陷,提供一种在VxWorks操作系统中实现驱动具有1394设备的方法和系统。
为实现上述目的,本发明实施例提供了如下技术方案:一种VxWorks操作系统中实现驱动1394设备的方法,包括步骤:
a)初始化;
b)中断处理;
c)使能DMA读写,接收和发送数据。
所述a)初始化进一步包括步骤:
a1)设置链路层寄存器和物理层寄存器,使寄存器处于准备状态;
a2)初始化DMA接收描述符和DMA发送描述符;
a3)安装中断服务程序,通过设置链路层芯片的中断屏蔽寄存器来使中断打开;
a4)软复位总线,使能链路层。
所述a1)设置链路层寄存器和物理层寄存器,使寄存器处于准备状态具体包括步骤:
设置总线选项寄存器;设置主机控制器控制寄存器LPS位;设置节点标识和状态寄存器中的总线号;使能PostedWrites位;清除链路层控制寄存器;使能周期定时器和周期控制器;清除中断寄存器;设置自标识DMA缓存区并使能自标识DMA;设置配置ROM映射寄存器并初始化ConfigROM;获得最大数据包的大小,单位为字节;设置异步接收过滤寄存器;设置字节交换。
所述a2)初始化DMA接收描述符和DMA发送描述符具体包括步骤:
确定需要的发送描述符和接收描述符的个数;
为发送数据和接收数据分配内存空间;
初始化发送描述符链表和接收描述符链表;
将每一个描述符链表的头节点的地址赋值到相应的命令寄存器中,DMA控制器根据寄存器中的地址来进行命令解析。
所述为发送和接收数据分配内存空间具体实现为:一次性在物理内存空间内开辟一段连续的空间,分别存储发送和接收的数据包,所述连续空间划分成若干相等的内存块。发送缓冲区的单个内存块的大小是一个最大的数据包的大小,接收缓冲区的单个内存块大小是一个最大的数据包的大小的整数倍,整个存储空间是静态的,在运行过程中不释放。
所述DMA的读操作包括步骤:接收数据包上下文处理任务接收到DMA的中断产生的信号后,在当前的接收描述符中查询是否有数据包过来,并且判断是否有跨描述符,然后根据获得的信息将接收数据包的地址和大小一起通过消息队列的方式传递给解包任务。
所述DMA的写操作包括步骤:应用程序将需要发送的数据包封装好后,先将数据包的信息放入到一个动态的链表中,然后依次从按照发送描述符的格式来插入到发送描述符链表中,通过设置相应的寄存器来启动DMA的发送,当发送第一个数据包完毕后会产生一个发送完成中断,在该中断中会继续从动态链表中获取数据包插入到描述符链表中,直到完成全部数据包的发送。
所述中断包括:不可恢复性中断,循环连续包中断,总线复位中断,请求发送完成中断,响应发送完成中断,请求包中断,响应包中断,等时接收中断,等时发送中断和自标识包中断。
一种VxWorks操作系统中实现驱动1394设备的系统,包括:
初始化单元,用于设置链路层芯片的相关寄存器和物理层寄存器的相关位,使处于准备状态,初始化DMA接收描述符和DMA发送描述符;
中断处理单元,用于处理各类中断;
数据发送单元,以DMA方式发送数据;
数据接收单元,以DMA方式接收数据。
所述初始化单元进一步包括:
寄存器初始化单元,用于设置总线选项寄存器;设置主机控制器控制寄存器中的LPS位;设置节点标识和状态寄存器中的总线号;使能PostedWrites位;清除链路层控制寄存器;使能周期定时器和周期控制器;清除中断寄存器;设置自标识DMA缓存区并使能自标识DMA;设置配置ROM映射寄存器并初始化ConfigROM;获得最大包的大小,单位为字节;设置异步接收过滤寄存器;设置字节交换;
内存分配单元,用于一次性在物理内存空间内开辟一段连续的空间,分别存储发送和接收的数据包,所述连续空间划分成若干相等的内存块;
DMA描述符初始化单元,用于初始化DMA发送描述符链表和DMA接收描述符链表;
中断挂接单元,用于挂接中断服务程序。
可见,与现有技术相比,本发明实施例提供的技术方案,实现了在VxWorks操作系统中驱动1394设备。
附图说明
图1为IEEE 1394硬件拓扑结构示意图;
图2为IEEE 1394协议栈结构示意图;
图3为IEEE 1394驱动架构示意图;
图4为IEEE 1394B两个设备之间的数据包流向图;
图5为本发明实施例提供的一种内存空间分配示意图;
图6为本发明实施例DMA接收描述符链表结构示意图;
图7为本发明实施例数据包接收数据流示意图;
图8为本发明实施例DMA发送描述符链表结构示意图;
图9为本发明实施例数据包发送数据流示意图;
图10为本发明实施例提供的一种VxWorks操作系统中实现驱动1394设备的方法流程图;
图11为本发明实施例提供的一种VxWorks操作系统中实现驱动1394设备的系统结构示意图。
具体实施方式
下面将结合附图及实施例对本发明作进一步说明,本发明实施例以在VxWorks操作系统中驱动具有1394标准接口的外部设备,特别是以驱动德州仪器(TI)公司推出的OHCI(Open Host Controller Interface)链路层芯片和物理层芯片为例来详细说明。
1394总线的拓扑结构是一个树形的结构,树形结构就是所有连接在一起的设备不能形成一个环(圈),否则就不能正常地工作,但是IEEE 1394B提出了一个避免环状结构的方法,即使设备连接形成一个环(圈)也能正常工作。
请参阅图1所示,图1为IEEE 1394B总线硬件拓扑结构。一个IEEE1394系统由众多可寻址的节点(node)组成,节点(node)是一个1394网络中的基本组成单位。
请参阅图2所示,图2为IEEE1394协议栈结构示意图。IEEE 1394标准定义了三个基本协议层,分别是事务层,链路层,物理层,用于在请求者和响应者之间的数据传输过程中完成相关的服务,后来新增加了总线管理层和应用层,每层负责完成自己的服务。本发明实施例是基于链路层中的异步传输模式来实现驱动的。
请参阅图3所示,图3为IEEE1394B驱动架构示意图,本发明实施例驱动只实现了协议栈中的数据链路层,提供了一些应用程序接口函数给用户,可以直接在应用层上调用该接口函数来进行数据包的DMA传送,将数据通过物理层和传输线缆到达接收的节点。
请参阅图4所示,图4为IEEE 1394B两个设备之间的数据包流向图,在点对点的数据传输中,节点一(发送端设备)中由应用程序来进行发起一个请求包,通过发送端的DMA经由1394的线缆传送到节点二(接收端设备),节点二通过接收DMA接收到数据包后传递给接收任务,接收任务根据包格式解包后发送一个响应数据包,通过其发送DMA经由1394线缆传送到节点一,然后节点一的接收DMA接收到响应数据包后传递给接收任务,这样完成了一次数据交互的过程。
数据链路层主要实现了接收DMA和发送DMA的数据描述符链表,该链表在内存中被维护,通过该链表和DMA控制器进行通讯。
请参阅图5所示,本发明采用统一的内存分配方案,即在初始化过程中,在物理内存中开辟一段连续的空间,分别存储发送和接收的数据包。整个存储空间为静态的,在运行过程中不释放。用于发送数据包的单个内存块的大小是一个最大的数据包的大小,用于接收数据包的单个内存块大小是一个最大的数据包的大小的整数倍。
目前,1394 OHCI(Open Host Controller Interface,开放式主机控制接口协议)  支持7种DMA(Direct Memory Access,直接内存访问)类型,每种DMA类型都有自己的寄存器空间,并且至少支持一个“逻辑数据流上下文(Context)”,即DMA通道。每个DMA通道由一个DMA上下文链表(Context program)和另外两个寄存器:上下文控制寄存器(ContextControl register)和命令地址寄存器(CommandPtr register)组成。上下文链表是指DMA描述符链表,这个链表位于主内存中。描述符链表中的每个描述符定义了待传输的数据包格式和控制信息,并由相应的DMA控制器将数据放入对应的FIFO(First Input First Output,先进先出)数据缓存器中,然后发出中断请求。上下文控制寄存器可以控制DMA的开始和结束,并返回传输状态;命令地址寄存器用来保存描述符链表的开始地址以及描述符的个数。
为了满足驱动程序高效操作和实现的需要,本发明实施例定义了如下的几个数据结构:
DMA接收描述符结构体(DMA_CMD)
struct dma_cmd
{
     u32 control;        /*命令描述符的控制位,32位*/
     u32 address;        /*数据缓冲区的地址,32位*/
     u32 branchAddress;  /*下一个描述符的地址,32位*/
     u32 status;         /*状态位,32位*/
};
DMA发送描述符结构体(AT_DMA_PRG)
struct  at_dma_prg
{
     struct dma_cmd begin;  /*起始命令描述符,16字节*/
     quadlet_t data[4];     /*用来存放数据包头*/
     struct dma_cmd end;    /*结束命令描述符,16字节*/
     quadlet_t pad[4];      /*需要时用来填充,保证是16字节对齐*/
};
DMA接收上下文结构体(DMA_RCV_CTX)
  struct dma_rcv_ctx
{
    struct ti_ohci*ohci;
    enum context_type type;     /*上下文的类型,是否是异步还是同步*/
    int ctx;                    /*是否是请求上下文还是响应上下文*/
    unsigned int num_desc;      /*接收描述符的个数*/
    unsigned int buf_size;      /*用来存放单个DMA接收缓冲区的大小*/
    unsigned int split_buf_size;/*分离的数据包缓冲区分配的大小*/
    struct dma_cmd**prg_cpu;    /*用来存放指定个数的接收描述符的首地
                                 址*/
    dma_addr_t*prg_bus;
    quadlet_t**buf_cpu; /*用来存放第一个单内存块的首地址*/
    quadlet_t*split_buf;/*分离包的缓冲区,最大数据包的大小,当出现
                         跨描述符时,将分布在两个描述符对应的接收缓
                         冲区的数据包整合到该内存块中进行处理*/
    int length;         /*用来存放当前的DMA接收缓冲区中有效的数
                         据的长度*/
    unsigned int buf_ind;   /*当前的DMA接收描述符的序号*/
    unsigned int buf_offset;/*用来存放当前的DMA接收描述符中的有效
                             数据的地址偏移量*/
    quadlet_t*spb;
    spinlock_tlock;
    int ctrlClear;/*存放异步接收上下文控制清除寄存器偏移量,通过该数值可以用来访问异步接收上下文控制清除寄存器,可用于停止接收DMA*/
    int ctrlSet;/*异步接收上下文控制设置寄存器偏移量,通过该数值可以用来访问异步接收上下文控制设置寄存器,可用于启动接收DMA*/
    int cmdPtr;/*命令指针寄存器偏移量,通过该数值可以用来访问命令指针寄存器,命令指针寄存器存放了第一个有效的接收描述符的地址,通知DMA从该描述符对应的缓冲区开始接收数据包*/
    int ctxtMatch;
};
DMA发送上下文结构体(DMA_TRM_CTX)
struct dma_trm_ctx
{
     struct ti_ohci*ohci;
     enum context_type type;
     int ctx;
     unsigned int num_desc;     /*用于发送描述符的个数*/
     struct at_dma_prg**prg_cpu;/*用于保存第一个发送描述符的内存
                                 地址*/
     unsigned int prg_ind;      /*用来记录当前的描述符的序号*/
     unsigned int sent_ind;
     int free_prgs;             /*空闲的描述符的个数,如果不为0则表示可
                                 以用来发送数据包,如果为0,则不能发送*/
     quadlet_t*branchAddrPtr;       /*用来保存下一个描述符的地址*/
     struct list_head fifo_list;   /*一个双向链表,用来链接需要发送的数据
                                    包*/
     struct list_head pending_list;/*一个双向链表,用来链接未发送的数
                                    据包*/
     spinlock_t lock;
     int ctrlClear;/*存放异步发送上下文控制清除寄存器偏移量,通过该数值可以用来访问异步发送上下文控制清除寄存器,可用于停止发送DMA*/
     int ctrlSet;/*异步发送上下文控制设置寄存器偏移量,通过该数值可以用来访问异步发送上下文控制设置寄存器,可用于启动发送DMA*/
     int cmdPtr;/*命令指针寄存器偏移量,通过该数值可以用来访问命令指针寄存器,命令指针寄存器存放了第一个有效的发送描述符的地址,当异步发送上下文控制设置寄存器后,DMA将从该描述符开始解析并发送数据包*/
};
描述1394 OHCI的结构体  (TI_OHCI)
struct ti_ohci
{
     enum
     {
         OHCI_INIT_ALLOC_HOST,
         OHCI_INIT_HAVE_MEM_REGION,
         OHCI_INIT_HAVE_IOMAPPING,
         OHCI_INIT_HAVE_CONFIG_ROM_BUFFER,
         OHCI_INIT_HAVE_SELFID_BUFFER,
         OHCI_INIT_HAVE_TXRX_BUFFERS_MAYBE,
         OHCI_INIT_HAVE_IRQ,
         OHCI_INIT_DONE,
    }init_state;
    void*registers;
    quadlet_t*selfid_buf_cpu;           /*自标识数据包的存放内存地址*/
    quadlet_t*csr_config_rom_cpu;
    int csr_config_rom_length;
    unsigned int max_packet_size;       /*最大数据包的大小*/
    struct dma_rcv_ctx ar_resp_context; /*异步接收响应上下文结构体*/
    struct dma_rcv_ctx ar_req_context;  /*异步接收请求上下文结构体*/
    struct dma_trm_ctx at_resp_context; /*异步发送响应上下文结构体*/
    struct dma_trm_ctx at_req_context;  /*异步发送请求上下文结构体*/
    struct hpsb_host*host;
    int phyid,isroot;
    spinlock_t phy_reg_lock;
    spinlock_t event_lock;
    int self_id_errors;
    unsigned int selfid_swap:1;
    unsigned int no_swap_incoming:1;
    unsigned int check_busreset:1;
};
请参阅图6所示,图6为DMA接收描述符链表结构。图中接收DMA描述符指针(prg_cpu)用于保存在初始化时由用户来动态分配的指定个数的DMA接收描述符中的第一个描述符的地址。描述符指针0(prg_cpu[0])、描述符指针1(prg_cpu[1])、描述符指针2(prg_cpu[2])、描述符指针3(prg_cpu[3])到描述符指针N(prg_cpu[N])用于保存动态分配的每个描述符的地址。
所述控制位(Control),接收缓冲区地址(Data Address),下一个描述符地址(Branch Addres)以及状态位(Status)组成的一个块在数据结构上构成一个DMA_CMD结构体。需要说明的是,下一个描述符地址(BranchAddress)里面包含了两部分,一部分是下一个描述符的地址,一部分是一个4比特的标志位。该标志位用来标识该下一个描述符是否有效。如果是1则为有效,如果是0则为无效,且表示结束。
第一个描述符中的BanchAddress变量存放了下一个描述符的地址并且该标志位为1,第二个描述符的BranchAddress变量存放了第三个描述符的地址,并且设置该标志位为1,依次类推,直到最后一个描述符,最后一个描述符的BranchAddress变量存放了第一个描述符的地址,但是该标志位为0,表示结束,这样形成了一个环链。
接收缓冲区指针(buf_cpu)用于保存初始化时由用户分配的指定个数的DMA接收缓冲区的第一个缓冲区的地址,接收缓冲区指针0(buf_cpu[0])、接收缓冲区指针1(buf_cpu[1])、接收缓冲区指针2(buf_cpu[2])到接收缓冲区指针N(buf_cpu[N])保存了每一个DMA接收描述符对应的接收缓冲区的地址。
以上分配好之后,将第一个描述符的地址存放到异步接收命令指针寄存器中,异步接收DMA将会从该描述符来执行相关操作。当异步接收上下文设置寄存器的DMA启动位置位后,那么DMA接收机制将启动,只要有数据包从线缆上发送过来,该DMA接收控制器就把数据存放到指定的接收缓冲区。
请参阅图7所示,图7为数据包接收流程示意图。图中实线表示一次实际的操作,而虚线代表依次将要发生的操作。每个内存块的大小是数据包的整数倍。从内存块1到N的数据包地址和长度通过消息队列的方式传递给解析数据包任务。接收数据包的流程包括步骤:接收数据包时,接收数据包上下文处理任务接收到DMA的中断产生的信号后,在当前的接收描述符中查询是否有数据包过来,并且判断是否有跨描述符,然后根据获得的信息将接收数据包的地址和大小一起通过消息队列的方式(Vxworks系统中的功能)传递给解析数据包任务,接收的数据会依次放在如图5中的静态内存中。
本发明实施例中,因为数据包的大小可能是不确定的,但是每一个描述符对应的接收缓冲区(也就是分配好的内存中的某一块)有可能不是刚好装满剩余的空间,那么就需要使用下一个描述符对应的缓冲区来存放数据包的另一部分。本发明实施例中,每一个描述符对应的接收缓冲区在内存中是连续的,但是缓冲区长度是有限的,最终总会到末尾,如果在末尾发生跨描述符的情况,将会导致接收的数据包在内存中不完整,需要判断后手动从最后一个描述符号和第一个描述符中的缓冲区中根据指定的包的大小将这个数据包整合在一起就可以了。最后一个描述符号对应的缓冲区用完了将使用第一个接收缓冲区,DMA自动使用哪一个描述符是由描述符中的状态标识来判断的。举例说明,假设接收到了一个新的数据包,长度是9字节,它应该存放到当前的描述符指向的接收缓冲区。但是当前的描述符对应的缓冲区中由于上一次接收了数据包而只剩下空闲的5个字节,此时,当前的描述符对应的缓冲区接收完后需要使用下一个描述符对应的接收缓冲区的4字节。
请参阅图8所示,图8为DMA发送描述符链表结构。图8中的发送描述符链表由单个的发送描述符组成,根据需要和实际的情况来选择链表节点的个数。单个的发送描述符结构符合AT_DMA_PRG结构体。图中发送DMA描述符指针(prg_cpu)用于保存在初始化时由用户来动态分配的指定个数的DMA发送描述符中的第一个描述符的地址。发送描述符指针0(prg_cpu[0])、发送描述符指针1(prg_cpu[1])、发送描述符指针2(prg_cpu[2])、发送描述符指针3(prg_cpu[3])到发送描述符指针N(prg_cpu[N])保存了动态分配的每个描述符的地址。
需要进一步说明的是,图8中的“下一个描述符”的地址一栏中,包含了最低的4个比特位数值,称之为Z,用来表示发送所需要的16字节的命令块数值。由OHCI规范可知,带有*_Immdiate的描述符Z值为2,其它的描述符的Z为1,这样可以得知,如果带有数据负载,则Z值为3,否则为2。发送DMA可以知道当前的数据包需要使用的16字节的命令块的个数来决定是否发送完毕。
以上分配好之后,就可以用来发送数据包。
请参阅图9所示,图9为数据包发送流程示意图。图中实线表示一次实际的操作,而虚线代表依次将要发生的操作。每个内存块的大小是数据包的整数倍。发送数据包的流程包括步骤:
首先进行应用程序组包,把需要发送的数据包按照标准的格式填充好,驱动程序会将该数据包先挂到一个双向链表中。如果数据包很多,将依次往后排列。然后判断是否有空闲描述符号来决定是否继续发送该数据包,如果有则先用现有的描述符来发送可以发送的数据包,如果没有则等待,直到发送完成中断产生后将会有空闲的发送描述符。然后依次从待发送的双向链表中取数据包来插入到发送描述符中启动发送DMA进行发送,直到发送完毕。
本发明实施例中,使用三种命令描述符进行插包,和接收数据包不同。如果是没有负载(数据内容)的数据包,则使用OUTPUT_LAST_Immdiate描述符,如果是有负载(只有包头)的数据包,则使用OUTPUT_MORE_Immdiate描述符和OUTPUT_LAST描述符,完成将每一个数据包插入到发送描述符链表中。然后通过设置异步发送上下文设置寄存器中的相关位来启动DMA发送。
请参阅图10所示,图10为本发明实施例提供的一种初始化方法流程图,包括步骤:
步骤1001:设置链路层芯片的相关寄存器和物理层寄存器的相关位,使处于准备状态,具体包括以下步骤:
设置Bus options(总线选项)寄存器;
设置主机控制器控制(HCControl)寄存器中的LPS位,LPS称之为连接电源状态,是HCControl寄存器中的一个控制位,该位是用来使能链路层芯片和物理层芯片之间连接的一个控制位,使能以后,可以通过链路层芯片来执行物理层的读和写操作,否则,链路层将不能执行物理层的读写操作;
设置Node indentification and status(节点标识和状态)寄存器中的总线号;使能PostedWrites(通告写,是指在数据写到主机内存之前发送一个应答信号)位;
清除链路层控制寄存器;使能周期定时器和周期控制器;
清除中断寄存器;
设置自标识DMA缓存区并使能自标识DMA;
设置Configuration ROM mapping(配置ROM映射)寄存器并初始化Configrom;
获得最大包的大小,单位为字节;
设置异步接收过滤寄存器;
设置字节交换。
步骤1002:初始化DMA接收描述符和DMA发送描述符;
具体包括具体步骤:
确定所需要的发送描述符和接收描述符的个数,根据自己需要来设置;
为发送和接收数据分配内存空间;
初始化发送和接收描述符链表;
将每一个描述符链表的头节点的地址赋值到相应的命令寄存器中,DMA控制器根据寄存器中的地址来进行命令解析。
步骤1003:安装中断服务程序,通过设置链路层芯片的中断屏蔽寄存器来使中断打开;
需要说明的是,本发明实施例中是通过VxWorks操作系统的API(Application Programming Interface,应用程序接口)函数来安装,通过设置IntMask(中断屏蔽)寄存器来设置所需要的中断位。
本发明实施例中,DMA数据的接收和发送都需要对CPU申请中断来告诉程序的当前状态,系统处理的效率也可以体现在该中断处理函数中。当系统需要进入中断时,通过读取中断事件寄存器,判断是哪种类型的中断,本发明实施例中出现的中断类型包括但不局限于:不可恢复性中断,循环连续包中断,总线复位中断,请求发送完成中断,响应发送完成中断,请求包中断,响应包中断,等时接收中断,等时发送中断,自标识包中断等,如果有上述类型的中断发生,则首先清楚对应的中断标识位,然后处理该中断。
步骤1004:软复位总线,使能链路层;
需要说明的是,软复位总线,通过写物理寄存器的相关位来完成,使能链路层通过设置HCControl寄存器来完成。
根据上述的方法,本发明实施例还提供了一种VxWorks操作系统中实现驱动1394设备的系统,如图11所示,系统包括:
初始化单元1101,用于设置链路层芯片的相关寄存器和物理层寄存器的相关位,使处于准备状态,初始化DMA接收描述符和DMA发送描述符;
本发明实施例中,所述初始化单元1101进一步包括:
寄存器初始化单元11011,用于设置Bus options(总线选项)寄存器;设置HCControl(主机控制器控制)寄存器中的LPS位,LPS称之为连接电源状态,是HCControl寄存器中的一个控制位,该位是用来使能链路层芯片和物理层芯片之间连接的一个控制位,使能以后,可以通过链路层芯片来执行物理层的读和写操作,否则,链路层将不能执行物理层的读写操作;设置Node indentification and status(节点标识和状态)寄存器中的总线号;使能PostedWrites位;清除链路层控制寄存器;使能周期定时器和周期控制器;清除中断寄存器;设置自标识DMA缓存区并使能自标识DMA;设置Configuration ROM mapping(配置ROM映射)寄存器并初始化Configrom;获得最大包的大小,单位为字节;设置异步接收过滤寄存器;设置字节交换。
内存分配单元11012,一次性在物理内存空间内开辟一段连续的空间,分别存储发送和接收的数据包,所述连续空间划分成若干相等的内存块。发送缓冲区的单个内存块的大小是一个最大的数据包的大小,接收缓冲区的单个内存块大小是一个最大的数据包的大小的整数倍,整个存储空间是静态的,在运行过程中不释放;
DMA描述符初始化单元11013,用于初始化DMA发送描述符链表和DMA接收描述符链表;
中断挂接单元11014,用于挂接中断服务程序。
进一步的,本系统还包括:
中断处理单元1102,用于处理各类中断;
进一步的,本系统还包括:
数据发送单元1103,以DMA方式发送数据;
进一步的,本系统还包括:
数据接收单元1104,以DMA方式接收数据。
需要说明的是,本发明实施例提供的各单元之间的连接关系是为了清楚的阐释其信息交互控制过程的需要,因此仅视为逻辑上的连接关系,而不应仅限于物理连接。
通过上述系统,本发明提供的实施例实现了在VxWorks操作系统中对1394设备的驱动。
综上所述,本发明实施例以TI(Texas Instrument)公司推出的OHCI链路层芯片和物理层芯片为例,对本发明实施例的原理及实施方式进行了阐述。对于本技术领域人员来说,通过本发明实施例提供的技术方案即可开发出其他独立芯片的1394驱动程序。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的硬件平台的方式来实现,当然也可以全部通过硬件来实施,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案对背景技术做出贡献的全部或者部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本发明实施例应用了具体的实施例对本发明实施例的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明实施例的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明实施例的限制。

Claims (10)

1.一种VxWorks操作系统中实现驱动1394设备的方法,其特征在于,包括步骤:
a)初始化;
b)中断处理;
c)使能DMA读写,接收和发送数据。
2.根据权利要求1所述的方法,其特征在于,所述a)初始化进一步包括步骤:
a1)设置链路层寄存器和物理层寄存器,使寄存器处于准备状态;
a2)初始化DMA接收描述符和DMA发送描述符;
a3)安装中断服务程序,通过设置链路层芯片的中断屏蔽寄存器来使中断打开;
a4)软复位总线,使能链路层。
3.根据权利要求2所述的方法,其特征在于,所述a1)设置链路层寄存器和物理层寄存器,使寄存器处于准备状态具体包括步骤:
设置总线选项寄存器;设置主机控制器控制寄存器LPS位;设置节点标识和状态寄存器中的总线号;使能PostedWrites位;清除链路层控制寄存器;使能周期定时器和周期控制器;清除中断寄存器;设置自标识DMA缓存区并使能自标识DMA;设置配置ROM映射寄存器并初始化ConfigROM;获得最大数据包的大小,单位为字节;设置异步接收过滤寄存器;设置字节交换。
4.根据权利要求2所述的方法,其特征在于,所述a2)初始化DMA接收描述符和DMA发送描述符具体包括步骤:
确定需要的发送描述符和接收描述符的个数;
为发送数据和接收数据分配内存空间;
初始化发送描述符链表和接收描述符链表;
将每一个描述符链表的头节点的地址赋值到相应的命令寄存器中,DMA控制器根据寄存器中的地址来进行命令解析。
5.根据权利要求4所述的方法,其特征在于,所述为发送和接收数据分配内存空间具体实现为:一次性在物理内存空间内开辟一段连续的空间,分别存储发送和接收的数据包,所述连续空间划分成若干相等的内存块。发送缓冲区的单个内存块的大小是一个最大的数据包的大小,接收缓冲区的单个内存块大小是一个最大的数据包的大小的整数倍,整个存储空间是静态的,在运行过程中不释放。
6.根据权利要求1所述的方法,其特征在于,所述DMA的读操作包括步骤:接收数据包上下文处理任务接收到DMA的中断产生的信号后,在当前的接收描述符中查询是否有数据包过来,并且判断是否有跨描述符,然后根据获得的信息将接收数据包的地址和大小一起通过消息队列的方式传递给解包任务。
7.根据权利要求1所述的方法,其特征在于,所述DMA的写操作包括步骤:应用程序将需要发送的数据包封装好后,先将数据包的信息放入到一个动态的链表中,然后依次从按照发送描述符的格式来插入到发送描述符链表中,通过设置相应的寄存器来启动DMA的发送,当发送第一个数据包完毕后会产生一个发送完成中断,在该中断中会继续从动态链表中获取数据包插入到描述符链表中,直到完成全部数据包的发送。
8.根据权利要求1-7任一项所述的方法,其特征在于,所述中断包括:不可恢复性中断,循环连续包中断,总线复位中断,请求发送完成中断,响应发送完成中断,请求包中断,响应包中断,等时接收中断,等时发送中断和自标识包中断。
9.一种VxWorks操作系统中实现驱动1394设备的系统,其特征在于,包括:
初始化单元,用于设置链路层芯片的相关寄存器和物理层寄存器的相关位,使处于准备状态,初始化DMA接收描述符和DMA发送描述符;
中断处理单元,用于处理各类中断;
数据发送单元,以DMA方式发送数据;
数据接收单元,以DMA方式接收数据。
10.根据权利要求9所述的系统,其特征在于,所述初始化单元进一步包括:
寄存器初始化单元,用于设置总线选项寄存器;设置主机控制器控制寄存器中的LPS位;设置节点标识和状态寄存器中的总线号;使能PostedWrites位;清除链路层控制寄存器;使能周期定时器和周期控制器;清除中断寄存器;设置自标识DMA缓存区并使能自标识DMA;设置配置ROM映射寄存器并初始化ConfigROM;获得最大包的大小,单位为字节;设置异步接收过滤寄存器;设置字节交换;
内存分配单元,用于一次性在物理内存空间内开辟一段连续的空间,分别存储发送和接收的数据包,所述连续空间划分成若干相等的内存块;
DMA描述符初始化单元,用于初始化DMA发送描述符链表和DMA接收描述符链表;
中断挂接单元,用于挂接中断服务程序。
CN2009101081611A 2009-06-29 2009-06-29 一种VxWorks操作系统中实现驱动1394设备的方法和系统 Active CN101937406B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2009101081611A CN101937406B (zh) 2009-06-29 2009-06-29 一种VxWorks操作系统中实现驱动1394设备的方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2009101081611A CN101937406B (zh) 2009-06-29 2009-06-29 一种VxWorks操作系统中实现驱动1394设备的方法和系统

Publications (2)

Publication Number Publication Date
CN101937406A true CN101937406A (zh) 2011-01-05
CN101937406B CN101937406B (zh) 2012-08-22

Family

ID=43390743

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2009101081611A Active CN101937406B (zh) 2009-06-29 2009-06-29 一种VxWorks操作系统中实现驱动1394设备的方法和系统

Country Status (1)

Country Link
CN (1) CN101937406B (zh)

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102420763A (zh) * 2011-12-07 2012-04-18 中国航空无线电电子研究所 Dma发送方法
CN102752223A (zh) * 2012-07-26 2012-10-24 杭州海康威视数字技术股份有限公司 并行系统间数据传输方法及其系统
CN102999381A (zh) * 2011-09-09 2013-03-27 中国航天科工集团第三研究院第八三五七研究所 一种提高VxWorks实时性的CPCI设备中断复用方法
CN103197966A (zh) * 2011-11-02 2013-07-10 瑞萨电子株式会社 半导体数据处理设备,时间触发通信系统以及通信系统
CN103942069A (zh) * 2014-04-01 2014-07-23 西安睿控创合电子科技有限公司 一种基于X86平台Vxworks操作系统的快速启动优化方法
WO2015070539A1 (zh) * 2013-11-14 2015-05-21 浪潮电子信息产业股份有限公司 一种基于dma的数据压缩芯片结构及其实现方法
CN105824762A (zh) * 2016-03-15 2016-08-03 乐视移动智能信息技术(北京)有限公司 智能终端及其内存控制方法与装置
CN107729281A (zh) * 2017-08-31 2018-02-23 北京计算机技术及应用研究所 一种基于RapidIO的高速传输实现方法
CN108228496A (zh) * 2017-12-04 2018-06-29 北京旋极信息技术股份有限公司 一种直接内存访问内存管理方法、装置和主控设备
CN108462651A (zh) * 2016-12-12 2018-08-28 中国航空工业集团公司西安航空计算技术研究所 一种采用dma链实现的1394异步流传输的方法
CN109714336A (zh) * 2018-12-26 2019-05-03 吴海蒙 一种适用于多设备间通信的嵌入式modbus协议栈
CN111930648A (zh) * 2020-08-07 2020-11-13 山东云海国创云计算装备产业创新中心有限公司 一种缓存配置方法、装置及电子设备和存储介质
CN112231266A (zh) * 2020-10-15 2021-01-15 天津津航计算技术研究所 一种基于查找表的arinc 429总线控制方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101324831A (zh) * 2007-06-15 2008-12-17 中国电子科技集团公司第四十一研究所 基于VxWorks的打印机驱动方法

Cited By (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102999381A (zh) * 2011-09-09 2013-03-27 中国航天科工集团第三研究院第八三五七研究所 一种提高VxWorks实时性的CPCI设备中断复用方法
CN102999381B (zh) * 2011-09-09 2015-03-04 中国航天科工集团第三研究院第八三五七研究所 一种提高VxWorks实时性的CPCI设备中断复用方法
CN103197966A (zh) * 2011-11-02 2013-07-10 瑞萨电子株式会社 半导体数据处理设备,时间触发通信系统以及通信系统
CN103197966B (zh) * 2011-11-02 2017-07-11 瑞萨电子株式会社 半导体数据处理设备,时间触发通信系统以及通信系统
CN102420763A (zh) * 2011-12-07 2012-04-18 中国航空无线电电子研究所 Dma发送方法
CN102420763B (zh) * 2011-12-07 2014-05-07 中国航空无线电电子研究所 Dma发送方法
CN102752223A (zh) * 2012-07-26 2012-10-24 杭州海康威视数字技术股份有限公司 并行系统间数据传输方法及其系统
CN102752223B (zh) * 2012-07-26 2014-11-05 杭州海康威视数字技术股份有限公司 并行系统间数据传输方法及其系统
WO2015070539A1 (zh) * 2013-11-14 2015-05-21 浪潮电子信息产业股份有限公司 一种基于dma的数据压缩芯片结构及其实现方法
CN103942069B (zh) * 2014-04-01 2017-06-09 西安睿控创合电子科技有限公司 一种基于X86平台Vxworks操作系统的快速启动优化方法
CN103942069A (zh) * 2014-04-01 2014-07-23 西安睿控创合电子科技有限公司 一种基于X86平台Vxworks操作系统的快速启动优化方法
CN105824762A (zh) * 2016-03-15 2016-08-03 乐视移动智能信息技术(北京)有限公司 智能终端及其内存控制方法与装置
CN108462651A (zh) * 2016-12-12 2018-08-28 中国航空工业集团公司西安航空计算技术研究所 一种采用dma链实现的1394异步流传输的方法
CN107729281A (zh) * 2017-08-31 2018-02-23 北京计算机技术及应用研究所 一种基于RapidIO的高速传输实现方法
CN107729281B (zh) * 2017-08-31 2019-11-15 北京计算机技术及应用研究所 一种基于RapidIO的高速传输实现方法
CN108228496A (zh) * 2017-12-04 2018-06-29 北京旋极信息技术股份有限公司 一种直接内存访问内存管理方法、装置和主控设备
CN108228496B (zh) * 2017-12-04 2020-10-02 北京旋极信息技术股份有限公司 一种直接内存访问内存管理方法、装置和主控设备
CN109714336A (zh) * 2018-12-26 2019-05-03 吴海蒙 一种适用于多设备间通信的嵌入式modbus协议栈
CN111930648A (zh) * 2020-08-07 2020-11-13 山东云海国创云计算装备产业创新中心有限公司 一种缓存配置方法、装置及电子设备和存储介质
CN112231266A (zh) * 2020-10-15 2021-01-15 天津津航计算技术研究所 一种基于查找表的arinc 429总线控制方法
CN112231266B (zh) * 2020-10-15 2023-03-24 天津津航计算技术研究所 一种基于查找表的arinc 429总线控制方法

Also Published As

Publication number Publication date
CN101937406B (zh) 2012-08-22

Similar Documents

Publication Publication Date Title
CN101937406B (zh) 一种VxWorks操作系统中实现驱动1394设备的方法和系统
US7822908B2 (en) Discovery of a bridge device in a SAS communication system
JP3497834B2 (ja) ルートリピータ、usb通信システム、usb通信制御方法
US8542693B2 (en) Managing free packet descriptors in packet-based communications
US6622193B1 (en) Method and apparatus for synchronizing interrupts in a message passing queue oriented bus system
US6122676A (en) Apparatus and method for transmitting and receiving data into and out of a universal serial bus device
US6947442B1 (en) Data transfer control device and electronic equipment
EP0885418B1 (en) Asynchronous data pipe for automatically managing asynchronous data transfers between an application and a bus structure
CN100414908C (zh) 一种支持虚拟接口的存储网络适配器
US6047001A (en) Apparatus and method in a network interface device for storing a data frame and corresponding tracking information in a buffer memory
CN106648896B (zh) 一种Zynq芯片在异构称多处理模式下双核共享输出外设的方法
US6345345B1 (en) Data communications device and associated method for arbitrating access using dynamically programmable arbitration scheme and limits on data transfers
JP2002541554A (ja) ユニバーサル・シリアル・バスに基づくpcフラッシュディスクのためのアーキテクチャ
US6581113B1 (en) Apparatus and method for transferring frame data between a host system memory and a network interface buffer memory employing transmit descriptors without transmit status information
US6857028B1 (en) Data transfer control device and electronic equipment
CN102033840A (zh) 总线协议转换装置和总线协议转换方法
CN111611185A (zh) 一种多pcie端口的msi中断过滤装置
US6401142B1 (en) Apparatus and method for selective bus transfer using master and slave modes
US6516371B1 (en) Network interface device for accessing data stored in buffer memory locations defined by programmable read pointer information
US20040057448A1 (en) Information processing system, information processing apparatus, and information processing method
JP4033915B2 (ja) データストリーム制御方法及び装置
US7346714B2 (en) Notification of completion of communication with a plurality of data storage areas
CN106126452B (zh) 基于IIC协议的Linux操作系统与裸机通信的方法
EP1236091B1 (en) Register arrangement for optimum access
US6424591B1 (en) Network interface supporting fifo-type and SRAM-type accesses to internal buffer memory

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
TR01 Transfer of patent right
TR01 Transfer of patent right

Effective date of registration: 20230705

Address after: 518000 1701, Yanxiang Science and Technology Building, No. 31, High-tech Middle 4th Road, Maling Community, Yuehai Street, Nanshan District, Shenzhen, Guangdong Province

Patentee after: Shenzhen Yanxiang Smart Technology Co.,Ltd.

Address before: 518057 Guangdong city of Shenzhen province Nanshan District high in the four EVOC Technology Building No. 31

Patentee before: EVOC INTELLIGENT TECHNOLOGY Co.,Ltd.