Переделываю пример usbbulk-1-0-3-lpc214x.zip для работы как CDC. Размер дескриптора 67 байтов и не может быть передан за раз.
Код
void tn_usb_lpc_cmd(int cmd)
{
rUSBDevIntClr = CDFULL | CCEMTY; // clear CDFULL/CCEMTY
rUSBCmdCode = 0x00000500 | (cmd << 16); // write command code
while(!(rUSBDevIntSt & CCEMTY));
rUSBDevIntClr = CCEMTY;
}
int tn_usb_ep0_write(int ep_num_logical,BYTE * buf,int nbytes)
{
union
{
BYTE b[4];
unsigned int w;
}data;
ep_num_logical &= 0x8F;
rUSBCtrl = WR_EN | ((ep_num_logical & 0x0F)<< 2); // set write enable for specific endpoint
rUSBTxPLen = nbytes; // set packet length
if(nbytes > 0)
{
while(rUSBCtrl & WR_EN) // write data
{
data.b[0] = *buf++;
data.b[1] = *buf++;
data.b[2] = *buf++;
data.b[3] = *buf++;
rUSBTxData = data.w;
}
}
rUSBCtrl = 0;
tn_usb_lpc_cmd(CMD_EP_SELECT | ep_num_lg2ph(ep_num_logical));
tn_usb_lpc_cmd(CMD_EP_VALIDATE_BUFFER);
return nbytes;
}
{
rUSBDevIntClr = CDFULL | CCEMTY; // clear CDFULL/CCEMTY
rUSBCmdCode = 0x00000500 | (cmd << 16); // write command code
while(!(rUSBDevIntSt & CCEMTY));
rUSBDevIntClr = CCEMTY;
}
int tn_usb_ep0_write(int ep_num_logical,BYTE * buf,int nbytes)
{
union
{
BYTE b[4];
unsigned int w;
}data;
ep_num_logical &= 0x8F;
rUSBCtrl = WR_EN | ((ep_num_logical & 0x0F)<< 2); // set write enable for specific endpoint
rUSBTxPLen = nbytes; // set packet length
if(nbytes > 0)
{
while(rUSBCtrl & WR_EN) // write data
{
data.b[0] = *buf++;
data.b[1] = *buf++;
data.b[2] = *buf++;
data.b[3] = *buf++;
rUSBTxData = data.w;
}
}
rUSBCtrl = 0;
tn_usb_lpc_cmd(CMD_EP_SELECT | ep_num_lg2ph(ep_num_logical));
tn_usb_lpc_cmd(CMD_EP_VALIDATE_BUFFER);
return nbytes;
}
Можно ли для передачи вызвать 2 раза подряд эту процедуру с nbytes=64 и 3
или требуется проверка получения SETUP пакета как в примере от филлипса?
Код
// Validate buffer
USB_ValidateBuffer(CTRL_ENP_IN);
// Wait until data is send or overwrite by setup packet
while ((ENDPINTS & (1<<CTRL_ENP_IN)) == 0)
{
if ((USB_Cmd(CMD_USB_SET_EP_STAT + CTRL_ENP_IN,0) & 1) == 0)
{
if((ENDPINTS & (1<<CTRL_ENP_IN)) == 0)
{
USB_Cmd(CMD_USB_SEL_CLR_INT_EP + CTRL_ENP_IN,0);
return;
}
}
}
USB_Cmd(CMD_USB_SEL_CLR_INT_EP + CTRL_ENP_IN,0);
ENDPINTCLR = (1<<CTRL_ENP_IN);
USB_ValidateBuffer(CTRL_ENP_IN);
// Wait until data is send or overwrite by setup packet
while ((ENDPINTS & (1<<CTRL_ENP_IN)) == 0)
{
if ((USB_Cmd(CMD_USB_SET_EP_STAT + CTRL_ENP_IN,0) & 1) == 0)
{
if((ENDPINTS & (1<<CTRL_ENP_IN)) == 0)
{
USB_Cmd(CMD_USB_SEL_CLR_INT_EP + CTRL_ENP_IN,0);
return;
}
}
}
USB_Cmd(CMD_USB_SEL_CLR_INT_EP + CTRL_ENP_IN,0);
ENDPINTCLR = (1<<CTRL_ENP_IN);
Спасибо!
только что нашел в коде, где это должно обрабатываться
Код
void tn_usb_st_DATAIN(USB_EP_STATUS * eps)
{
int bytes;
if(eps->nbytes > USB_MAX_PACKET0)
bytes = USB_MAX_PACKET0;
else
bytes = eps->nbytes;
bytes = tn_usb_ep0_write(0x80,(BYTE*)eps->pdata, bytes); //-- Tx EP0
eps->nbytes -= bytes;
eps->pdata += bytes;
}
{
int bytes;
if(eps->nbytes > USB_MAX_PACKET0)
bytes = USB_MAX_PACKET0;
else
bytes = eps->nbytes;
bytes = tn_usb_ep0_write(0x80,(BYTE*)eps->pdata, bytes); //-- Tx EP0
eps->nbytes -= bytes;
eps->pdata += bytes;
}
Оказывается eps->nbytes -= bytes; это (unsigned int*), смещение на bytes считалось неправильно