Example #1
0
File: usbdrv.c Project: unhold/avr
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
}
Example #2
0
File: usbdrv.c Project: unhold/avr
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
}
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}