[an error occurred while processing this directive]
весь обработчик внутри (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено omen 05 июля 2006 г. 13:04
В ответ на: Не могу найти информацию как подключить прерывание USB в SAM7S64 отправлено misyachniy 05 июля 2006 г. 12:56

void USB_c_irq_handler( void )
{
unsigned long ulTemp;
// unsigned long ulCSR1;
unsigned long ulCSR2;

unsigned long ulEpStatus;
unsigned long ulIrqStatus;

ulIrqStatus = AT91C_BASE_UDP->UDP_ISR; // читаем причину прерывания
ulTemp = ulEpStatus = AT91C_BASE_UDP->UDP_CSR[usbEND_POINT_0];
// ulCSR1 = AT91C_BASE_UDP->UDP_CSR[usbEND_POINT_1];
ulCSR2 = AT91C_BASE_UDP->UDP_CSR[usbEND_POINT_2];

if(ulIrqStatus & AT91C_UDP_ENDBUSRES)
{

prvConfigureAndResetEP( usbEND_POINT_0, AT91C_UDP_EPTYPE_CTRL, true ); //разрешим endpoint 0 как control
prvConfigureAndResetEP( usbEND_POINT_1, AT91C_UDP_EPTYPE_BULK_IN, true );
prvConfigureAndResetEP( usbEND_POINT_2, AT91C_UDP_EPTYPE_BULK_OUT, true );
AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT0; //разрешим прерывание endpoint 0
}

if(ulIrqStatus & AT91C_UDP_EPINT0)
{
//UART1_Transmit_Str_Flash( "EP0" );
if (ulEpStatus & AT91C_UDP_RX_DATA_BK0)
{
usbCSR_CLEAR_BIT( &ulTemp, AT91C_UDP_RX_DATA_BK0);
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;
pxCharsForTx.ulNextCharIndex = pxCharsForTx.ulTotalDataLength;
}

if (ulEpStatus & AT91C_UDP_TXCOMP)
{
// We received a TX complete interrupt. What we do depends on
// what we sent to get this interrupt.

usbCSR_CLEAR_BIT( &ulTemp, AT91C_UDP_TXCOMP);
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;

if (eDriverState == eJUST_GOT_ADDRESS)
{
// We sent an acknowledgement of a SET_ADDRESS request.
// Move to the addressed state.
if (ulReceivedAddress != 0)
{
AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN;
}
else
{
AT91C_BASE_UDP->UDP_GLBSTATE = 0;
}

AT91C_BASE_UDP->UDP_FADDR = ( AT91C_UDP_FEN | ulReceivedAddress );

eDriverState = eNOTHING;
}
else if (eDriverState == eJUST_GOT_CONFIG)
{
// We sent an acknowledgement of a SET_CONFIG request.
// We are now at the end of the enumeration.
AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_CONFG;

// Read the end point for data transfer.
// AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT1; // разрешим прерывание endpoint 1
AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT2; // разрешим прерывание endpoint 2
UART1_Transmit_Str_Flash( "FUCK!" );

eDriverState = eREADY_TO_SEND;
}
else
{
// The TXCOMP was not for any special type of transmission.
// See if there is any more data to send.
prvSendNextSegment();
}
}

if( ulEpStatus & AT91C_UDP_RXSETUP )
{
usbUSB_REQUEST usbRequest;

unsigned char ucRequest;
unsigned long ulRxBytes;
unsigned char i = 0;

//пришел setup пакет, прочтем его
ulRxBytes = (ulEpStatus >> 16) & 0x7ff;

if( ulRxBytes == 8 ) // setup пакеты всегда по 8 байт
{
while (ulRxBytes--)
{
usbRequest.bytes[ i++ ] = AT91C_BASE_UDP->UDP_FDR[ 0 ];
//UART1_Transmit_Byte( usbRequest.bytes[ i-1 ] );
};

usbCSR_SET_BIT( &ulTemp, AT91C_UDP_DIR );
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;
usbCSR_CLEAR_BIT( &ulTemp, AT91C_UDP_RXSETUP);
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_0 ] = ulTemp;

// Manipulate the ucRequestType and the ucRequest parameters to
// generate a zero based request selection. This is just done to
// break up the requests into subsections for clarity. The
// alternative would be to have more huge switch statement that would
// be difficult to optimise.
ucRequest = (usbRequest.xRequest.ucRequestType & 0x60) >> 3;
ucRequest |= (usbRequest.xRequest.ucRequestType & 0x03);

switch( ucRequest )
{
case usbSTANDARD_DEVICE_REQUEST:
// Standard Device request
prvHandleStandardDeviceRequest( &(usbRequest.xRequest) );
break;

case usbSTANDARD_INTERFACE_REQUEST:
// Standard Interface request
prvHandleStandardInterfaceRequest( &(usbRequest.xRequest) );
break;

case usbSTANDARD_END_POINT_REQUEST:
// Standard Endpoint request
prvHandleStandardEndPointRequest( &(usbRequest.xRequest) );
break;

case usbCLASS_INTERFACE_REQUEST:
// Class Interface request
prvHandleClassInterfaceRequest( &(usbRequest.xRequest) );
break;

default: // This is not something we want to respond to.
prvSendStall();
};
}
}
}


/*
if (ulIrqStatus & AT91C_UDP_EPINT1)
{
UART1_Transmit_Str_Flash( "IEP_1 " );
if (ulCSR1 & AT91C_UDP_TXCOMP)
{
bRequestReady = true;
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_1 ] &= ~(AT91C_UDP_TXCOMP);
AT91C_BASE_UDP->UDP_IDR = AT91C_UDP_EPINT1; // запрещаем прерывание endpoint 1
}
}
*/

if (ulIrqStatus & AT91C_UDP_EPINT2)
{
unsigned int receivedCnt = (ulCSR2 >> 16) & 0x7FF;
if (((ulCSR2 & AT91C_UDP_RX_DATA_BK0) || (ulCSR2 & AT91C_UDP_RX_DATA_BK1)))
{
if (receivedCnt)
{
unsigned char i = 0;
while (receivedCnt)
{
//UART1_Transmit_Byte( AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_2 ] );
aucCmd[ i ] = AT91C_BASE_UDP->UDP_FDR[ usbEND_POINT_2 ];
i++;
receivedCnt--;
}
bCmdReady = true;
}
AT91C_BASE_UDP->UDP_CSR[ usbEND_POINT_2 ] &= ~(AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1);
}
}

AT91C_BASE_UDP->UDP_ICR = AT91C_BASE_UDP->UDP_IMR | AT91C_UDP_ENDBUSRES;
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_UDP); // снимаем прерывание в AIC
AT91C_BASE_AIC->AIC_EOICR = 0;
}



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru