static void usbBuildTxBlock(void) { uchar wantLen, len, txLen, token; wantLen = usbMsgLen; if(wantLen > 8) wantLen = 8; usbMsgLen -= wantLen; token = USBPID_DATA1; if(usbMsgFlags & USB_FLG_TX_PACKET) token = USBPID_DATA0; usbMsgFlags++; len = usbRead(usbTxBuf + 1, wantLen); if(len <= 8){ /* valid data packet */ usbCrc16Append(usbTxBuf + 1, len); txLen = len + 4; /* length including sync byte */ if(len < 8) /* a partial package identifies end of message */ usbMsgLen = 0xff; }else{ token = USBPID_STALL; txLen = 2; /* length including sync byte */ usbMsgLen = 0xff; } usbTxBuf[0] = token; usbTxLen = txLen; #if DEBUG_LEVEL > 1 DBG2(0x20, usbTxBuf, txLen-1); #else DBG1(0x20, usbTxBuf + 1, 2); #endif }
void usbSetInterrupt(uchar *data, uchar len) { uchar *p, i; #if USB_CFG_IMPLEMENT_HALT if(usbHalted1) return; #endif if(len > 8) /* interrupt transfers are limited to 8 bytes */ len = 8; i = USBPID_DATA1; if(usbTxPacketCnt1 & 1) i = USBPID_DATA0; if(usbTxLen1 < 0){ /* packet buffer was empty */ usbTxPacketCnt1++; }else{ usbTxLen1 = -1; /* avoid sending incomplete interrupt data */ } p = usbTxBuf1; *p++ = i; for(i=len;i--;) *p++ = *data++; usbCrc16Append(&usbTxBuf1[1], len); usbTxLen1 = len + 4; /* len must be given including sync byte */ #if DEBUG_LEVEL > 1 DBG2(0x21, usbTxBuf1, usbTxLen1-1); #else DBG1(0x21, usbTxBuf1 + 1, 2); #endif }
void usbSetInterrupt(uchar *data, uchar len) { uchar *p, i; #if USB_CFG_IMPLEMENT_HALT if(usbTxLen1 == USBPID_STALL) return; #endif #if 0 /* No runtime checks! Caller is responsible for valid data! */ if(len > 8) /* interrupt transfers are limited to 8 bytes */ len = 8; #endif i = USBPID_DATA1; if(usbTxPacketCnt1 & 1) i = USBPID_DATA0; if(usbTxLen1 & 0x10){ /* packet buffer was empty */ usbTxPacketCnt1++; }else{ usbTxLen1 = USBPID_NAK; /* avoid sending incomplete interrupt data */ } p = usbTxBuf1; *p++ = i; for(i=len;i--;) *p++ = *data++; usbCrc16Append(&usbTxBuf1[1], len); usbTxLen1 = len + 4; /* len must be given including sync byte */ DBG2(0x21, usbTxBuf1, len + 3); }
USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len) { uchar *p, i; if(usbTxLen3 & 0x10){ /* packet buffer was empty */ usbTxBuf3[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* toggle token */ }else{ usbTxLen3 = USBPID_NAK; /* avoid sending outdated (overwritten) interrupt data */ } p = usbTxBuf3 + 1; for(i=len;i--;) *p++ = *data++; usbCrc16Append(&usbTxBuf3[1], len); usbTxLen3 = len + 4; /* len must be given including sync byte */ DBG2(0x23, usbTxBuf3, len + 3); }
void usbSetInterrupt3(uchar *data, uchar len) { uchar *p, i; i = USBPID_DATA1; if(usbTxPacketCnt3 & 1) i = USBPID_DATA0; if(usbTxLen3 & 0x10){ /* packet buffer was empty */ usbTxPacketCnt3++; }else{ usbTxLen3 = USBPID_NAK; /* avoid sending incomplete interrupt data */ } p = usbTxBuf3; *p++ = i; for(i=len;i--;) *p++ = *data++; usbCrc16Append(&usbTxBuf3[1], len); usbTxLen3 = len + 4; /* len must be given including sync byte */ DBG2(0x23, usbTxBuf3, len + 3); }