Hi, I have some questions about configuration USB OTG controller on EVM OMAP L138
Sample code I use refer SPRUFM9D :
1) file main.c
#include "stdio.h"
#include "types.h"
#include "evmomapl138.h"
#include "evmomapl138_timer.h"
#include "usb_reg_test.h"
#include "evmomapl138_usb.h"
///////////////////////////////////////////////////////////////////
int main(void)
{
// uint16_t I;
// uint32_t results = 0;
#if NO_GEL
EVMOMAPL138_init();
EVMOMAPL138_initRAM();
#endif
USTIMER_init();
USB_OTG_init_forum();
//---------------------------------------------------------------------
printf("STATR = 0x%X\r\n",USB_OTG->STATR);
printf("CTRLR = 0x%X\r\n",USB_OTG->CTRLR);
printf("CFGCHIP[2] = 0x%X\r\n",SYSCONFIG->CFGCHIP[2]);
printf("INTSRCR = 0x%X\r\n",USB_OTG->INTSRCR);
printf("INTSETR = 0x%X\r\n",USB_OTG->INTSETR);
printf("INTCLRR = 0x%X\r\n",USB_OTG->INTCLRR);
printf("EOIR = 0x%X\r\n",USB_OTG->EOIR);
printf("FADDR = 0x%X\r\n",USB_OTG->FADDR);
printf("POWER = 0x%X\r\n",USB_OTG->POWER);
printf("INTRTX = 0x%X\r\n",USB_OTG->INTRTX);
printf("INTRRX = 0x%X\r\n",USB_OTG->INTRRX);
printf("INTRTXE = 0x%X\r\n",USB_OTG->INTRTXE);
printf("INTRRXE = 0x%X\r\n",USB_OTG->INTRRXE);
printf("INTRUSB = 0x%X\r\n",USB_OTG->INTRUSB);
printf("INDEX = 0x%X\r\n",USB_OTG->INDEX);
printf("HOST_CSR0 = 0x%X\r\n",USB_OTG->HOST_CSR0);
printf("COUNT0 = 0x%X\r\n",USB_OTG->COUNT0);
printf("HOST_TYPE0 = 0x%X\r\n",USB_OTG->HOST_TYPE0);
printf("HOST_NAKLIMIT0 = 0x%X\r\n",USB_OTG->HOST_NAKLIMIT0);
printf("CONFIGDATA = 0x%X\r\n",USB_OTG->CONFIGDATA);
printf("DEVCTL = 0x%X\r\n",USB_OTG->DEVCTL);
USB_OTG_SETUP();
return(0);
}
USB initialization procedure:
//-----------------------------------------------------------------------------
// \file test_usb.c
// \brief simple reading registers
//
//-----------------------------------------------------------------------------
#include "stdio.h"
#include "types.h"
#include "evmomapl138.h"
#include "evmomapl138_timer.h"
//#include "usb_reg_test.h"
#include "evmomapl138_usb.h"
///////////////////////////////////////////////////////////////////////////////////////
void USB_OTG_init_forum()
{
uint16_t I;
// Config BootREGS
SYSCONFIG->KICKR[0] = KICK0R_UNLOCK;
SYSCONFIG->KICKR[1] = KICK1R_UNLOCK;
//Config PINMUX
SYSCONFIG->PINMUX[9] |= 0x010;
SYSCONFIG->PINMUX[9] &= 0xFFFFFF7F ;
// Reset the USB controller:
USB_OTG->CTRLR |= 0x00000001;
//Wait until controller is finished with Reset. When done, it will clear the RESET bit field.
while ((USB_OTG->CTRLR & 0x1) == 1);
// RESET: Hold PHY in Reset
SYSCONFIG->CFGCHIP[2] |= 0x00008000; // Hold PHY in Reset
// Drive Reset for few clock cycles
for (I=0; I < 50; I++);
// RESET: Release PHY from Reset
SYSCONFIG->CFGCHIP[2] &= 0xFFFF7FFF; // Release PHY from Reset
/* Configure PHY with the Desired Operation */
// OTGMODE
SYSCONFIG->CFGCHIP[2] &= 0xFFFF9FFF; // 00= > Do Not Override PHY Values
//SYSCONFIG->CFGCHIP[2] |= 0x00002000; // 11= > Override PHY Values, force host, VBUS low
// PHYPWDN
SYSCONFIG->CFGCHIP[2] &= 0xFFFFFBFF; // 1/0 = > PowerdDown/ NormalOperation
// OTGPWRDN
SYSCONFIG->CFGCHIP[2] &= 0xFFFFFDFF; // 1/0 = > PowerDown/ NormalOperation
// DATAPOL
SYSCONFIG->CFGCHIP[2] |= 0x00000100; // 1/0 = > Normal/ Reversed
// SESNDEN
SYSCONFIG->CFGCHIP[2] |= 0x00000020; // 1/0 = > NormalOperation/ SessionEnd
// VBDTCTEN
SYSCONFIG->CFGCHIP[2] |= 0x00000010; // 1/0 = > VBUS Comparator Enable/ Disable
/* Configure PHY PLL use and Select Source */
// REF_FREQ[3:0]
SYSCONFIG->CFGCHIP[2] |= 0x00000002; // 0010b = > 24MHz Input Source
// USB2PHYCLKMUX: Select External Source
SYSCONFIG->CFGCHIP[2] &= 0xFFFFF7FF; // 1/0 = > Internal/External(Pin)
// PHY_PLLON: On Simulation PHY PLL is OFF
SYSCONFIG->CFGCHIP[2] |= 0x00000040; // 1/0 = > On/ Off
// Wait Until PHY Clock is Good //
while ((SYSCONFIG->CFGCHIP[2] & 0x00020000) == 0);
#ifndef HS_ENABLE
// Disable high-speed
USB_OTG->POWER &= ~USB_OTG_POWER_HSEN;
#else
// Enable high-speed
USB_OTG->POWER |= USB_OTG_POWER_HSEN;
#endif
// Enable Interrupts
// Enable interrupts in OTG block
USB_OTG->CTRLR &= 0xFFFFFFF7; // Enable PDR2.0 Interrupt
USB_OTG->INTRTXE = 0x1F; // Enable All Core Tx Endpoints Interrupts + EP0 Tx/Rx interrupt
USB_OTG->INTRRXE = 0x1E; // Enable All Core Rx Endpoints Interrupts
// Enable all interrupts in OTG block
USB_OTG->INTMSKSETR = 0x01FF1E1F;
// Enable all USB interrupts in MUSBMHDRC
USB_OTG->INTRUSBE = 0xFF;
// Enable SUSPENDM so that suspend can be seen UTMI signal
USB_OTG->POWER |= USB_OTG_POWER_ENSUSPM;
//Clear all pending interrupts
USB_OTG->INTCLRR = USB_OTG->INTSRCR;
//Set softconn bit
USB_OTG->POWER |= USB_OTG_POWER_SOFTCONN;
// while (( USB_OTG->DEVCTL & 0x01) == 0);
// Start a session
USB_OTG->DEVCTL |= USB_OTG_DEVCTL_SESSION;
USTIMER_init();
USB_OTG->POWER |= 0x20; // set bit5 - "1"
USB_OTG->POWER |= 0x08; //set bit3 - "1"
for (I=0; I<50; I++);
// set delay 20ms
USTIMER_delay(500000);
USB_OTG->POWER &= 0xF7;
}
void USB_OTG_SETUP()
{
printf("_____________________\n");
USB_OTG->INTCLRR &= 0xffffffff;
printf("INTCLRR = 0x%X\r\n",USB_OTG->INTCLRR);
USB_OTG->FIFO0 = 0x030500 ;//DATA
USB_OTG->HOST_CSR0 |= 0x0A;/// SETUPPKT and TXPKTRDY
printf("HOST_CSR0 = 0x%X\r\n",USB_OTG->HOST_CSR0);
USTIMER_delay(500000);
printf("INTSRCR = 0x%X\r\n",USB_OTG->INTSRCR);
printf("INTCLRR = 0x%X\r\n",USB_OTG->INTCLRR);
if ((USB_OTG->HOST_CSR0 & 0x04)== 0x04 )// RXSTALL
{
printf("RXSTALL = 0x%X\r\n",USB_OTG->HOST_CSR0);
}
else
{
printf("RXSTALL_OK = 0x%X\r\n",USB_OTG->HOST_CSR0);
}
if ((USB_OTG->HOST_CSR0 & 0x0010)== 0x0010 )// ERROR
{
printf("ERROR = 0x%X\r\n",USB_OTG->HOST_CSR0);
}
else
{
printf("ERRROR_OK = 0x%X\r\n",USB_OTG->HOST_CSR0);
}
if ((USB_OTG->HOST_CSR0 & 0x080)== 0x080 )// NAK_TIMEOUT
{
printf("NAK_TIMEOUT = 0x%X\r\n",USB_OTG->HOST_CSR0);
}
else
{
printf("NAK_TIMEOUT_OK = 0x%X\r\n",USB_OTG->HOST_CSR0);
}
}
////////////////////////////////////////////////////////////////////////////////
And now I have some questions
- Where can I find PINMUX settings USB OTG (in my sample code I use PINMUX from OMAP L137 example)
- Registers values after run this programm:
STATR=0x01
INTSRCR=0x1100000
INTSETR=0x1100000
INTCLRR=0x1100000
EOIR=0
FADDR=0
POWER=0x61
INDEX=0
DEVCTRL=0x5D
CTRL=0x0
CFGCHIP2=0x301F2
USB_ID pin is LOW
After doing init USB I try to start Control Transfer and receive Standart Device Descriptor
Load 8 bytes in EP0 FIFO and set SETUPPKT and TXPKTRDY, and then EP0 Interrupt...But I did not receive ANY INTERRUPT AT ALL!
АБСОЛЮТНО НИЧЕГО НЕ ПРОИСХОДИТ!НИКАКИХ ПРЕРЫВАНИЙ НЕ ВОЗНИКАЕТ!
That should I do?There is my mistake?
Best regard,Anton