📄 drv_usb_hwif.c
字号:
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 + -