void SendlPTD(UINT16 *pPTDdata){ // pPTDdata指针指向PTD数据内容;
WritePTDtoATL(pPTDdata, 16); //把PTD数据写入ATL缓冲区,16为写入数据字节数;
do {ReadPTDfromATL(pPTDdata, 72); //从ATL缓冲区读取PTD数据,72为读取的字节数;
bfActive = (*pPTDdata) & PTD_ACTIVE; //检查有效位,PTD结束后主控器将把该位清零。
}while(bfActive != 0)}
void WritePTDtoATL(UINT16 *pPTDdata, UINT totalbytes){
WriteHCR_UINT16(IDX_HcTransferCounter, databytes);//向HcTransferCounter寄存器写入要传输的字节数;
*hccport = IDX_HcATLBufferPort | COM_WR; //向ATLBuffer端口写入写命令;
DisableInterrupts(); //禁止所有中断;
for (UINT m= totalbytes; m》0; m -=4 ){ //为了维护PTD数据在ATL缓冲区中的结构,采取每四字节循环
*hcdport = * pwPTDdata ++; //的方式;
*hcdport = * pwPTDdata ++; }
EnableInterrupts();} //使能中断;
void ReadPTDfromATL(UINT16 * pPTDdata, UINT totalbytes){
WriteHCR_UINT16(IDX_HcTransferCounter, totalbytes);
*hccport = IDX_HcATLBufferPort | COM_RD;
DisableInterrupts();
for (UINT m= totalbytes; m》0; m -=4 ){
* pwPTDdata ++ = *hcdport;
* pwPTDdata ++ = *hcdport; }
EnableInterrupts();}
数据结构链表的处理
在HCD将PTD从系统内存复制到ATL或ITL缓冲区之前,HCD必须通过集合数据结构来建立和追踪PTD。HCD的责任是追踪所有已连接设备的每个端点的属性,如端点最大封包大小、端点地址和该端点从属的设备地址。另外,HCD必须管理每个端点新的PTD的产生和已经完成的PTD的处理。所以使用一个有效的数据结构体系可以加快主机控制器的操作。本设计实现的数据结构类似于OHCI中定义的数据结构,如图4所示。此数据结构由三部分组成:三种类型端点的队列(控制传输端点、批量传输端点和中断传输端点)、每种端点的一个PTD列和一个完成队列。每个列队由一个全局指针指定,这个全局指针保持队列中第一个端点(EP)队列头的地址。每个EP队列头指向一个PTD列。一个PTD列保留着等待被主机控制器处理的PTD。在控制、批量和中断传输中,PTD被复制到ATL缓冲区。一旦PTD被放入ATL缓冲区,主机控制器就在下一帧中处理该PTD。
结束语
在USB主机端功能实现后,我们又开发了USB设备——指纹传感器MBF200的驱动程序,并按照规定要求实现了指纹数据的采集和传输。
责任编辑:gt
关于接口,总线,驱动就介绍完了,您有什么想法可以联系小编。