//--------------------------------------------------------------------------------- int main(int argc, char **argv) { //--------------------------------------------------------------------------------- s32 ret; u8 gamestatus = 0x03; u8 versionnumber = 0x80; u32 geckoidcheck; u8 oldconfigbytes[2]; ret = sd_init(); if(!ret){ sd_found = 0; } else { sd_found = 1; } if (*((u32 *) 0x80001804) == 0x53545542 && *((u32 *) 0x80001808) == 0x48415858) loaderhbc = 1; *(u32*)0xCD00643C = 0x00000000; // 32Mhz on Bus gecko_attached = usb_isgeckoalive(EXI_CHANNEL_1); if(gecko_attached){ gecko_channel = 1; if (EXI_GetID(gecko_channel, 0x80, &geckoidcheck) == 1) { if (geckoidcheck != 0) { gecko_attached = FALSE; goto slota; } } else { gecko_attached = FALSE; goto slota; } usb_flushnew(gecko_channel); goto slotb; } slota: gecko_attached = usb_isgeckoalive(EXI_CHANNEL_0); if(gecko_attached){ gecko_channel = 0; if (EXI_GetID(gecko_channel, 0x80, &geckoidcheck) == 1) { if (geckoidcheck != 0) { gecko_attached = FALSE; goto slotb; } } else { gecko_attached = FALSE; goto slotb; } usb_flushnew(gecko_channel); } slotb: sd_load_config(); tempgameconf = (char *) sdbuffer; autobootcheck = 1; memset(gameidbuffer, 0, 8); app_loadgameconfig(gameidbuffer); autobootcheck = 0; loadStartupIOS(); iosversion = IOS_GetVersion(); if(config_not_loaded == 0){ menu_load_config(); config_not_loaded = 1; } if (autoboothbc || !loaderhbc) { if (autoboot == 1) { rebooter_thread(); menu_number = 12; rebooter_thread_state = 0; } } else autoboot = 0; WPAD_Init(); PAD_Init(); VIDEO_Init(); AUDIO_Init (NULL); SYS_SetPowerCallback (power_cb); SYS_SetResetCallback (reset_cb); if (CONF_GetProgressiveScan() > 0 && VIDEO_HaveComponentCable()) { progmode = 1; } if (CONF_GetAspectRatio()) { widescreen = 1; } gfx_init(); gfx_load_gfx(); gfx_load_gfx1(); if (autoboot == 0 || autobootwait > 1) gfx_fade_logo(); VIDEO_WaitVSync(); if(!gecko_attached){ gecko_channel = 2; } gfx_int_stars(); while(1) { if(gecko_attached){ usb_recvbuffer(gecko_channel,&gecko_command,1); switch(gecko_command) { //case 0x04: // gecko_readmem(); //break; case 0x14: // Load DOL load_geckoexe(0); break; case 0x24: // Load DOL load_geckoexe(1); break; case 0x42: // Debugger on, pause start off config_bytes[7] = 0x01; config_bytes[5] = 0x00; usb_recvbuffer_safe(gecko_channel,&oldconfigbytes,2); // Get config config_bytes[0] = oldconfigbytes[0]; switch (oldconfigbytes[1]) { case 0x00: config_bytes[1] = 0x00; break; case 0x01: config_bytes[1] = 0x01; break; case 0x02: config_bytes[1] = 0x00; break; case 0x03: config_bytes[1] = 0x01; break; case 0x04: config_bytes[1] = 0x03; break; case 0x05: config_bytes[1] = 0x03; break; case 0x06: config_bytes[1] = 0x02; break; case 0x07: config_bytes[1] = 0x02; break; } menu_number = 8; apploader_thread(); gecko_command = 0; break; case 0x43: // Debugger on, pause start on config_bytes[7] = 0x01; config_bytes[5] = 0x01; usb_recvbuffer_safe(gecko_channel,&oldconfigbytes,2); // Get config config_bytes[0] = oldconfigbytes[0]; switch (oldconfigbytes[1]) { case 0x00: config_bytes[1] = 0x00; break; case 0x01: config_bytes[1] = 0x01; break; case 0x02: config_bytes[1] = 0x00; break; case 0x03: config_bytes[1] = 0x01; break; case 0x04: config_bytes[1] = 0x03; break; case 0x05: config_bytes[1] = 0x03; break; case 0x06: config_bytes[1] = 0x02; break; case 0x07: config_bytes[1] = 0x02; break; } menu_number = 8; apploader_thread(); gecko_command = 0; break; case 0x50: usb_sendbuffer_safe(gecko_channel,&gamestatus,1); break; case 0x99: usb_sendbuffer_safe(gecko_channel,&versionnumber,1); break; } } if(error_sd || confirm_sd || error_video){ sleep(1); error_sd = 0; confirm_sd = 0; error_video = 0; } if(loadedpng && !alphapng){ // if custom backdrop draw bubbles after image gfx_draw_image(0, 0, 640, 480, tex_logo1, 0, 1, 1,0xff); gfx_draw_stars(); } else{ gfx_draw_stars(); // else if own back drop do in this order due to border clip gfx_draw_image(0, 0, 640, 480, tex_logo1, 0, 1, 1,0xff); }; menu_draw(); gfx_render_direct(); } return 0; }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED1, LED2, LED3 and LED4 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); BSP_LED_Init(LED4); /* Initialize the Push buttons */ /* Wakeup button used for Volume Low */ BSP_PB_Init(BUTTON_WAKEUP, BUTTON_MODE_GPIO); /* Tamper button used for Volume High */ BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_GPIO); /* Initialize the LCD */ BSP_LCD_Init(); BSP_LCD_LayerDefaultInit(1, 0xC0130000); BSP_LCD_SelectLayer(1); /* Display message on EVAL LCD **********************************************/ /* Clear the LCD */ BSP_LCD_Clear(LCD_COLOR_BLUE); /* Set the LCD Back Color */ BSP_LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the LCD Text Color */ BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_DisplayStringAt(0, LINE(0), (uint8_t *)MESSAGE1, CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(1), (uint8_t *)MESSAGE2, CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(2), (uint8_t *)MESSAGE3, CENTER_MODE); /* Turn on LEDs available on EVAL *******************************************/ BSP_LED_On(LED1); BSP_LED_On(LED2); BSP_LED_On(LED3); BSP_LED_On(LED4); /* Initialize the Audio codec and all related peripherals (SAI, I2C, IOs...) */ if(AUDIO_Init() == AUDIO_ERROR_NONE) { BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)"====================", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)"Tamper: Vol+ ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(6), (uint8_t *)"Wakeup: Vol- ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(7), (uint8_t *)"====================", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(8), (uint8_t *)" AUDIO CODEC OK ", CENTER_MODE); } else { BSP_LCD_DisplayStringAt(0, LINE(4), (uint8_t *)" AUDIO CODEC FAIL ", CENTER_MODE); BSP_LCD_DisplayStringAt(0, LINE(5), (uint8_t *)" Try to reset board ", CENTER_MODE); } /* Start playing the file from a circular buffer, once the DMA is enabled, it is always in running state. Application has to fill the buffer with the audio data using Transfer complete and/or half transfer complete interrupts callbacks (EVAL_AUDIO_TransferComplete_CallBack() or EVAL_AUDIO_HalfTransfer_CallBack()... */ AUDIO_Start(); /* Display the state on the screen */ BSP_LCD_DisplayStringAt(0, LINE(9), (uint8_t *)" PLAYING... ", CENTER_MODE); /* IMPORTANT: AUDIO_Process() is called by the SysTick Handler, as it should be called within a periodic process */ /* Infinite loop */ while(1) { /* Check on the Volume high button */ if (BSP_PB_GetState(BUTTON_WAKEUP) != RESET) { /* Wait to avoid rebound */ while (BSP_PB_GetState(BUTTON_WAKEUP) != RESET); /* Decrease volume by 5% */ if (uwVolume > 5) uwVolume -= 5; else uwVolume = 0; /* Apply the new volume to the codec */ BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)" VOL: - ", CENTER_MODE); } /* Check on the Volume high button */ if (BSP_PB_GetState(BUTTON_TAMPER) == RESET) { /* Wait to avoid rebound */ while (BSP_PB_GetState(BUTTON_TAMPER) == RESET); /* Increase volume by 5% */ if (uwVolume < 95) uwVolume += 5; else uwVolume = 100; /* Apply the new volume to the codec */ BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAt(0, LINE(10), (uint8_t *)" VOL: + ", CENTER_MODE); } /* Toggle LED3 */ BSP_LED_Toggle(LED3); /* Insert 100 ms delay */ HAL_Delay(100); /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 100 ms delay */ HAL_Delay(100); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 168 MHz */ SystemClock_Config(); /* Configure LEDs, Push buttons and LCD available on EVAL board ************/ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); BSP_LED_Init(LED4); /* Configure push Buttons */ /* Key button used for Pause/Resume */ BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); /* Wakeup button used for Volume High */ BSP_PB_Init(BUTTON_WAKEUP, BUTTON_MODE_GPIO); /* Tamper button used for Volume Low */ BSP_PB_Init(BUTTON_TAMPER, BUTTON_MODE_GPIO); /* Initialize the LCD */ BSP_LCD_Init(); /* Display message on EVAL LCD **********************************************/ /* Clear the LCD */ BSP_LCD_Clear(LCD_COLOR_BLUE); /* Set the LCD Back Color */ BSP_LCD_SetBackColor(LCD_COLOR_BLUE); /* Set the LCD Text Color */ BSP_LCD_SetTextColor(LCD_COLOR_WHITE); BSP_LCD_DisplayStringAtLine(0, (uint8_t *)MESSAGE1); BSP_LCD_DisplayStringAtLine(1, (uint8_t *)MESSAGE2); BSP_LCD_DisplayStringAtLine(2, (uint8_t *)MESSAGE3); /* Turn On LEDs available on EVAL *******************************************/ BSP_LED_On(LED1); BSP_LED_On(LED2); BSP_LED_On(LED3); BSP_LED_On(LED4); /* Initialize the Audio codec and all related peripherals (I2S, I2C, IOExpander, IOs...) */ if(AUDIO_Init() == AUDIO_ERROR_NONE) { BSP_LCD_DisplayStringAtLine(3, (uint8_t *)"===================="); BSP_LCD_DisplayStringAtLine(4, (uint8_t *)"Key : Play/Pause "); BSP_LCD_DisplayStringAtLine(5, (uint8_t *)"Tamper: Vol+/Headph"); BSP_LCD_DisplayStringAtLine(6, (uint8_t *)"Wakeup: Vol-/Spkr "); BSP_LCD_DisplayStringAtLine(7, (uint8_t *)"===================="); BSP_LCD_DisplayStringAtLine(8, (uint8_t *)" AUDIO CODEC OK "); } else { BSP_LCD_DisplayStringAtLine(4, (uint8_t *)" AUDIO CODEC FAIL "); BSP_LCD_DisplayStringAtLine(5, (uint8_t *)" Try to reset board "); } /* Start playing the file from a circular buffer, once the DMA is enabled, it is always in running state. Application has to fill the buffer with the audio data using Transfer complete and/or half transfer complete interrupts callbacks (EVAL_AUDIO_TransferComplete_CallBack() or EVAL_AUDIO_HalfTransfer_CallBack()... */ AUDIO_Start(); /* Display the state on the screen */ BSP_LCD_DisplayStringAtLine(8, (uint8_t *)" PLAYING "); /* Infinite loop */ while (1) { /* Check on the Pause/Resume button */ if(BSP_PB_GetState(BUTTON_KEY) == RESET) { /* Wait to avoid rebound */ while (BSP_PB_GetState(BUTTON_KEY) == RESET); if(uwCommand == AUDIO_PAUSE) { BSP_AUDIO_OUT_Pause(); /* Display the current state of the player */ BSP_LCD_DisplayStringAtLine(8, (uint8_t *)" PAUSED "); /* Next time Resume command should be processed */ uwCommand = AUDIO_RESUME; /* Push buttons will be used to switch between Speaker and Headphone modes */ uwSpHpSwitch = 1; } else { BSP_AUDIO_OUT_Resume(); /* Display the current state of the player */ BSP_LCD_DisplayStringAtLine(8, (uint8_t *)" PLAYING "); /* Next time Pause command should be processed */ uwCommand = AUDIO_PAUSE; /* Push buttons will be used to control volume level */ uwSpHpSwitch = 0; } } /* Check on the Volume high button */ if (BSP_PB_GetState(BUTTON_WAKEUP) != RESET) { /* Check if the current state is paused (push buttons are used for volume control or for speaker/headphone mode switching) */ if (uwSpHpSwitch) { /* Set output to Speaker */ BSP_AUDIO_OUT_SetOutputMode(OUTPUT_DEVICE_SPEAKER); /* Display the current state of the player */ BSP_LCD_DisplayStringAtLine(9, (uint8_t *)" SPEAKER "); } else { /* Wait to avoid rebound */ while (BSP_PB_GetState(BUTTON_WAKEUP) != RESET); /* Decrease volume by 5% */ if (uwVolume > 5) uwVolume -= 5; else uwVolume = 0; /* Apply the new volume to the codec */ BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAtLine(9, (uint8_t *)" VOL: - "); } } /* Check on the Volume high button */ if (BSP_PB_GetState(BUTTON_TAMPER) == RESET) { /* Check if the current state is paused (push buttons are used for volume control or for speaker/headphone mode switching) */ if (uwSpHpSwitch) { /* Set output to Headphone */ BSP_AUDIO_OUT_SetOutputMode(OUTPUT_DEVICE_HEADPHONE); /* Display the current state of the player */ BSP_LCD_DisplayStringAtLine(9, (uint8_t *)" HEADPHONE "); } else { /* Wait to avoid rebound */ while (BSP_PB_GetState(BUTTON_TAMPER) == RESET); /* Increase volume by 5% */ if (uwVolume < 95) uwVolume += 5; else uwVolume = 100; /* Apply the new volume to the codec */ BSP_AUDIO_OUT_SetVolume(uwVolume); BSP_LCD_DisplayStringAtLine(9, (uint8_t *)" VOL: + "); } } /* Toggle LED3 */ BSP_LED_Toggle(LED3); /* Insert 100 ms delay */ HAL_Delay(100); /* Toggle LED2 */ BSP_LED_Toggle(LED2); /* Insert 100 ms delay */ HAL_Delay(100); } }