Цитата(Bulat @ Jan 9 2008, 09:34)

Спасибо, но хотелось бы еще посмотреть на пример кода осуществляющий запись данных в конечную точку EP_IN, для передачи их хосту.
__ramfunc __arm u_int AT91F_UDP_Write(AT91PS_HID pCdc, char *pData, u_int length){
AT91PS_UDP pUdp = pCdc->pUdp;
u_int cpt = 0;
if (length)
while ( (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY) && !(pUdp->UDP_ISR & AT91C_UDP_RXSUSP) );
// Send the first packet
cpt = MIN(length, FTDI_EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
while (length) {
// Fill the second bank
cpt = MIN(length, FTDI_EP_IN_SIZE);
length -= cpt;
while ( (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY) && !(pUdp->UDP_ISR & AT91C_UDP_RXSUSP) );
if ( pUdp->UDP_ISR & AT91C_UDP_RXSUSP ) return length;
while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
// Wait for the the first bank to be sent
while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
if ( !AT91F_UDP_IsConfigured(pCdc) )
return length;
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
}
// Wait for the end of transfer
while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) ){
if ( !AT91F_UDP_IsConfigured(pCdc) )
return length;
};
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
return length;
}
Для ускоренной передачи пакетов не более 64 байта:
__ramfunc __arm void AT91F_UDP_Write64(AT91PS_HID pCdc, char *pData, char length){
AT91PS_UDP pUdp = pCdc->pUdp;
while ( (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY) && !(pUdp->UDP_ISR & AT91C_UDP_RXSUSP) );
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (length--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
}
Цитата(Bulat @ Jan 9 2008, 09:34)

Да и еще вопрос. В функции AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, udp_c_irq_handler) не определены параметры UDP_INTERRUPT_LEVEL и AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE. Где они определяются?
Делается один раз в main:
if (HID.IsConfigured(&HID)) {
HID.pUdp->UDP_ICR = 0xff00;
AT91F_UDP_DisableIt ( HID.pUdp, 0xFFFF);
AT91F_UDP_EnableIt ( HID.pUdp, AT91C_UDP_EPINT2);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, udp_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);
}