TwlToolsRED/build/tools/sctools/auto_preinst_rom/src/main.c

900 lines
24 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <twl.h>
#include <nitro/nvram/nvram.h>
#include <twl/sea.h>
#include <twl/lcfg.h>
#include <twl/na.h>
#include <twl/nam.h>
#include "ecdl.h"
#include <NitroWiFi/nhttp.h>
#include <NitroWiFi/nssl.h>
#include <NitroWiFi/ncfg.h>
#include "font.h"
#include "text.h"
#include "mprintf.h"
#include "gfx.h"
#include "key.h"
#include "my_fs_util.h"
#include "hwi.h"
#include "mydata.h"
#include "error_report.h"
#include "myfilename.h"
#include "pre_install.h"
#include "hatamotolib.h"
#include "mywlan.h"
#include "netconnect.h"
#include "sitedefs.h"
#include "wcm_control.h"
#define HATAMOTO_LIB 1
#define THREAD_COMMAND_INSTALL_APP 1
#define THREAD_COMMAND_INSTALL_TICKET 2
#define THREAD_COMMAND_DELETE_APP_CONTENT 3
#define THREAD_COMMAND_DELETE_APP_COMPLETELY 4
#define THREAD_COMMAND_DELETE_DEVKP 5
#define THREAD_COMMAND_DOWNLOAD_APP 6
static void init_my_thread(void);
static BOOL start_my_thread(u32 command);
static FSEventHook sSDHook;
static BOOL sd_card_flag = FALSE;
static BOOL development_console_flag = FALSE;
static OSHeapHandle hHeap;
static u32 allocator_total_size = 0;
static u8 org_region = 0;
static u64 org_fuseId = 0;
static BOOL pushed_power_button = FALSE;
static BOOL throw_pushed_power_button = FALSE;
static LCFGTWLHWNormalInfo hwn_info;
static LCFGTWLHWSecureInfo hws_info;
static MyData mydata;
static int vram_num_main = 1;
static int vram_num_sub = 0;
static u64 eticket_only_id_buf[100];
static int eticket_only_id_count = 0;
static void fill_command(void)
{
if( development_console_flag == FALSE ) {
/* —ÊŽY@—p */
/*
0x00030004484e474a, 0 , 0 , rom:/tads/TWL-HNGJ-v256.tad,
0x000300044b32444a, 0 , 0 , rom:/tads/TWL-K2DJ-v0.tad,
0x000300044b47554a, 0 , 0 , rom:/tads/TWL-KGUJ-v257.tad,
0x00030004434f5041, 0 , 0 , sdmc:/sdtads/en_CooperationA.tad,
0x0003001548485741, 0 , 0 , sdmc:/sdtads/en_HHWA.Release.tad,
0x0003000548504341, 0 , 0 , sdmc:/sdtads/en_HPCA.Release.tad,
*/
#if 0
/* ROMÌâ */
eticket_only_id_buf[0] = 0x00030004484e474a;
eticket_only_id_buf[1] = 0x000300044b32444a;
eticket_only_id_buf[2] = 0x000300044b47554a;
#else
/* SDÌâ */
eticket_only_id_buf[0] = 0x00030004434f5041;
eticket_only_id_buf[1] = 0x0003001548485741;
eticket_only_id_buf[2] = 0x0003000548504341;
#endif
eticket_only_id_count = 3;
}
else {
/* ŠJ”­@—p */
/*
ROM
0x0003000434424e41, 0 , 0 , rom:/tads_dev/backupSample.tad,
0x00030004344a4541, 0 , 0 , rom:/tads_dev/encodeSD.tad,
0x0003000434534e41, 0 , 0 , rom:/tads_dev/nandAppSample.tad,
SD
0x0003000434424e41, 0 , 0 , sdmc:/sdtaddevs/en_backupSample.tad,
0x0003000444534943, 0 , 0 , sdmc:/sdtaddevs/en_chavitt.tad,
0x00030004344a4541, 0 , 0 , sdmc:/sdtaddevs/en_encodeSD.tad,
0x0003000434534e41, 0 , 0 , sdmc:/sdtaddevs/en_nandAppSample.tad,
*/
#if 1
/* ROMÌâ */
eticket_only_id_buf[0] = 0x0003000434424e41;
eticket_only_id_buf[1] = 0x00030004344a4541;
eticket_only_id_buf[2] = 0x0003000434534e41;
eticket_only_id_count = 3;
#else
/* SDÌâ */
eticket_only_id_buf[0] = 0x0003000434424e41;
eticket_only_id_buf[1] = 0x0003000434534e41;
eticket_only_id_count = 2;
#endif
}
}
static BOOL myTWLCardCallback( void )
{
return FALSE; // means that not terminate.
}
static PMExitCallbackInfo pmexitcallbackinfo;
static void pmexitcallback(void *arg)
{
#pragma unused(arg)
/* <20>ˆ<CB86><E28099>iƒf<C692>[ƒ^<5E>«<E2809A>žÝ<E28099>jÈ烊ƒZƒbƒgðƒuƒ<75>ƒbƒNµÈ¯êÎÈçÈ¢ */
pushed_power_button = TRUE;
}
static void *AllocForNAM(size_t size)
{
OSIntrMode old = OS_DisableInterrupts();
void* p = OS_Alloc(size);
OS_RestoreInterrupts(old);
return p;
}
static void FreeForNAM(void* ptr)
{
if( ptr != NULL ) {
OSIntrMode old = OS_DisableInterrupts();
OS_Free(ptr);
OS_RestoreInterrupts(old);
}
}
static void SDEvents(void *userdata, FSEvent event, void *arg)
{
(void)userdata;
(void)arg;
if (event == FS_EVENT_MEDIA_REMOVED) {
sd_card_flag = FALSE;
m_set_palette(tc[0], M_TEXT_COLOR_YELLOW );
mprintf("SD card:removed!\n");
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
}
else if (event == FS_EVENT_MEDIA_INSERTED) {
sd_card_flag = TRUE;
m_set_palette(tc[0], M_TEXT_COLOR_YELLOW );
mprintf("SD card:inserted!\n");
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
}
}
static BOOL LoadWlanConfig(void)
{
u8 buf[256];
int len;
int i; /* ƒ†<C692>[ƒU<C692>[ƒf<C692>[ƒ^<5E>«<E2809A>žÝƒ<C692>[ƒh */
if( TRUE == LoadWlanConfigFile("sdmc:/wlan_cfg.txt") ) {
OS_TPrintf("SSID = %s\n", GetWlanSSID());
OS_TPrintf("MODE = ");
#if 0
mfprintf(tc[3],"SSID = %s\n", GetWlanSSID());
mfprintf(tc[3],"MODE = ");
#endif
switch( GetWlanMode() ) {
case WCM_WEPMODE_NONE:
OS_TPrintf("NONE\n");
// mfprintf(tc[3],"NONE\n");
break;
case WM_WEPMODE_40BIT:
OS_TPrintf("WEP40\n");
// mfprintf(tc[3],"WEP128\n");
break;
case WM_WEPMODE_104BIT:
OS_TPrintf("WEP104\n");
// mfprintf(tc[3],"WEP128\n");
break;
case WM_WEPMODE_128BIT:
OS_TPrintf("WEP128\n");
// mfprintf(tc[3],"WEP128\n");
break;
case WCM_WEPMODE_WPA_TKIP:
OS_TPrintf("WPA-TKIP\n");
// mfprintf(tc[3],"WPA-TKIP\n");
break;
case WCM_WEPMODE_WPA2_TKIP:
OS_TPrintf("WPA2-TKIP\n");
// mfprintf(tc[3],"WPA2-TKIP\n");
break;
case WCM_WEPMODE_WPA_AES:
OS_TPrintf("WPA-AES\n");
// mfprintf(tc[3],"WPA-AES\n");
break;
case WCM_WEPMODE_WPA2_AES :
OS_TPrintf("WPA2-AES\n");
// mfprintf(tc[3],"WPA2-AES\n");
break;
defalut:
OS_TPrintf("Unknow mode..\n");
// mfprintf(tc[3],"Unknow mode..\n");
break;
}
if( TRUE == GetKeyModeStr() ) {
OS_TPrintf("KEY STR = %s\n", GetWlanKEYSTR());
// mfprintf(tc[3],"KEY STR = %s\n", GetWlanKEYSTR());
}
else {
len = GetWlanKEYBIN(buf);
if( len ) {
OS_TPrintf("KEY BIN = 0x");
// mfprintf(tc[3],"KEY BIN = 0x");
for( i = 0 ; i < len ; i++ ) {
OS_TPrintf("%02X",buf[i]);
// mfprintf(tc[3],"%02X",buf[i]);
}
OS_TPrintf("\n");
// mfprintf(tc[3],"\n");
}
}
// mfprintf(tc[3],"\n");
if( TRUE == GetDhcpMODE() ) {
// mfprintf(tc[3],"DHCP client\n");
}
}
else {
OS_TPrintf("Invalid wlan cfg file\n");
// mfprintf(tc[3],"Invalid wlan cfg file\n");
mprintf("Invalid wlan cfg file\n");
return FALSE;
}
return TRUE;
}
void TwlMain(void)
{
int i,n;
void* newArenaLo;
u8 macAddress[6];
ESError es_error_code;
u16 keyData;
int loop_counter = 0;
RTCDate rtc_date;
RTCTime rtc_time;
u16 BatterylevelBuf = 0;
BOOL isAcConnectedBuf = FALSE;
OS_Init();
OS_InitThread();
OS_InitTick();
OS_InitAlarm();
// ƒ}ƒXƒ^<5E>[Š„è<E2809A>žÝƒtƒ‰ƒOð‰ÂÉ
(void)OS_EnableIrq();
// IRQ Š„è<E2809A>žÝð‰ÂµÜ·
(void)OS_EnableInterrupts();
// ARM7ÆÌÊ<E28099>MFIFOŠ„è<E2809A>žÝ‰Â
(void)OS_EnableIrqMask(OS_IE_SPFIFO_RECV);
// ƒtƒ@ƒCƒƒVƒXƒeƒ€<C692>‰Šú‰»
FS_Init( FS_DMA_NOT_USE );
PM_Init();
// ƒ<>ƒCƒ“ƒAƒŠ<C692>[ƒĩAƒ<41>ƒP<C692>[ƒgƒVƒXƒeƒ€ð<E2809A>‰Šú‰»
newArenaLo = OS_InitAlloc(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi(), 1);
OS_SetMainArenaLo(newArenaLo);
// ƒ<>ƒCƒ“ƒAƒŠ<C692>[ƒi<C692>ãɃq<C692>[ƒvð<E2809A>ì<EFBFBD>¬
hHeap = OS_CreateHeap(OS_ARENA_MAIN, OS_GetMainArenaLo(), OS_GetMainArenaHi());
OS_SetCurrentHeap(OS_ARENA_MAIN, hHeap);
allocator_total_size = OS_GetTotalFreeSize(OS_ARENA_MAIN, hHeap);
Gfx_Init();
RTC_Init();
SCFG_Init();
NVRAMi_Init();
CARD_Init();
CARD_SetPulledOutCallback( myTWLCardCallback );
// •K<E280A2>{<7B>GSEA Ì<E2809A>‰Šú‰»
SEA_Init();
development_console_flag = IsThisDevelopmentConsole();
if(TRUE == development_console_flag ) {
mprintf("--development console--\n");
}
PM_SetAutoExit( FALSE );
PM_SetExitCallbackInfo( &pmexitcallbackinfo,pmexitcallback, NULL);
PM_PrependPreExitCallback( &pmexitcallbackinfo );
ES_InitLib();
if( FALSE == MiyaReadHWNormalInfo( &hwn_info ) ) {
m_set_palette(tc[0], 0x1); /* red */
mprintf("HW Normal Info. read error.\n");
m_set_palette(tc[0], 0xF);
}
// mprintf("HW Secure Info. read ");
if( FALSE == MiyaReadHWSecureInfo( &hws_info ) ) {
m_set_palette(tc[0], 0x1); /* red */
mprintf("HW Secure Info. read error.\n");
m_set_palette(tc[0], 0xF); /* white */
}
// ƒjƒbƒNƒl<C692>[ƒ€ªóÈç“K“É<E2809A>Ýè
if( *LCFG_TSD_GetNicknamePtr() == L'\0' ) {
LCFG_TSD_SetNickname((const u16*)(L"repair-tool"));
// mprintf("Set dummy Nickname\n");
}
// region
org_region = LCFG_THW_GetRegion();
// ES Device ID
// <20>ªIð³êĢȢÈç“K“É<E2809A>Ýè
if( LCFG_TSD_GetCountry() == LCFG_TWL_COUNTRY_UNDEFINED ) {
mprintf("Set dummy Country code ");
switch( org_region ) {
case OS_TWL_REGION_JAPAN:
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_JAPAN);
mprintf("JPN");
break;
case OS_TWL_REGION_AMERICA:
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_UNITED_STATES);
mprintf("USA");
break;
case OS_TWL_REGION_EUROPE:
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_UNITED_KINGDOM);
mprintf("UK");
break;
case OS_TWL_REGION_AUSTRALIA:
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_AUSTRALIA);
mprintf("AUS");
break;
case OS_TWL_REGION_CHINA:
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_CHINA);
mprintf("CHN");
break;
case OS_TWL_REGION_KOREA:
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_SOUTH_KOREA);
mprintf("KOR");
break;
case OS_TWL_REGION_MAX:
default:
mprintf("JPN");
LCFG_TSD_SetCountry(LCFG_TWL_COUNTRY_JAPAN);
break;
}
mprintf("\n");
}
org_fuseId = SCFG_ReadFuseData();
OS_TPrintf("eFuseID: %08X%08X\n", (u32)(org_fuseId >> 32), (u32)(org_fuseId));
OS_GetMacAddress( macAddress );
OS_TPrintf("%s %s %d\n", __FILE__,__FUNCTION__,__LINE__ );
mydata.shop_record_flag = FALSE;
es_error_code = ES_GetDeviceId(&mydata.deviceId);
if( es_error_code == ES_ERR_OK ) {
if( TRUE == CheckShopRecord( NULL ) ) {
mydata.shop_record_flag = TRUE;
}
else {
mprintf("no shop record\n");
}
}
else {
OS_TPrintf("es_error_code = %d\n", es_error_code );
}
OS_TPrintf("%s %s %d\n", __FILE__,__FUNCTION__,__LINE__ );
// NAM Ì<E2809A>‰Šú‰»
NAM_Init(&AllocForNAM, &FreeForNAM);
if( FALSE == SDCardValidation() ) {
sd_card_flag = FALSE;
m_set_palette(tc[0], 0x1); /* red */
mprintf("No SD card\n");
}
else {
sd_card_flag = TRUE;
}
m_set_palette(tc[0], 0xF); /* white */
FS_RegisterEventHook("sdmc", &sSDHook, SDEvents, NULL);
// OS_TPrintf("%s %s %d\n", __FILE__,__FUNCTION__,__LINE__ );
init_my_thread();
while( 1 ) {
Gfx_Render( vram_num_main , vram_num_sub );
OS_WaitVBlankIntr();
(void)RTC_GetDate( &rtc_date );
(void)RTC_GetTime( &rtc_time );
keyData = m_get_key_trigger();
if ( keyData & PAD_BUTTON_R ) {
vram_num_main++;
if( vram_num_main > (MAX_VRAM_NUM-1) ) {
vram_num_main = 0;
}
}
else if ( keyData & PAD_BUTTON_L ) {
vram_num_main--;
if( vram_num_main < 0 ) {
vram_num_main = (MAX_VRAM_NUM-1);
}
}
else if ( keyData & PAD_BUTTON_A ) {
fill_command();
(void)start_my_thread(THREAD_COMMAND_INSTALL_APP);
}
else if ( keyData & PAD_BUTTON_B ) {
fill_command();
(void)start_my_thread(THREAD_COMMAND_INSTALL_TICKET);
}
else if ( keyData & PAD_BUTTON_X ) {
fill_command();
(void)start_my_thread(THREAD_COMMAND_DELETE_APP_CONTENT);
}
else if ( keyData & PAD_BUTTON_Y ) {
fill_command();
(void)start_my_thread(THREAD_COMMAND_DELETE_APP_COMPLETELY);
}
else if ( keyData & PAD_BUTTON_START ) {
if( sd_card_flag == TRUE ) {
(void)start_my_thread(THREAD_COMMAND_DELETE_DEVKP);
}
}
else if ( keyData & PAD_BUTTON_SELECT ) {
(void)start_my_thread(THREAD_COMMAND_DOWNLOAD_APP);
}
else if ( keyData & PAD_KEY_RIGHT ) {
n = m_get_display_offset_x(tc[0]);
n++;
m_set_display_offset_x(tc[0], n);
}
else if ( keyData & PAD_KEY_LEFT ) {
n = m_get_display_offset_x(tc[0]);
n--;
m_set_display_offset_x(tc[0], n);
}
else if ( keyData & PAD_KEY_UP ) {
n = m_get_display_offset_y(tc[0]);
n++;
m_set_display_offset_y(tc[0], n);
}
else if ( keyData & PAD_KEY_DOWN ) {
n = m_get_display_offset_y(tc[0]);
n--;
m_set_display_offset_y(tc[0], n);
}
mfprintf(tc[1], "\fAuto Pre-install Tool\n");
/* ƒ†ƒj<C692>[ƒNhcÍ•\ަµÈ­Ä¢¢<E2809A>H */
m_set_palette(tc[1], M_TEXT_COLOR_LIGHTBLUE );
mfprintf(tc[1], "Unique ID:\n");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
mfprintf(tc[1], " ");
for( i = 0; i < LCFG_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN/2 ; i++ ) {
mfprintf(tc[1], "%02X:", hwn_info.movableUniqueID[i]);
}
mfprintf(tc[1], "\n ");
for( ; i < LCFG_TWL_HWINFO_MOVABLE_UNIQUE_ID_LEN ; i++ ) {
mfprintf(tc[1], "%02X:", hwn_info.movableUniqueID[i]);
}
mfprintf(tc[1], "\n\n");
m_set_palette(tc[1], M_TEXT_COLOR_LIGHTBLUE );
mfprintf(tc[1], "Serial No. ");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
mfprintf(tc[1], "%s\n", hws_info.serialNo);
mfprintf(tc[1], "\n");
m_set_palette(tc[1], M_TEXT_COLOR_LIGHTBLUE );
mfprintf(tc[1], "eFuse ID: ");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
mfprintf(tc[1],"%08X%08X\n\n", (u32)(org_fuseId >> 32), (u32)(org_fuseId));
m_set_palette(tc[1], M_TEXT_COLOR_LIGHTBLUE );
mfprintf(tc[1],"MAC add.: ");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
mfprintf(tc[1],"%02X:%02X:%02X:%02X:%02X:%02X", macAddress[0],macAddress[1],
macAddress[2], macAddress[3], macAddress[4], macAddress[5]);
mfprintf(tc[1],"\n\n");
m_set_palette(tc[1], M_TEXT_COLOR_LIGHTBLUE );
mfprintf(tc[1],"Device ID: ");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
/* ‚±‚±‚Å mydata.shop_record_flag<61>@‚Æ‚¢‚Á‚µ‚å‚É */
if( TRUE == mydata.shop_record_flag ) {
mfprintf(tc[1],"%s\n", mydata.bmsDeviceId);
}
else {
m_set_palette(tc[1], M_TEXT_COLOR_YELLOW );
mfprintf(tc[1],"-----------\n");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
}
mfprintf(tc[1],"\n");
if( (loop_counter % 60*5) == 0 ) {
// PM_RESULT_SUCCESS
(void)PM_GetACAdapter( &isAcConnectedBuf );
(void)PM_GetBatteryLevel( &BatterylevelBuf );
}
mfprintf(tc[1], "%4d/%02d/%02d %02d:%02d:%02d ",
rtc_date.year + 2000, rtc_date.month , rtc_date.day,
rtc_time.hour , rtc_time.minute , rtc_time.second );
if( isAcConnectedBuf == TRUE ) {
m_set_palette(tc[1], M_TEXT_COLOR_BLUE );
mfprintf(tc[1], "AC. \n\n");
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
}
else {
mfprintf(tc[1], "Batt.Lv ");
switch( BatterylevelBuf ) {
case 0:
case 1:
m_set_palette(tc[1], M_TEXT_COLOR_RED );
break;
case 2:
case 3:
case 4:
m_set_palette(tc[1], M_TEXT_COLOR_YELLOW );
break;
default:
m_set_palette(tc[1], M_TEXT_COLOR_GREEN );
break;
}
mfprintf(tc[1], "%d/5\n\n" , BatterylevelBuf);
m_set_palette(tc[1], M_TEXT_COLOR_WHITE );
}
mfprintf(tc[1], "A -> Install App.\n");
mfprintf(tc[1], "B -> Install Ticket\n");
mfprintf(tc[1], "X -> Delete App. content\n");
mfprintf(tc[1], "Y -> Delete App. completely\n");
mfprintf(tc[1], "START -> Delete /sys/dev.kp\n");
mfprintf(tc[1], "SELECT -> Download App.\n");
if( pushed_power_button == TRUE ) {
OS_TPrintf("%s Power button pressed!\n",__FUNCTION__);
PM_ReadyToExit();
pushed_power_button = FALSE;
}
loop_counter++;
}
OS_Terminate();
}
#if 0
static MY_USER_APP_TID title_id_buf_ptr[] = {
{0x000300044b47554a, 2, FALSE },
{0x000300044b32444a, 2, FALSE },
{0x00030004484e474a, 2, FALSE },
{0x00030004346b6941, 2, FALSE },
{0x00030004346b6a41, 2, FALSE },
{0x00030004346b6b41, 2, FALSE },
{0x00030004346b6c41, 2, FALSE },
{0x0003000434656241, 2, FALSE },
{0x0003000434657541, 2, FALSE },
{0x0003000430484141, 2, FALSE },
{0x0003000430484941, 2, FALSE },
{0x000300044b58374a, 2, FALSE },
{0x000300044b53394a, 2, FALSE }
};
static int title_id_count = sizeof(title_id_buf_ptr)/sizeof(MY_USER_APP_TID);
#else
static MY_USER_APP_TID *title_id_buf_ptr;
static int title_id_count = 0;
#endif
#ifdef HATAMOTO_LIB
static void ec_download_func(void)
{
int i;
ECError rv;
BOOL ret_flag = TRUE;
int ec_download_ret;
char game_code_buf[5];
int is_personalized;
u64 tid;
mprintf("-wireless AP conf. load ");
if( TRUE == LoadWlanConfig() ) {
m_set_palette(tc[0], M_TEXT_COLOR_GREEN ); /* green */
mprintf("OK.\n");
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
#if 0
SetupShopTitleId(); /* ƒGƒ‰<C692>[‚͂Ȃ¢ */
// <20>H<EFBFBD>Fƒ†<C692>[ƒU<C692>Ý誳êĢȢÆ<E2809A>ڱūȢÌÅ“K“É<E2809A>Ýè
// SetupUserInfo();
// •K<E280A2>{<7B>Fƒo<C692>[ƒWƒ‡ƒ“ƒf<C692>[ƒ^‚̃}ƒEƒ“ƒg
if( FALSE == SetupVerData() ) {
mprintf("%s failed SetupVerData\n", __FUNCTION__);
ret_flag = FALSE;
goto end_log_e;
}
#endif
// •K<E280A2>{<7B>Fƒlƒbƒgƒ<67><C692>[ƒNÖÌ<E2809A>Ú±
if( 0 != NcStart(SITEDEFS_DEFAULTCLASS) ) {
mprintf("%s failed NcStart\n", __FUNCTION__);
ret_flag = FALSE;
goto end_log_e;
}
/******** ƒlƒbƒgƒ<67><C692>[ƒNÉÂÈ¢¾ *************/
// •K<E280A2>{<7B>FHTTP ‚Æ SSL Ì<E2809A>‰Šú‰»
mprintf("-setup NSSL & NHTTP\n");
SetupNSSL();
if( FALSE == SetupNHTTP() ) {
ret_flag = FALSE;
mprintf(" %s failed SetupNHTTP\n", __FUNCTION__);
goto end_nhttp;
}
/******** NHTTP & NSSLÉÂÈ¢¾ *************/
// •K<E280A2>{<7B>FEC Ì<E2809A>‰Šú‰»
mprintf("-setup EC\n");
if( FALSE == SetupEC() ) {
ret_flag = FALSE;
mprintf(" %s failed SetupEC\n", __FUNCTION__);
goto end_ec;
}
// •K<E280A2>{<7B>FƒfƒoƒCƒX<C692>ؾ<E28093>Ì”­<E2809D>s
if( FALSE == KPSClient() ) {
ret_flag = FALSE;
mprintf("%s failed KPSClient\n", __FUNCTION__);
goto end_ec_f;
}
for( i = 0; i < title_id_count ; i++ ) {
tid = title_id_buf_ptr[i].tid;
is_personalized = title_id_buf_ptr[i].is_personalized = 2;
(void)my_fs_Tid_To_GameCode(tid, game_code_buf);
mprintf(" id %08X %08X [%s] %c\n", (u32)(tid >> 32), (u32)tid, game_code_buf,
(is_personalized == 1)? 'P':'D');
}
ec_download_ret = ECDownload_Auto((MY_USER_APP_TID *)title_id_buf_ptr , (u32)title_id_count);
if( ec_download_ret == ECDOWNLOAD_FAILURE ) {
ret_flag = FALSE;
mprintf("%s failed ECDownload 1\n", __FUNCTION__);
}
else if( ec_download_ret == ECDOWNLOAD_DUMMY ) {
ret_flag = FALSE;
mprintf("%s failed ECDownload 2\n", __FUNCTION__);
}
// •s—v<E28094>FƒZ<C692>[ƒuƒf<C692>[ƒ^—̈æð<E2809A>ì<EFBFBD>¬
// NAM_Init ðYêĽ
// SetupTitlesDataFile((NAMTitleId *)title_id_buf_ptr , (u32)title_id_count);
SetupTitlesDataFile((MY_USER_APP_TID *)title_id_buf_ptr , (u32)title_id_count);
end_ec_f:
// cleanup
// EC Ì<E2809A>I—¹<E28094>ˆ<CB86>
mprintf("-ec shutdown.. ");
rv = EC_Shutdown();
if( rv != EC_ERROR_OK ) {
ret_flag = FALSE;
m_set_palette(tc[0], M_TEXT_COLOR_RED );
mprintf("NG.\n");
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
mprintf("%s failed EC_Shutdown\n", __FUNCTION__);
}
else {
m_set_palette(tc[0], M_TEXT_COLOR_GREEN );
mprintf("OK.\n");
}
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
end_ec:
// ƒlƒbƒgƒ<67><C692>[ƒN©çÌ<E2809A>Øf
mprintf("-LINK DOWN....");
NHTTP_Cleanup();
end_nhttp:
NSSL_Finish();
end_nssl:
NcFinish();
end_nc:
//miya_log_fprintf(log_fd,"NSSL_Finish() return = %d\n", NSSL_Finish());
TerminateWcmControl();
mprintf("done.\n");
// EC ‚ªŽ©•ª‚Ì Title ID ̃fƒBƒŒƒNƒgƒŠð<E2809A>ì<EFBFBD>¬µÄµÜ¤½ß<E2809A>A<EFBFBD>í<EFBFBD>œ·é
DeleteECDirectory();
end_log_e:
;
}
else {
/* mprintf("-Wireless AP conf. loading.. "); */
ret_flag = FALSE;
m_set_palette(tc[0], M_TEXT_COLOR_RED );
mprintf("NG.\n");
}
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
}
#endif /* HATAMOTO_LIB */
#define MY_STACK_SIZE (1024*128) /* ‚Å‚©‚¢‚Ù‚¤‚ª‚¢‚¢ */
//#define MY_THREAD_PRIO 20
#define MY_THREAD_PRIO 5
static OSThread MyThread;
static u64 MyStack[MY_STACK_SIZE/sizeof(u64)];
static OSMessage MyMesgBuffer_request[1];
static OSMessage MyMesgBuffer_response[1];
static OSMessageQueue MyMesgQueue_request;
static OSMessageQueue MyMesgQueue_response;
static void MyThreadProc(void *arg)
{
#pragma unused(arg)
OSMessage message;
BOOL flag;
u32 command;
m_set_palette(tc[0], M_TEXT_COLOR_WHITE );
while( 1 ) {
// (void)pre_install_process( NULL, NULL, 0, NULL, 0 , development_console_flag);
(void)OS_SendMessage(&MyMesgQueue_response, (OSMessage)0, OS_MESSAGE_NOBLOCK);
(void)OS_ReceiveMessage(&MyMesgQueue_request, &message, OS_MESSAGE_BLOCK);
flag = TRUE;
command = (u32)message;
switch( command ) {
case THREAD_COMMAND_INSTALL_APP:
flag = pre_install_command(NULL, eticket_only_id_buf, eticket_only_id_count,
1, development_console_flag );
break;
case THREAD_COMMAND_INSTALL_TICKET:
flag = pre_install_command(NULL, eticket_only_id_buf, eticket_only_id_count,
2, development_console_flag );
break;
case THREAD_COMMAND_DELETE_APP_CONTENT:
flag = pre_install_command(NULL, eticket_only_id_buf, eticket_only_id_count,
3, development_console_flag );
break;
case THREAD_COMMAND_DELETE_APP_COMPLETELY:
flag = pre_install_command(NULL, eticket_only_id_buf, eticket_only_id_count,
4, development_console_flag );
break;
case THREAD_COMMAND_DELETE_DEVKP:
#if 0
{
char *src_path = "nand:/sys/dev.kp";
char *dst_path = "sdmc:/dev.kp";
FSFile f;
FS_InitFile(&f);
if( FALSE == FS_OpenFileEx(&f, src_path, FS_FILEMODE_R) ) {
if( FALSE == FS_OpenFileEx(&f, dst_path, FS_FILEMODE_R) ) {
mprintf("no dev.kp file in NAND & SD\n");
}
else {
FS_CloseFile(&f);
(void)CopyFile(src_path, dst_path, NULL );
mprintf("copy dev.kp from SD to NAND\n");
}
}
else {
FS_CloseFile(&f);
(void)CopyFile(dst_path, src_path, NULL );
FS_DeleteFile( src_path );
mprintf("move dev.kp from NAND to SD\n");
}
}
#endif
break;
case THREAD_COMMAND_DOWNLOAD_APP:
#ifdef HATAMOTO_LIB
SetupShopTitleId(); /* ƒGƒ‰<C692>[‚͂Ȃ¢ */
if( FALSE == SetupVerData() ) {
mprintf("%s failed SetupVerData\n", __FUNCTION__);
}
(void)SetupEC_pre();
pre_install_eticket_only_process( NULL, development_console_flag ,
&title_id_buf_ptr,&title_id_count);
ec_download_func();
#endif
break;
default:
flag = FALSE;
mprintf("%s unknown command!\n",__FUNCTION__);
break;
}
mprintf("\n");
}
}
static void init_my_thread(void)
{
OS_InitMessageQueue(&MyMesgQueue_request, &MyMesgBuffer_request[0], 1);
OS_InitMessageQueue(&MyMesgQueue_response, &MyMesgBuffer_response[0], 1);
OS_CreateThread(&MyThread, MyThreadProc,
NULL, MyStack + MY_STACK_SIZE /sizeof(u64),
MY_STACK_SIZE, MY_THREAD_PRIO);
OS_WakeupThreadDirect(&MyThread);
}
static BOOL start_my_thread(u32 command)
{
OSMessage message;
if( TRUE == OS_ReceiveMessage(&MyMesgQueue_response, &message, OS_MESSAGE_NOBLOCK) ) {
(void)OS_SendMessage(&MyMesgQueue_request, (OSMessage)command, OS_MESSAGE_BLOCK);
return TRUE;
}
return FALSE;
}