⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_usb_hwif.c

📁 sparc硬件平台上的usb驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
voidUSB_ClearInterruptRegister (D_UINT8 intBit){    //D_UINT8 c = USB_ReadInterruptRegister();//      outportb(SC_INTERRUPT_STATUS_REG, intBit);    *(registers + SC_INTERRUPT_STATUS_REG) =	*(registers + SC_INTERRUPT_STATUS_REG) & ~intBit;}/************************************************************** 函数名称: USB_ReadEndpointStatus()** 功能描述: 读取端点状态** 输   入: D_UINT8 bEndp:   端点索引号,取值0 ~ 5** 输   出: 端点状态************************************************************///#if USB_ReadEndpointStatus_END_UINT8USB_ReadEndpointStatus (D_UINT8 bEndp){	return get_register (ENDPOINT_STATUS_REG + bEndp * ep_cmd_offset);	//读取端点状态}//#endif/************************************************************** 函数名称: USB_ReadLastTransactionStatus()** 功能描述: 读取最后处理状态寄存器** 输   入: D_UINT8 bEndp:   端点索引号,取值0 ~ 5** 输   出: 端点最后处理的状态************************************************************/D_UINT8USB_ReadLastTransactionStatus (D_UINT8 bEndp, D_UINT8 bNAK){					    //输出读取最后处理状态寄存器命令    if (bNAK)	//读取状态	return get_register (ENDPOINT_NAK_TRANSTYPE_STATUS_REG +			     bEndp * ep_cmd_offset) & TRANSACTION_TYPE;    else	//读取状态	return get_register (ENDPOINT_TRANSTYPE_STATUS_REG +			     bEndp * ep_cmd_offset) & TRANSACTION_TYPE;	}voidUSB_Clear_FIFO (D_UINT8 bEndp){    set_register (EP_RX_FIFO_CONTROL_REG + bEndp * ep_data_offset, 1);}/************************************************************** 函数名称: USB_SetEndpointStall()** 功能描述: 设置端点状态** 输   入: D_UINT8 bEndp:   端点索引号,取值0 ~ 5	         D_UINT8 bStalled: 状态值** 输   出: 端点状态************************************************************/// 将端点bEndp的控制寄存器的ENDPOINT_SEND_STALL_BIT位置为bStalledvoidUSB_SetEndpointStall (D_UINT8 bEndp, D_UINT8 bStalled){    D_UINT8 c;    if (bEPPflags.bits.in_isr == 0)	DISABLE ();    c = get_register (ENDPOINT_CONTROL_REG +		      bEndp * ep_cmd_offset) | ENDPOINT_READY_BIT;    if (bStalled)	c |= ENDPOINT_SEND_STALL_BIT;    else	// 将EPN的控制寄存器的ENDPOINT_SEND_STALL_BIT位置为0,表示EPN结束停止状态	c &= ~ENDPOINT_SEND_STALL_BIT;    set_register (ENDPOINT_CONTROL_REG + bEndp * ep_cmd_offset, c);    if (bEPPflags.bits.in_isr == 0)	ENABLE ();}// 将端点bEndp的控制寄存器的ENDPOINT_READY_BIT位置为bReadyvoidUSB_SetEndpointReady (D_UINT8 bEndp, D_UINT8 bReady){    D_UINT8 c;    if (bEPPflags.bits.in_isr == 0)	DISABLE ();    c = get_register (ENDPOINT_CONTROL_REG + bEndp * ep_cmd_offset);    if (bReady && !(c & ENDPOINT_READY_BIT))	// 将EPN的控制寄存器的ENDPOINT_READY_BIT位置为1,表示EPN继续	set_register (ENDPOINT_CONTROL_REG + bEndp * ep_cmd_offset,		      c | ENDPOINT_READY_BIT);    else if (!bReady && (c & ENDPOINT_READY_BIT))	set_register (ENDPOINT_CONTROL_REG + bEndp * ep_cmd_offset,		      c & ~ENDPOINT_READY_BIT);    //outportb(ENDPOINT_CONTROL_REG+bEndp*ep_cmd_offset, c);    if (bEPPflags.bits.in_isr == 0)	ENABLE ();}/************************************************************** 函数名称: USB_SendResume()** 功能描述: 传输恢复** 输   入: 无** 输   出: 无************************************************************/#if USB_SendResume_ENvoidUSB_SendResume (void){    //outportb(USB_COMMAND, 0xF6);                  //设置发送恢复}#endif /*  *//************************************************************** 函数名称: USB_ReadCurrentFrameNumber()** 功能描述: 读取当前帧号** 输   入: 无** 输   出: 当前帧号************************************************************/#if USB_ReadCurrentFrameNumber_END_UINT16USB_ReadCurrentFrameNumber (void){//      D_UINT16 i,j;    if (bEPPflags.bits.in_isr == 0)	DISABLE ();/*	outportb(USB_COMMAND, 0xF5);			//发送读取当前帧数目命令	i= inportb(USB_DATA);					//读取帧数目的低8位	j = inportb(USB_DATA);					//读取帧数目的高8位	i += (j<<8);*/    if (bEPPflags.bits.in_isr == 0)	ENABLE ();    return 1;			//返目当前帧数目}#endif /*  *//************************************************************** 函数名称: USB_ReadEndpoint()** 功能描述: 读取端点数据** 输   入: D_UINT8 endp:     端点索引号,取值 0 ~ 5 	    	 D_UINT8 len:	     要读取的数据长度	     	 D_UINT8 * buf:    接收数据指针** 输   出: 实际读得的字节数************************************************************/D_UINT16USB_ReadEndpoint (D_UINT8 endp, D_UINT16 len, D_UINT8 * buf){    D_UINT16 i, j;    if (bEPPflags.bits.in_isr == 0)	DISABLE ();    /*       outportb(USB_COMMAND, endp);                                         //发送选择端点命令       if((inportb(USB_DATA) & USB_FULLEMPTY) == 0) {               //如果缓冲区为空       if(bEPPflags.bits.in_isr == 0)       ENABLE();       return 0;                                                                            //则返回读到0字节       }     */    // 读取端点EPN需要读取数据的长度,并赋值给j    //outportb(USB_COMMAND, 0xF0);                                          //发送读缓冲区命令    j = (get_register (EP_RX_FIFO_DATA_COUNT_MSB + ep_data_offset * endp)) <<	8;    //读取保留字节    //j <<= 8;                                                                                      //读取数据字节的数目/长度    j |= get_register (EP_RX_FIFO_DATA_COUNT_LSB + ep_data_offset * endp);    if (j == 0)      {	  if (bEPPflags.bits.in_isr == 0)	      ENABLE ();	  return 0;      }    if (j > len)		//如果大于要求读的字节数目	j = len;		//则只读取要求的字节长度    //读取要求的字节数目/长度    for (i = 0; i < j; i++)	*(buf + i) =	    get_register (i + EP_RX_FIFO_DATA + ep_data_offset * endp);    // outportb(USB_COMMAND, 0xF2);         //清缓冲区,新的信息包才可以重新被接受    if (bEPPflags.bits.in_isr == 0)	ENABLE ();    return j;			//返回读到的字节数}/************************************************************** 函数名称: USB_WriteEndpoint()** 功能描述: 把数据写入端点** 输   入: D_UINT8 endp:     端点索引号,取值 0 ~ 5 	     	 D_UINT8 len:	     要写入的数据长度	     	 D_UINT8 * buf:    发送数据指针** 输   出: 实际写入的字节数************************************************************/D_UINT16USB_WriteEndpoint (D_UINT8 endp, D_UINT16 len, D_UINT8 * buf){    D_UINT8 c;    D_UINT16 i;    if (bEPPflags.bits.in_isr == 0)	DISABLE ();    set_register (ENDPOINT_SIZE_LSB_REG + ep_cmd_offset * endp, len & 0xff);    set_register (ENDPOINT_SIZE_MSB_REG + ep_cmd_offset * endp,		  (len >> 8) & 0x3);    for (i = 0; i < len; i++)	// 每次向EPn寄存器中写入8bits数据;	// 每次软件向该寄存器写入数据后,udc将数据发送到FIFO中	set_register (i + EP_TX_FIFO_DATA + ep_data_offset * endp,		      *(buf + i));    c = get_register (ENDPOINT_CONTROL_REG + ep_cmd_offset * endp);    //使缓冲区有效    set_register (ENDPOINT_CONTROL_REG + ep_cmd_offset * endp,		  c | ENDPOINT_READY_BIT);    if (bEPPflags.bits.in_isr == 0)	ENABLE ();    return len;			//返回写入的字节数}/************************************************************** 函数名称: USB_AcknowledgeEndpoint()** 功能描述: 应答Setup** 输   入: D_UINT8 endp:     端点索引号,取值 0 ~ 5 ** 输   出: 无************************************************************/#if 0voidUSB_AcknowledgeEndpoint (D_UINT8 endp){    outportb (USB_COMMAND, endp);	//选择端点    outportb (USB_COMMAND, 0xF1);	//应答Setup指令    if (endp == 0)	outportb (USB_COMMAND, 0xF2);	//清空该端点缓冲区}#endif /*  *//************************************************************** 函数名称: void USB_ClearBuff()** 功能描述: 清指定端点的缓冲区(包括双缓冲区)** 输   入: D_UINT8 endp:     端点索引号,取值 0 ~ 5 ** 输   出: 无************************************************************/#if 0voidUSB_ClearBuff (D_UINT8 endp){    outportb (USB_COMMAND, endp);	//选择端点    outportb (USB_COMMAND, 0xF2);	//清空第1个缓冲区            if (endp >= 4)      {	  outportb (USB_COMMAND, endp);	//选择端点	  outportb (USB_COMMAND, 0xF2);	//清空第2个缓冲区              }}#endif /*  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -