чтобы работала с моим драйвером и убрал код связанный с усарт. Нумерация проходит нормально. Writefile тоже работает. Пакеты благополучно
доставляются моему девайсу. Не могу реализовать передачу пакетов от девайса хосту. Readfile возвращает ошибку.
В стандартной прошивке в файле cdc_enumerate.c я нашел функцию AT91F_UDP_IsConfigured(AT91PS_CDC pCdc), которая, как я понял отвечает за обработку
источников прерываний isr. Туда я добавил свой код, кот обрабатывает прерывания от ер1 и ер2 (ер1 - in, ep2 - out).
Вот этот код:
Код
//*----------------------------------------------------------------------------
//* \fn AT91F_UDP_IsConfigured
//* \brief Test if the device is configured and handle enumeration
//*----------------------------------------------------------------------------
static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc)
{
AT91PS_UDP pUDP = pCdc->pUdp;
AT91_REG isr = pUDP->UDP_ISR;
if (isr & AT91C_UDP_ENDBUSRES) {
pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
// reset all endpoints
pUDP->UDP_RSTEP = (unsigned int)-1;
pUDP->UDP_RSTEP = 0;
// Enable the function
pUDP->UDP_FADDR = AT91C_UDP_FEN;
// Configure endpoint 0
pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
}
else if (isr & AT91C_UDP_EPINT0) {
pUDP->UDP_ICR = AT91C_UDP_EPINT0;
AT91F_CDC_Enumerate(pCdc);
}
else if (isr & AT91C_UDP_EPINT1){
pUDP->UDP_ICR = AT91C_UDP_EPINT1;
pUDP->UDP_CSR[1]=0; //подтверждает, что хост принял данные
}
else if (isr & AT91C_UDP_EPINT2){
pUDP->UDP_ICR = AT91C_UDP_EPINT2;
AT91F_CDC_ReadData(pCdc);
}
return pCdc->currentConfiguration;
}
//* \fn AT91F_UDP_IsConfigured
//* \brief Test if the device is configured and handle enumeration
//*----------------------------------------------------------------------------
static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc)
{
AT91PS_UDP pUDP = pCdc->pUdp;
AT91_REG isr = pUDP->UDP_ISR;
if (isr & AT91C_UDP_ENDBUSRES) {
pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
// reset all endpoints
pUDP->UDP_RSTEP = (unsigned int)-1;
pUDP->UDP_RSTEP = 0;
// Enable the function
pUDP->UDP_FADDR = AT91C_UDP_FEN;
// Configure endpoint 0
pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
}
else if (isr & AT91C_UDP_EPINT0) {
pUDP->UDP_ICR = AT91C_UDP_EPINT0;
AT91F_CDC_Enumerate(pCdc);
}
else if (isr & AT91C_UDP_EPINT1){
pUDP->UDP_ICR = AT91C_UDP_EPINT1;
pUDP->UDP_CSR[1]=0; //подтверждает, что хост принял данные
}
else if (isr & AT91C_UDP_EPINT2){
pUDP->UDP_ICR = AT91C_UDP_EPINT2;
AT91F_CDC_ReadData(pCdc);
}
return pCdc->currentConfiguration;
}
Т.е. при получении данных от хоста возникает прерывание от ер2 и вызывается функция AT91F_CDC_ReadData(pCdc). Ее код приведен ниже:
Код
extern struct _AT91S_CDC pCDC;
static char adrRT[64];
AT91PS_UDP pUDP = pCdc->pUdp;
pCDC.Read(&pCDC, adrRT,64);
uint nbytes = AT91F_UDP_Read(pCdc, adrRT, 64);
pUDP->UDP_CSR[2]=pUDP->UDP_CSR[2]&0x7FFFFFD;/*сброс бита RX_DATA_BK0 -
подтвердение того, что данные из FIFO считаны*/
static char CWord[64];
CWord[1] = nbytes;
pCDC.Write(&pCDC,CWord,64);
static char adrRT[64];
AT91PS_UDP pUDP = pCdc->pUdp;
pCDC.Read(&pCDC, adrRT,64);
uint nbytes = AT91F_UDP_Read(pCdc, adrRT, 64);
pUDP->UDP_CSR[2]=pUDP->UDP_CSR[2]&0x7FFFFFD;/*сброс бита RX_DATA_BK0 -
подтвердение того, что данные из FIFO считаны*/
static char CWord[64];
CWord[1] = nbytes;
pCDC.Write(&pCDC,CWord,64);
Т.е. я считываю данные из буфера, а потом пытаюсь передать количество полученных байт обратно на хост, но они не передаются, т.к. device monitoring studio не показывает принятых байт от моего девайса.
Привожу код функции main() из файла main.c
Код
// Enable User Reset and set its minimal assertion to 960 us
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
// Init USB device
AT91F_USB_Open();
// Init USB device
// Wait for the end of enumeration
while (!pCDC.IsConfigured(&pCDC));
while(1);
AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
// Init USB device
AT91F_USB_Open();
// Init USB device
// Wait for the end of enumeration
while (!pCDC.IsConfigured(&pCDC));
while(1);
Как правильно воспользоваться этой стандартной прошивкой, чтобы считывать и записывать данные в конечные точки? Может я свой код не туда добавил, вроде кроме как в AT91F_UDP_IsConfigured(AT91PS_CDC pCdc) и некуда, она же прерывания обрабатывает или я не прав?