u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout) { volatile UINT32* semaphore = (volatile UINT32*)sem; if(timeout != 0) { INT64 now = ::HAL_Time_CurrentTime(); INT64 elapsed = now + (timeout * 10000); while(elapsed > ::HAL_Time_CurrentTime()) { if(IsSemaphoreGreen(semaphore)) { AcquireSemaphore(semaphore); break; } if(INTERRUPTS_ENABLED_STATE()) { if(Events_WaitForEvents(SYSTEM_EVENT_FLAG_NETWORK, timeout)) { Events_Clear(SYSTEM_EVENT_FLAG_NETWORK); } } else { break; } } } else { while(1) { // wait and call the continuation for tcpip_thread if(IsSemaphoreGreen(semaphore)) { AcquireSemaphore(semaphore); break; } if(INTERRUPTS_ENABLED_STATE()) { Events_WaitForEvents(SYSTEM_EVENT_FLAG_NETWORK, EVENTS_TIMEOUT_INFINITE); Events_Clear(SYSTEM_EVENT_FLAG_NETWORK); } else { break; } } } return *semaphore; }
void ApplicationEntryPoint() { INT32 timeout = 20000; // 20 second timeout bool enterBootMode = false; // crypto API needs to allocate memory. Initialize simple heap for it. UINT8* BaseAddress; UINT32 SizeInBytes; HeapLocation ( BaseAddress, SizeInBytes ); SimpleHeap_Initialize( BaseAddress, SizeInBytes ); g_eng.Initialize( HalSystemConfig.DebuggerPorts[ 0 ] ); // internal reset and stop check enterBootMode = g_PrimaryConfigManager.IsBootLoaderRequired( timeout ); // ODM defined method to enter bootloader mode if(!enterBootMode) { enterBootMode = WaitForTinyBooterUpload( timeout ); } if(!enterBootMode) { if(!g_eng.EnumerateAndLaunch()) { timeout = -1; enterBootMode = true; } } if(enterBootMode) { LCD_Clear(); hal_fprintf( STREAM_LCD, "TinyBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); hal_fprintf( STREAM_LCD, "%s Build Date:\r\n\t%s %s\r\n", HalName, __DATE__, __TIME__ ); DebuggerPort_Initialize( HalSystemConfig.DebuggerPorts[ 0 ] ); TinyBooter_OnStateChange( State_EnterBooterMode, NULL ); DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); hal_printf( "TinyBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); hal_printf( "%s Build Date: %s %s\r\n", HalName, __DATE__, __TIME__ ); #if defined(__GNUC__) hal_printf("GNU Compiler version %d\r\n", __GNUC__); #elif defined(_ARC) hal_printf("ARC Compiler version %d\r\n", _ARCVER); #elif defined(__ADSPBLACKFIN__) hal_printf( "Blackfin Compiler version %d\r\n", __VERSIONNUM__ ); #elif defined(__RENESAS__) hal_printf( "Renesas Compiler version %d\r\n", __RENESAS_VERSION__ ); #else hal_printf( "ARM Compiler version %d\r\n", __ARMCC_VERSION ); #endif DebuggerPort_Flush( HalSystemConfig.DebugTextPort ); // // Send "presence" ping. // { CLR_DBG_Commands::Monitor_Ping cmd; cmd.m_source = CLR_DBG_Commands::Monitor_Ping::c_Ping_Source_TinyBooter; g_eng.m_controller.SendProtocolMessage( CLR_DBG_Commands::c_Monitor_Ping, WP_Flags::c_NonCritical, sizeof(cmd), (UINT8*)&cmd ); } UINT64 ticksStart = HAL_Time_CurrentTicks(); // // Wait for somebody to press a button; if no button press comes in, lauch the image // do { const UINT32 c_EventsMask = SYSTEM_EVENT_FLAG_COM_IN | SYSTEM_EVENT_FLAG_USB_IN | SYSTEM_EVENT_FLAG_BUTTON; UINT32 events = ::Events_WaitForEvents( c_EventsMask, timeout ); if(events != 0) { Events_Clear( events ); } if(events & SYSTEM_EVENT_FLAG_BUTTON) { TinyBooter_OnStateChange( State_ButtonPress, (void*)&timeout ); } if(events & (SYSTEM_EVENT_FLAG_COM_IN | SYSTEM_EVENT_FLAG_USB_IN)) { g_eng.ProcessCommands(); } if(LOADER_ENGINE_ISFLAGSET(&g_eng, Loader_Engine::c_LoaderEngineFlag_ValidConnection)) { LOADER_ENGINE_CLEARFLAG(&g_eng, Loader_Engine::c_LoaderEngineFlag_ValidConnection); TinyBooter_OnStateChange( State_ValidCommunication, (void*)&timeout ); ticksStart = HAL_Time_CurrentTicks(); } else if((timeout != -1) && (HAL_Time_CurrentTicks()-ticksStart) > CPU_MillisecondsToTicks((UINT32)timeout)) { TinyBooter_OnStateChange( State_Timeout, NULL ); g_eng.EnumerateAndLaunch(); } } while(true); } ::CPU_Reset(); }
void ApplicationEntryPoint() { char Data[1], previousChar = '\0'; int ret = 0, TestItem = 0; BOOL validCommand = TRUE; MEMORY_MAPPED_NOR_BLOCK_CONFIG* config; // BlockStorageDevice *device; // ByteAddress datByteAddress; // BlockStorageList::FindDeviceForPhysicalAddress( &device, 0, datByteAddress ); // const BlockDeviceInfo * deviceInfo=device->GetDeviceInfo(); Data[1] = '\0'; char ip[15]; int length; unsigned long dest_ip=0; UINT32 sleep = 100; // TimedEvents eventsTest; // UART usartTest ( COMTestPort, 9600, USART_PARITY_NONE, 8, USART_STOP_BITS_ONE, USART_FLOW_NONE ); // GPIO gpioTest ( GPIOTestPin ); do { lcd_printf( "\n\n\n\n\n\n\n\n SH7619 EVB\n" ); lcd_printf( " Renesas America Inc." ); //Serial TEST hal_printf( "\r\nSH7619 EVB .NET Micro Framework NativeSample\r\n" ); hal_printf( "Renesas Electronics America Inc.\r\n" ); hal_printf( "61 MHz Clk,Big-endian\r\n" ); hal_printf( ">" ); NATIVE_PROFILE_PAL_EVENTS(); do { UINT32 Events = Events_WaitForEvents( SYSTEM_EVENT_FLAG_COM_IN | SYSTEM_EVENT_FLAG_ETHER, sleep ); // if(Events == 0) // { // hal_printf("Slept %d sec\r\n", sleep / 1000); // sleep += 1000; // continue; // } if(Events & SYSTEM_EVENT_FLAG_ETHER) { //Network_Interface_Process_Packet(); //hal_printf("ETHER event\r\n"); Events_Clear( SYSTEM_EVENT_FLAG_ETHER ); } if(Events & SYSTEM_EVENT_FLAG_COM_IN) { Events_Clear( SYSTEM_EVENT_FLAG_COM_IN ); while((ret = DebuggerPort_Read( HalSystemConfig.DebugTextPort, Data, 1 )) > 0) { switch(TestItem) { case 0: //None if(Data[0] == 0xD) //0xD: ENTER key { hal_printf( "\r\n" ); if(validCommand) { TestItem = 1; //Enter test validCommand = FALSE; previousChar = '\0'; hal_printf( "\r\nTest Menu:\r\n" ); hal_printf( " [L]CD Tests\r\n" ); hal_printf( " [K]eypad Tests\r\n" ); hal_printf( " [N]etwork Tests\r\n" ); hal_printf( " [F]lash memory Tests\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); } else if(previousChar == 'I') { hal_printf("** Invalid Selection\r\n>"); previousChar = '\0'; } else hal_printf( ">" ); } else { hal_printf( Data ); if(Data[0] == 'd' || Data[0] == 'D') { if(previousChar == '\0') previousChar = 'd'; else { validCommand = FALSE; previousChar = 'I'; //Invalid character input } } else if(Data[0] == 't' || Data[0] == 'T') { if(previousChar == 'd') { previousChar = 't'; validCommand = TRUE; } else { validCommand = FALSE; previousChar = 'I'; //Invalid character input } } else { validCommand = FALSE; previousChar = 'I'; //Invalid character input } } break; case 1: //Enter test hal_printf( Data ); switch(Data[0]) { case 'X': case 'x': TestItem = 0; hal_printf( "\r\n\n>" ); break; case 'L': case 'l': TestItem = 5; hal_printf( "\r\n\nLCD Menu:\r\n" ); hal_printf( " 1: Display colorful rectangles\r\n" ); hal_printf( " 2: Colorful wireframe rectangle\r\n" ); hal_printf( " 3: Colorful solid rectangle\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case 'K': case 'k': KeyPad_Test(); break; case 'N': case 'n': TestItem = 7; hal_printf( "\r\n\nEthernet Menu:\r\n" ); hal_printf( " [1]Read IP Address\r\n" ); hal_printf( " [2]Read EtherC Registers\r\n" ); hal_printf( " [3]Read E-DMAC Registers\r\n" ); hal_printf( " [4]Ping Test\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case 'F': case 'f': TestItem = 8; hal_printf( "\r\n\nFlash memory Menu:\r\n" ); hal_printf( " [1]Erase block\r\n" ); hal_printf( " [2]write block\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; default: hal_printf( "\r\n\nTest Menu:\r\n" ); hal_printf( " [L]CD Tests\r\n" ); hal_printf( " [K]eypad Tests\r\n" ); hal_printf( " [N]etwork Tests\r\n" ); hal_printf( " [F]lash memory Tests\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; } break; case 5: //LCD test hal_printf( Data ); switch(Data[0]) { case 'X': case 'x': TestItem = 1; hal_printf( "\r\n\nTest Menu:\r\n" ); hal_printf( " [L]CD Tests\r\n" ); hal_printf( " [K]eypad Tests\r\n" ); hal_printf( " [N]etwork Tests\r\n" ); hal_printf( " [F]lash memory Tests\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '1': LCDTest_Driver::LCD_Sample1(); hal_printf( "\r\n\nLCD Menu:\r\n" ); hal_printf( " 1: Display colorful rectangles\r\n" ); hal_printf( " 2: Colorful wireframe rectangle\r\n" ); hal_printf( " 3: Colorful solid rectangle\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '2': LCDTest_Driver::LCD_Sample2(0); hal_printf( "\r\n\nLCD Menu:\r\n" ); hal_printf( " 1: Display colorful rectangles\r\n" ); hal_printf( " 2: Colorful wireframe rectangle\r\n" ); hal_printf( " 3: Colorful solid rectangle\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '3': LCDTest_Driver::LCD_Sample2(1); hal_printf( "\r\n\nLCD Menu:\r\n" ); hal_printf( " 1: Display colorful rectangles\r\n" ); hal_printf( " 2: Colorful wireframe rectangle\r\n" ); hal_printf( " 3: Colorful solid rectangle\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; default: hal_printf( "\r\n\nLCD Menu:\r\n" ); hal_printf( " 1: Display colorful rectangles\r\n" ); hal_printf( " 2: Colorful wireframe rectangle\r\n" ); hal_printf( " 3: Colorful solid rectangle\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; } break; case 7: //Ethernet test hal_printf( Data ); hal_printf( "\r\n" ); switch(Data[0]) { case 'X': case 'x': TestItem = 1; hal_printf( "\r\n\nTest Menu:\r\n" ); hal_printf( " [L]CD Tests\r\n" ); hal_printf( " [K]eypad Tests\r\n" ); hal_printf( " [N]etwork Tests\r\n" ); hal_printf( " [F]lash memory Tests\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '1': //Network_Interface_IP_Address(); hal_printf( "\r\n\nEthernet Menu:\r\n" ); hal_printf( " [1]Read IP Address\r\n" ); hal_printf( " [2]Read EtherC Registers\r\n" ); hal_printf( " [3]Read E-DMAC Registers\r\n" ); hal_printf( " [4]Ping Test\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '2': //Network_Interface_EtherC_Registers(); hal_printf( "\r\n\nEthernet Menu:\r\n" ); hal_printf( " [1]Read IP Address\r\n" ); hal_printf( " [2]Read EtherC Registers\r\n" ); hal_printf( " [3]Read E-DMAC Registers\r\n" ); hal_printf( " [4]Ping Test\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '3': //Network_Interface_EDMAC_Registers(); hal_printf( "\r\n\nEthernet Menu:\r\n" ); hal_printf( " [1]Read IP Address\r\n" ); hal_printf( " [2]Read EtherC Registers\r\n" ); hal_printf( " [3]Read E-DMAC Registers\r\n" ); hal_printf( " [4]Ping Test\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '4': //do //{ // hal_printf( "\r\nEnter dest IP: " ); // Get_IP_String(ip, &length); // if( (dest_ip = Is_IP_Address(ip, length)) == 0) // hal_printf( "\r\n*** Invalid IP Address!\r\n" ); //}while(dest_ip == 0); //Ether_Ping(dest_ip, 4); hal_printf( "\r\n\nEthernet Menu:\r\n" ); hal_printf( " [1]Read IP Address\r\n" ); hal_printf( " [2]Read EtherC Registers\r\n" ); hal_printf( " [3]Read E-DMAC Registers\r\n" ); hal_printf( " [4]Ping Test\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; default: hal_printf( "\r\n\nEthernet Menu:\r\n" ); hal_printf( " [1]Read IP Address\r\n" ); hal_printf( " [2]Read EtherC Registers\r\n" ); hal_printf( " [3]Read E-DMAC Registers\r\n" ); hal_printf( " [4]Ping Test\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; } break; case 8: //Flash memory test hal_printf( Data ); hal_printf( "\r\n" ); switch(Data[0]) { case 'X': case 'x': TestItem = 1; hal_printf( "\r\n\nTest Menu:\r\n" ); hal_printf( " [L]CD Tests\r\n" ); hal_printf( " [K]eypad Tests\r\n" ); hal_printf( " [N]etwork Tests\r\n" ); hal_printf( " [F]lash memory Tests\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '1': g_AM29DL_16_BS_DeviceTable.InitializeDevice(pBLOCK_CONFIG); g_AM29DL_16_BS_DeviceTable.EraseBlock(pBLOCK_CONFIG,0xa0080000); hal_printf( "\r\n\nFlash memory Menu:\r\n" ); hal_printf( " [1]Erase block\r\n" ); hal_printf( " [2]write block\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; case '2': BYTE Buff[0x10]; for(int i=0; i<0x10; i++) Buff[i]=i; g_AM29DL_16_BS_DeviceTable.InitializeDevice(pBLOCK_CONFIG); g_AM29DL_16_BS_DeviceTable.Write(pBLOCK_CONFIG,0xa0080000,0x10,Buff,0x0); hal_printf( "\r\n\nFlash memory Menu:\r\n" ); hal_printf( " [1]Erase block\r\n" ); hal_printf( " [2]write block\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; default: hal_printf( "\r\n\nFlash memory Menu:\r\n" ); hal_printf( " [1]Erase block\r\n" ); hal_printf( " [2]write block\r\n" ); hal_printf( " E[x]it\r\n" ); hal_printf( "Your choice: " ); break; } break; } } } } while(TRUE); } while(FALSE); // run only once! }
void ApplicationEntryPoint() { UINT32 ComEvent; g_State.Initialize(); ComEvent = 0; if(COM_IsSerial(g_State.UsartPort) && (g_State.UsartPort != COM_NULL)) { ComEvent = SYSTEM_EVENT_FLAG_COM_IN; } #if !defined(TARGETLOCATION_RAM) g_State.WaitForActivity = (g_State.ProgramCount != 0); // is there a main app? #else g_State.WaitForActivity = FALSE; // forever #endif { UINT32 ButtonsPressed; UINT32 ButtonsReleased; char c; // clear any events present from startup while(Events_Get( SYSTEM_EVENT_FLAG_ALL )); // clear any junk from com port buffers while(DebuggerPort_Read( g_State.UsartPort, &c, sizeof(c) )); // clear any junk from button buffer while(Buttons_GetNextStateChange( ButtonsPressed, ButtonsReleased )); } { BOOL ProcessingSREC = FALSE; BOOL ProcessingXREC = FALSE; INT32 ProcessingZENFLASH = 0; INT32 Mode = 0; INT32 MenuChoice = 1; // main application location when USB not enabled BOOL MenuUpdate = TRUE; UINT32 USBEvent = 0; COM_HANDLE ReadPort = COM_NULL; int MenuOffset = 1; // no USB enabled INT64 WaitTimeout = 0; #if defined(PLATFORM_ARM_MOTE2) CPU_GPIO_SetPinState( LED1_GREEN, LED_ON ); #endif if(g_State.WaitForActivity) { WaitTimeout = HAL_Time_CurrentTime() + (INT64)g_State.WaitInterval * (10 * 1000); hal_printf( "Waiting %d.%03d second(s) for hex upload\r\n", g_State.WaitInterval / 1000, g_State.WaitInterval % 1000 ); } else { hal_printf( "Waiting forever for hex upload\r\n" ); } // checking the existence of Usb Driver, all the default values are set to no USB if( USB_DEVICE_STATE_NO_CONTROLLER != USB_GetStatus( ConvertCOM_UsbController(g_State.UsbPort) ) ) { g_State.UsingUsb = TRUE; MenuChoice = 2; MenuOffset = 2; } while(true) { if(MenuUpdate) { MenuUpdate = FALSE; LCD_Clear(); hal_fprintf( STREAM_LCD, "\f"); switch(Mode) { case 0: hal_fprintf( STREAM_LCD, " Zen Boot\r\n\r\n" ); hal_fprintf( STREAM_LCD, "%c PortBooter\r\n", MenuChoice == 0 ? '*' : ' ' ); if(g_State.UsingUsb) { hal_fprintf( STREAM_LCD, "%c FlashUSB\r\n", MenuChoice == 1 ? '*' : ' ' ); } for(int i = 0; i < g_State.ProgramCount; i++) { hal_fprintf( STREAM_LCD, "%c Prg:%08x\r\n", (i+MenuOffset) == MenuChoice ? '*' : ' ', g_State.Programs[i] ); } break; case 1: hal_printf( "PortBooter v%d.%d.%d.%d\r\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); hal_fprintf( STREAM_LCD, "Waiting forever for hex upload\r\n" ); break; case 2: hal_fprintf( STREAM_LCD, "FlashUSB\r\n" ); hal_fprintf( STREAM_LCD, "Waiting forever for hex upload\r\n" ); break; } } UINT32 Events = Events_WaitForEvents( ComEvent | SYSTEM_EVENT_FLAG_BUTTON | SYSTEM_EVENT_FLAG_USB_IN, 2000 ); if(Events & SYSTEM_EVENT_FLAG_BUTTON) { UINT32 ButtonsPressed; UINT32 ButtonsReleased; Events_Clear( SYSTEM_EVENT_FLAG_BUTTON ); while(Buttons_GetNextStateChange( ButtonsPressed, ButtonsReleased )); { if(g_State.SerialPortActive == FALSE) { //printf("%02x %02x\r\n", ButtonsPressed, ButtonsReleased); // up if(ButtonsPressed & BUTTON_UP) { switch(Mode) { case 0: MenuChoice = __max( MenuChoice-1, 0 ); break; } g_State.WaitForActivity = FALSE; MenuUpdate = TRUE; } // down if(ButtonsPressed & BUTTON_DOWN) { switch(Mode) { case 0: MenuChoice = __min( MenuChoice+1, g_State.ProgramCount + MenuOffset-1 ); break; } g_State.WaitForActivity = FALSE; MenuUpdate = TRUE; } // enter button if(ButtonsPressed & BUTTON_ENTR) { switch(Mode) { case 0: if(MenuChoice == 0) { Mode = 1; //UsingUsb = FALSE; } else if(g_State.UsingUsb && MenuChoice == 1) { Mode = 2; USB_Configure( ConvertCOM_UsbController(g_State.UsbPort), &UsbDefaultConfiguration ); USB_Initialize( ConvertCOM_UsbController(g_State.UsbPort) ); USB_OpenStream( ConvertCOM_UsbStream(g_State.UsbPort), USB_DEBUG_EP_WRITE, USB_DEBUG_EP_READ ); //UsingUsb = TRUE; } else { StartApplication( (void (*)())g_State.Programs[MenuChoice-MenuOffset] ); } break; case 1: Mode = 0; break; case 2: // USB_Uninitialize(); Mode = 0; break; } g_State.WaitForActivity = FALSE; MenuUpdate = TRUE; } if(ButtonsReleased) { MenuUpdate = TRUE; } } } } if((Events & ComEvent) || (Events & SYSTEM_EVENT_FLAG_USB_IN)) { char c; if(Events & ComEvent) { Events_Clear( ComEvent ); ReadPort = g_State.UsartPort; g_State.pStreamOutput = ReadPort; } else { USBEvent = USB_GetEvent( ConvertCOM_UsbController(g_State.UsbPort), USB_EVENT_ALL ); if( !(USBEvent & g_State.UsbEventCode) ) continue; g_State.pStreamOutput = g_State.UsbPort; ReadPort = g_State.UsbPort; } while(DebuggerPort_Read( ReadPort, &c, sizeof(c) )) { if(ProcessingSREC) { ProcessingSREC = g_SREC.Process( c ); } else if(ProcessingXREC) { ProcessingXREC = g_XREC.Process( c ); } else if(ProcessingZENFLASH) { const char Signature[] = "ZENFLASH\r"; //printf( "Got %d at %d\r\n", c, ProcessingZENFLASH ); if(Signature[ProcessingZENFLASH++] == c) { if(Signature[ProcessingZENFLASH] == 0) { SignalActivity(); ProcessingZENFLASH = 0; } } else { ProcessingZENFLASH = 0; } } else if('S' == c) { ProcessingSREC = TRUE; } else if('X' == c) { ProcessingXREC = TRUE; } else if('Z' == c) { ProcessingZENFLASH = 1; } } } if(g_State.WaitForActivity && WaitTimeout < HAL_Time_CurrentTime()) { #if defined(PLATFORM_ARM_MOTE2) CPU_GPIO_SetPinState(LED1_GREEN, LED_OFF); // Turn off Green LED for iMOTE2 #endif // we didn't see anything on serial port for wait interval (2 seconds nominally), // continue with code - just run the normal application StartApplication( (void (*)())g_State.Programs[0] ); } } } }
RTP_BOOL SH7619_EDMAC_open(PIFACE pi) { PSH7619_EDMAC_SOFTC sc = iface_to_softc(pi); char c[1],Buffer[17]; int i; UINT32 Events; BYTE Buff[6]; if (!sc) { RTP_DEBUG_ERROR("SH7619_EDMAC_open: softc invalid!\r\n", NOVAR, 0, 0); set_errno(ENUMDEVICE); return(RTP_FALSE); } // Set Interface sc->iface = pi; iface = pi; int macLen = __min(g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressLen, sizeof(sc->mac_address)); if(macLen > 0) { int addr = MAC_address_area; for(i=0; i<macLen; i++) g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[i] = *(volatile char *)(addr+i); debug_printf( "MAC Address: %x.%x.%x.%x.%x.%x\r\n", (UINT8)g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[0], (UINT8)g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[1], (UINT8)g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[2], (UINT8)g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[3], (UINT8)g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[4], (UINT8)g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[5]); debug_printf( "Do you need to change MAC Address? If yes, press 'Enter' key\r\n" ); c[0] = 0x0; for (i=0; i<0xff; i++){ DebuggerPort_Read( HalSystemConfig.DebugTextPort, c, 1); if (c[0] == 0x0d){ hal_printf( "new MAC Address :" ); while(c[0] == 0x0d) DebuggerPort_Read( HalSystemConfig.DebugTextPort, c, 1); for(i=0; i<17; ){ Events = Events_WaitForEvents( SYSTEM_EVENT_FLAG_COM_IN, 100 ); if(Events & SYSTEM_EVENT_FLAG_COM_IN){ Events_Clear( SYSTEM_EVENT_FLAG_COM_IN ); DebuggerPort_Read( HalSystemConfig.DebugTextPort, c, 1); Buffer[i] = c[0]; i++; } } for (i=0; i<17; i++) hal_printf( "%c",Buffer[i] ); hal_printf( "\r\n"); for(i=0; i<macLen; i++) { Buff[i]=SH7619_EDMAC_AtoH(Buffer[i*3])*0x10; Buff[i]+=SH7619_EDMAC_AtoH(Buffer[i*3+1]); } for(i=0; i<macLen; i++) { g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[i]=Buff[i]; } debug_printf( "Updating...\r\n" ); g_AM29DL_16_BS_DeviceTable.InitializeDevice(pBLOCK_CONFIG); g_AM29DL_16_BS_DeviceTable.EraseBlock(pBLOCK_CONFIG,MAC_address_area); g_AM29DL_16_BS_DeviceTable.Write(pBLOCK_CONFIG,MAC_address_area,macLen,Buff,0x0); debug_printf( "Done\r\n" ); i=0x100; } } memcpy(&sc->mac_address[0], &g_NetworkConfig.NetworkInterfaces[NETWORK_INTERFACE_INDEX_SH7619EMAC].macAddressBuffer[0], macLen); } else { RTP_DEBUG_ERROR("Device initialize without MAC address!!!\r\n", NOVAR, 0, 0); } /* Now put in a dummy ethernet address */ rtp_memcpy(&pi->addr.my_hw_addr[0], sc->mac_address, 6); // Get the ethernet address /* clear statistic information */ sc->stats.packets_in = 0L; sc->stats.packets_out = 0L; sc->stats.bytes_in = 0L; sc->stats.bytes_out = 0L; sc->stats.errors_in = 0L; sc->stats.errors_out = 0L; if(RTP_FALSE == SH7619_EDMAC_SetupDevice()) { return RTP_FALSE; } rtp_irq_hook_interrupt( (RTP_PFVOID) pi, (RTP_IRQ_FN_POINTER)SH7619_EDMAC_recv, (RTP_IRQ_FN_POINTER) 0); return(RTP_TRUE); }
u32_t sys_arch_mbox_fetch(sys_mbox_t* mbox, void **msg, u32_t timeout) { if(mbox == NULL || *mbox == NULL) { ASSERT(FALSE); return SYS_ARCH_TIMEOUT; } Hal_Queue_UnknownSize<OpaqueQueueNode>* queue = (Hal_Queue_UnknownSize<OpaqueQueueNode>*)*mbox; bool didTimeout = false; if(timeout == 0) { timeout = 0xFFFFFFFF; } INT64 now = ::HAL_Time_CurrentTime(); INT64 elapsed = now + (timeout * 10000); while(elapsed > ::HAL_Time_CurrentTime() || timeout == 1) { OpaqueQueueNode* node = queue->Pop(); if(node) { *msg = node->payload; Events_Set(SYSTEM_EVENT_FLAG_NETWORK); SOCKETS_RestartTcpIpProcessor(0); return 0; } else if(timeout == 1) { break; } if(INTERRUPTS_ENABLED_STATE()) { if(Events_WaitForEvents(SYSTEM_EVENT_FLAG_NETWORK, timeout)) { Events_Clear(SYSTEM_EVENT_FLAG_NETWORK); INT64 curTime = ::HAL_Time_CurrentTime(); if(elapsed > curTime) { timeout -= (elapsed - HAL_Time_CurrentTime()) / 10000; } } else { break; } } else { break; } } if(timeout != 1) { Events_Set(SYSTEM_EVENT_FLAG_NETWORK); } else { didTimeout = true; } *msg = NULL; return didTimeout ? SYS_ARCH_TIMEOUT : SYS_MBOX_EMPTY; }