diff --git a/build/buildtools/commondefs b/build/buildtools/commondefs index d1ec8358..403e6ec3 100644 --- a/build/buildtools/commondefs +++ b/build/buildtools/commondefs @@ -151,6 +151,7 @@ TWL_BUILDARCH ?= $(FIRM_BUILDARCH) ifneq ($(FIRM_TARGET),APP) LCFILE_TEMPLATE ?= $(DEFAULT_FIRM_LCFILE_TEMPLATE) LCFILE_SPEC ?= $(DEFAULT_FIRM_LCFILE_SPEC) +ROM_SPEC ?= $(DEFAULT_FIRM_ROM_SPEC) endif # FIRM_TARGET!=APP LDEPENDS_LCF += $(FIRM_BUILDTOOLSDIR)/commondefs diff --git a/build/libraries/fatfs/ARM7/Makefile b/build/libraries/fatfs/ARM7/Makefile index 5d193869..1780c302 100644 --- a/build/libraries/fatfs/ARM7/Makefile +++ b/build/libraries/fatfs/ARM7/Makefile @@ -28,18 +28,15 @@ FIRM_CODEGEN_ALL ?= TRUE # Codegen for sub processer FIRM_PROC = ARM7 -INCDIR = rom_sdmc \ +INCDIR = \ $(TWLSDK_ROOT)/build/libraries/fatfs/ARM7.TWL/include \ $(TWLSDK_ROOT)/build/libraries/fatfs/ARM7.TWL/include/twl/fatfs/ARM7 -SRCDIR = src rom_sdmc +SRCDIR = src SRCS = \ fatfs_loader.c \ fatfs_firm.c \ -# sdmc.c \ -# sdmc_nandinit.c \ -# drsdmc.c \ TARGET_LIB = libfatfs_sp$(FIRM_LIBSUFFIX).a diff --git a/build/libraries/fatfs/ARM7/firm_sdmc/drsdmc.c b/build/libraries/fatfs/ARM7/firm_sdmc/drsdmc.c deleted file mode 100644 index 3087226e..00000000 --- a/build/libraries/fatfs/ARM7/firm_sdmc/drsdmc.c +++ /dev/null @@ -1,687 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: CTR - rtfs interface for SD Memory Card - File: drsdmc.h - - Copyright 2006,2007 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - *---------------------------------------------------------------------------*/ - -#include -#include -//#if (INCLUDE_SD) - -//#include "sdmc_config.h" -//#include "sdmc.h" -//#include "sdif_ip.h" -//#include "sdif_reg.h" -#include - -#if (SD_DEBUG_PRINT_ON == 1) - #if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - #define PRINTDEBUG osTPrintf - #else - #include - #define PRINTDEBUG vlink_dos_printf - #endif -#else - #define PRINTDEBUG( ...) ((void)0) -#endif - - -#define NUM_SD_PAGES -#define SD_PAGE_SIZE - - -/*---------------------------------------------------------------------------* - extern変数 - *---------------------------------------------------------------------------*/ -//extern ER_ID sdmc_dtq_id; -//extern ER_ID sdmc_result_dtq_id; -extern void (*func_SDCARD_In)(void); /* カード挿入イベント用コールバック保存用 */ -extern void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */ -extern volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ - -extern int rtfs_first_stat_flag[26]; - -/*SDメモリカードのスペック構造体*/ -extern SdmcSpec sdmc_current_spec; - - -/*---------------------------------------------------------------------------* - extern関数 - *---------------------------------------------------------------------------*/ -extern SDMC_ERR_CODE sdmcGoIdle(void (*func1)(),void (*func2)()); - - -/*---------------------------------------------------------------------------* - static変数 - *---------------------------------------------------------------------------*/ -static int sdmc_drive_no; -void (*func_usr_sdmc_out)(void) = NULL; /* カード排出イベントのユーザコールバック */ - - -/*---------------------------------------------------------------------------* - static関数 - *---------------------------------------------------------------------------*/ -void i_sdmcRemovedIntr( void); -static void sdi_get_CHS_params( void); -static u32 sdi_get_ceil( u32 cval, u32 mval); -static void sdi_get_nom( void); -static void sdi_get_fatparams( void); -static void sdi_build_partition_table( void); - - -/*---------------------------------------------------------------------------* - Name: sdmcCheckMedia - - Description: MBRのシグネチャおよび - パーティションのフォーマット種別をチェックする - - Arguments: - - Returns: TRUE/FALSE - (FALSEなら pc_format_media が必要) - *---------------------------------------------------------------------------*/ -BOOL sdmcCheckMedia( void) -{ - u16 i; - SdmcResultInfo SdResult; - u8* bufp; - u32 buffer[512/4]; - u8 systemid; - - /**/ - if( sdmcReadFifo( buffer, 1, 0, NULL, &SdResult)) { - return( FALSE); - } - - bufp = (u8*)buffer; - - /* Check the Signature Word. */ - if( (bufp[510]!=0x55) || (bufp[511]!=0xAA)) { - return( FALSE); - } - /* Check the System ID of partition. */ - systemid = bufp[450]; - if( (systemid!=0x01) && (systemid!=0x04) && (systemid!=0x06) && - (systemid!=0x0B) && (systemid!=0x0C)) { - return( FALSE); - } - /* Check the System ID of unuse partitions. */ - for( i=1; i<4; i++) { - systemid = bufp[450+(16*i)]; - if( systemid != 0x00) { - return( FALSE); - } - } - /**/ - /*もっと厳密にチェックするならパーティション0開始位置の - 正当性も調べる*/ - return( TRUE); -} - - -/*---------------------------------------------------------------------------* - Name: sdmcRtfsIo - - Description: 上位層からのセクタリード/ライト要求を受ける - - Arguments: driveno : ドライブ番号 - block : 開始ブロック番号 - buffer : - count : ブロック数 - reading : リード要求時にTRUE - - Returns: TRUE/FALSE - *---------------------------------------------------------------------------*/ -BOOL sdmcRtfsIo( int driveno, dword block, void* buffer, word count, BOOLEAN reading) -{ - u16 result; - SdmcResultInfo SdResult; - - if( reading) { - PRINTDEBUG( "DEVCTL_IO_READ ... block:%x, count:%x -> buf:%x\n", block, count, buffer); - result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcRead( buffer, count, block, NULL, &SdResult); - }else{ - PRINTDEBUG( "DEVCTL_IO_WRITE ... block:%x, count:%x <- buf:%x\n", block, count, buffer); - result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcWrite( buffer, count, block, NULL, &SdResult); - } - if( result) { - return FALSE; - } - - return TRUE; -} - -/*---------------------------------------------------------------------------* - Name: sdmcRtfsCtrl - - Description: 上位層からのコントロール要求を受ける - - Arguments: driveno : ドライブ番号 - opcode : 要求の種類 - pargs : - - Returns: - Memo : DRIVE_FLAGS_REMOVABLEの場合、ドライバのIO関数を呼ぶ前に - CTRL関数のDEVCTL_CHECK_STATUSが呼ばれる。 - DEVTEST_CHANGED→DEVTEST_NOCHANGEが確認されるとRTFSはセクタ0を - 読みに行き、FATパラメータを取得した上で目的のセクタを読みに行く。 - CTRL関数の前にはDEVCTL_CHECK_STATUSが呼ばれないので、DEVCTL_ - GET_GEOMETRYでは自前で再挿入をチェックする必要がある。 - *---------------------------------------------------------------------------*/ -int sdmcRtfsCtrl( int driveno, int opcode, void* pargs) -{ - DDRIVE *pdr; - DEV_GEOMETRY gc; - int heads, secptrack; - - pdr = pc_drno_to_drive_struct( driveno); - - switch( opcode) { - case DEVCTL_GET_GEOMETRY: //formatまたはpartirionするときにRTFSが使うパラメータ - PRINTDEBUG( "DEVCTL_GET_GEOMETRY\n"); - if( (pdr->drive_flags & DRIVE_FLAGS_INSERTED) == 0) { /* 抜かれていた場合 */ - if( SDCARD_OutFlag == TRUE) { /* 今現在も抜かれているとき */ - return( -1); - }else{ /* 今現在は再挿入されているとき */ - /*-- GoIdleセット --*/ - if( func_SDCARD_Out != i_sdmcRemovedIntr) { - func_usr_sdmc_out = func_SDCARD_Out; //ユーザコールバック取得 - } - sdmcGoIdle( func_SDCARD_In, i_sdmcRemovedIntr); //カード初期化シーケンス - /*------------------*/ - } - } - - rtfs_memset( &gc, (byte)0, sizeof(gc)); - - sdi_get_CHS_params(); //最初に呼ぶこと - sdi_get_fatparams(); - sdi_get_nom(); - - PRINTDEBUG( "heads : 0x%x\n", sdmc_current_spec.heads); - PRINTDEBUG( "secptrack : 0x%x\n", sdmc_current_spec.secptrack); - PRINTDEBUG( "cylinders : 0x%x\n", sdmc_current_spec.cylinders); - PRINTDEBUG( "SC : 0x%x\n", sdmc_current_spec.SC); - PRINTDEBUG( "BU : 0x%x\n", sdmc_current_spec.BU); - PRINTDEBUG( "RDE : 0x%x\n", sdmc_current_spec.RDE); - PRINTDEBUG( "SS : 0x%x\n", sdmc_current_spec.SS); - PRINTDEBUG( "RSC : 0x%x\n", sdmc_current_spec.RSC); - PRINTDEBUG( "FATBITS : 0x%x\n", sdmc_current_spec.FATBITS); - PRINTDEBUG( "SF : 0x%x\n", sdmc_current_spec.SF); - PRINTDEBUG( "SSA : 0x%x\n", sdmc_current_spec.SSA); - PRINTDEBUG( "NOM : 0x%x\n", sdmc_current_spec.NOM); - - gc.dev_geometry_lbas = (sdmc_current_spec.adjusted_memory_capacity);// - sdmc_current_spec.NOM); - gc.dev_geometry_heads = sdmc_current_spec.heads; - gc.dev_geometry_cylinders = sdmc_current_spec.cylinders; - gc.dev_geometry_secptrack = sdmc_current_spec.secptrack; - /**/ - gc.fmt_parms_valid = TRUE; - gc.fmt.oemname[0] = 'C'; - gc.fmt.oemname[1] = 'T'; - gc.fmt.oemname[2] = 'R'; - gc.fmt.oemname[3] = '\0'; - gc.fmt.secpalloc = sdmc_current_spec.SC; /*sectors per cluster(FIX by capacity)*/ - gc.fmt.secreserved = sdmc_current_spec.RSC;//sdmc_current_spec.RSC;/*reserved sectors(FIX 1 at FAT12,16)*/ - gc.fmt.numfats = 2; - gc.fmt.secpfat = sdmc_current_spec.SF; - gc.fmt.numhide = sdmc_current_spec.NOM; /**/ - gc.fmt.numroot = sdmc_current_spec.RDE; /*FIX*/ - gc.fmt.mediadesc = 0xF8; - gc.fmt.secptrk = sdmc_current_spec.secptrack; //CHS Recommendation - gc.fmt.numhead = sdmc_current_spec.heads; - gc.fmt.numcyl = sdmc_current_spec.cylinders; - gc.fmt.physical_drive_no = driveno; - gc.fmt.binary_volume_label = BIN_VOL_LABEL; - gc.fmt.text_volume_label[0] = '\0'; - //TODO:dev_geometry_lbasもセットする必要あるか調べること - PRINTDEBUG( "heads : 0x%x, secptrack : 0x%x, cylinders : 0x%x\n", gc.dev_geometry_heads, gc.dev_geometry_secptrack, gc.dev_geometry_cylinders); - -#if (TARGET_OS_CTR == 1) - miCpuCopy8( &gc, pargs, sizeof(gc)); -// copybuff( pargs, &gc, sizeof(gc)); -#else - MI_CpuCopy8( &gc, pargs, sizeof(gc)); -#endif - return( 0); - - case DEVCTL_FORMAT: - PRINTDEBUG( "DEVCTL_FORMAT\n"); - sdi_build_partition_table(); //MBRセクタ(パーティションテーブル含む)書き込み - return( 0); - - case DEVCTL_REPORT_REMOVE: //抜かれたとき - PRINTDEBUG( "DEVCTL_REPORT_REMOVE\n"); - pdr->drive_flags &= ~DRIVE_FLAGS_INSERTED; - return( 0); - - case DEVCTL_CHECKSTATUS: //REMOVABLEの場合、毎回R/W前に呼ばれる - PRINTDEBUG( "DEVCTL_CHECKSTATUS\n"); - if (!(pdr->drive_flags & DRIVE_FLAGS_REMOVABLE)) { //リムーバブルでない場合 - return(DEVTEST_NOCHANGE); - } - if (pdr->drive_flags & DRIVE_FLAGS_INSERTED) { /* 抜かれてない場合 */ - if( rtfs_first_stat_flag[driveno]) { //初回のCHECKSTATUS時 - rtfs_first_stat_flag[driveno] = 0; - PRINTDEBUG( "CHANGED!\n"); - return(DEVTEST_CHANGED); - }else{ - PRINTDEBUG( "DEVTEST_NOCHANGE\n"); - return( DEVTEST_NOCHANGE); - } - }else{ /* 抜かれていた場合 */ - if( SDCARD_OutFlag == FALSE) { /* 排出フラグ参照 */ - pdr->drive_flags |= DRIVE_FLAGS_INSERTED; - /*-- GoIdleセット --*/ - if( func_SDCARD_Out != i_sdmcRemovedIntr) { - func_usr_sdmc_out = func_SDCARD_Out; //ユーザコールバック取得 - } - sdmcGoIdle( func_SDCARD_In, i_sdmcRemovedIntr); //カード初期化シーケンス - /*------------------*/ - PRINTDEBUG( "DEVTEST_CHANGED\n"); - return( DEVTEST_CHANGED); //挿さっている - }else{ - PRINTDEBUG( "DEVTEST_NOMEDIA\n"); - return( DEVTEST_NOMEDIA); //挿さってない - } - } - - case DEVCTL_WARMSTART: //attachのときしか呼ばれない - PRINTDEBUG( "DEVCTL_WARMSTART\n"); - /*-- GoIdleセット --*/ - if( func_SDCARD_Out != i_sdmcRemovedIntr) { - func_usr_sdmc_out = func_SDCARD_Out; //ユーザコールバック取得 - } - sdmcGoIdle( func_SDCARD_In, i_sdmcRemovedIntr); //カード初期化シーケンス - /*------------------*/ - pdr->drive_flags |= (DRIVE_FLAGS_VALID | DRIVE_FLAGS_REMOVABLE | DRIVE_FLAGS_PARTITIONED); - pdr->partition_number = 0; - - if( SDCARD_OutFlag == FALSE) { /* 排出フラグ参照 */ - pdr->drive_flags |= DRIVE_FLAGS_INSERTED; - }else{ /* カード未挿入のとき */ - pdr->drive_flags &= (~(DRIVE_FLAGS_INSERTED)); //抜かれているだけではVALIDフラグは落とさないらしい - } - return( 0); - - case DEVCTL_POWER_RESTORE: - PRINTDEBUG( "DEVCTL_POWER_RESTORE\n"); - break; - - case DEVCTL_POWER_LOSS: - PRINTDEBUG( "DEVCTL_POWER_LOSS\n"); - break; - - default: - PRINTDEBUG( "DEVCTL_unknown\n"); - break; - } - return( 0); -} - -/*---------------------------------------------------------------------------* - 抜取コールバック関数 - - RTFSが次回"DEVCTL_GET_GEOMETRY"を行うとき、ここでセットしたパラメータを知る - *---------------------------------------------------------------------------*/ -void i_sdmcRemovedIntr( void) -{ - DDRIVE *pdr; - - pdr = pc_drno_to_drive_struct( sdmc_drive_no); - if( pdr) { - pdr->dev_table_perform_device_ioctl( pdr->driveno, - DEVCTL_REPORT_REMOVE, - (void*)0); - } - - if( func_usr_sdmc_out) { - func_usr_sdmc_out(); //ユーザコールバック - } -} - - -/*---------------------------------------------------------------------------* - Name: sdmcRtfsAttach - - Description: sdmcドライバをドライブに割り当てる - - Arguments: driveno : ドライブ番号 - - Returns: - *---------------------------------------------------------------------------*/ -BOOL sdmcRtfsAttach( int driveno) -{ - BOOLEAN result; - DDRIVE pdr; - - pdr.dev_table_drive_io = sdmcRtfsIo; - pdr.dev_table_perform_device_ioctl = sdmcRtfsCtrl; - pdr.register_file_address = (dword) 0; /* Not used */ - pdr.interrupt_number = 0; /* Not used */ - pdr.drive_flags = 0;//DRIVE_FLAGS_FAILSAFE; - pdr.partition_number = 0; /* Not used */ - pdr.pcmcia_slot_number = 0; /* Not used */ - pdr.controller_number = 0; - pdr.logical_unit_number = 0; - - result = rtfs_attach( driveno, &pdr, "SD"); //構造体がFSライブラリ側にコピーされる - - /*drivenoをグローバル変数に記憶*/ - sdmc_drive_no = driveno; - - return( result); -} - - - -/*SD File System Specification(仕様書)に基づいた値を出す*/ -static void sdi_get_CHS_params( void) -{ - int mbytes; - -// mbytes = (sdmc_current_spec.card_capacity / (1024 * 1024)) * 512; - mbytes = (sdmc_current_spec.card_capacity >> 11); - - while( 1) { - if( mbytes <= 2) { - sdmc_current_spec.heads = 2; - sdmc_current_spec.secptrack = 16; - break; - } - if( mbytes <= 16) { - sdmc_current_spec.heads = 2; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 32) { - sdmc_current_spec.heads = 4; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 128) { - sdmc_current_spec.heads = 8; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 256) { - sdmc_current_spec.heads = 16; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 504) { - sdmc_current_spec.heads = 16; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 1008) { - sdmc_current_spec.heads = 32; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 2016) { - sdmc_current_spec.heads = 64; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 2048) { - sdmc_current_spec.heads = 128; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 4032) { - sdmc_current_spec.heads = 128; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 32768) { - sdmc_current_spec.heads = 255; - sdmc_current_spec.secptrack = 63; - break; - } - } - - /*シリンダ数を計算*/ - sdmc_current_spec.cylinders = (sdmc_current_spec.memory_capacity / - (sdmc_current_spec.heads * sdmc_current_spec.secptrack)); - - /*memory_capacityを再計算してadjusted_memory_capacityに格納*/ - sdmc_current_spec.adjusted_memory_capacity = sdmc_current_spec.cylinders * - (sdmc_current_spec.heads * sdmc_current_spec.secptrack); -} - - -/*引数を超える最も小さい整数を算出する*/ -static u32 sdi_get_ceil( u32 cval, u32 mval) -{ - return( (cval / mval) + (1 * (cval % mval != 0))); -} - - -/*マスターブートセクタのセクタ数を返す*/ -static void sdi_get_nom( void) -{ - u32 RSC = 1; //FAT12,16では1 - u32 RDE = 512; //ルートディレクトリエントリ。FIX - u32 SS = 512; //セクタサイズ。FIX - u32 TS, SC, n; - u32 MAX, SFdash; - - TS = sdmc_current_spec.adjusted_memory_capacity; - SC = sdmc_current_spec.SC; - - sdmc_current_spec.SF = sdi_get_ceil( TS/SC * sdmc_current_spec.FATBITS, SS*8); - - /*-----------------------SDHCのとき----------------------------*/ - if( sdmc_current_spec.csd_ver2_flag) { - sdmc_current_spec.NOM = sdmc_current_spec.BU; - do { - n = sdi_get_ceil( 2*sdmc_current_spec.SF, sdmc_current_spec.BU); - sdmc_current_spec.RSC = (sdmc_current_spec.BU * n) - ( 2 * sdmc_current_spec.SF); - if( sdmc_current_spec.RSC < 9) { - sdmc_current_spec.RSC += sdmc_current_spec.BU; - } - sdmc_current_spec.SSA = sdmc_current_spec.RSC + (2 * sdmc_current_spec.SF); - do { - MAX = ((TS - sdmc_current_spec.NOM - sdmc_current_spec.SSA) / SC) + 1; - SFdash = sdi_get_ceil( (2+(MAX-1)) * sdmc_current_spec.FATBITS, SS*8); - if( SFdash > sdmc_current_spec.SF) { - sdmc_current_spec.SSA += sdmc_current_spec.BU; - sdmc_current_spec.RSC += sdmc_current_spec.BU; - }else{ - break; - } - }while( 1); - if( SFdash != sdmc_current_spec.SF) { - sdmc_current_spec.SF -= 1; - }else{ - break; - } - }while( 1); - }else{ /*-------------------------SDのとき-------------------------------*/ - do { - sdmc_current_spec.SSA = RSC + ( 2 * sdmc_current_spec.SF) + sdi_get_ceil( 32*RDE, SS); - n = sdi_get_ceil( sdmc_current_spec.SSA, sdmc_current_spec.BU); - sdmc_current_spec.NOM = (sdmc_current_spec.BU * n) - sdmc_current_spec.SSA; - if( sdmc_current_spec.NOM != sdmc_current_spec.BU) { - sdmc_current_spec.NOM += sdmc_current_spec.BU; - } - do { - MAX = ((TS - sdmc_current_spec.NOM - sdmc_current_spec.SSA) / SC) + 1; - SFdash = sdi_get_ceil( (2+(MAX-1)) * sdmc_current_spec.FATBITS, SS*8); - if( SFdash > sdmc_current_spec.SF) { - sdmc_current_spec.NOM += sdmc_current_spec.BU; - }else{ - break; - } - }while( 1); - if( SFdash != sdmc_current_spec.SF) { - sdmc_current_spec.SF = SFdash; - }else{ - break; //complete - } - }while( 1); - } - - return; -} - -/*FATのビット数を返す*/ -static void sdi_get_fatparams( void) -{ - int mbytes; - -// mbytes = (sdmc_current_spec.card_capacity / (1024 * 1024)) * 512; - mbytes = (sdmc_current_spec.card_capacity >> 11); - - if( mbytes <= 64) { - sdmc_current_spec.FATBITS = 12; - sdmc_current_spec.RDE = 512; - sdmc_current_spec.RSC = 1; - }else{ - if( mbytes <= 2048) { - sdmc_current_spec.FATBITS = 16; - sdmc_current_spec.RDE = 512; - sdmc_current_spec.RSC = 1; - }else{ - sdmc_current_spec.FATBITS = 32; - sdmc_current_spec.RDE = 0; //FAT32のときは未使用。0にしておかないとRTFSが BAD FORMAT を返す。 - sdmc_current_spec.RSC = 1; - } - } - - if( mbytes <= 8) { - sdmc_current_spec.SC = 16; - sdmc_current_spec.BU = 16; - return; - } - if( mbytes <= 64) { - sdmc_current_spec.SC = 32; - sdmc_current_spec.BU = 32; - return; - } - if( mbytes <= 256) { - sdmc_current_spec.SC = 32; - sdmc_current_spec.BU = 64; - return; - } - if( mbytes <= 1024) { - sdmc_current_spec.SC = 32; - sdmc_current_spec.BU = 128; - return; - } - if( mbytes <= 2048) { - sdmc_current_spec.SC = 64; - sdmc_current_spec.BU = 128; - return; - } - if( mbytes <= 32768) { - sdmc_current_spec.SC = 64; - sdmc_current_spec.BU = 8192; - return; - } -} - -/*MBRセクタ(パーティションセクタ含む)を生成して書き込む*/ -static void sdi_build_partition_table( void) -{ - u16 MbrSectDat[512/2]; - u32 starting_head, starting_sect, starting_cyl; - u32 ending_head, ending_sect, ending_cyl; - u32 total_sect; -#if (SD_DEBUG_PRINT_ON == 1) - u32 starting_data, ending_data; -#endif - u32 systemid; - SdmcResultInfo SdResult; - - /**/ - starting_head = sdmc_current_spec.NOM % (sdmc_current_spec.heads * - sdmc_current_spec.secptrack); - starting_head /= sdmc_current_spec.secptrack; - - /**/ - starting_sect = (sdmc_current_spec.NOM % sdmc_current_spec.secptrack) + 1; - - /**/ - starting_cyl = sdmc_current_spec.NOM / (sdmc_current_spec.heads * - sdmc_current_spec.secptrack); - - /**/ - total_sect = (sdmc_current_spec.adjusted_memory_capacity - sdmc_current_spec.NOM); - ending_head = (sdmc_current_spec.NOM + total_sect - 1) % - (sdmc_current_spec.heads * sdmc_current_spec.secptrack); - ending_head /= sdmc_current_spec.secptrack; - - /**/ - ending_sect = ((sdmc_current_spec.NOM + total_sect - 1) % - sdmc_current_spec.secptrack) + 1; - - /**/ - ending_cyl = (sdmc_current_spec.NOM + total_sect - 1) / - (sdmc_current_spec.heads * sdmc_current_spec.secptrack); - - /**/ - if( sdmc_current_spec.FATBITS == 32) { //FAT32のとき - if( total_sect < 0xFB0400) { //8032.5MBが閾値(SD FileSystemSpec2.00参照) - systemid = 0x0B; /* FAT32 */ - }else{ - systemid = 0x0C; /* FAT32(拡張INT13対応) */ - } - }else{ //FAT12,FAT16のとき - if( total_sect < 32680) { - systemid = 0x01; /* FAT12 */ - }else if( total_sect < 65536) { - systemid = 0x04; /* FAT16(16MB〜32MB未満) */ - }else{ - systemid = 0x06; /* FAT16(32MB〜4GB) */ - } - } - - /*MBRセクタ(パーティションテーブル含む)作成*/ -#if (TARGET_OS_CTR == 1) - miCpuFill8( MbrSectDat, 0, 512); -#else - MI_CpuFill8( MbrSectDat, 0, 512); -#endif - MbrSectDat[446/2] = (starting_head<<8); - //上位8bit:starting_cylの下位8bit, 下位8bit:starting_cylの上位2bit + starting_sect 6bit. - MbrSectDat[448/2] = (starting_cyl<<8) + ((starting_cyl>>2) & 0xC0) + starting_sect; - MbrSectDat[450/2] = (ending_head<<8) + systemid; - //上位8bit:ending_cylの下位8bit, 下位8bit:ending_cylの上位2bit + ending_sect 6bit. - MbrSectDat[452/2] = (ending_cyl<<8) + ((ending_cyl>>2) & 0xC0) + ending_sect; - MbrSectDat[454/2] = sdmc_current_spec.NOM; - MbrSectDat[456/2] = (sdmc_current_spec.NOM>>16); - MbrSectDat[458/2] = total_sect; - MbrSectDat[460/2] = (total_sect>>16); - MbrSectDat[510/2] = 0xAA55; - /*セクタ0に書き込み*/ - sdmcWriteFifo( MbrSectDat, 1, 0, NULL, &SdResult); - - /**/ - PRINTDEBUG( "total sect : 0x%x\n", total_sect); - PRINTDEBUG( "starting head : 0x%x\n", starting_head); - PRINTDEBUG( "starting sect : 0x%x\n", starting_sect); - PRINTDEBUG( "starting cyl : 0x%x\n", starting_cyl); - PRINTDEBUG( "ending head : 0x%x\n", ending_head); - PRINTDEBUG( "ending sect : 0x%x\n", ending_sect); - PRINTDEBUG( "ending cyl : 0x%x\n", ending_cyl); - PRINTDEBUG( "\n"); -#if (SD_DEBUG_PRINT_ON == 1) - starting_data = (starting_cyl<<8) + ((starting_cyl>>2) & 0xC0) + starting_sect; - PRINTDEBUG( "starting data : 0x%x\n", starting_data); - ending_data = (ending_cyl<<8) + ((ending_cyl>>2) & 0xC0) + ending_sect; - PRINTDEBUG( "endign data : 0x%x\n", ending_data); -#endif -} - -//#endif /*(INCLUDE_SD)*/ diff --git a/build/libraries/fatfs/ARM7/firm_sdmc/sdif.c b/build/libraries/fatfs/ARM7/firm_sdmc/sdif.c deleted file mode 100644 index aa770409..00000000 --- a/build/libraries/fatfs/ARM7/firm_sdmc/sdif.c +++ /dev/null @@ -1,1188 +0,0 @@ -/* - Project: CTR SD Card driver - File: sd_card.c - - 2006, Research and Development Department, Nintendo. -*/ - -#include -#include "sdmc_config.h" -#include "sdif_reg.h" /* IP 対応レジスタ定義 */ -#include -#include "sdif_ip.h" /* IP 対応フラグ定義 */ - -#if (SD_DEBUG_PRINT_ON == 1) - #if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - #define PRINTDEBUG osTPrintf - #else - #include - #define PRINTDEBUG vlink_dos_printf - #endif -#else - #define PRINTDEBUG( ...) ((void)0) -#endif - - -#define ADD_CHECK 1 - -/*********************************************************************** - グローバル -***********************************************************************/ -u16 SD_CID[8]; /* CID保存用 (Card IDentification register) : ID*/ -u16 SD_CSD[8]; /* CSD保存用 (Card Specific Data register) : spec*/ -u16 SD_OCR[2]; /* OCR保存用 (Operation Condition Register) : voltage and status*/ -u16 SD_SCR[4]; /* SCR保存用 (Sd card Configulation Register) : bus-width, card-ver, etc*/ -u16 SD_RCA; /* RCA保存用 (Relative Card Address register) : address*/ - -s16 SDCARD_MMCFlag; /* MMCカードフラグ */ -s16 SDCARD_SDHCFlag; /* SDHCカードフラグ(ここではPhysicalLayer2.0の意) */ -u16 SD_port_number; /* 現在のポート番号 */ - -/*********************************************************************** - 外部参照変数 -***********************************************************************/ -extern volatile u16 SDCARD_ErrStatus; /* エラーステータス */ -extern volatile u32 SDCARD_Status; /* カードステータス */ -//extern volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ -//extern void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */ - - - - - -void SD_DisableInfo( void); - - - -/*---------------------------------------------------------------------------* - Name: SD_Init - - Description: reset and initialize SD card interface - SDカードIPのリセットと初期設定 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_Init(void) -{ - SD_AndFPGA( SOFT_RST,(~(SOFT_RST_SDIF_RST))); /* SD I/F モジュールをリセット */ - SD_OrFPGA( SOFT_RST,((SOFT_RST_SDIF_RST))); /* SD I/F モジュールをリセット復帰 */ - - SD_AndFPGA( SD_STOP,(~SD_STOP_STP)); /* データ転送終了クリア */ -} - -/*---------------------------------------------------------------------------* - Name: SD_EnableInfo - - Description: enable SD card insert and remove interrupts. - SDカードの挿入/抜取 割り込みを許可する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_EnableInfo( void) -{ - if(SD_port_number == SDCARD_PORT0) - { - SD_AndFPGA(SD_INFO1,(~(SD_INFO1_INSERT | SD_INFO1_REMOVE))); /* SD_INFO1レジスタの card inserted removedをクリア */ - SD_AndFPGA(SD_INFO1_MASK,(~(SD_INFO1_MASK_INSERT | SD_INFO1_MASK_REMOVE))); /* 挿/抜 割り込み許可 */ - } - else if(SD_port_number == SDCARD_PORT1) - { /* ポート1はCD端子が繋がっていないので実質無効 */ - SD_AndFPGA(EXT_CD,(~(EXT_CD_PORT1_INSERT | EXT_CD_PORT1_REMOVE))); /* EXT_CD レジスタの card inserted removedをクリア */ - SD_AndFPGA(EXT_CD_MASK,(~(EXT_CD_MASK_PORT1INSERT | EXT_CD_MASK_PORT1REMOVE))); /* 挿抜 割り込み許可 */ - } -} -/*---------------------------------------------------------------------------* - Name: SD_DisableInfo - - Description: disable SD card insert and remove interrupts. - SDカードの挿入/抜取 割り込みを禁止する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_DisableInfo( void) -{ - if(SD_port_number == SDCARD_PORT0) - { - SD_AndFPGA(SD_INFO1,(~(SD_INFO1_INSERT | SD_INFO1_REMOVE))); /* SD_INFO1レジスタの card inserted removedをクリア */ - SD_OrFPGA(SD_INFO1_MASK,(SD_INFO1_MASK_INSERT | SD_INFO1_MASK_REMOVE)); /* 挿/抜 割り込み禁止 */ - } - else if(SD_port_number == SDCARD_PORT1) - { /* ポート1はCD端子が繋がっていないので実質無効 */ - SD_AndFPGA(EXT_CD,(~(EXT_CD_PORT1_INSERT | EXT_CD_PORT1_REMOVE))); /* EXT_CD レジスタの card inserted removedをクリア */ - SD_OrFPGA(EXT_CD_MASK,(EXT_CD_MASK_PORT1INSERT | EXT_CD_MASK_PORT1REMOVE)); /* 挿抜 割り込み禁止 */ - } -} - -/*---------------------------------------------------------------------------* - Name: SD_Command - - Description: send command that the card will response only. - コマンドを送出する(レスポンスが返ってくるだけのコマンド用) - - Arguments: ucCommand : command number - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_Command(u16 ucCommand) -{ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_ERR_ALLCLR)); /* SD Card I/F の 全エラーをクリア */ - SD_AndFPGA(SD_INFO1,(~SD_INFO1_RES_END)); /* SD_INFO1レジスタの Response end クリア */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み許可 */ - - SD_SetFPGA(SD_CMD,(ucCommand)); /* コマンド発行 */ - - while(!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_RES_END)){ /* Response end 待ち */ - if(SDCARD_ErrStatus != SDMC_NORMAL) { /* エラーチェック */ - break; - } - } - - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の全エラー割込み禁止 */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_AppCommand - - Description: send apprication command. - アプリケーションコマンド(CMD55)を送出する - - Arguments: None - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_AppCommand(void) -{ - PRINTDEBUG( " CMD55 (APP_CMD)\n"); - - /* argumentをセット */ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits */ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - SD_Command(SD_CMD_CMD | APP_CMD); /* CMD55発行、レスポンス(R1)待ち */ - -#if ADD_CHECK - /*SD_CheckStatusを行うと、直前にCMD8を発行していた場合、SDHC以外はCardStatusの - IllegalCommandエラーフラグが立ってしまうので、ここで引っかかることになる - (このフラグがクリアされるのは1コマンドぶん遅れるため) - SD Physical Layer 仕様書の Card Status参照*/ -// SD_CheckStatus(FALSE); /* コマンドレスポンス(R1) の Card Status チェック */ -#endif - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_AppOpCond - - Description: get operating condition register data of SD card. - SDカードのACMD41を発行してOCRを取得する - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_AppOpCond(void) -{ - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウト以外のエラーをクリア */ - - while( !SDCARD_ErrStatus){ /* エラーが発生しない間は繰り返し */ - /* Argument(31:0) = OCR without busy (0x00100000 = 3.2-3.3V) */ - /*ホスト側で電圧を選択できる場合などは、初回にSD_ARG1を0にすることにより - カードが対応している電圧を問い合わせることができる。CTRは電圧3.3V決め打ち - なので問い合わせせず、いきなり3.3V対応をカードに要求する。対応できない - カードは Inactive Mode に移行する。*/ - SD_SetFPGA(SD_ARG0,(0x0000)); - if( SDCARD_SDHCFlag) { - SD_SetFPGA(SD_ARG1,(0x4010)); - }else{ - SD_SetFPGA(SD_ARG1,(0x0010)); - } - - PRINTDEBUG( " ACMD41 (SD_SEND_OP_COND)\n"); - SD_Command(SD_CMD_ACMD | SD_APP_OP_COND); /* ACMD41発行、レスポンス(R3)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?)*/ - SD_GetFPGA(SD_OCR[0],SD_RSP0); /* レスポンス(R3)からOCR取得 */ - SD_GetFPGA(SD_OCR[1],SD_RSP1); /* レスポンス(R3)からOCR取得 */ - if(SD_RSP1 & RSP_R3_OCR31){ /* OCR(レジスタ)の31bit目チェック(busy?) */ - break; - } - } - SD_AppCommand(); /* 決定済みのRCAを設定しCMD55発行 */ - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendOpCond - - Description: send CMD1 without busy for MMC - MMC の CMD1を発行する(SDのACMD41に位置するコマンド) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendOpCond(void) -{ - PRINTDEBUG( " CMD1 (SEND_OP_COND)\n"); - - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウトエラーをクリア */ - - while( !SDCARD_ErrStatus){ /* エラーが発生しない間は繰り返し */ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) for MMC (None for SD) */ - SD_SetFPGA(SD_ARG1,(0x0010)); /* Argument(31:16) for MMC (None for SD) */ - SD_Command(SD_CMD_CMD | SEND_OP_COND); /* CMD1発行、レスポンス(R1)待ち */ - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_GetFPGA(SD_OCR[0],SD_RSP0); - SD_GetFPGA(SD_OCR[1],SD_RSP1); - if(SD_RSP1 & RSP_R3_OCR31){ /* OCR(レジスタ)の31bit目チェック(busy?) */ - break; - } - } - } - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: SD_SendIfCond - - Description: send CMD8 - CMD8を発行する(Physical Layer 2.00で追加されたコマンド) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendIfCond(void) -{ - PRINTDEBUG( " CMD8 (SEND_IF_COND)\n"); - - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウトエラーをクリア */ - - /* (31:12) Reserved bits, (11:8) supply voltage(VHS), (7:0) check pattern */ - SD_SetFPGA(SD_ARG0,(0x01AA)); /* Argument */ - SD_SetFPGA(SD_ARG1,(0x0000)); /* Argument */ - - SD_Command(SD_CMD_CMD | SEND_IF_COND_EXT); /* CMD8発行、レスポンス(R7)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SDCARD_SDHCFlag = TRUE; /* SDHC */ -// SD_GetFPGA(SD_R7[0],SD_RSP0); -// SD_GetFPGA(SD_R7[1],SD_RSP1); - }else{ - SDCARD_SDHCFlag = FALSE; - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendRelativeAddr - - Description: send relative addr - CMD3を発行し、SDカードの場合はレスポンスのRCAを取得する - (RCAは他のコマンド発行時にArgumentとして必要) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendRelativeAddr(void) -{ - PRINTDEBUG( " CMD3 (SEND_RELATIVE_ADDR)\n"); - - if(SDCARD_MMCFlag){ /* MMCカードフラグ ON ? */ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) */ - SD_SetFPGA(SD_ARG1,(0x0001)); /* Argument(31:16) = 0x0001 (松下drvはなぜか0x0100にしていた) */ - } /* SDカードのときはArgument(31:0) = stuff bits */ - - SD_Command(SD_CMD_CMD | SEND_RELATIVE_ADDR); /* CMD3発行、レスポンス(R6)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - if(SDCARD_MMCFlag){ /* MMCカードフラグ ON ? */ - SD_RCA = 0x0001; /* RCA <- 1 (松下drvはなぜか0x0100にしていた) */ - }else{ - SD_GetFPGA(SD_RCA,SD_RSP1); /* レスポンスレジスタからRCAを取得 */ - } - } - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SelectCard - - Description: toggle card between the stand-by and transfer states. - CMD7を発行してスタンバイモードと転送モードを切り替える - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SelectCard(void) -{ - PRINTDEBUG( " CMD7 (SELECT#/DESELECT_CARD)\n"); - - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits*/ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - SD_Command(SD_CMD_CMD | SELECT_CARD); /* CMD7発行、レスポンス(R1b)待ち */ - -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1) の Card Status チェック */ -#endif - - return SDCARD_ErrStatus; - -} - -/*---------------------------------------------------------------------------* - Name: SD_SetBlockLength - - Description: set of block length. - SDカードのブロックレングスを設定する。 - 注意:multiple read のときに SD_SIZEレジスタに512以外の値を - 設定すると正しく動作しない(IP reg spec資料より)。 - - Arguments: ulBlockLength : bytes of a block ( must be multiplier of 2) - (memo : the default block length is as specified in the CSD.) - 1ブロックの長さ:2の乗数を指定すること - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SetBlockLength(u32 ulBlockLength) -{ - u16 usValue; - - PRINTDEBUG( " CMD16 (SET_BLOCKLEN)\n"); - - /*------- IPの transfer length を設定 -------*/ - if(ulBlockLength == 512){ - SD_SetFPGA(SD_SIZE,(SD_SIZE_DATA_LENGTH_512B)); /* SDカードデータ転送サイズ 512Bytes 設定 */ - }else{ - usValue = (u16)ulBlockLength; /* 16bitに変換 */ - SD_SetFPGA(SD_SIZE,(usValue)); /* IPにSDカードデータ転送サイズを設定 */ - }/*------------------------------------------*/ - - /*------- カードの設定 -------*/ - /* argument(31:0) = block length */ - SD_SetFPGA(SD_ARG0,(((LELONG *)&ulBlockLength)->dt2word.low)); - SD_SetFPGA(SD_ARG1,(((LELONG *)&ulBlockLength)->dt2word.high)); - - SD_Command(SD_CMD_CMD | SET_BLOCKLEN); /* CMD16発行、レスポンス(R1)待ち */ -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1) の Card Status チェック */ -#endif - /*----------------------------*/ - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: SD_SendCID - - Description: get card identification data (128bits). - SDカードのCID値を取得する - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendCID(void) -{ - PRINTDEBUG( " CMD2 (ALL_SEND_CID)\n"); - /* Argument(31:0) = stuff bits */ - SD_Command(SD_CMD_CMD | ALL_SEND_CID); /* CMD2発行、レスポンス(R2)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_GetFPGA(SD_CID[0],SD_RSP0); - SD_GetFPGA(SD_CID[1],SD_RSP1); - SD_GetFPGA(SD_CID[2],SD_RSP2); - SD_GetFPGA(SD_CID[3],SD_RSP3); - SD_GetFPGA(SD_CID[4],SD_RSP4); - SD_GetFPGA(SD_CID[5],SD_RSP5); - SD_GetFPGA(SD_CID[6],SD_RSP6); - SD_GetFPGA(SD_CID[7],SD_RSP7); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendCSD - - Description: get card specific data - SDカードのCSD値を取得する - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendCSD(void) -{ - PRINTDEBUG( " CMD9 (SEND_CSD)\n"); - - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits */ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - SD_Command(SD_CMD_CMD | SEND_CSD); /* CMD9発行、レスポンス(R2)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_GetFPGA(SD_CSD[0],SD_RSP0); - SD_GetFPGA(SD_CSD[1],SD_RSP1); - SD_GetFPGA(SD_CSD[2],SD_RSP2); - SD_GetFPGA(SD_CSD[3],SD_RSP3); - SD_GetFPGA(SD_CSD[4],SD_RSP4); - SD_GetFPGA(SD_CSD[5],SD_RSP5); - SD_GetFPGA(SD_CSD[6],SD_RSP6); - SD_GetFPGA(SD_CSD[7],SD_RSP7); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendStatus - - Description: send status read command (compatible to the MMC protocol). - マルチメディアカード互換方式でのstatus取得コマンド発行 - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendStatus(void) -{ - PRINTDEBUG( " CMD13 (Send STATUS)\n"); - - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits */ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - /* カード排出の重複を防ぐため */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_ERR_ALLCLR)); /* SD Card I/F の 全てのエラーをクリア */ - SD_AndFPGA(SD_INFO1,(~SD_INFO1_RES_END)); /* SD_INFO1レジスタの Response end クリア */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み許可 */ - - SD_SetFPGA(SD_CMD,(SD_CMD_CMD | SD_SEND_STATUS)); /* CMD13発行 */ - - while(!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_RES_END)){ /* Response end (R1)待ち */ - if(SDCARD_ErrStatus != SDMC_NORMAL) { - break; - } - } - - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み禁止 */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendSCR - - Description: get condition data. - SDカード内のSCRレジスタ値取得コマンド発行。この後カードは - DATライン経由で1ブロック(8Bytesに設定しておくこと)送信してくる。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendSCR(void) -{ - PRINTDEBUG( " ACMD51 (Send SCR)\n"); - /* Argument(31:0) = stuff bits */ -#if ADD_CHECK - SD_TransReadyFPGA(); /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/ - - SD_TransCommand((SD_CMD_ACMD | SEND_SCR)); /* SCR取得コマンド発行、レスポンス(R1)待ち */ -#endif - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SDStatus - - Description: send status read command (for SD card only). - SDカード専用方式でのstatus取得コマンド発行。この後カードは - DATライン経由で1ブロック(64Bytesに設定しておくこと)送信してくる。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SDStatus(void) -{ - PRINTDEBUG( " ACMD13 (SD_SD STATUS)\n"); - /* Argument(31:0) = stuff bits */ - SD_TransReadyFPGA(); /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/ - - SD_TransCommand((SD_CMD_ACMD | SD_STATUS)); /* ACMD13 Send the SD_CARD status コマンド発行、レスポンス(R1)待ち */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_MultiReadBlock - - Description: send multiple block read command. - マルチブロックリードコマンド発行。この後カードは - DATライン経由でデータを送信してくる。 - - Arguments: ulOffset : offset address to read(BYTE). - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_MultiReadBlock(u32 ulOffset) -{ - PRINTDEBUG( " CMD18 (READ_MULTIPLE_BLOCK)\n"); - - SD_TransReadyFPGA(); /* INFOレジスタ初期化 */ - if( !SDCARD_UseFifoFlag) { /* FIFOを使わないとき */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/ - } - - /* 読み込み開始アドレス(オフセット)設定 */ - SD_SetFPGA(SD_ARG0,(((LELONG *)&ulOffset)->dt2word.low)); - SD_SetFPGA(SD_ARG1,(((LELONG *)&ulOffset)->dt2word.high)); - - SD_TransCommand((READ_MULTIPLE_BLOCK)); /* CMD18(マルチセクタリードコマンド)発行、レスポンス(R1)待ち */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_ClockDivSet - - Description: set clock speed into the SD card. - (notice : clock into IP is 33.51MHz.) - (memo : default clock is 262KHz.) - SDカードへのクロック速度を設定する。CTRからIMCLK端子でIPに供給 - される基本クロックは33.51MHz。 - 起動直後のデフォルトでは128分周(262KHz)が設定されている。 - - Arguments: CSD responce include "TRAN_SPEED". - 予めCSDをSDカードから読み出しておいた、TRAN_SPEEDが入っている - 部分のCSD(CSD[5])。SDカード側で対応可能な周波数を参照するため。 - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 SD_ClockDivSet(u16 usTranSpeed) -{ - u16 usTranTime; - - //CTRでは、IMCLKに入力されるクロックは 33.51Mhz - //SD_CLK_CTRL の default値は 0x0020( 128分周 = 262kHz) - /*------*/ - usTranTime = (u16)((usTranSpeed >> 11) & 0x000F); /* CSD[103:96] の time value(=4bit) 取得 */ - - usTranSpeed &= CSD_TRANSFER_RATE; /* CSD[103:96] の transfer rate unit を取得 */ - usTranSpeed = (u16)(usTranSpeed >> 8); /* transfer rate unit を下位8ビットに設定する */ - /*------*/ - - - switch( usTranSpeed) { - /*--- 100kbit/s(one dat line) = 100KHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_100K: - if(usTranTime > 0x000C){ /* time value が 5.5 より大きい? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_64)); /* 523KHz */ - } - else{ - if(usTranTime > 0x0006){ /* time value が 2.5 より大きい? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_128)); /* 262KHz */ - }else{ - if( usTranTime == 1) { /* time value が 1.0 ? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_512)); /* 65KHz */ - }else{ /* time value が 1.2〜2.5 のとき */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_256)); /* 131KHz */ - } - } - } - break; - /*--- 1Mbit/s(one dat line) = 1MHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_1M: - if(usTranTime == 0x0001){ /* time value が 1.0 ? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_64)); /* 523KHz */ - } - else{ - if(usTranTime <= 0x0005){ /* time value が 2.0 以下? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_32)); /* 1.05MHz */ - } - else{ - if(usTranTime <= 0x0009){ /* time value が 4.0 以下? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_16)); /* 2.095MHz */ - }else{ /* time value が 4.5 以上のとき */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_8)); /* 4.18MHz */ - } - } - } - break; - /*--- 10Mbit/s(one dat line) = 10MHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_10M: - if(usTranTime > 0x0004){ /* time value が 1.5 より大きい? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_2)); /* 16.76MHz */ - }else{ /* time value が 1.5 以下のとき */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_4)); /* 8.38MHz */ - } - break; - /*--- 100Mbit/s(one dat line) = 100MHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_100M: /* time value がどんな値であっても */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_2)); /* 16.76MHz */ - break; - default: - if( usTranSpeed != 7) { /* reserved値(=7)以外か? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_2)); /* 16.76MHz */ - } /* (松下drvでは、4以上なら288KHzにしている) */ - break; /* transfer rate unit が 7 のときは何もしない */ - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_EnableClock - - Description: enable clock - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_EnableClock( void) -{ - SD_OrFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_SDCLKEN)); -} - -/*---------------------------------------------------------------------------* - Name: SD_DisableClock - - Description: disable clock (for power save). - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_DisableClock( void) -{ - SD_AndFPGA(SD_CLK_CTRL,(~SD_CLK_CTRL_SDCLKEN)); -} - - -/*---------------------------------------------------------------------------* - Name: SD_SelectBitWidth - - Description: set bus width for SD Card ( Not for MMC Card). - (The allowed data bus widths are given in SCR register.) - SDカードのDATラインバス幅を1bitまたは4bitに設定する。 - SDカードが4bitに対応していないか、MMCカードの場合はバス幅を4bitに - 設定することはできない。SDカードの許容するバス幅は、予め取得済みの - SCRレジスタによって参照している。 - - Arguments: b4bit : TRUE = 4bit, FALSE = 1bit - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 SD_SelectBitWidth(s16 b4bit) -{ - /*--- カードの仕様(SCR)を参照 ---*/ -#if ADD_CHECK - if( b4bit){ /* SCRレジスタがリード済であること! */ - if( !(SD_SCR[0] & SCR_DAT_BUS_WIDTH_4BIT)) { /* カードが4bit幅に対応していないか? */ - b4bit = FALSE; /* 対応していない場合は1bit幅を指定しておく */ - } - }/*------------------------------*/ -#endif - /*--- 4bit(TRUE) 指定のとき ---*/ - if(b4bit){ - if(!SDCARD_MMCFlag){ /* MMCカードフラグ OFF?(ONなら何もしない) */ - if(SD_AppCommand()){ /* RCA設定後 CMD55発行 */ - return SDCARD_ErrStatus; /* CMD55が正常終了しなかったらエラー終了 */ - } - SD_SetFPGA(SD_ARG0,(0x0002)); /* Argument(1:0) = (10) to 4bit,(00) to 1bit */ - SD_SetFPGA(SD_ARG1,(0x0000)); /* Argument(31:2) = stuff bits */ - PRINTDEBUG( " ACMD6 (SET_BUS_WIDTH:4bit)\n"); - SD_Command(SD_CMD_ACMD | SET_BUS_WIDTH); /* ACMD6(ビット幅選択コマンド)発行、レスポンス(R1)待ち */ -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ -#endif - if(!SDCARD_ErrStatus){ /* エラーなし? */ - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - } - } - }/*--- 1bit(FALSE) 指定のとき ---*/ - else{ - if(!SDCARD_MMCFlag){ /* MMCカードフラグ OFF?(ONなら何もしない) */ - if(SD_AppCommand()){ /* RCA設定後 CMD55発行処理 */ - return SDCARD_ErrStatus; /* CMD55が正常終了しなかったらエラー終了 */ - } - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(1:0) = bus width : 1bit */ - SD_SetFPGA(SD_ARG1,(0x0000)); /* Argument(31:2) = stuff bits */ - PRINTDEBUG( " ACMD6 (SET_BUS_WIDTH:1bit)\n"); - SD_Command(SD_CMD_ACMD | SET_BUS_WIDTH); /* ACMD6(ビット幅選択コマンド)発行、レスポンス(R1)待ち */ -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ -#endif - } - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_OrFPGA(SD_OPTION,(SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(1bit幅) */ - } - }/*------------------------------*/ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: MMCP_WriteBusWidth - - Description: set bus width for SD Card ( Not for MMC Card). - (The allowed data bus widths are given in SCR register.) - MMCplusカードのDATラインバス幅を1bitまたは4bitに設定する。 - SDまたはMMCカードの場合はバス幅を4bitに設定することはできない。 - - Arguments: b4bit : TRUE = 4bit, FALSE = 1bit - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 MMCP_WriteBusWidth(s16 b4bit) -{ - if( !SDCARD_MMCFlag) { - return 1; - } - - /* 書き込み開始オフセット設定 */ - if( b4bit) { - SD_SetFPGA(SD_ARG0,(0x0100)); /* Argument(15:8)=(0x1) to 4bit,(0x0) to 1bit */ - }else{ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:8)=(0x1) to 4bit,(0x0) to 1bit */ - } - SD_SetFPGA(SD_ARG1,(0x03B7)); /* Argument(25:24)=(0x3)Write, (23:16)=(183)Index */ - - /* CMD6(ビット幅選択コマンド)発行、レスポンス(R1)待ち */ - SD_Command(SD_CMD_CMD | EXT_CSD_ACCESS); - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: MMCP_BusTest - - Description: バスのテストを行う。 - この後カードにDATライン経由でデータを送信する必要がある。 - - Arguments: readflag : リード時TRUE, ライト時FALSE - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 MMCP_BusTest( BOOL readflag) -{ - /**/ - SD_TransReadyFPGA(); /* INFOレジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */ - - /**/ - SD_SetFPGA( SD_ARG0, 0); - SD_SetFPGA( SD_ARG1, 0); - - if( readflag) { - SD_TransCommand( 14); - }else{ - SD_TransCommand( 19); - } - - return( SDCARD_ErrStatus); -} - - -/*---------------------------------------------------------------------------* - Name: SD_FPGA_irq - - Description: handler of data transfer request interrupt from card, - check and clear interrupt register of IP. - カードからの転送要求(BREまたはBWE)割り込み発生時に - どちらかを調べて返し、INFO2の当該割り込み要求フラグをクリアする。 - - Arguments: None - - Returns: TRUE : BRE割り込み発生 - FALSE : BWE割り込み発生 - *---------------------------------------------------------------------------*/ -BOOL SD_FPGA_irq(void) -{ - /*--- FIFOを使うとき ---*/ - if( SDCARD_UseFifoFlag) { - if( SD_CheckFPGAReg( *SDIF_CNT_L, (u16)SDIF_CNT_FFIE)) { /* FULL割り込み許可のとき */ - return TRUE; - }else{ - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求あり? */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable リセット*/ - } - return FALSE; - } - }else{ /*--- FIFOを使わないとき ---*/ - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BRE)){ /* SDカードからのデータ読出し要求あり? */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BRE)); /* SD用バッファ制御 Read Enable リセット*/ - return TRUE; - } - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求あり? */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable リセット*/ - return FALSE; - } - } - return FALSE; -} - -/*---------------------------------------------------------------------------* - Name: SD_StopTransmission - - Description: manual send CMD12 to terminate translate. - 手動でCMD12を発行し、転送終了をFPGAに通知する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_StopTransmission(void) -{ - SD_OrFPGA(SD_STOP,(SD_STOP_STP)); /* データ転送終了設定 */ -} - -/*---------------------------------------------------------------------------* - Name: SD_TransEndFPGA - - Description: clear the transfer interrupt. - カード転送終了時に転送関連の割り込みを禁止に戻しておく - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_TransEndFPGA(void) -{ - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み禁止 */ - SD_OrFPGA(SD_INFO1_MASK,(SD_INFO1_MASK_ALL_END)); /* R/W アクセス終了割込み禁止 */ - - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BRE)){ /* SDカードからのデータ読込み要求割込み許可か? */ - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_BRE)); /* SDカードからのデータ読込み要求割込み禁止 */ - } - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求割込み許可か? */ - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み禁止 */ - } -} - -/*---------------------------------------------------------------------------* - Name: SD_CheckStatus - - Description: check the card status in the R1. - R1レスポンスのカードステータスをチェックする - - Arguments: bRead : 読み込み処理時 = TRUE - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_CheckStatus(BOOL bRead) -{ - /* コマンドレスポンス(R1)の[39:8] から Card status を取得 */ - SD_GetFPGA((((LELONG *)&SDCARD_Status)->dt2word.low),SD_RSP0); - SD_GetFPGA((((LELONG *)&SDCARD_Status)->dt2word.high),SD_RSP1); - - /*--- 松下サンプルドライバでやっている処理 ---*/ - if(bRead){ /* リード時か? */ - if(!(SDCARD_ErrStatus & SDMC_ERR_TIMEOUT)){ /* タイムアウト発生していないか? */ - SDCARD_Status &= ~SDCARD_STATUS_OUT_OF_RANGE; /* OUT_OF_RANGEフラグを落とす */ - } - }/*-------------------------------------------*/ - - PRINTDEBUG( " SD_CheckStatus ======== 0x%x\n", SDCARD_Status); - - if(SDCARD_Status & RSP_R1_STATUS_ERR){ /* コマンドレスポンス(R1)のカードステータスがエラーか確認 */ - SD_SetErr(SDMC_ERR_R1_STATUS); /* コマンドレスポンス(R1)のカードステータス エラー */ - } - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SwapByte - - Description: swap bytes in a 16bit data. - 16bitデータの上位と下位を入れ換える - - Arguments: data : 16bit data - - Returns: swapped data - *---------------------------------------------------------------------------*/ -u16 SD_SwapByte(u16 *data) -{ - u16 usDATA; - - usDATA = *data; - usDATA = (u16)(((usDATA & 0x00FF) << 8) | ((usDATA & 0xFF00) >> 8)); - - return usDATA; -} - -/*---------------------------------------------------------------------------* - Name: SD_EnableSeccnt - - Description: enable SD_SECCNT register. - SD_SECCNT を有効化して値をセットする。 - - Arguments: ulSDCARD_SectorCount : セクタカウント値(1セクタ=512byte) - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_EnableSeccnt( u32 ulSDCARD_SectorCount) -{ - u16 usSector; - - usSector = (u16)ulSDCARD_SectorCount; - SD_OrFPGA(SD_STOP,SD_STOP_SEC_ENABLE); /* SD_SECCNTレジスタを有効にする */ - SD_SetFPGA(SD_SECCNT,usSector); /* SD_SECCNTレジスタに転送セクタカウントを設定 */ -} - -/*---------------------------------------------------------------------------* - Name: SD_DisableSeccnt<現在は未使用関数> - - Description: disable SD_SECCNT register. - SD_SECCNT を無効化する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_DisableSeccnt( void) -{ - u16 i; - - /*--- 松下ドライバでやっていること ---*/ - for ( i=0; i<50000; i++) /* カウント値50000では足りないことあり */ - { /* SD_INFO1レジスタの R/W access all end 待ち */ - if(SD_CheckFPGAReg(SD_INFO1,SD_INFO1_ALL_END)) { - break; - } - }/*-----------------------------------*/ - SD_AndFPGA(SD_STOP,(~SD_STOP_SEC_ENABLE)); /* SD_SECCNTレジスタを無効にする */ -} - -/*---------------------------------------------------------------------------* - Name: SD_SetErr - - Description: set error flag - 指定のエラーフラグをセットする - - Arguments: Error : error flag to set - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_SetErr(u16 Error) -{ - OSIntrMode irq_core_flag; - -#if (TARGET_OS_CTR == 1) - irq_core_flag = osDisableInterrupts(); /* 割込み禁止 */ - SDCARD_ErrStatus |= Error; /* エラーステータスを設定 */ - osRestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#else - irq_core_flag = OS_DisableInterrupts(); - SDCARD_ErrStatus |= Error; /* エラーステータスを設定 */ - OS_RestoreInterrupts( irq_core_flag); -#endif -} - -/*---------------------------------------------------------------------------* - Name: SD_ClrErr - - Description: clear error flag - 指定のエラーフラグをクリアする - - Arguments: Error : error flag to clear - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_ClrErr(u16 Error) -{ - OSIntrMode irq_core_flag; - -#if (TARGET_OS_CTR == 1) - irq_core_flag = osDisableInterrupts(); /* 割込み禁止 */ - SDCARD_ErrStatus &= ~(Error); /* エラーステータスをクリア */ - osRestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#else - irq_core_flag = OS_DisableInterrupts(); /* 割込み禁止 */ - SDCARD_ErrStatus &= ~(Error); /* エラーステータスをクリア */ - OS_RestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#endif -} - - -/*---------------------------------------------------------------------------* - Name: SD_TransReadyFPGA - - Description: setup for the command that the card will response and request data transfer. - DATラインでのデータ転送が発生するコマンド発行前の転送準備 - (BRE, BWE割り込みの許可は別途行うこと) - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_TransReadyFPGA(void) -{ - /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_ERR_ALLCLR)); /* SD Card I/F の 全てのエラーをクリア */ - SD_AndFPGA(SD_INFO1,(~(SD_INFO1_RES_END | SD_INFO1_ALL_END))); /* SD_INFO1レジスタの Response end と access all end クリア */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BRE)); /* SD用バッファ制御 Read Enable クリア*/ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable クリア*/ - SD_AndFPGA(SD_STOP,(~SD_STOP_STP)); /* データ転送終了クリア */ - - /* 割り込み関連許可 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み許可 */ - SD_AndFPGA(SD_INFO1_MASK,(~SD_INFO1_MASK_ALL_END)); /* R/W access all end 割込み許可(Responseはポーリングで見るため許可しない) */ -} - - -/*---------------------------------------------------------------------------* - Name: SD_TransCommand - - Description: send command that the card will response and request data transfer. - コマンドを送出する(DATラインでのデータ転送が発生するコマンド用) - - Arguments: ucCommand : command number - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_TransCommand(u16 ucCommand) -{ - SD_SetFPGA(SD_CMD,(ucCommand)); /* コマンド発行 */ - - while(!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_RES_END)){ /* Response end 待ち */ - if(SDCARD_ErrStatus != SDMC_NORMAL) { - break; - } - } - SD_CheckStatus(FALSE); /* R1レスポンスのcard statusチェック*/ - - if(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS){ - SD_StopTransmission(); /* カード転送終了をFPGAに通知 */ - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_CheckFPGAReg - - Description: check register bits. - レジスタの状態をチェックする - - Arguments: reg : 16bit register data - value : mask data - - Returns: TRUE : some of mask data bits are 1 on the register. - FALSE : no mask data bits is 1 on the register. - *---------------------------------------------------------------------------*/ -BOOL SD_CheckFPGAReg(u16 reg,u16 value) -{ - if( reg & value) { - return TRUE; - }else{ - return FALSE; - } -} - -/*---------------------------------------------------------------------------* - Name: SD_SendNumWRSectors - - Description: send "number of well written blocks" command (for SD card only). - SDカード専用方式でのライト済みセクタ数取得コマンド発行。この後カードは - DATライン経由で1ブロック(4Bytesに設定しておくこと)送信してくる。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendNumWRSectors(void) -{ - PRINTDEBUG( " ACMD22 (SEND_NUM_WR_SECTORS)\n"); - /* Argument(31:0) = stuff bits */ - SD_TransReadyFPGA(); /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読込み要求割込み許可 */ - - SD_TransCommand((SD_CMD_ACMD | SEND_NUM_WR_SECTORS)); /* ACMD22(書きこみ完了セクタ数取得コマンド)発行、レスポンス(R1)待ち */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_MultiWriteBlock - - Description: send multiple block write command. - マルチブロックライトコマンド発行。この後カードに - DATライン経由でデータを送信する必要がある。 - - Arguments: ulOffset : offset address to write(BYTE). - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_MultiWriteBlock(u32 ulOffset) -{ - PRINTDEBUG( " CMD25 (WRITE_MULTIPLE_BLOCK)\n"); - - SD_TransReadyFPGA(); /* INFOレジスタ初期化 */ -// if( !SDCARD_UseFifoFlag) { /* FIFOを使わないとき */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */ -// } - - /* 書き込み開始オフセット設定 */ - SD_SetFPGA(SD_ARG0,(((LELONG *)&ulOffset)->dt2word.low)); - SD_SetFPGA(SD_ARG1,(((LELONG *)&ulOffset)->dt2word.high)); - - SD_TransCommand(WRITE_MULTIPLE_BLOCK); /* CMD25(マルチセクタライトコマンド)発行 */ - - return SDCARD_ErrStatus; -} - - diff --git a/build/libraries/fatfs/ARM7/firm_sdmc/sdmc.c b/build/libraries/fatfs/ARM7/firm_sdmc/sdmc.c deleted file mode 100644 index a5f0d897..00000000 --- a/build/libraries/fatfs/ARM7/firm_sdmc/sdmc.c +++ /dev/null @@ -1,2683 +0,0 @@ -/* - Project: CTR SD port driver - File: sdmc.c - - 2006-2007, Research and Development Department, Nintendo. -*/ - -#include -#include - -/*#if (SD_DEBUG_PRINT_ON == 1) - #if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - #define PRINTDEBUG osTPrintf - #else - #include - #define PRINTDEBUG vlink_dos_printf - #endif -#else - #define PRINTDEBUG( ...) ((void)0) -#endif*/ - -// #define PRINTDEBUG OS_TPrintf - #define PRINTDEBUG( ...) ((void)0) - - -/*********************************************************************** - 定数 -***********************************************************************/ -#define SD_STACK_SIZE (4096*2) -#define SD_THREAD_PRIO (10) -#define SD_INTR_THREAD_PRIO (SD_THREAD_PRIO - 1) - -#define SD_OPERATION_INIT (0) -#define SD_OPERATION_READ (1) -#define SD_OPERATION_READ_WITH_FIFO (2) -#define SD_OPERATION_WRITE (3) -#define SD_OPERATION_WRITE_WITH_FIFO (4) - -/* -TODO: -SD_INTR_THREAD_PRIOを高くしてSleepをなくせば動く。 -Sleepを使うには、Wakeupの前にSleepさせるためSD_INTR_THREAD_PRIOを低く -する必要があるが、Sleepの前にSD割り込みが入らなかった場合なぜかずっと -割り込みが入らなくなり動かなくなる。Sleepの前に割り込みが入れば動く。 -*/ - - -/*********************************************************************** - extern変数 -***********************************************************************/ -extern u16 BgBak[32*32]; -//u16 sdcard_request_flag; //カードからのデータ転送要求の有無フラグ -static BOOL thread_flag; - - -/*********************************************************************** - global変数 -***********************************************************************/ -BOOL sdmc_tsk_created = FALSE; -#if (TARGET_OS_CTR == 1) -ER_ID sdmc_tsk_id; //SDタスクID -ER_ID sdmc_dtq_id; -ER_ID sdmc_result_dtq_id; -ER_ID sdmc_alm_id; -ER_ID sdmc_intr_tsk_id; -#else -OSThread sdmc_tsk; -OSMessageQueue sdmc_dtq; -OSMessage sdmc_dtq_array[1]; -OSMessageQueue sdmc_result_dtq; -OSMessage sdmc_result_dtq_array[1]; -OSAlarm sdmc_alm; -OSThread sdmc_intr_tsk; -#endif - -u16 sdmc_wakeup_count = 0; //OS_WakeupThreadのキューイング代わり -u16 sdmc_intr_wakeup_count = 0; - -#if (TARGET_OS_CTR == 1) -#else -u64 sd_stack[SD_STACK_SIZE / sizeof(u64)]; -u64 sd_intr_stack[SD_STACK_SIZE / sizeof(u64)]; -#endif - -/* drsdmc.cでも参照 */ -SdmcSpec sdmc_current_spec; //TODO:ポート切り替え時、Port0とPort1に保存するように - -typedef struct { //OSMessage - void* buf; - u32 bufsize; - u32 offset; - void (*func)(void); - SdmcResultInfo* info; - u32 operation; - void (*func2)(void); -} SDCARDMsg; - - -/*********************************************************************** - static関数の宣言 -***********************************************************************/ -void i_sdmcCalcSize( void); -static void SDCARD_Backup_port0(void); -void SDCARD_Backup_port1(void); -static void SDCARD_Restore_port0(void); -void SDCARD_Restore_port1(void); - -static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info); - -static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info); - -int MMCP_SetBusWidth( BOOL b4bit); /* ビット幅の選択(MMCplus, eMMC, moviNAND) */ - -static void SDCARD_Thread( void* arg); //SDスレッド -static void SDCARD_Intr_Thread( void* arg); //SD割り込み処理スレッド - -SDMC_ERR_CODE sdmcGoIdle( void (*func1)(),void (*func2)()); -static SDMC_ERR_CODE i_sdmcInit( void); -SDMC_ERR_CODE SDCARD_Layer_Init(void); -static SDMC_ERR_CODE i_sdmcMPInit( void); /* カードドライバ初期化(マルチポート対応) */ - -static u16 i_sdmcErrProcess(void); /* エラー時の処理 */ -static u16 i_sdmcGetResid(u32 *pResid); /* 書きこみ完了セクタ数の取得 */ -static u16 i_sdmcCheckWP(void); /* SDCARD ライトプロテクトチェック */ - -static void i_sdmcEnable( void); /* SD使用のためのOS準備 */ -static void i_sdmcDisable( void); - -static u16 i_sdmcSendSCR(void); /* SCRの読み出し */ -static u16 SDCARD_SD_Status(void); /* SD_STATUSの取得 */ -static u32 SDCARD_GetR1Status(void); /* Normal response command カードステータスを取得 */ - -static void SDCARD_Dmy_Handler( void); /* 何もしない */ -static void SDCARD_Timer_irq(void* arg); /* タイムアウト割り込みハンドラ */ -static void SDCARD_irq_Handler( void); /* SD-IPからの割り込みハンドラ */ -static void SDCARD_FPGA_irq(void); /* カードリードライト割り込み処理 */ -static void SDCARD_ATC0_irq(void); /* ATC0転送完了割り込み処理 */ -static void SYSFPGA_irq(void); /* SYSFPGAエラー割り込み処理 */ - -/*ポート1は無線固定なのでポート選択関数は公開しない*/ -static u16 i_sdmcSelectedNo(void); /* カードポートの選択 */ -static u16 i_sdmcSelect(u16 select); /* 現在のカードポート番号のチェック */ - - - - -/*********************************************************************** - 外部参照変数 -***********************************************************************/ -static void SDCARD_TimerStart(u32 tim); /* タイムアウト計測スタート */ -void SDCARD_TimerStop(void); /* タイムアウト計測停止 */ - -extern u16 SD_CID[8]; /* CID値保存用 */ -extern u16 SD_CSD[8]; /* CSD値保存用 */ -extern u16 SD_OCR[2]; /* OCR値保存用 */ -extern u16 SD_SCR[4]; /* SCR値保存用 */ -extern u16 SD_RCA; /* RCA値保存用 */ - -extern s16 SDCARD_MMCFlag; /* MMCカードフラグ */ -extern s16 SDCARD_SDHCFlag; /* SDHCカードフラグ */ -extern u16 SD_port_number; /* 現在ポート番号 */ - -//static BOOL init_io_exist; /* SDIO存在フラグ */ -//static BOOL init_mem_exist; /* メモリ存在フラグ */ - - -/*********************************************************************** - グローバル -***********************************************************************/ -u16 SD_SDSTATUS[32]; /* SD_STATUSレジスタ保存用 */ -u16 SDCARD_WP_FLAG0; /* カードライトプロテクトフラグ。0=なし、1=有り */ -u16 SDCARD_WP_FLAG1; /* カードライトプロテクトフラグ。0=なし、1=有り */ -u16 SDCARD_WP_PERMANENT; /* カードライトプロテクト永久フラグ。0=なし、1=有り */ -u16 SDCARD_WP_TEMPORARY; /* カードライトプロテクト一時フラグ。0=なし、1=有り */ - -u16* pSDCARD_BufferAddr; /* 保存用データ格納バッファアドレス */ - -u32 ulSDCARD_SectorCount; /* 転送セクタ数 */ -u32 ulSDCARD_RestSectorCount; /* 残り転送セクタ数 */ -u32 SDCARD_SectorSize; /* セクタサイズ デフォルト 512bytes */ - -u16 SD_INFO1_VALUE; /* SD_INFO1レジスタ取得用変数 */ -u16 SD_INFO1_MASK_VALUE; /* SD_INFO1割込みマスク用変数(0で許可, 1で禁止) */ -u16 SD_INFO2_VALUE; /* SD_INFO2レジスタ取得用変数 */ -u16 SD_INFO2_MASK_VALUE; /* SD_INFO2割り込みマスク用変数(0で許可, 1で禁止) */ -u16 SD_INFO_ERROR_VALUE; /* SD_INFO2, SD_INFO1のエラービット確認用変数 */ - -u16 SD_port_en_numbers; /* サポートするポート数 */ - - - -/*ポート状態保存*/ -SDPortContext SDPort0Context; -SDPortContext SDPort1Context; -//SDPortContext *SDPortCurrentContext = &SDPort0Context; /*TODO*/ - - - -u16 TransCount; /* R/W転送カウント変数 */ - -u32 ulSDCARD_Size; /* カード全セクタ数 */ - -volatile s16 SDCARD_ATC0_Flag; /* 全ATC完了フラグ */ -volatile s16 SDCARD_FPGA_Flag; /* FPGA処理完了フラグ */ -volatile s16 SDCARD_EndFlag; /* 転送処理完了フラグ */ - -SDMC_ERR_CODE SDCARD_ErrStatus; /* エラーステータス */ -vu32 SDCARD_Status; /* カードステータス */ -s16 SDCARD_SDFlag; /* SDカードフラグ */ - -volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ -SdmcResultInfo *pSDCARD_info; /* 保存用実行結果構造体ポインタ */ - -u16 SDCARD_IO_Port; /* カード挿入/排出割り込み発生時のポート番号 */ - -void (*func_SDCARD_In)(void); /* カード挿入イベント用コールバック保存用 */ -void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */ -/* void (*func_SDCARD_CallBack)(SdmcResultInfo *info); 処理結果通知用コールバック保存用 */ - - - -extern SDMC_ERR_CODE i_sdmcMPInitFirm( void); - - -/*---------------------------------------------------------------------------* - Name: SDCARD_Backup_port0 - - Description: backup registers and variables of port0. - ポート0のレジスタや変数をバックアップする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Backup_port0(void) -{ - /* registers */ - SD_GetFPGA(SDPort0Context.SD_CLK_CTRL_VALUE,SD_CLK_CTRL); - SD_GetFPGA(SDPort0Context.SD_OPTION_VALUE, SD_OPTION); - - /* variables */ - SDPort0Context.SD_RCA = SD_RCA; - SDPort0Context.ErrStatus = SDCARD_ErrStatus; - SDPort0Context.Status = SDCARD_Status; - SDPort0Context.MMCFlag = SDCARD_MMCFlag; - SDPort0Context.SDHCFlag = SDCARD_SDHCFlag; - SDPort0Context.SDFlag = SDCARD_SDFlag; - - SDPort0Context.OutFlag = SDCARD_OutFlag; - - /*media registers*/ - MI_CpuCopy8( SD_CID, SDPort0Context.SD_CID, 16); - MI_CpuCopy8( SD_CSD, SDPort0Context.SD_CSD, 16); - MI_CpuCopy8( SD_OCR, SDPort0Context.SD_OCR, 4); - MI_CpuCopy8( SD_SCR, SDPort0Context.SD_SCR, 8); -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Backup_port1 - - Description: backup registers and variables of port1. - ポート1のレジスタや変数をバックアップする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_Backup_port1(void) -{ - /* registers */ - SD_GetFPGA(SDPort1Context.SD_CLK_CTRL_VALUE,SD_CLK_CTRL); - SD_GetFPGA(SDPort1Context.SD_OPTION_VALUE, SD_OPTION); - - /* variables */ - SDPort1Context.SD_RCA = SD_RCA; - SDPort1Context.ErrStatus = SDCARD_ErrStatus; - SDPort1Context.Status = SDCARD_Status; - SDPort1Context.MMCFlag = SDCARD_MMCFlag; - SDPort1Context.SDHCFlag = SDCARD_SDHCFlag; - SDPort1Context.SDFlag = SDCARD_SDFlag; - - SDPort1Context.OutFlag = SDCARD_OutFlag; - - /*media registers*/ - MI_CpuCopy8( SD_CID, SDPort1Context.SD_CID, 16); - MI_CpuCopy8( SD_CSD, SDPort1Context.SD_CSD, 16); - MI_CpuCopy8( SD_OCR, SDPort1Context.SD_OCR, 4); - MI_CpuCopy8( SD_SCR, SDPort1Context.SD_SCR, 8); -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcEnable - - Description: assign OS resouce for using SD memory card. - SDカードを使うための準備をする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void i_sdmcEnable( void) -{ -#if (TARGET_OS_CTR == 1) - /*SD interrupt setting*/ -// osInitIntrFlag(); -// osClearInterruptPendingID( OS_INTR_ID_SD); -// *(vu32*)CTR_INT_IF = CTR_IE_SD_MASK; - osSetInterruptHandler( OS_INTR_ID_SD, SDCARD_irq_Handler); - osEnableInterruptID( OS_INTR_ID_SD); -// *(vu32*)CTR_INT_SE = CTR_IE_SD_MASK; //割り込み(IRQ)発生許可 -// *(vu32*)CTR_INT_IE = CTR_IE_SD_MASK; -// osEnableInterrupts(); -// *(vu16*)0x04000208 = 1; -#else - /*SD割り込みのIF解除*/ -// *SDIF_CNT_L = (SDIF_CNT_FCLR | SDIF_CNT_USEFIFO); //ラッパーレジスタ(sdmcReset呼ぶならいらない) -// SD_AndFPGA( SD_OPTION, SD_CD_DETECT_TIME); /* CD 検出タイムをゼロクリア(sdmcReset呼ぶならいらない) */ - - *(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; - OS_SetIrqFunction( OS_IE_SD1, SDCARD_irq_Handler); - OS_EnableIrqMask( OS_IE_SD1); -#endif -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcDisable - - Description: under construction - 工事中 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void i_sdmcDisable( void) -{ -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_irq_Handler - - Description: SD interrupt handler - SD割り込みハンドラ - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_irq_Handler( void) -{ -#if (TARGET_OS_CTR == 1) - iwup_tsk( sdmc_intr_tsk_id); -#else - PRINTDEBUG( "SD irq!\n"); -// OS_DumpThreadList(); - OS_SetIrqCheckFlag( OS_IE_SD1); -// sdmc_intr_wakeup_count++; -// OS_WakeupThreadDirect( &sdmc_intr_tsk); -#endif -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Dmy_Handler - - Description: dmy handler for timer interrupt. - タイマー割り込み用ダミーハンドラ - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Dmy_Handler( void) -{ -} - -/*---------------------------------------------------------------------------* - Name: sdmcInit - - Description: Initialize SD interface and SD card. - 初期化 - - Arguments: dma_no : DMA番号 - func1 : カード挿入時コールバック関数 - func2 : カード排出時コールバック関数 - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)()) -{ -#if (TARGET_OS_CTR == 1) - T_CALM calm; - T_CTSK ctsk; - T_CDTQ cdtq; -#endif -// SDCARDMsg SdMsg; -// u32 init_msg; - SDMC_ERR_CODE api_result; - - if( sdmc_tsk_created == FALSE) { - /*---------- OS準備 ----------*/ - /* アラームハンドラ登録 */ -#if (TARGET_OS_CTR == 1) - calm.almatr = TA_HLNG; // set attribution : for high level language - calm.exinf = 0; // set argument for alarm handler - calm.almhdr = SDCARD_Timer_irq; // set alarm handler - sdmc_alm_id = acre_alm(&calm); - if (sdmc_alm_id < 0) - { - PRINTDEBUG("create_alarm_simple: Cannot create new alarm handler (%d).\n", sdmc_alm_id); - } - - /* メッセージ初期化 */ - // setup dataqueue structure - cdtq.dtqatr = TA_TFIFO; // set attribution : normal FIFO - cdtq.dtqcnt = 1; // there are 2 datas in queue - cdtq.dtq = NULL; // set data queue address : NULL means automatically allocated by kernel - sdmc_dtq_id = acre_dtq(&cdtq); - if (sdmc_dtq_id < 0) - { - PRINTDEBUG("create_dataqueue_simple: Cannot create new data queue.\n"); - } - /**/ - cdtq.dtqatr = TA_TFIFO; // set attribution : normal FIFO - cdtq.dtqcnt = 1; // there are 2 datas in queue - cdtq.dtq = NULL; // set data queue address : NULL means automatically allocated by kernel - sdmc_result_dtq_id = acre_dtq(&cdtq); - if (sdmc_result_dtq_id < 0) - { - PRINTDEBUG("create_dataqueue_simple: Cannot create new data queue.\n"); - } - -// OS_InitThread(); //自分の優先度が16になる -// chg_pri( (ID)0, (PRI)12); - - /* SDタスクの立ち上げ */ - ctsk.tskatr = TA_HLNG | TA_ACT; // set attribution : for high level language and running now - ctsk.task = SDCARD_Thread; // set task routine - ctsk.exinf = (void*)0; // set argument for task routine - ctsk.itskpri = SD_THREAD_PRIO; // set priority - ctsk.stksz = SD_STACK_SIZE; // set stack size - ctsk.stk = NULL; // set stack address : NULL means automatically allocated by kernel - sdmc_tsk_id = acre_tsk(&ctsk); - if (sdmc_tsk_id < 0) - { - PRINTDEBUG("create_task_sd: Cannot create new task.\n"); - }else{ - if( (sdmc_tsk_id == E_NOID)||(sdmc_tsk_id == E_NOMEM)||(sdmc_tsk_id == E_RSATR)|| - (sdmc_tsk_id == E_PAR)||(sdmc_tsk_id == E_OBJ)) { - PRINTDEBUG("create_task_sd: Cannot create new task.\n"); - } - PRINTDEBUG("create_task_sd: 0x%x\n", sdmc_tsk_id); - } - /*----------------------------*/ - - /* SD割り込み処理タスクの立ち上げ */ - ctsk.tskatr = TA_HLNG | TA_ACT; // set attribution : for high level language and running now - ctsk.task = SDCARD_Intr_Thread; // set task routine - ctsk.exinf = (void*)0; // set argument for task routine - ctsk.itskpri = SD_INTR_THREAD_PRIO; // set priority - ctsk.stksz = SD_STACK_SIZE; // set stack size - ctsk.stk = NULL; // set stack address : NULL means automatically allocated by kernel - sdmc_intr_tsk_id = acre_tsk(&ctsk); - if (sdmc_intr_tsk_id < 0) - { - PRINTDEBUG("create_intr_task_sd: Cannot create new task.\n"); - }else{ - if( (sdmc_intr_tsk_id == E_NOID)||(sdmc_intr_tsk_id == E_NOMEM)||(sdmc_intr_tsk_id == E_RSATR)|| - (sdmc_intr_tsk_id == E_PAR)||(sdmc_intr_tsk_id == E_OBJ)) { - PRINTDEBUG("create_intr_task_sd: Cannot create new task.\n"); - } - PRINTDEBUG("create_intr_task_sd: 0x%x\n", sdmc_intr_tsk_id); - } - -#else //(TARGET_OS_NITRO = 1) - /*---------- OS準備 ----------*/ - if( !OS_IsAlarmAvailable()) { /* アラームチェック(OS_InitAlarm済みか?) */ - SDCARD_ErrStatus |= SDMC_ERR_END; - }else{ - OS_CreateAlarm( &sdmc_alm); //使用可能であれば初期化 - } - - /* メッセージ初期化 */ - OS_InitMessageQueue( &sdmc_dtq, &sdmc_dtq_array[0], 1); - OS_InitMessageQueue( &sdmc_result_dtq, &sdmc_result_dtq_array[0], 1); - -// OS_InitThread(); //自分の優先度が16になる - - /* SDスレッドの立ち上げ */ - OS_CreateThread( &sdmc_tsk, SDCARD_Thread, NULL, - (sd_stack+SD_STACK_SIZE / sizeof(u64)), SD_STACK_SIZE, SD_THREAD_PRIO); - OS_WakeupThreadDirect( &sdmc_tsk); - PRINTDEBUG( "sdmc_tsk:0x%x\n", &sdmc_tsk); - - - /* SD割り込み処理スレッドの立ち上げ */ - (void)OS_ClearIrqCheckFlag( OS_IE_SD1); - OS_CreateThread( &sdmc_intr_tsk, SDCARD_Intr_Thread, NULL, - (sd_intr_stack+SD_STACK_SIZE / sizeof(u64)), SD_STACK_SIZE, SD_INTR_THREAD_PRIO); - OS_WakeupThreadDirect( &sdmc_intr_tsk); - PRINTDEBUG( "sdmc_intr_tsk:0x%x\n", &sdmc_intr_tsk); - /*----------------------------*/ -#endif - /**/ - sdmc_tsk_created = TRUE; - } - - /**/ - func_SDCARD_In = func1; /* カード挿入イベント用関数のアドレスを設定 */ - func_SDCARD_Out = func2; /* カード排出イベント用関数のアドレスを設定 */ - api_result = sdmcGoIdle( func1, func2); -// api_result = SDMC_NORMAL; - - return api_result; -} - -/* カードが入れ換わったときなどに初期化(RTFS用)*/ -SDMC_ERR_CODE sdmcGoIdle( void (*func1)(),void (*func2)()) -{ - SDCARDMsg SdMsg; -#if (TARGET_OS_CTR == 1) - u32 init_msg; -#else - OSMessage init_msg; -#endif - SDMC_ERR_CODE api_result; - - func_SDCARD_In = func1; /* カード挿入イベント用関数のアドレスを設定 */ - func_SDCARD_Out = func2; /* カード排出イベント用関数のアドレスを設定 */ - - /*----- SDスレッドと通信 -----*/ -#if (TARGET_OS_CTR == 1) - SdMsg.operation = SD_OPERATION_INIT; - - snd_dtq( sdmc_dtq_id, (VP_INT)&SdMsg); - - /* 返り値待ち */ - rcv_dtq( sdmc_result_dtq_id, (VP_INT*)&init_msg); - api_result = (SDMC_ERR_CODE)init_msg; -#else - SdMsg.operation = SD_OPERATION_INIT; -// SdMsg.func = func1; -// SdMsg.func2 = func2; - - init_msg = (OSMessage)&SdMsg; - OS_SendMessage( &sdmc_dtq, init_msg, OS_MESSAGE_BLOCK); - - /* 返り値待ち */ - OS_ReceiveMessage( &sdmc_result_dtq, &init_msg, OS_MESSAGE_BLOCK); - api_result = (SDMC_ERR_CODE)init_msg; -#endif - /*----------------------------------*/ - - return api_result; -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcInit - - Description: Initialize SD interface and SD card. - 初期化 - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcInit( void) -{ - i_sdmcEnable(); - - /* SD初期化 */ - SDCARD_ErrStatus = sdmcReset(); - - if(!SDCARD_ErrStatus) { - SDCARD_ErrStatus = i_sdmcMPInitFirm(); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: sdmcReset - - Description: reset SD card. - リセット - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReset( void) -{ - OSIntrMode irq_core_flag; - ulSDCARD_Size = 0; /* カード全セクタ数クリア */ - SDCARD_MMCFlag = FALSE; /* MMCカード判定フラグクリア */ - SDCARD_SDHCFlag = FALSE; - SDCARD_SDFlag = FALSE; /* SDカード判定フラグクリア */ - - /*** カードステータスをクリア ***/ - SDCARD_ErrStatus = SDMC_NORMAL; - SDCARD_Status = SDMC_NORMAL; - - /*** カードCSD WPビットをクリア ***/ - SDCARD_WP_FLAG0 = 0; - SDCARD_WP_FLAG1 = 0; - SDCARD_WP_PERMANENT = 0; - SDCARD_WP_TEMPORARY = 0; - - pSDCARD_info = NULL; - SDCARD_OutFlag = FALSE; /* カード排出発生判定フラグクリア */ - -#if (TARGET_OS_CTR == 1) - irq_core_flag = osDisableInterrupts(); /* 割込み禁止 */ -#else - irq_core_flag = OS_DisableInterrupts(); /* 割込み禁止 */ -#endif - *SDIF_CNT_L = (SDIF_CNT_FCLR | SDIF_CNT_USEFIFO); //ラッパーレジスタ - *SDIF_CNT_L = 0x0000; //ラッパーレジスタ - *SDIF_FDS_L = 0; - *SDIF_FSC_L = 1; - SD_Init(); /* SD Card I/F 初期化処理 */ - SD_AndFPGA( SD_OPTION, SD_CD_DETECT_TIME); /* CD 検出タイムをゼロクリア */ - - SD_port_en_numbers = SDCARD_PORT_NO_MAX; /*** サポートするポート数をデフォルトに設定 ***/ - SD_port_number = 0; /*** 現在のポート番号をデフォルトに設定 ***/ - - SDCARD_Backup_port0(); /* port0 backup */ - SDCARD_Backup_port1(); /* port1 backup */ - -#if (TARGET_OS_CTR == 1) - osRestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#else - OS_RestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#endif - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Layer_Init - - Description: initialize sequence for SD card. - SDカード規定の初期化手順 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE SDCARD_Layer_Init(void) -{ -// SYSTIM wait_tim, limit_tim; - -// u16 memory_exist, function_number; - SDCARD_Status = SDMC_NORMAL; /* カードステータスをクリア */ -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグセット */ - SDCARD_MMCFlag = FALSE; /* MMCカード判定フラグクリア */ - SDCARD_SDHCFlag = FALSE; - SDCARD_SDFlag = FALSE; /* SDカード判定フラグクリア */ - SDCARD_OutFlag = FALSE; /* カード排出発生判定フラグクリア */ - ulSDCARD_Size = 0; /* カード全セクタ数クリア */ - TransCount = 0; /* 転送カウント変数クリア */ -// init_io_exist = 0; -// init_mem_exist = 0; - - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_128)); /* SDクロックの周波数 261KHz(初期化時は100〜400khz) */ - SD_EnableClock(); /* SDカードのクロックをイネーブルにする */ - - /* SD I/F部ダミー80クロック(1mSec)転送待ち(タイマーで待ちを実装しても良い) */ -#if (TARGET_OS_CTR == 1) - dly_tsk( 1); -#else -// OS_Sleep( 1); - SVC_WaitByLoop( 17900); //179*4サイクル=716サイクル=10024ns=10us -#endif - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスをクリア */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RESET_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - - PRINTDEBUG( " CMD0(GO_IDLE_STATE)\n"); - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウト以外のエラーをクリア */ - { -/*PRINTDEBUG( "SD_INFO1 : 0x%x\n", SD_INFO1); -PRINTDEBUG( "SD_INFO2 : 0x%x\n", SD_INFO2); -PRINTDEBUG( "SD_INFO1_MASK : 0x%x\n", SD_INFO1_MASK); -PRINTDEBUG( "SD_INFO2_MASK : 0x%x\n", SD_INFO2_MASK); -PRINTDEBUG( "SD_CLK_CTRL : 0x%x\n", SD_CLK_CTRL); -PRINTDEBUG( "SD_SIZE : 0x%x\n", SD_SIZE); - -PRINTDEBUG( "SD_INFO1_MASK : 0x%x\n", (*(vu32 *)(SD_IP_BASE + 0x20)));*/ - } - SD_Command(SD_CMD_CMD | GO_IDLE_STATE); /* CMD0発行、レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /*------- idle state -------*/ -#if (TARGET_OS_CTR == 1) - dly_tsk( 1); /* 1ms待ち */ -#else -// OS_Sleep( 1); - SVC_WaitByLoop( 17900); //179*4サイクル=716サイクル=10024ns=10us -#endif - SD_SendIfCond(); /* CMD8発行、レスポンス確認 */ - if( !SDCARD_SDHCFlag) { /* SDHC以外は失敗してるはずなので */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーフラグをクリアしておく */ - } //注:CMD8によりここで割り込みが入る! - - while(!(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT)){ /* タイムアウトになったら抜ける */ - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); - - SD_RCA = 0; /* RCA = 0をセット */ - if(!SDCARD_MMCFlag){ /* MMCカードフラグが 0(OFF) か? */ - if(!SD_AppCommand()){ /* CMD55 発行処理が正常か? */ - SDCARD_MMCFlag = FALSE; /* MMCカードフラグクリア */ - if(!SD_AppOpCond()){ /* ACMD41発行処理が正常か?(OCR31bit = L の時 No Response) */ - SDCARD_SDFlag = TRUE; /* SDカードフラグセット */ - break; - } - }else{ /* CMD55 が正常終了しない */ - if(SDCARD_ErrStatus == SDMC_ERR_TIMEOUT){ /* タイムアウト(==No Response)か? */ - SDCARD_MMCFlag = TRUE; /* MMCカードフラグセット */ - }else{ -// break; //コメントアウトしないとSDカードの初期化に失敗する - } - } - } - if(SDCARD_MMCFlag){ /* MMCカードフラグが 1(ON) のとき */ - SD_RCA = 1; /* RCA = 1をセット */ - if(!SD_SendOpCond()){ /* CMD1発行処理が正常か? */ - break; - } - } - } -/* - if( SDCARD_SDHCFlag) { - SD_ReadOCR(); - } -*/ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーかチェック */ - SD_ClrErr(SDMC_ERR_FPGA_TIMEOUT); /* タイムアウトエラーの設定クリア */ - SD_SetErr(SDMC_ERR_RESET); /* 初期化カードリセットコマンド時1.5秒タイムアウトエラーの設定 */ - } - SDCARD_MMCFlag = FALSE; /* MMCカードフラグクリア */ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_INITIAL_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - SD_SendCID(); /* CMD2発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - while(1){ - SD_SendRelativeAddr(); /* CMD3発行 レスポンス確認 正常終了時 RCA<-ResのRCA */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - if(SD_RCA != 0){ - break; - } - } - /*------- standby state -------*/ - SD_SendCSD(); /* CMD9発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); - - /* 転送速度設定 */ - SD_ClockDivSet(SD_RSP5); /* SDカードの動作クロック設定 (CSD[5]) */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - /* Command toggles acard between the Stand-by and Transfer states */ - SD_SelectCard(); /* CMD7発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /*------- translate state -------*/ - - SDCARD_SectorSize = SECTOR_SIZE; /* セクタサイズ デフォルト 512bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* CMD16 ブロックサイズの設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - -#if SCR_ON - SD_SelectBitWidth(FALSE); /* CMD55->ACMD6 ビット幅の選択 1bit */ - - /* ACMD51 発行 SD configuration register (SCR) */ - if(SDCARD_SDFlag){ /* SDカードフラグ ON かチェック */ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - i_sdmcSendSCR(); - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } -#if TIMEOUT - SDCARD_TimerStart(SDCARD_CLOCK_WAIT);/* タイムアウト判定用タイマスタート */ -#endif - } -#endif - SD_EnableClock(); /* SD-CLK Enable */ - - if(SDCARD_MMCFlag){ /* MMCカード ON かチェック */ - if( ((SD_CSD[7] & 0x3C)>>2) >= 4) { - MMCP_SetBusWidth( TRUE); - } -// SD_SelectBitWidth(FALSE); /* CMD55->ACMD6 ビット幅の選択 1bit */ - }else{ - SD_SelectBitWidth(TRUE); /* CMD55->ACMD6 ビット幅の選択 4bit */ - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - - if(SDCARD_SDFlag){ /* SDカードフラグ ON かチェック */ - if (SDCARD_SD_Status()) /* CMD55->ACMD13 カードステータスを取得 */ - return SDCARD_ErrStatus; - if(SD_SDSTATUS[1] & SD_MEMORY_CARD){ - SDCARD_SDFlag = FALSE; /* SDカードフラグクリア */ - } - } - - i_sdmcCalcSize(); - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcCalcSize - - Description: - - Arguments: - - Returns: None - *---------------------------------------------------------------------------*/ -void i_sdmcCalcSize( void) -{ - u32 ulCSize; - u16 read_block_len_val, mult_val; - - /*--------------カードサイズの算出---------------*/ - if( ((SD_CSD[7] & CSD_STRUCT_BIT_127_126) >> 6) == 0x1) { //SDHCのとき - sdmc_current_spec.csd_ver2_flag = 1; - ulCSize = (u32)((((u32)(SD_CSD[3]) & CSD_C_SIZE_BIT_69_56) << 8) + - ((SD_CSD[2] & CSD_C_SIZE_BIT_55_48) >> 8) + 1); - ulCSize = ulCSize * 1024; //もともと512KByte単位なのを512Byte単位にする - /* データ領域サイズ算出 */ - sdmc_current_spec.memory_capacity = ulCSize; - ulSDCARD_Size = ulCSize; - /* プロテクト領域サイズ算出 */ - sdmc_current_spec.protected_capacity = (((SD_SwapByte( &SD_SDSTATUS[2])) << 16) + - (SD_SwapByte( &SD_SDSTATUS[3]))) / 0x200; - /*トータルサイズ算出 */ - sdmc_current_spec.card_capacity = sdmc_current_spec.memory_capacity + - sdmc_current_spec.protected_capacity; - - }else{ //従来SDカードのとき - sdmc_current_spec.csd_ver2_flag = 0; - ulCSize = (u32)(((SD_CSD[3] & CSD_C_SIZE_BIT_71_62) >> 6) + - ((SD_CSD[4] & CSD_C_SIZE_BIT_73_72) << 10) + 1); - mult_val = ((SD_CSD[2] & CSD_C_SIZE_MULT) >> 7) + 2; //2の乗数 - ulCSize = ulCSize << mult_val; - if(SDCARD_MMCFlag){ /* MMCカードフラグON かチェック */ - read_block_len_val = ((SD_CSD[4] & CSD_READ_BL_LEN) >> 8); - ulCSize = (ulCSize << read_block_len_val); - }else{ /* SDカードフラグ(SDCARD_SDFlag)ON のはず */ - read_block_len_val = (((SD_CSD[1] & CSD_WRITE_BL_LEN_BIT_25_24) << 2) | - ((SD_CSD[0] & CSD_WRITE_BL_LEN_BIT_23_22) >> 14)); - ulCSize = (ulCSize << read_block_len_val); - } - /* データ領域サイズ算出 */ - ulCSize /= SDCARD_SectorSize; /* 全セクタ数の算出 */ - sdmc_current_spec.memory_capacity = ulCSize; - ulSDCARD_Size += ulCSize; /* 全セクタ数のセット */ - /* プロテクト領域サイズ算出 */ - sdmc_current_spec.protected_capacity = ((SD_SwapByte( &SD_SDSTATUS[2])) << 16) + - (SD_SwapByte( &SD_SDSTATUS[3])); - sdmc_current_spec.protected_capacity <<= mult_val; - sdmc_current_spec.protected_capacity <<= read_block_len_val; - sdmc_current_spec.protected_capacity /= SDCARD_SectorSize; //TODO:構造体にまとめること - /*トータルサイズ算出 */ - sdmc_current_spec.card_capacity = sdmc_current_spec.memory_capacity + - sdmc_current_spec.protected_capacity; - } - sdmc_current_spec.SS = SDCARD_SectorSize; - - PRINTDEBUG( "SD memory capacity : 0x%x\n", sdmc_current_spec.memory_capacity); - PRINTDEBUG( "SD protected capacity : 0x%x\n", sdmc_current_spec.protected_capacity); - PRINTDEBUG( "SD total capacity : 0x%x\n", sdmc_current_spec.card_capacity); -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcMPInit - - Description: initialize SD card in multi ports. - マルチポートのSDカード初期化 - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcMPInit( void) -{ - if(((SD_port_number == SDCARD_PORT0) && (!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_DETECT))) || - ((SD_port_number == SDCARD_PORT1) && (!SD_CheckFPGAReg(EXT_CD,EXT_CD_PORT1_DETECT))) || - (SD_port_number > SDCARD_PORT1)) - { - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスをクリア */ - SDCARD_OutFlag = TRUE; /* 排出フラグをセット */ - }else{ - if( SD_CheckFPGAReg( SD_INFO1, SD_INFO1_DETECT)) { - sdmcSelect( (u16)SDMC_PORT_CARD); - SDCARD_ErrStatus = SDCARD_Layer_Init(); - } - if( SD_CheckFPGAReg( EXT_CD, EXT_CD_PORT1_DETECT)) { - sdmcSelect( (u16)SDMC_PORT_NAND); - SDCARD_ErrStatus = SDCARD_Layer_Init(); - } - SDCARD_OutFlag = FALSE; /* 排出フラグをリセット */ - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - SD_DisableClock(); /* SD-CLK Disable */ - SD_EnableInfo(); /* SD Card 挿抜 割り込み許可 */ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcGetStatus - - Description: get card status - カードの状態を取得する - bit15 SDカード判別ビット(検出したら1) - bit14 MMCカード判別ビット(検出したら1) - bit10 IO3 card detect(検出したら1) ※CTRではプルアップのため使えない - bit9 IO3 card inserted(挿入動作で1) ※CTRではプルアップのため使えない - bit8 IO3 card removed(脱動作で1) ※CTRではプルアップのため使えない - bit7 write protect(書き込み禁止の場合1) - bit5 card detect(検出したら1) - bit4 card inserted(挿入動作で1) - bit3 card removed(脱動作で1) - bit2 R/W access all end - bit0 Response end - - Arguments: *status : カードの状態を格納する変数へのポインタ - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -/*----------------------------------------------- -SD_INFO1レジスタ -bit[10,9,8,7] = DAT3CD, DAT3IN, DAT3OUT, WP -bit[5, 4, 3, 2] = CD, INS, REM, ALLEND -bit0 = RESEND -------------------------------------------------- -EXT_CDレジスタ -bit[2,1,0] = P1CD, P1INS, P1REM -------------------------------------------------- -EXT_CD_DAT3レジスタ -bit[2, 1, 0] = P1DCD, P1DINS, P1DREM -------------------------------------------------- -EXT_WPレジスタ -bit0 = P1WP ------------------------------------------------*/ -SDMC_ERR_CODE sdmcGetStatus(u16 *status) -{ - u16 SD_INFO1_STATUS; - - SD_INFO1_STATUS = SD_INFO1; /* SD_INFO1レジスタ読み出し */ - *status = SD_INFO1_STATUS; /* 論理反転 */ - - /*--- ポート0のとき ---*/ - if(SD_port_number == SDCARD_PORT0) - { - *status &= SDCARD_FLAG_CLR; /* SD/MMCフラグクリア */ - } - /*--- ポート1のとき ---*/ - else if (SD_port_number == SDCARD_PORT1) - { - *status &= SDCARD_PORT1_CLR; /* port1に関係ない部分をクリア */ - SD_INFO1_STATUS = (u16)((EXT_CD & 0x0007) << 3); - SD_INFO1_STATUS |= ((EXT_CD_DAT3 & 0x0007) << 8); - SD_INFO1_STATUS |= ((EXT_WP & 0x0001) << 7); - *status |= SD_INFO1_STATUS; /* カードport1フラグ設定 */ - } - /*--- SD/MMCフラグをセット ---*/ - if( SDCARD_MMCFlag) { /* 検出したカードがMMCカードの時 */ - *status |= SDCARD_FLAG_MMC; /* カード判定部分MMCカード */ - } - if( SDCARD_SDFlag) { /* 検出したカードがSDカードの時 */ - *status |= SDCARD_FLAG_SD; /* カード判定部分SDカード */ - } - - return SDMC_NORMAL; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_GetR1Status - - Description: get the card status of R1 response. - R1レスポンスのカードステータスを取得する。 - - Arguments: None - - Returns: SDCARD_Status : R1の[39:8] - *---------------------------------------------------------------------------*/ -static u32 SDCARD_GetR1Status(void) -{ - /* SD_CheckStatusでSDCARD_Statusに値が入る */ - return SDCARD_Status; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcReadFifo - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; -#if (TARGET_OS_CTR == 1) - u32 recv_dat; -#else - OSMessage recv_dat; -#endif - SDMC_ERR_CODE api_result; //SDCARD関数の返り値 - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ_WITH_FIFO; - -#if (TARGET_OS_CTR == 1) - PRINTDEBUG( "readfifo : snd_dtq begin\n"); - snd_dtq( sdmc_dtq_id, (VP_INT)&SdMsg); - - /* 返り値待ち */ - PRINTDEBUG( "readfifo : rcv_dtq begin\n"); - rcv_dtq( sdmc_result_dtq_id, (VP_INT*)&recv_dat); - - api_result = (SDMC_ERR_CODE)recv_dat; -#else - recv_dat = (OSMessage)&SdMsg; //SdMsgのアドレスを伝える - OS_SendMessage( &sdmc_dtq, recv_dat, OS_MESSAGE_BLOCK); - - /* 返り値待ち */ - OS_ReceiveMessage( &sdmc_result_dtq, &recv_dat, OS_MESSAGE_BLOCK); - api_result = (SDMC_ERR_CODE)recv_dat; -#endif - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: SDCARDi_ReadFifo - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDMC_ERR_CODE result; - - /* FIFO Empty割り込み無効、FIFO Full割り込み有効 */ - *(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FEIE)) | SDIF_CNT_FFIE; - *(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */ - *(SDIF_FSC) = bufsize; - *(SDIF_CNT) |= (SDIF_CNT_USEFIFO | SDIF_CNT_FCLR); /* FIFO使用フラグON */ - CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */ - - result = SDCARDi_Read( buf, bufsize, offset, func, info); - - /* FIFO無効に */ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* FIFO使用フラグOFF */ - CC_EXT_MODE = CC_EXT_MODE_PIO; /* PIOモード(DMAモードOFF) */ - - return result; -} - -/*---------------------------------------------------------------------------* - Name: sdmcRead - - Description: read from card. - カードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcRead(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; -#if (TARGET_OS_CTR == 1) - u32 recv_dat; -#else - OSMessage recv_dat; -#endif - SDMC_ERR_CODE api_result; - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ; - -#if (TARGET_OS_CTR == 1) - snd_dtq( sdmc_dtq_id, (VP_INT)&SdMsg); - - /* 返り値待ち */ - rcv_dtq( sdmc_result_dtq_id, (VP_INT*)&recv_dat); - - api_result = (SDMC_ERR_CODE)recv_dat; -#else - recv_dat = (OSMessage)&SdMsg; - OS_SendMessage( &sdmc_dtq, recv_dat, OS_MESSAGE_BLOCK); - - /* 返り値待ち */ - OS_ReceiveMessage( &sdmc_result_dtq, &recv_dat, OS_MESSAGE_BLOCK); - api_result = (SDMC_ERR_CODE)recv_dat; -#endif - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: SDCARDi_Read - - Description: read from card. - カードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - s16 nRetryCount; /* リトライ回数カウント */ - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - - for( nRetryCount=0; nRetryCountresult = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } - } - }else{ /*--- 残りセクタ数が 0 でないとき ---*/ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */ -#endif - } -} - -/*---------------------------------------------------------------------------* - Name: SYSFPGA_irq - - Description: insert/remove/error/access end interrupt handler. - BREやBWE割り込みを除く割り込みのハンドラ。挿抜、エラー発生、 - アクセス終了の割り込み発生時にそれぞれの処理を行う。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SYSFPGA_irq(void) -{ - /*--- ポート0の挿抜割り込みチェックとコールバック起動 ---*/ - if(!SD_CheckFPGAReg( SD_INFO1_MASK, SD_INFO1_MASK_REMOVE)){ /* SD Card 抜け 割込み許可状態か? */ - if( SD_CheckFPGAReg( SD_INFO1, SD_INFO1_REMOVE)){ /* SD Card 抜け 発生か? */ - SD_AndFPGA( SD_INFO1,(~SD_INFO1_REMOVE)); /* INFO1の抜けフラグを落とす */ - SDCARD_OutFlag = TRUE; /* 排出フラグセット */ - if(func_SDCARD_Out){ /* コールバック関数のNullチェック */ - SDCARD_IO_Port = SDCARD_PORT0; /* カード抜けポート番号を設定 */ - func_SDCARD_Out(); /* カード抜けコールバック関数呼び出し */ - } - } - } - if(!SD_CheckFPGAReg( SD_INFO1_MASK, SD_INFO1_MASK_INSERT)){ /* SD Card 挿入 割込み許可状態か? */ - if( SD_CheckFPGAReg( SD_INFO1, SD_INFO1_INSERT)){ /* SD Card 挿入 発生か? */ - SD_AndFPGA( SD_INFO1, (~SD_INFO1_INSERT)); /* INFO1の挿入フラグを落とす */ - SDCARD_OutFlag = FALSE; /* 排出フラグリセット */ - if(func_SDCARD_In){ /* コールバック関数のNullチェック */ - SDCARD_IO_Port = SDCARD_PORT0; /* カード挿入ポート番号を設定 */ - func_SDCARD_In(); /* カード挿入コールバック関数呼び出し */ - } - } - } - /* (CTRはポート1のCD端子が未接続(常に挿入状態)なので、ポート1の挿抜チェックは行わない) */ - - /*--- 割り込み要求と割り込みマスクを保存 ---*/ - SD_GetFPGA( SD_INFO1_VALUE, SD_INFO1); - SD_GetFPGA( SD_INFO1_MASK_VALUE, SD_INFO1_MASK); - SD_GetFPGA( SD_INFO2_VALUE, SD_INFO2); - SD_GetFPGA( SD_INFO2_MASK_VALUE, SD_INFO2_MASK); - /*------------------------------------------*/ - - /*--- SD_INFO2のエラーフラグ作成 ---*/ - SD_INFO_ERROR_VALUE = (u16)(SD_INFO2_VALUE & (~SD_INFO2_MASK_VALUE)); - /*--- エラーステータス作成 (RESTIMEOUTとILAエラーのフラグは反映しない) ---*/ - SDCARD_ErrStatus |= SD_INFO_ERROR_VALUE & (~(SD_INFO2_ERR_RESTIMEOUT)) & - (~(SD_INFO2_ERR_ILA)) & SD_INFO2_MASK_ERRSET; - - /*--- RESTIMEOUTとILAエラーはフラグの位置をずらして反映する ---*/ - if( SD_INFO_ERROR_VALUE & SD_INFO2_ERR_ILA) { - SDCARD_ErrStatus |= SDMC_ERR_ILA; /* イリーガルアクセスエラー発生 */ - } - if( SD_INFO_ERROR_VALUE & SD_INFO2_ERR_RESTIMEOUT) { - SDCARD_ErrStatus |= SDMC_ERR_TIMEOUT; /* Response Time out エラー発生 */ - }/*------------------------------------------------------------*/ - - SD_AndFPGA( SD_INFO2,(~(SD_INFO2_ERROR_SET))); /* SD_INFO2のエラーフラグを全て落とす */ - if ( SDCARD_ErrStatus) { /* 何らかのエラーが発生しているか? */ - SD_OrFPGA( SD_INFO2_MASK, SD_INFO2_MASK_ERRSET); /* 全てのエラー割り込みを禁止 */ - } - /*--- SD_INFO2のエラーチェック終了 ---*/ - - - /*--- SD_INFO1の割り込み発生状況フラグ作成 ---*/ - SD_INFO_ERROR_VALUE = (u16)(SD_INFO1_VALUE & (~SD_INFO1_MASK_VALUE)); - - if( SD_INFO_ERROR_VALUE & SD_INFO1_MASK_ALL_END) { /* R/W access all end 割込み発生か? */ - SD_OrFPGA( SD_INFO1_MASK, SD_INFO1_MASK_ALL_END); /* INFO1の access all end 割込み禁止 */ - SDCARD_FPGA_Flag = TRUE; /* R/Wアクセス終了(IP処理完了)フラグセット */ - if( SDCARD_ATC0_Flag) { /* 転送完了処理(SDCARD_ATC0_irq)が完了しているか? */ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - SD_TransEndFPGA(); /* 転送終了処理(割り込みマスクを禁止に戻す) */ - if( SDCARD_EndFlag == FALSE) { /* 転送が終了していないか? */ - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグセット */ - if( pSDCARD_info) { /* Nullチェック */ - pSDCARD_info->result = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } /* 転送が終了済みのとき */ - return; - } /* 全ATC完了フラグ OFF の場合 */ - if( SDCARD_ErrStatus != SDMC_NORMAL) { /* エラーが発生している場合 */ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - if( SDCARD_EndFlag == FALSE) { /* 転送が終了していないか? */ - SD_TransEndFPGA(); /* カード転送の終了処理 */ - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグセット */ - /* SD_Init(); */ /* SD Cardインターフェース部をリセット&初期設定 */ - if( pSDCARD_info) { /* Nullチェック */ - pSDCARD_info->result = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } - } - } /* R/W access all end 割り込み未発生 */ -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_TimerStart - - Description: start timer for measure timeout. - タイムアウト計測を開始する - - Arguments: tim : ms単位のタイムアウト時間 - (50msを超える値の場合は50ms単位になる) - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_TimerStart(u32 tim) -{ -#if (TARGET_OS_CTR == 1) - sta_alm( sdmc_alm_id, tim); - PRINTDEBUG( "Timer Started.\n"); -#else - OSTick tim_tick; - - tim_tick = OS_MilliSecondsToTicks( tim); //us単位からTick単位へ - - OS_CancelAlarm( &sdmc_alm); //アラーム破棄 - OS_SetAlarm( &sdmc_alm, tim_tick, SDCARD_Timer_irq, NULL); //アラームセット -#endif -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_TimerStop - - Description: stop timer - タイムアウト計測を停止する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_TimerStop(void) -{ -#if (TARGET_OS_CTR == 1) - stp_alm( sdmc_alm_id); - PRINTDEBUG( "Timer Stopped.\n"); - - //memo:割り込み禁止状態にしてstp_almを呼んでも停止しないので注意 -#else - OS_DisableIrq(); - OS_CancelAlarm( &sdmc_alm); - OS_EnableIrq(); -#endif -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Timer_irq - - Description: timer interrupt handler. - タイマー割り込みハンドラ - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Timer_irq(void* arg) -{ -#if (SD_DEBUG_PRINT_ON == 1) - u16 tmp; - - PRINTDEBUG( ">>>Timer intr(Timeout)\n"); - - SDCARD_ErrStatus |= SDMC_ERR_FPGA_TIMEOUT; /* タイムアウトエラービットの設定 */ - - tmp = SD_INFO1; - PRINTDEBUG( "SD_INFO1 : 0x%x\n", tmp); - tmp = SD_INFO1_MASK; - PRINTDEBUG( "SD_INFO1_MASK : 0x%x\n", tmp); - tmp = SD_INFO2; - PRINTDEBUG( "SD_INFO2 : 0x%x\n", tmp); - tmp = SD_INFO2_MASK; - PRINTDEBUG( "SD_INFO2_MASK : 0x%x\n", tmp); - tmp = SD_ERR_STS1; - PRINTDEBUG( "SD_ERR_STS1 : 0x%x\n", tmp); -#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - *(vu16*)0x08030200 = 1; -#endif - tmp = SD_ERR_STS2; -#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - *(vu16*)0x08030200 = 0; -#endif - PRINTDEBUG( "SD_ERR_STS2 : 0x%x\n", tmp); - tmp = *(vu16 *)(SD_IF_BASE+0x00); - PRINTDEBUG( "SD_CNT : 0x%x\n", tmp); - tmp = SD_SECCNT; - PRINTDEBUG( "SD_SECCNT : 0x%x\n", tmp); -#endif - - - if(SDCARD_EndFlag == FALSE){ /* 転送処理完了フラグの確認(クリア?)*/ - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグをセット */ - /* SD_TransEndFPGA(); */ /* カード転送の終了処理 */ - /* SD_StopTransmission(); */ /* カード転送終了設定 */ - /* SD_Init(); */ /* SD Cardインターフェース部をリセット&初期設定 */ - if(pSDCARD_info){ /* Nullチェック */ - pSDCARD_info->result = SDCARD_ErrStatus;/* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } - - /**/ - PRINTDEBUG( "--Wup sdTsk(Time)--\n"); -#if (TARGET_OS_CTR == 1) - iwup_tsk( sdmc_tsk_id); - PRINTDEBUG( "id : 0x%x\n", sdmc_tsk_id); -#else - sdmc_wakeup_count++; - PRINTDEBUG( "wakeup\n"); - OS_WakeupThreadDirect( &sdmc_tsk); -#endif -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcSendSCR - - Description: get SCR register. - SCRを取得する(DATライン経由で8バイト送られてくる)。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 i_sdmcSendSCR(void) -{ - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ - - SD_EnableClock(); /* SD-CLK Enable */ - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 8; /* SCR レジスタ 転送サイズ 8bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 8byte 設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - - if(SD_AppCommand()){ /* RCA設定後 CMD55発行処理が正常終了しない? */ - SD_DisableClock(); /* SD-CLK Disable */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1; /* 残りセクタサイズ、セクタカウントに1を設定 */ - pSDCARD_BufferAddr = SD_SCR; /* データ格納バッファのアドレスを設定 */ - - /* 転送前の準備処理 */ - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if SCR_ON - thread_flag = TRUE; - SD_SendSCR(); /* SCRの取得コマンド発行 */ - PRINTDEBUG( "==Slp Tsk==\n"); -#if (TARGET_OS_CTR == 1) - //can_wup( 0); - slp_tsk(); -#else - /*--------------------*/ -// OS_TPrintf( "sleep %d\n", __LINE__); -// OS_SleepThread( NULL); - /*--------------------*/ -#endif - PRINTDEBUG( "waked\n"); - thread_flag = FALSE; - - while(!SDCARD_EndFlag){ /* カードアクセス終了待ち */ - PRINTDEBUG( "k\n"); - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - } - - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_SendStatus(); /* カードステータスの取得コマンド発行処理 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - } - } - SaveStatus = SDCARD_Status; /* カードステータスの保存 */ - SaveErrStatus = SDCARD_ErrStatus; /* エラーステータスの保存 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - i_sdmcErrProcess(); /* エラー時の処理 */ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - SDCARD_Status = SaveStatus; /* カードステータスの復帰 */ - SDCARD_ErrStatus = SaveErrStatus; /* エラーステータスの復帰 */ -#endif - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを戻す(default:512bytes)*/ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ - - SD_DisableClock(); /* SD-CLK Disable */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcErrProcess - - Description: when error is occured, get Card Status to check and stop the - transfer. - エラー発生時の処理。カードステータスを取得し、データ転送中で - あればストップさせる。 - - Arguments: None - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 i_sdmcErrProcess(void) -{ - u16 usRSP0; - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_ERRPROC_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - SD_SendStatus(); /* CMD13 addressed card sends its status register 発行、レスポンス待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - SD_GetFPGA( usRSP0, SD_RSP0); - usRSP0 = (u16)(( usRSP0 & RSP_R1_CURRENT_STATE) >> 1); /* カレントステートを取り出す */ - if((usRSP0 == CURRENT_STATE_DATA) || (usRSP0 == CURRENT_STATE_RCV)){ /* SDCARD Status が data rcv の時 */ - SD_Command(SD_CMD_CMD | STOP_TRANSMISSION); /* CMD12(StopTransmission)発行処理 */ - } - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcGetCardSize - - Description: get card size (number of sectors). - カードのセクタ数を取得する - - Arguments: None - - Returns: number of sectors in the SD card which inserted. - *---------------------------------------------------------------------------*/ -u32 sdmcGetCardSize(void) -{ - /* カード全セクタ数 (SDCARD_Layer_Init関数内で算出される) */ - return ulSDCARD_Size; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_SD_Status - - Description: get SD Status. - SDステータスを取得する(DATライン経由で64バイト送られてくる)。 - カードステータスではないことを留意。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 SDCARD_SD_Status(void) -{ - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ - u32 ulSaveRestSectorCount; /* 残りセクタサイズ保存用 */ - - SD_EnableClock(); /* SD-CLK Enable */ - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 64; /* SD_STATUS 転送サイズ 64bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 64byte 設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */ -#endif - - if(SD_AppCommand()){ /* RCA設定後 CMD55発行処理 が正常終了しない?*/ - SD_DisableClock(); /* SD-CLK Disable */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - ulSaveRestSectorCount = ulSDCARD_RestSectorCount; /* 残りセクタサイズを保存(TODO:いらない?) */ - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1; /* 残りセクタサイズ、セクタカウントを1に設定 */ - pSDCARD_BufferAddr = SD_SDSTATUS; /* データ格納バッファのアドレスを設定 */ - - /* 転送前の準備処理 */ - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - - thread_flag = TRUE; - SD_SDStatus(); /* ACMD13 SD_STATUSの取得コマンド発行処理 */ - PRINTDEBUG( "==Slp Tsk==\n"); -#if (TARGET_OS_CTR == 1) - //can_wup( 0); - slp_tsk(); -#else - /*--------------------*/ -// OS_TPrintf( "sleep %d\n", __LINE__); -// OS_SleepThread( NULL); - /*--------------------*/ -#endif - PRINTDEBUG( "waked\n"); - thread_flag = FALSE; - - while(!SDCARD_EndFlag){ /* カードアクセス終了待ち */ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - } - - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスが何らかのエラーでないか確認 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_SendStatus(); /* カードステータス取得コマンド発行、レスポンス(R1)待ち */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - } - } - SaveStatus = SDCARD_Status; /* カードステータスの保存 */ - SaveErrStatus = SDCARD_ErrStatus; /* エラーステータスの保存 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - i_sdmcErrProcess(); /* エラー時の処理 */ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - SDCARD_Status = SaveStatus; /* カードステータスの復帰 */ - SDCARD_ErrStatus = SaveErrStatus; /* エラーステータスの復帰 */ - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを戻す(default:512bytes)*/ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ - ulSDCARD_RestSectorCount = ulSaveRestSectorCount; /* 保存していた残りセクタサイズを戻す(TODO:いらない?)*/ - - SD_DisableClock(); /* SD-CLK Disable */ - - return SDCARD_ErrStatus; -} - -/*******************************************************************************/ -int MMCP_SetBusWidth( BOOL b4bit) -{ - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ -// u16 TestData; - u16 Resid; - - SD_EnableClock(); /* SD-CLK Enable */ - -#if 0 - TestData = 0x5A;//0xA5; - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 4; /* 転送サイズ 1バイト */ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 1byte 設定 */ -#endif - /*コマンド6発行*/ - MMCP_WriteBusWidth( b4bit); - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - -#if 0 - /**/ - pSDCARD_info = NULL; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1; - pSDCARD_BufferAddr = &TestData; /* データ格納バッファのアドレスを設定 */ - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */ -#endif - - /* IPのSD_SECCNTレジスタ有効化、転送セクタ数設定(自動CMD12発行のため) */ -// SD_EnableSeccnt( ulSDCARD_RestSectorCount); - - /*バステスト*/ - MMCP_BusTest( FALSE); - - /**/ - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - - - /**/ - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */ - pSDCARD_BufferAddr = &Resid; /* データ格納バッファのアドレスを設定 */ - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */ -#endif - - /**/ - MMCP_BusTest( TRUE); - - /**/ - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - if( SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - - /*バステスト合格ならバス幅を4bitに拡張*/ -// if( TestData == (~(Resid))) { - if( Resid == 0xA5) { - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - }else{ - SD_OrFPGA(SD_OPTION,(SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(1bit幅) */ - } - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを設定(デフォルト 512bytesに戻す)*/ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ -#endif - return( 0); -} -/*******************************************************************************/ - - -/*---------------------------------------------------------------------------* - Name: i_sdmcCheckWP - - Description: check the write protect bit in the SD_INFO1 register. - SD_INFO1レジスタのライトプロテクトビットを調べる - (0:ライトプロテクトされている、1:ライトプロテクトされていない)。 - CTRではポート1は常に1。 - - Arguments: None - - Returns: number of sectors in the SD card which inserted. - *---------------------------------------------------------------------------*/ -static u16 i_sdmcCheckWP(void) -{ - if (SD_port_number == SDCARD_PORT0) /* ポート0のとき */ - { - if(!(SD_CheckFPGAReg(SD_INFO1,SD_INFO1_WRITEPROTECT))) { //WPフラグが立っていないか? - SDCARD_ErrStatus |= SDMC_ERR_WP; //エラーフラグのWPエラービットを立てる - }else{ //WPフラグが立っていたとき - SDCARD_ErrStatus &= ~SDMC_ERR_WP; //エラーフラグのWPエラービットを落とす - } - return SDCARD_ErrStatus; - } - else if (SD_port_number == SDCARD_PORT1) /* ポート1のとき */ - { /*TWLのポート1はライトプロテクトビットが常に0(プロテクト状態)なので反転して評価*/ - if((SD_CheckFPGAReg(EXT_WP,EXT_WP_PORT1))) { //WPフラグが立っていないか? - SDCARD_ErrStatus |= SDMC_ERR_WP; //エラーフラグのWPエラービットを立てる - }else{ //WPフラグが立っていたとき - SDCARD_ErrStatus &= ~SDMC_ERR_WP; //エラーフラグのWPエラービットを落とす - } - return SDCARD_ErrStatus; - } - return SDMC_ERR_END; //ここには来ない -} - -/*---------------------------------------------------------------------------* - Name: sdmcWriteFifo - - Description: write to card. - ラッパーのFIFOを使用してカードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; -#if (TARGET_OS_CTR == 1) - u32 recv_dat; -#else - OSMessage recv_dat; -#endif - SDMC_ERR_CODE api_result; - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_WRITE_WITH_FIFO; - -#if (TARGET_OS_CTR == 1) - snd_dtq( sdmc_dtq_id, (VP_INT)&SdMsg); - - /* 返り値待ち */ - rcv_dtq( sdmc_result_dtq_id, (VP_INT*)&recv_dat); - - api_result = (SDMC_ERR_CODE)recv_dat; -#else - recv_dat = (OSMessage)&SdMsg; - OS_SendMessage( &sdmc_dtq, recv_dat, OS_MESSAGE_BLOCK); - - /* 返り値待ち */ - OS_ReceiveMessage( &sdmc_result_dtq, &recv_dat, OS_MESSAGE_BLOCK); - api_result = (SDMC_ERR_CODE)recv_dat; -#endif - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: SDCARDi_WriteFifo - - Description: write to card. - ラッパーのFIFOを使用してカードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDMC_ERR_CODE result; - - /* FIFO割り込み禁止 */ - *(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE))); - *(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */ - *(SDIF_FSC) = bufsize; - *(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用フラグON */ - CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */ - - result = SDCARDi_Write( buf, bufsize, offset, func, info); - - /* FIFO無効に */ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* FIFO使用フラグOFF */ - CC_EXT_MODE = CC_EXT_MODE_PIO; /* PIOモード(DMAモードOFF) */ - - return result; -} - -/*---------------------------------------------------------------------------* - Name: sdmcWrite - - Description: write to card. - カードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcWrite(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; -#if (TARGET_OS_CTR == 1) - u32 recv_dat; -#else - OSMessage recv_dat; -#endif - SDMC_ERR_CODE api_result; - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_WRITE; - -#if (TARGET_OS_CTR == 1) - snd_dtq( sdmc_dtq_id, (VP_INT)&SdMsg); - - /* 返り値待ち */ - rcv_dtq( sdmc_result_dtq_id, (VP_INT*)&recv_dat); - - api_result = (SDMC_ERR_CODE)recv_dat; -#else - recv_dat = (OSMessage)&SdMsg; - OS_SendMessage( &sdmc_dtq, recv_dat, OS_MESSAGE_BLOCK); - - /* 返り値待ち */ - OS_ReceiveMessage( &sdmc_result_dtq, &recv_dat, OS_MESSAGE_BLOCK); - api_result = (SDMC_ERR_CODE)recv_dat; -#endif - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: SDCARDi_Write - - Description: write to card. - カードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - s16 nRetryCount; - u32 ulResid; - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - - if( func != NULL){ /* コールバック関数のNullチェック */ - return SDMC_ERR_PARAM; /* コマンドパラメータエラー */ - } - -#if WP_ena - if( i_sdmcCheckWP()) { - return SDMC_ERR_WP; /*** ライトプロテクトのチェック ***/ - } -#endif - for(nRetryCount = 0;nRetryCount < SDCARD_RETRY_COUNT;nRetryCount++){ - - SD_EnableClock(); /* SD-CLK Enable */ - -/* func_SDCARD_CallBack = func; */ - pSDCARD_info = info; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = bufsize; - pSDCARD_BufferAddr = buf; /* データ格納バッファのアドレスを設定 */ - - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */ -#endif - - /* IPのSD_SECCNTレジスタ有効化、転送セクタ数設定(自動CMD12発行のため) */ - SD_EnableSeccnt( ulSDCARD_RestSectorCount); - - /*--- ライトコマンド発行 ---*/ - if( SDCARD_SDHCFlag) { - SD_MultiWriteBlock( offset); /* ライトコマンド発行(引数:オフセット) */ - }else{ - SD_MultiWriteBlock( offset * SDCARD_SectorSize); /* ライトコマンド発行(引数:オフセット*セクタサイズ) */ - } - /*--------------------------*/ - - /**/ - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - - /* エラーが発生していないか、タイムアウト以外のエラーの場合 */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_SendStatus(); /* カードステータスの取得コマンド発行処理 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - } - } - SaveStatus = SDCARD_Status; /* カードステータスの保存 */ - SaveErrStatus = SDCARD_ErrStatus; /* エラーステータスの保存 */ - if( SDCARD_ErrStatus) { /* エラーステータスの確認(エラー有り?)*/ - i_sdmcErrProcess(); /* エラー時の処理(status取得、強制停止) */ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; /* エラー終了 */ - } -#if RESID - if( SDCARD_SDFlag) { /* SDカード(MMCでない)の場合 */ - if( SDCARD_UseFifoFlag) { /*--- FIFOを使用しているときは ---*/ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* 一時的にFIFO未使用モードにする */ - CC_EXT_MODE = CC_EXT_MODE_PIO; - i_sdmcGetResid(&ulResid); /* 書き込み完了セクタ数の取得 */ - *(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用モードに戻す */ - CC_EXT_MODE = CC_EXT_MODE_DMA; - }else{ /*--- FIFOを使用していないとき ---*/ - i_sdmcGetResid(&ulResid); /* 書き込み完了セクタ数の取得 */ - } - if(info){ - info->resid = ulResid * SDCARD_SectorSize;/*** pSDCARD_info->resid をinfo->resid に修正 柏 2000.08.31. ***/ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - } -#endif - SDCARD_Status = SaveStatus; /* カードステータスの復帰 */ - SDCARD_ErrStatus = SaveErrStatus; /* エラーステータスの復帰 */ -#if RESID - if( SDCARD_SDFlag) { /* SDカード(MMCでない)の場合 */ - if( bufsize != ulResid){ /* ライト済みセクタ数が正しくないか? */ - SD_SetErr( SDMC_ERR_NUM_WR_SECTORS); /* エラーフラグセット */ - } - } -#endif - if( SDCARD_ErrStatus == SDMC_NORMAL) { /* エラーステータスの確認(エラー無し?)*/ - break; - } - } - - SD_DisableClock(); /* クロック供給停止 */ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcGetResid - - Description: get the numbers of the well written(without errors) blocks. - 書き込みが完了したセクタの数を取得する。 - - - Arguments: pResid : 書き込み完了セクタ数を返す変数へのポインタ - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 i_sdmcGetResid(u32 *pResid) -{ - u16 Resid[2]; - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスをクリア */ - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 4; /* 転送サイズ 4バイト */ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 4byte 設定 */ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(4000msec) */ -#endif - - if( SD_AppCommand()) { /* RCA設定後 CMD55発行処理 */ - return SDCARD_ErrStatus; /* エラー発生(CMD55が正常終了しない)なら戻る */ - } - -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */ - pSDCARD_BufferAddr = Resid; /* データ格納バッファのアドレスを設定 */ - - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - - thread_flag = TRUE; - /*--- ACMD22 ライト済みセクタ数取得コマンド発行 ---*/ - SD_SendNumWRSectors(); - /*-------------------------------------------------*/ - PRINTDEBUG( "==Slp Tsk==\n"); -#if (TARGET_OS_CTR == 1) -// can_wup( 0); - slp_tsk(); -#else - /*--------------------*/ -// OS_TPrintf( "sleep %d\n", __LINE__); -// OS_SleepThread( NULL); - /*--------------------*/ -#endif - PRINTDEBUG( "waked\n"); - thread_flag = FALSE; - - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - if( SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - /* エラーが発生していないか、タイムアウト以外のエラーの場合 */ - if( SDCARD_ErrStatus) { /* (タイムアウト以外に)エラー発生か? */ - i_sdmcErrProcess(); /* エラー時の処理 */ - *pResid = 0L; /* ライト済みセクタ数に 0 を設定 */ - }else{ /* エラーが発生していない場合 */ - /* SDカードのレジスタはMSBから送られてくるため並べ替えを行う */ - Resid[1] = SD_SwapByte(&Resid[1]); /* 上位 1byte と下位 1byte を入れ替える */ - (((LELONG *)pResid)->dt2word.low) = Resid[1]; /* Resid[1]の設定 */ - Resid[0] = SD_SwapByte(&Resid[0]); /* 上位 1byte と下位 1byte を入れ替える */ - (((LELONG *)pResid)->dt2word.high) = Resid[0]; /* Resid[0]の設定 */ - } - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを設定(デフォルト 512bytesに戻す)*/ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ - /* SetBlockLengthでエラーが出たらどうする? */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Restore_port0 - - Description: restore registers and variables of port0. - ポート0のレジスタや変数を復帰する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Restore_port0(void) -{ - /* registers */ - SD_SetFPGA( SD_CLK_CTRL, SDPort0Context.SD_CLK_CTRL_VALUE); - SD_SetFPGA( SD_OPTION, SDPort0Context.SD_OPTION_VALUE); - - /* variables */ - SD_RCA = SDPort0Context.SD_RCA; - SDCARD_ErrStatus = SDPort0Context.ErrStatus; - SDCARD_Status = SDPort0Context.Status; - SDCARD_MMCFlag = SDPort0Context.MMCFlag; - SDCARD_SDHCFlag = SDPort0Context.SDHCFlag; - SDCARD_SDFlag = SDPort0Context.SDFlag; - - SDCARD_OutFlag = SDPort0Context.OutFlag; - pSDCARD_info = NULL; - - /*media registers*/ - MI_CpuCopy8( SDPort0Context.SD_CID, SD_CID, 16); - MI_CpuCopy8( SDPort0Context.SD_CSD, SD_CSD, 16); - MI_CpuCopy8( SDPort0Context.SD_OCR, SD_OCR, 4); - MI_CpuCopy8( SDPort0Context.SD_SCR, SD_SCR, 8); - - /*recalc*/ - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Restore_port1 - - Description: restore registers and variables of port0. - ポート1のレジスタや変数を復帰する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_Restore_port1(void) -{ - /* registers */ - SD_SetFPGA( SD_CLK_CTRL, SDPort1Context.SD_CLK_CTRL_VALUE); - SD_SetFPGA( SD_OPTION, SDPort1Context.SD_OPTION_VALUE); - - /* variables */ - SD_RCA = SDPort1Context.SD_RCA; - SDCARD_ErrStatus = SDPort1Context.ErrStatus; - SDCARD_Status = SDPort1Context.Status; - SDCARD_MMCFlag = SDPort1Context.MMCFlag; - SDCARD_SDHCFlag = SDPort1Context.SDHCFlag; - SDCARD_SDFlag = SDPort1Context.SDFlag; - - SDCARD_OutFlag = SDPort1Context.OutFlag; - pSDCARD_info = NULL; - - /*media registers*/ - MI_CpuCopy8( SDPort1Context.SD_CID, SD_CID, 16); - MI_CpuCopy8( SDPort1Context.SD_CSD, SD_CSD, 16); - MI_CpuCopy8( SDPort1Context.SD_OCR, SD_OCR, 4); - MI_CpuCopy8( SDPort1Context.SD_SCR, SD_SCR, 8); - - /*recalc*/ - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); -} - - -/*---------------------------------------------------------------------------* - Name: sdmcSelectedNo - - Description: get selected port number. - 選択されているポート番号を取得する - - Arguments: None - - Returns: [15:8]port numbers which supported(サポートされているポート数) - [7:0]port number which selected now(選択されているポート番号) - *---------------------------------------------------------------------------*/ -u16 sdmcSelectedNo(void) -{ - u16 i_sdmcSelect_Value; - - SD_GetFPGA(i_sdmcSelect_Value,SD_PORTSEL); /* SD_PORTSELレジスタ値を取得 */ - - return i_sdmcSelect_Value; -} - -/*---------------------------------------------------------------------------* - Name: sdmcSelect - - Description: select port. - ポートを選択する - - Arguments: select : [15:8]port numbers which supported(サポートされているポート数) - [7:0]port number which selected now(選択するポート番号) - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcSelect(u16 select) -{ - union - { - u16 Val; - struct - { - u8 L; /* 指定したいポート */ - u8 H; /* サポートされているポート */ - } PSel; - } SDCARD_PSel; - - //TODO : transferモードからstand-byモードにする? -/* if( !SDCARD_EndFlag) { // 転送が残っている場合はエラー - return SDMC_ERR_END; - } -*/ - SDCARD_PSel.Val = select; - if ((SDCARD_PSel.PSel.H > SDCARD_PORT_NO_MAX) - | (SDCARD_PSel.PSel.H < SDCARD_PORT_NO_MIN) - | (SDCARD_PSel.PSel.L > SDCARD_PORT_SELECT_NO)) - { - return SDMC_ERR_PARAM; /* コマンドパラメータエラー */ - }else{ - SD_port_en_numbers = SDCARD_PSel.PSel.H; /* 新しくサポートするポート数を保存 */ - SD_port_number = SDCARD_PSel.PSel.L; /* 新しく選択するポート番号を保存 */ - - SD_GetFPGA(SDCARD_PSel.Val,SD_PORTSEL); /* 現在のレジスタを取得 */ - - if (SDCARD_PSel.PSel.L == 0) /* 現在選択されているポートが 0 ? */ - { - SDCARD_Backup_port0(); - }else{ - SDCARD_Backup_port1(); - } - - SDCARD_PSel.Val= select; - - if (SDCARD_PSel.PSel.L == 0) /* 新しく選択されたポートが 0 ? */ - { - SDCARD_Restore_port0(); - }else{ - SDCARD_Restore_port1(); - } - - SD_SetFPGA(SD_PORTSEL,select); /* レジスタへセット */ - return SDMC_NORMAL; /* 0 リターン */ - } -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_Thread - - Description: SDメモリカードメインタスク - - Arguments: - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Thread( void* arg) -{ - SDCARDMsg* SdMsg; -#if (TARGET_OS_CTR == 1) - u32 current_dat; -#else - OSMessage current_dat; -#endif - SDMC_ERR_CODE api_result; - - while( TRUE) { - /* メッセージ待ち */ - PRINTDEBUG( "rcv mes sdThread\n"); -#if (TARGET_OS_CTR == 1) - rcv_dtq( sdmc_dtq_id, (VP_INT*)¤t_dat); -#else - OS_ReceiveMessage( &sdmc_dtq, ¤t_dat, OS_MESSAGE_BLOCK); -#endif - SdMsg = (SDCARDMsg*)current_dat; - PRINTDEBUG( "sd task : receive command : %d\n", SdMsg->operation); - - switch( SdMsg->operation) { - case SD_OPERATION_INIT: - api_result = i_sdmcInit(); - break; - case SD_OPERATION_READ: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_Read( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - case SD_OPERATION_READ_WITH_FIFO: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_ReadFifo( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - case SD_OPERATION_WRITE: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_Write( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - case SD_OPERATION_WRITE_WITH_FIFO: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_WriteFifo( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - default: - PRINTDEBUG( "sdmc-thread error : undefined command.\n"); - api_result = SDMC_ERR_COMMAND; - break; - } - - PRINTDEBUG( "sd task : operation ends(result : 0x%x), send message begin\n", api_result); - - /*メッセージ返送*/ - current_dat = (OSMessage)api_result; -#if (TARGET_OS_CTR == 1) - snd_dtq( sdmc_result_dtq_id, (VP_INT)api_result); -#else - OS_SendMessage( &sdmc_result_dtq, current_dat, OS_MESSAGE_BLOCK); -#endif - } -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Intr_Thread - - Description: SDメモリカード割り込み処理タスク - - Arguments: - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Intr_Thread( void* arg) -{ - u16 sd_info1;//, sd_info2; - OSIntrMode enabled; - - while( 1) { - PRINTDEBUG( "next_tsk:0x%x\n", OS_SelectThread()); - PRINTDEBUG( "Slp sdIntr\n"); - - OS_WaitIrq( FALSE, OS_IE_SD1); -// OS_DisableIrqMask( OS_IE_SD1); -// if( sdmc_intr_wakeup_count == 0) { -// OS_SleepThread( NULL); -// } -// sdmc_intr_wakeup_count--; -// OS_EnableIrqMask( OS_IE_SD1); -// enabled = OS_DisableInterrupts(); - (void)OS_ClearIrqCheckFlag( OS_IE_SD1); - /*SD割り込みのIF解除*/ - *(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; -// (void)OS_RestoreInterrupts( enabled); - PRINTDEBUG( "sdIntr waked\n"); - - /*--- FIFOを使うとき ---*/ - if( SDCARD_UseFifoFlag) { - sd_info1 = SD_INFO1; - if( ((*SDIF_CNT & SDIF_CNT_FULL)&&(*SDIF_CNT & SDIF_CNT_FFIE)) || - ((!(*SDIF_CNT & SDIF_CNT_NEMP))&&(*SDIF_CNT & SDIF_CNT_FEIE))) { - - PRINTDEBUG( ">>>SD Intr(FIFO)\n");// Full or Empty)\n"); - OS_DisableIrqMask( OS_IE_SD1); - SDCARD_FPGA_irq(); /*カードからのリードライト要求割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - /* FIFO割り込みとALLEND割り込みがほぼ同時の場合に対応 */ - if( SD_CheckFPGAReg( sd_info1, SD_INFO1_ALL_END)) { - (void)OS_ClearIrqCheckFlag( OS_IE_SD1); - /*SD割り込みのIF解除*/ - *(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; - OS_DisableIrqMask( OS_IE_SD1); - SYSFPGA_irq(); - OS_EnableIrqMask( OS_IE_SD1); - if( thread_flag) { - PRINTDEBUG( "--Wup sdThread!--\n"); - sdmc_wakeup_count++; - PRINTDEBUG( "wakeup\n"); - OS_WakeupThreadDirect( &sdmc_tsk); - } - } - }else{ - if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) { - PRINTDEBUG ( ">>>SD Intr(R/W Req)\n"); - //ここで自動的にラッパーのFIFO<->SD_BUF0間で通信が行われる - // if((!(*SDIF_CNT & SDIF_CNT_NEMP))&&(*SDIF_CNT & SDIF_CNT_FEIE)) { - OS_DisableIrqMask( OS_IE_SD1); - SDCARD_FPGA_irq(); - OS_EnableIrqMask( OS_IE_SD1); - }else{ - PRINTDEBUG( ">>>SD Intr(End or Err)\n"); - OS_DisableIrqMask( OS_IE_SD1); - SYSFPGA_irq(); /*完了またはエラー割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - /**/ - if( thread_flag) { - PRINTDEBUG( "--Wup sdThread!--\n"); - sdmc_wakeup_count++; - OS_WakeupThreadDirect( &sdmc_tsk); - } - } - } - /*--- FIFOを使わないとき ---*/ - }else{ - if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) { - PRINTDEBUG( ">>>SD Intr(R/W Req)\n"); - OS_DisableIrqMask( OS_IE_SD1); - SDCARD_FPGA_irq(); /*カードからのリードライト要求割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - }else{ - PRINTDEBUG( ">>SD Intr(End or Err)\n"); - OS_DisableIrqMask( OS_IE_SD1); - SYSFPGA_irq(); /*完了またはエラー割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - /**/ - if( thread_flag) { - PRINTDEBUG( "--Wup sdThread!--\n"); - sdmc_wakeup_count++; - OS_WakeupThreadDirect( &sdmc_tsk); - } - } - } - } -} diff --git a/build/libraries/fatfs/ARM7/firm_sdmc/sdmc_port.c b/build/libraries/fatfs/ARM7/firm_sdmc/sdmc_port.c deleted file mode 100644 index c7f8da48..00000000 --- a/build/libraries/fatfs/ARM7/firm_sdmc/sdmc_port.c +++ /dev/null @@ -1,246 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: - File: sdmc_port.c - - Copyright 2007 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Log: sdmc_port.c,v $ - $NoKeywords: $ - *---------------------------------------------------------------------------*/ - -#include -#include "sdmc_config.h" -#include "sdif_reg.h" -#include -#include "sdif_ip.h" - - -// #define PRINTDEBUG OS_TPrintf - #define PRINTDEBUG( ...) ((void)0) - - - -/*extern変数(sdmc.c)*/ -extern u32 SDCARD_SectorSize; /* セクタサイズ デフォルト 512bytes */ -extern SDMC_ERR_CODE SDCARD_ErrStatus; /* エラーステータス */ -extern volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ - - -extern SDPortContext SDPort0Context; -extern SDPortContext SDPort1Context; - - -/*extern関数(sdmc.c)*/ -extern void i_sdmcCalcSize( void); -extern void SDCARD_Backup_port1(void); -extern void SDCARD_Restore_port1(void); -extern SDMC_ERR_CODE SDCARD_Layer_Init(void); -extern void SDCARD_TimerStop(void); /* タイムアウト計測停止 */ - -static SDMC_ERR_CODE i_sdmcSavePortContext( SDPortContext* buf_adr, u16 port_no); -static SDMC_ERR_CODE i_sdmcLoadPortContext( SDPortContext* buf_adr, u16* port_no); - -static void sdmcPrintContext( SDPortContext* targ); - - -/*---------------------------------------------------------------------------* - Name: sdmcClearPortContext - - Description: - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void sdmcClearPortContext( SDPortContext* buf_adr) -{ - MI_CpuFill8( buf_adr, 0x00, sizeof(SDPortContext)); -} - -/*---------------------------------------------------------------------------* - Name: sdmcCheckPortContext - - Description: - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcCheckPortContext( SDPortContext* buf_adr) -{ - if( (buf_adr->SD_CID[0] != 0)&&(buf_adr->port_no < 2)) { - return( SDMC_NORMAL); - }else{ - return( SDMC_ERR_PARAM); - } -} - -/*---------------------------------------------------------------------------* - Name: sdmcSavePortContext - - Description: ポート0のレジスタや変数をユーザバッファに退避する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcSavePortContext( SDPortContext* buf_adr, u16 port_no) -{ - if( buf_adr == NULL) { - return( SDMC_ERR_PARAM); - } - switch( port_no) { - case 0: - MI_CpuCopy8( &SDPort0Context, buf_adr, sizeof(SDPortContext)); - buf_adr->port_no = 0; - break; - case 1: - MI_CpuCopy8( &SDPort1Context, buf_adr, sizeof(SDPortContext)); - buf_adr->port_no = 1; - break; - default: return( SDMC_ERR_PARAM); - } - return( SDMC_NORMAL); -} - -/*---------------------------------------------------------------------------* - Name: sdmcLoadPortContext - - Description: ポート0のレジスタや変数をユーザバッファから復帰する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcLoadPortContext( SDPortContext* buf_adr, u16* port_no) -{ - if( buf_adr == NULL) { - return( SDMC_ERR_PARAM); - } - switch( buf_adr->port_no) { - case 0: - MI_CpuCopy8( buf_adr, &SDPort0Context, sizeof(SDPortContext)); - *port_no = 0; - break; - case 1: - MI_CpuCopy8( buf_adr, &SDPort1Context, sizeof(SDPortContext)); - *port_no = 1; - break; - default: return( SDMC_ERR_PARAM); - } - return( SDMC_NORMAL); -} - - - -/*---------------------------------------------------------------------------* - Name: i_sdmcMPInitFirm - - Description: initialize SD card in multi ports. - マルチポートのSDカード初期化 - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE i_sdmcMPInitFirm( void) -{ - u16 load_port_no; - SDPortContext* SDNandContext; - - //予約領域のポートコンテキスト参照 - SDNandContext = (SDPortContext*)&(((OSFromBromBuf*)OSi_GetFromBromAddr())->SDNandContext); - -#if 0 - sdmcPrintContext( SDNandContext); -#endif - - //NANDスロットの初期化 - SD_SetFPGA( SD_PORTSEL, SDMC_PORT_NAND); /* NANDポート選択 */ - - PRINTDEBUG( "SDNandContext : 0x%x\n", SDNandContext); - //初期化済みでないときだけ初期化 - if( sdmcCheckPortContext( SDNandContext) != SDMC_NORMAL) { - PRINTDEBUG( "sdmcCheckPortContext : ERR!\n"); - SDCARD_ErrStatus = SDCARD_Layer_Init(); - - SDCARD_Backup_port1(); //TODO:ポート番号 - //ポートコンテキストの保存 - if( i_sdmcSavePortContext( SDNandContext, 1) != SDMC_NORMAL) { - PRINTDEBUG( "i_sdmcSavePortContext failed\n"); - return( SDMC_ERR_PARAM); - } - }else{ //ポートコンテキストの復帰 - PRINTDEBUG( "sdmcCheckPortContext : NORMAL\n"); - - /*SDCARD_Layer_Init()の代わり*/ - SDCARD_SectorSize = SECTOR_SIZE; /* セクタサイズ デフォルト 512bytes */ -// SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_128)); /* SDクロックの周波数 261KHz(初期化時は100〜400khz) */ - - if( i_sdmcLoadPortContext( SDNandContext, &load_port_no) != SDMC_NORMAL) { - PRINTDEBUG( "i_sdmcLoadPortContext failed\n"); - return( SDMC_ERR_PARAM); - } - SDCARD_Restore_port1(); //TODO:load_port_no値判定 - } - - SDCARD_OutFlag = FALSE; /* 排出フラグをリセット */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - SD_DisableClock(); /* SD-CLK Disable */ - SD_EnableInfo(); /* SD Card 挿抜 割り込み許可 */ - - return SDCARD_ErrStatus; -} - - -/*デバッグ用*/ -static void sdmcPrintContext( SDPortContext* targ) -{ - OS_TPrintf( "CID[0]:0x%x\n", targ->SD_CID[0]); - OS_TPrintf( "CID[1]:0x%x\n", targ->SD_CID[1]); - OS_TPrintf( "CID[2]:0x%x\n", targ->SD_CID[2]); - OS_TPrintf( "CID[3]:0x%x\n", targ->SD_CID[3]); - OS_TPrintf( "CID[4]:0x%x\n", targ->SD_CID[4]); - OS_TPrintf( "CID[5]:0x%x\n", targ->SD_CID[5]); - OS_TPrintf( "CID[6]:0x%x\n", targ->SD_CID[6]); - OS_TPrintf( "CID[7]:0x%x\n\n", targ->SD_CID[7]); - - OS_TPrintf( "CSD[0]:0x%x\n", targ->SD_CSD[0]); - OS_TPrintf( "CSD[1]:0x%x\n", targ->SD_CSD[1]); - OS_TPrintf( "CSD[2]:0x%x\n", targ->SD_CSD[2]); - OS_TPrintf( "CSD[3]:0x%x\n", targ->SD_CSD[3]); - OS_TPrintf( "CSD[4]:0x%x\n", targ->SD_CSD[4]); - OS_TPrintf( "CSD[5]:0x%x\n", targ->SD_CSD[5]); - OS_TPrintf( "CSD[6]:0x%x\n", targ->SD_CSD[6]); - OS_TPrintf( "CSD[7]:0x%x\n\n", targ->SD_CSD[7]); - - OS_TPrintf( "OCR[0]:0x%x\n", targ->SD_OCR[0]); - OS_TPrintf( "OCR[1]:0x%x\n\n", targ->SD_OCR[1]); - - OS_TPrintf( "SCR[0]:0x%x\n", targ->SD_SCR[0]); - OS_TPrintf( "SCR[1]:0x%x\n\n", targ->SD_SCR[1]); - - OS_TPrintf( "RCA:0x%x\n\n", targ->SD_RCA); - - OS_TPrintf( "MMCFlag :0x%x\n", targ->MMCFlag); - OS_TPrintf( "SDHCFlag:0x%x\n", targ->SDHCFlag); - OS_TPrintf( "SDFlag :0x%x\n\n", targ->SDFlag); - - OS_TPrintf( "ErrStatus:0x%x\n", targ->ErrStatus); - OS_TPrintf( "Status:0x%x\n\n", targ->Status); - - OS_TPrintf( "SD_CLK_CTRL_VALUE:0x%x\n", targ->SD_CLK_CTRL_VALUE); - OS_TPrintf( "SD_OPTION_VALUE :0x%x\n\n", targ->SD_OPTION_VALUE); - - OS_TPrintf( "OutFlag:0x%x\n\n", targ->OutFlag); - - OS_TPrintf( "port_no:0x%x\n", targ->port_no); -} diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/drsdmc.c b/build/libraries/fatfs/ARM7/rom_sdmc/drsdmc.c deleted file mode 100644 index d1c9035f..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/drsdmc.c +++ /dev/null @@ -1,686 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlBrom - rtfs interface for SD Memory Card - File: drsdmc.h - - Copyright 2007 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - *---------------------------------------------------------------------------*/ - -#include -#include -//#if (INCLUDE_SD) - -#include "sdmc_config.h" -//#include "sdmc.h" -#include "sdif_ip.h" -#include "sdif_reg.h" - -#if (SD_DEBUG_PRINT_ON == 1) - #if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - #define PRINTDEBUG osTPrintf - #else - #include - #define PRINTDEBUG vlink_dos_printf - #endif -#else - #define PRINTDEBUG( ...) ((void)0) -#endif - - -#define NUM_SD_PAGES -#define SD_PAGE_SIZE - - -/*---------------------------------------------------------------------------* - extern変数 - *---------------------------------------------------------------------------*/ -//extern ER_ID sdmc_dtq_id; -//extern ER_ID sdmc_result_dtq_id; -extern void (*func_SDCARD_In)(void); /* カード挿入イベント用コールバック保存用 */ -extern void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */ -extern volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ - -extern int rtfs_first_stat_flag[26]; - -/*SDメモリカードのスペック構造体*/ -extern SdmcSpec sdmc_current_spec; - - -/*---------------------------------------------------------------------------* - extern関数 - *---------------------------------------------------------------------------*/ -extern SDMC_ERR_CODE sdmcGoIdle(void (*func1)(),void (*func2)()); - - -/*---------------------------------------------------------------------------* - static変数 - *---------------------------------------------------------------------------*/ -static int sdmc_drive_no; -void (*func_usr_sdmc_out)(void) = NULL; /* カード排出イベントのユーザコールバック */ - - -/*---------------------------------------------------------------------------* - static関数 - *---------------------------------------------------------------------------*/ -void i_sdmcRemovedIntr( void); -static void sdi_get_CHS_params( void); -static u32 sdi_get_ceil( u32 cval, u32 mval); -static void sdi_get_nom( void); -static void sdi_get_fatparams( void); -static void sdi_build_partition_table( void); - - -/*---------------------------------------------------------------------------* - Name: sdmcCheckMedia - - Description: MBRのシグネチャおよび - パーティションのフォーマット種別をチェックする - - Arguments: - - Returns: TRUE/FALSE - (FALSEなら pc_format_media が必要) - *---------------------------------------------------------------------------*/ -BOOL sdmcCheckMedia( void) -{ - u16 i; - SdmcResultInfo SdResult; - u8* bufp; - u32 buffer[512/4]; - u8 systemid; - - /**/ - if( sdmcReadFifo( buffer, 1, 0, NULL, &SdResult)) { - return( FALSE); - } - - bufp = (u8*)buffer; - - /* Check the Signature Word. */ - if( (bufp[510]!=0x55) || (bufp[511]!=0xAA)) { - return( FALSE); - } - /* Check the System ID of partition. */ - systemid = bufp[450]; - if( (systemid!=0x01) && (systemid!=0x04) && (systemid!=0x06) && - (systemid!=0x0B) && (systemid!=0x0C)) { - return( FALSE); - } - /* Check the System ID of unuse partitions. */ - for( i=1; i<4; i++) { - systemid = bufp[450+(16*i)]; - if( systemid != 0x00) { - return( FALSE); - } - } - /**/ - /*もっと厳密にチェックするならパーティション0開始位置の - 正当性も調べる*/ - return( TRUE); -} - - -/*---------------------------------------------------------------------------* - Name: sdmcRtfsIo - - Description: 上位層からのセクタリード/ライト要求を受ける - - Arguments: driveno : ドライブ番号 - block : 開始ブロック番号 - buffer : - count : ブロック数 - reading : リード要求時にTRUE - - Returns: TRUE/FALSE - *---------------------------------------------------------------------------*/ -BOOL sdmcRtfsIo( int driveno, dword block, void* buffer, word count, BOOLEAN reading) -{ - u16 result; - SdmcResultInfo SdResult; - - if( reading) { - PRINTDEBUG( "DEVCTL_IO_READ ... block:%x, count:%x -> buf:%x\n", block, count, buffer); - result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcRead( buffer, count, block, NULL, &SdResult); - }else{ - PRINTDEBUG( "DEVCTL_IO_WRITE ... block:%x, count:%x <- buf:%x\n", block, count, buffer); - result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcWrite( buffer, count, block, NULL, &SdResult); - } - if( result) { - return FALSE; - } - - return TRUE; -} - -/*---------------------------------------------------------------------------* - Name: sdmcRtfsCtrl - - Description: 上位層からのコントロール要求を受ける - - Arguments: driveno : ドライブ番号 - opcode : 要求の種類 - pargs : - - Returns: - Memo : DRIVE_FLAGS_REMOVABLEの場合、ドライバのIO関数を呼ぶ前に - CTRL関数のDEVCTL_CHECK_STATUSが呼ばれる。 - DEVTEST_CHANGED→DEVTEST_NOCHANGEが確認されるとRTFSはセクタ0を - 読みに行き、FATパラメータを取得した上で目的のセクタを読みに行く。 - CTRL関数の前にはDEVCTL_CHECK_STATUSが呼ばれないので、DEVCTL_ - GET_GEOMETRYでは自前で再挿入をチェックする必要がある。 - *---------------------------------------------------------------------------*/ -int sdmcRtfsCtrl( int driveno, int opcode, void* pargs) -{ - DDRIVE *pdr; - DEV_GEOMETRY gc; - int heads, secptrack; - - pdr = pc_drno_to_drive_struct( driveno); - - switch( opcode) { - case DEVCTL_GET_GEOMETRY: //formatまたはpartirionするときにRTFSが使うパラメータ - PRINTDEBUG( "DEVCTL_GET_GEOMETRY\n"); - if( (pdr->drive_flags & DRIVE_FLAGS_INSERTED) == 0) { /* 抜かれていた場合 */ - if( SDCARD_OutFlag == TRUE) { /* 今現在も抜かれているとき */ - return( -1); - }else{ /* 今現在は再挿入されているとき */ - /*-- GoIdleセット --*/ - if( func_SDCARD_Out != i_sdmcRemovedIntr) { - func_usr_sdmc_out = func_SDCARD_Out; //ユーザコールバック取得 - } - sdmcGoIdle( func_SDCARD_In, i_sdmcRemovedIntr); //カード初期化シーケンス - /*------------------*/ - } - } - - rtfs_memset( &gc, (byte)0, sizeof(gc)); - - sdi_get_CHS_params(); //最初に呼ぶこと - sdi_get_fatparams(); - sdi_get_nom(); - - PRINTDEBUG( "heads : 0x%x\n", sdmc_current_spec.heads); - PRINTDEBUG( "secptrack : 0x%x\n", sdmc_current_spec.secptrack); - PRINTDEBUG( "cylinders : 0x%x\n", sdmc_current_spec.cylinders); - PRINTDEBUG( "SC : 0x%x\n", sdmc_current_spec.SC); - PRINTDEBUG( "BU : 0x%x\n", sdmc_current_spec.BU); - PRINTDEBUG( "RDE : 0x%x\n", sdmc_current_spec.RDE); - PRINTDEBUG( "SS : 0x%x\n", sdmc_current_spec.SS); - PRINTDEBUG( "RSC : 0x%x\n", sdmc_current_spec.RSC); - PRINTDEBUG( "FATBITS : 0x%x\n", sdmc_current_spec.FATBITS); - PRINTDEBUG( "SF : 0x%x\n", sdmc_current_spec.SF); - PRINTDEBUG( "SSA : 0x%x\n", sdmc_current_spec.SSA); - PRINTDEBUG( "NOM : 0x%x\n", sdmc_current_spec.NOM); - - gc.dev_geometry_lbas = (sdmc_current_spec.adjusted_memory_capacity);// - sdmc_current_spec.NOM); - gc.dev_geometry_heads = sdmc_current_spec.heads; - gc.dev_geometry_cylinders = sdmc_current_spec.cylinders; - gc.dev_geometry_secptrack = sdmc_current_spec.secptrack; - /**/ - gc.fmt_parms_valid = TRUE; - gc.fmt.oemname[0] = 'C'; - gc.fmt.oemname[1] = 'T'; - gc.fmt.oemname[2] = 'R'; - gc.fmt.oemname[3] = '\0'; - gc.fmt.secpalloc = sdmc_current_spec.SC; /*sectors per cluster(FIX by capacity)*/ - gc.fmt.secreserved = sdmc_current_spec.RSC;//sdmc_current_spec.RSC;/*reserved sectors(FIX 1 at FAT12,16)*/ - gc.fmt.numfats = 2; - gc.fmt.secpfat = sdmc_current_spec.SF; - gc.fmt.numhide = sdmc_current_spec.NOM; /**/ - gc.fmt.numroot = sdmc_current_spec.RDE; /*FIX*/ - gc.fmt.mediadesc = 0xF8; - gc.fmt.secptrk = sdmc_current_spec.secptrack; //CHS Recommendation - gc.fmt.numhead = sdmc_current_spec.heads; - gc.fmt.numcyl = sdmc_current_spec.cylinders; - gc.fmt.physical_drive_no = driveno; - gc.fmt.binary_volume_label = BIN_VOL_LABEL; - gc.fmt.text_volume_label[0] = '\0'; - //TODO:dev_geometry_lbasもセットする必要あるか調べること - PRINTDEBUG( "heads : 0x%x, secptrack : 0x%x, cylinders : 0x%x\n", gc.dev_geometry_heads, gc.dev_geometry_secptrack, gc.dev_geometry_cylinders); - -#if (TARGET_OS_CTR == 1) - miCpuCopy8( &gc, pargs, sizeof(gc)); -// copybuff( pargs, &gc, sizeof(gc)); -#else - MI_CpuCopy8( &gc, pargs, sizeof(gc)); -#endif - return( 0); - - case DEVCTL_FORMAT: - PRINTDEBUG( "DEVCTL_FORMAT\n"); - sdi_build_partition_table(); //MBRセクタ(パーティションテーブル含む)書き込み - return( 0); - - case DEVCTL_REPORT_REMOVE: //抜かれたとき - PRINTDEBUG( "DEVCTL_REPORT_REMOVE\n"); - pdr->drive_flags &= ~DRIVE_FLAGS_INSERTED; - return( 0); - - case DEVCTL_CHECKSTATUS: //REMOVABLEの場合、毎回R/W前に呼ばれる - PRINTDEBUG( "DEVCTL_CHECKSTATUS\n"); - if (!(pdr->drive_flags & DRIVE_FLAGS_REMOVABLE)) { //リムーバブルでない場合 - return(DEVTEST_NOCHANGE); - } - if (pdr->drive_flags & DRIVE_FLAGS_INSERTED) { /* 抜かれてない場合 */ - if( rtfs_first_stat_flag[driveno]) { //初回のCHECKSTATUS時 - rtfs_first_stat_flag[driveno] = 0; - PRINTDEBUG( "CHANGED!\n"); - return(DEVTEST_CHANGED); - }else{ - PRINTDEBUG( "DEVTEST_NOCHANGE\n"); - return( DEVTEST_NOCHANGE); - } - }else{ /* 抜かれていた場合 */ - if( SDCARD_OutFlag == FALSE) { /* 排出フラグ参照 */ - pdr->drive_flags |= DRIVE_FLAGS_INSERTED; - /*-- GoIdleセット --*/ - if( func_SDCARD_Out != i_sdmcRemovedIntr) { - func_usr_sdmc_out = func_SDCARD_Out; //ユーザコールバック取得 - } - sdmcGoIdle( func_SDCARD_In, i_sdmcRemovedIntr); //カード初期化シーケンス - /*------------------*/ - PRINTDEBUG( "DEVTEST_CHANGED\n"); - return( DEVTEST_CHANGED); //挿さっている - }else{ - PRINTDEBUG( "DEVTEST_NOMEDIA\n"); - return( DEVTEST_NOMEDIA); //挿さってない - } - } - - case DEVCTL_WARMSTART: //attachのときしか呼ばれない - PRINTDEBUG( "DEVCTL_WARMSTART\n"); - /*-- GoIdleセット --*/ - if( func_SDCARD_Out != i_sdmcRemovedIntr) { - func_usr_sdmc_out = func_SDCARD_Out; //ユーザコールバック取得 - } - sdmcGoIdle( func_SDCARD_In, i_sdmcRemovedIntr); //カード初期化シーケンス - /*------------------*/ - pdr->drive_flags |= (DRIVE_FLAGS_VALID | DRIVE_FLAGS_REMOVABLE | DRIVE_FLAGS_PARTITIONED); - pdr->partition_number = 0; - - if( SDCARD_OutFlag == FALSE) { /* 排出フラグ参照 */ - pdr->drive_flags |= DRIVE_FLAGS_INSERTED; - }else{ /* カード未挿入のとき */ - pdr->drive_flags &= (~(DRIVE_FLAGS_INSERTED)); //抜かれているだけではVALIDフラグは落とさないらしい - } - return( 0); - - case DEVCTL_POWER_RESTORE: - PRINTDEBUG( "DEVCTL_POWER_RESTORE\n"); - break; - - case DEVCTL_POWER_LOSS: - PRINTDEBUG( "DEVCTL_POWER_LOSS\n"); - break; - - default: - PRINTDEBUG( "DEVCTL_unknown\n"); - break; - } - return( 0); -} - -/*---------------------------------------------------------------------------* - 抜取コールバック関数 - - RTFSが次回"DEVCTL_GET_GEOMETRY"を行うとき、ここでセットしたパラメータを知る - *---------------------------------------------------------------------------*/ -void i_sdmcRemovedIntr( void) -{ - DDRIVE *pdr; - - pdr = pc_drno_to_drive_struct( sdmc_drive_no); - if( pdr) { - pdr->dev_table_perform_device_ioctl( pdr->driveno, - DEVCTL_REPORT_REMOVE, - (void*)0); - } - - if( func_usr_sdmc_out) { - func_usr_sdmc_out(); //ユーザコールバック - } -} - - -/*---------------------------------------------------------------------------* - Name: sdmcRtfsAttach - - Description: sdmcドライバをドライブに割り当てる - - Arguments: driveno : ドライブ番号 - - Returns: - *---------------------------------------------------------------------------*/ -BOOL sdmcRtfsAttach( int driveno) -{ - BOOLEAN result; - DDRIVE pdr; - - pdr.dev_table_drive_io = sdmcRtfsIo; - pdr.dev_table_perform_device_ioctl = sdmcRtfsCtrl; - pdr.register_file_address = (dword) 0; /* Not used */ - pdr.interrupt_number = 0; /* Not used */ - pdr.drive_flags = 0;//DRIVE_FLAGS_FAILSAFE; - pdr.partition_number = 0; /* Not used */ - pdr.pcmcia_slot_number = 0; /* Not used */ - pdr.controller_number = 0; - pdr.logical_unit_number = 0; - - result = rtfs_attach( driveno, &pdr, "SD"); //構造体がFSライブラリ側にコピーされる - - /*drivenoをグローバル変数に記憶*/ - sdmc_drive_no = driveno; - - return( result); -} - - - -/*SD File System Specification(仕様書)に基づいた値を出す*/ -static void sdi_get_CHS_params( void) -{ - int mbytes; - -// mbytes = (sdmc_current_spec.card_capacity / (1024 * 1024)) * 512; - mbytes = (sdmc_current_spec.card_capacity >> 11); - - while( 1) { - if( mbytes <= 2) { - sdmc_current_spec.heads = 2; - sdmc_current_spec.secptrack = 16; - break; - } - if( mbytes <= 16) { - sdmc_current_spec.heads = 2; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 32) { - sdmc_current_spec.heads = 4; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 128) { - sdmc_current_spec.heads = 8; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 256) { - sdmc_current_spec.heads = 16; - sdmc_current_spec.secptrack = 32; - break; - } - if( mbytes <= 504) { - sdmc_current_spec.heads = 16; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 1008) { - sdmc_current_spec.heads = 32; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 2016) { - sdmc_current_spec.heads = 64; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 2048) { - sdmc_current_spec.heads = 128; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 4032) { - sdmc_current_spec.heads = 128; - sdmc_current_spec.secptrack = 63; - break; - } - if( mbytes <= 32768) { - sdmc_current_spec.heads = 255; - sdmc_current_spec.secptrack = 63; - break; - } - } - - /*シリンダ数を計算*/ - sdmc_current_spec.cylinders = (sdmc_current_spec.memory_capacity / - (sdmc_current_spec.heads * sdmc_current_spec.secptrack)); - - /*memory_capacityを再計算してadjusted_memory_capacityに格納*/ - sdmc_current_spec.adjusted_memory_capacity = sdmc_current_spec.cylinders * - (sdmc_current_spec.heads * sdmc_current_spec.secptrack); -} - - -/*引数を超える最も小さい整数を算出する*/ -static u32 sdi_get_ceil( u32 cval, u32 mval) -{ - return( (cval / mval) + (1 * (cval % mval != 0))); -} - - -/*マスターブートセクタのセクタ数を返す*/ -static void sdi_get_nom( void) -{ - u32 RSC = 1; //FAT12,16では1 - u32 RDE = 512; //ルートディレクトリエントリ。FIX - u32 SS = 512; //セクタサイズ。FIX - u32 TS, SC, n; - u32 MAX, SFdash; - - TS = sdmc_current_spec.adjusted_memory_capacity; - SC = sdmc_current_spec.SC; - - sdmc_current_spec.SF = sdi_get_ceil( TS/SC * sdmc_current_spec.FATBITS, SS*8); - - /*-----------------------SDHCのとき----------------------------*/ - if( sdmc_current_spec.csd_ver2_flag) { - sdmc_current_spec.NOM = sdmc_current_spec.BU; - do { - n = sdi_get_ceil( 2*sdmc_current_spec.SF, sdmc_current_spec.BU); - sdmc_current_spec.RSC = (sdmc_current_spec.BU * n) - ( 2 * sdmc_current_spec.SF); - if( sdmc_current_spec.RSC < 9) { - sdmc_current_spec.RSC += sdmc_current_spec.BU; - } - sdmc_current_spec.SSA = sdmc_current_spec.RSC + (2 * sdmc_current_spec.SF); - do { - MAX = ((TS - sdmc_current_spec.NOM - sdmc_current_spec.SSA) / SC) + 1; - SFdash = sdi_get_ceil( (2+(MAX-1)) * sdmc_current_spec.FATBITS, SS*8); - if( SFdash > sdmc_current_spec.SF) { - sdmc_current_spec.SSA += sdmc_current_spec.BU; - sdmc_current_spec.RSC += sdmc_current_spec.BU; - }else{ - break; - } - }while( 1); - if( SFdash != sdmc_current_spec.SF) { - sdmc_current_spec.SF -= 1; - }else{ - break; - } - }while( 1); - }else{ /*-------------------------SDのとき-------------------------------*/ - do { - sdmc_current_spec.SSA = RSC + ( 2 * sdmc_current_spec.SF) + sdi_get_ceil( 32*RDE, SS); - n = sdi_get_ceil( sdmc_current_spec.SSA, sdmc_current_spec.BU); - sdmc_current_spec.NOM = (sdmc_current_spec.BU * n) - sdmc_current_spec.SSA; - if( sdmc_current_spec.NOM != sdmc_current_spec.BU) { - sdmc_current_spec.NOM += sdmc_current_spec.BU; - } - do { - MAX = ((TS - sdmc_current_spec.NOM - sdmc_current_spec.SSA) / SC) + 1; - SFdash = sdi_get_ceil( (2+(MAX-1)) * sdmc_current_spec.FATBITS, SS*8); - if( SFdash > sdmc_current_spec.SF) { - sdmc_current_spec.NOM += sdmc_current_spec.BU; - }else{ - break; - } - }while( 1); - if( SFdash != sdmc_current_spec.SF) { - sdmc_current_spec.SF = SFdash; - }else{ - break; //complete - } - }while( 1); - } - - return; -} - -/*FATのビット数を返す*/ -static void sdi_get_fatparams( void) -{ - int mbytes; - -// mbytes = (sdmc_current_spec.card_capacity / (1024 * 1024)) * 512; - mbytes = (sdmc_current_spec.card_capacity >> 11); - - if( mbytes <= 64) { - sdmc_current_spec.FATBITS = 12; - sdmc_current_spec.RDE = 512; - sdmc_current_spec.RSC = 1; - }else{ - if( mbytes <= 2048) { - sdmc_current_spec.FATBITS = 16; - sdmc_current_spec.RDE = 512; - sdmc_current_spec.RSC = 1; - }else{ - sdmc_current_spec.FATBITS = 32; - sdmc_current_spec.RDE = 0; //FAT32のときは未使用。0にしておかないとRTFSが BAD FORMAT を返す。 - sdmc_current_spec.RSC = 1; - } - } - - if( mbytes <= 8) { - sdmc_current_spec.SC = 16; - sdmc_current_spec.BU = 16; - return; - } - if( mbytes <= 64) { - sdmc_current_spec.SC = 32; - sdmc_current_spec.BU = 32; - return; - } - if( mbytes <= 256) { - sdmc_current_spec.SC = 32; - sdmc_current_spec.BU = 64; - return; - } - if( mbytes <= 1024) { - sdmc_current_spec.SC = 32; - sdmc_current_spec.BU = 128; - return; - } - if( mbytes <= 2048) { - sdmc_current_spec.SC = 64; - sdmc_current_spec.BU = 128; - return; - } - if( mbytes <= 32768) { - sdmc_current_spec.SC = 64; - sdmc_current_spec.BU = 8192; - return; - } -} - -/*MBRセクタ(パーティションセクタ含む)を生成して書き込む*/ -static void sdi_build_partition_table( void) -{ - u16 MbrSectDat[512/2]; - u32 starting_head, starting_sect, starting_cyl; - u32 ending_head, ending_sect, ending_cyl; - u32 total_sect; -#if (SD_DEBUG_PRINT_ON == 1) - u32 starting_data, ending_data; -#endif - u32 systemid; - SdmcResultInfo SdResult; - - /**/ - starting_head = sdmc_current_spec.NOM % (sdmc_current_spec.heads * - sdmc_current_spec.secptrack); - starting_head /= sdmc_current_spec.secptrack; - - /**/ - starting_sect = (sdmc_current_spec.NOM % sdmc_current_spec.secptrack) + 1; - - /**/ - starting_cyl = sdmc_current_spec.NOM / (sdmc_current_spec.heads * - sdmc_current_spec.secptrack); - - /**/ - total_sect = (sdmc_current_spec.adjusted_memory_capacity - sdmc_current_spec.NOM); - ending_head = (sdmc_current_spec.NOM + total_sect - 1) % - (sdmc_current_spec.heads * sdmc_current_spec.secptrack); - ending_head /= sdmc_current_spec.secptrack; - - /**/ - ending_sect = ((sdmc_current_spec.NOM + total_sect - 1) % - sdmc_current_spec.secptrack) + 1; - - /**/ - ending_cyl = (sdmc_current_spec.NOM + total_sect - 1) / - (sdmc_current_spec.heads * sdmc_current_spec.secptrack); - - /**/ - if( sdmc_current_spec.FATBITS == 32) { //FAT32のとき - if( total_sect < 0xFB0400) { //8032.5MBが閾値(SD FileSystemSpec2.00参照) - systemid = 0x0B; /* FAT32 */ - }else{ - systemid = 0x0C; /* FAT32(拡張INT13対応) */ - } - }else{ //FAT12,FAT16のとき - if( total_sect < 32680) { - systemid = 0x01; /* FAT12 */ - }else if( total_sect < 65536) { - systemid = 0x04; /* FAT16(16MB〜32MB未満) */ - }else{ - systemid = 0x06; /* FAT16(32MB〜4GB) */ - } - } - - /*MBRセクタ(パーティションテーブル含む)作成*/ -#if (TARGET_OS_CTR == 1) - miCpuFill8( MbrSectDat, 0, 512); -#else - MI_CpuFill8( MbrSectDat, 0, 512); -#endif - MbrSectDat[446/2] = (starting_head<<8); - //上位8bit:starting_cylの下位8bit, 下位8bit:starting_cylの上位2bit + starting_sect 6bit. - MbrSectDat[448/2] = (starting_cyl<<8) + ((starting_cyl>>2) & 0xC0) + starting_sect; - MbrSectDat[450/2] = (ending_head<<8) + systemid; - //上位8bit:ending_cylの下位8bit, 下位8bit:ending_cylの上位2bit + ending_sect 6bit. - MbrSectDat[452/2] = (ending_cyl<<8) + ((ending_cyl>>2) & 0xC0) + ending_sect; - MbrSectDat[454/2] = sdmc_current_spec.NOM; - MbrSectDat[456/2] = (sdmc_current_spec.NOM>>16); - MbrSectDat[458/2] = total_sect; - MbrSectDat[460/2] = (total_sect>>16); - MbrSectDat[510/2] = 0xAA55; - /*セクタ0に書き込み*/ - sdmcWriteFifo( MbrSectDat, 1, 0, NULL, &SdResult); - - /**/ - PRINTDEBUG( "total sect : 0x%x\n", total_sect); - PRINTDEBUG( "starting head : 0x%x\n", starting_head); - PRINTDEBUG( "starting sect : 0x%x\n", starting_sect); - PRINTDEBUG( "starting cyl : 0x%x\n", starting_cyl); - PRINTDEBUG( "ending head : 0x%x\n", ending_head); - PRINTDEBUG( "ending sect : 0x%x\n", ending_sect); - PRINTDEBUG( "ending cyl : 0x%x\n", ending_cyl); - PRINTDEBUG( "\n"); -#if (SD_DEBUG_PRINT_ON == 1) - starting_data = (starting_cyl<<8) + ((starting_cyl>>2) & 0xC0) + starting_sect; - PRINTDEBUG( "starting data : 0x%x\n", starting_data); - ending_data = (ending_cyl<<8) + ((ending_cyl>>2) & 0xC0) + ending_sect; - PRINTDEBUG( "endign data : 0x%x\n", ending_data); -#endif -} - -//#endif /*(INCLUDE_SD)*/ diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdif.c b/build/libraries/fatfs/ARM7/rom_sdmc/sdif.c deleted file mode 100644 index e5064952..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdif.c +++ /dev/null @@ -1,1236 +0,0 @@ -/* - Project: TwlBrom SD Card driver - File: sd_card.c - - 2007, Research and Development Department, Nintendo. -*/ - -#include -//#include "sdmc_config.h" -//#include "sdif_reg.h" /* IP 対応レジスタ定義 */ -//#include "sdmc.h" -//#include "sdif_ip.h" /* IP 対応フラグ定義 */ - - -/* -#if (SD_DEBUG_PRINT_ON == 1) - #if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - #define PRINTDEBUG osTPrintf - #else - #include - #define PRINTDEBUG vlink_dos_printf - #endif -#else - #define PRINTDEBUG( ...) ((void)0) -#endif -*/ -// #define PRINTDEBUG OS_TPrintf - #define PRINTDEBUG( ...) ((void)0) - - -#define ADD_CHECK 1 - -/*********************************************************************** - グローバル -***********************************************************************/ -u16 SD_CID[8]; /* CID保存用 (Card IDentification register) : ID*/ -u16 SD_CSD[8]; /* CSD保存用 (Card Specific Data register) : spec*/ -u16 SD_OCR[2]; /* OCR保存用 (Operation Condition Register) : voltage and status*/ -u16 SD_SCR[4]; /* SCR保存用 (Sd card Configulation Register) : bus-width, card-ver, etc*/ -u16 SD_RCA; /* RCA保存用 (Relative Card Address register) : address*/ - -s16 SDCARD_MMCFlag; /* MMCカードフラグ */ -s16 SDCARD_SDHCFlag; /* SDHCカードフラグ(ここではPhysicalLayer2.0の意) */ -u16 SD_port_number; /* 現在のポート番号 */ - -/*********************************************************************** - 外部参照変数 -***********************************************************************/ -volatile SDMC_ERR_CODE SDCARD_ErrStatus; /* エラーステータス */ -vu32 SDCARD_Status; /* カードステータス */ -//extern volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ -//extern void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */ - -extern void SDCARD_TimerCheck( void); -extern void SYSFPGA_irq(void); - - - - - -void SD_DisableInfo( void); - - - -/*---------------------------------------------------------------------------* - Name: SD_Init - - Description: reset and initialize SD card interface - SDカードIPのリセットと初期設定 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_Init(void) -{ - SD_AndFPGA( SOFT_RST,(~(SOFT_RST_SDIF_RST))); /* SD I/F モジュールをリセット */ - SD_OrFPGA( SOFT_RST,((SOFT_RST_SDIF_RST))); /* SD I/F モジュールをリセット復帰 */ - - SD_AndFPGA( SD_STOP,(~SD_STOP_STP)); /* データ転送終了クリア */ -} - -/*---------------------------------------------------------------------------* - Name: SD_EnableInfo - - Description: enable SD card insert and remove interrupts. - SDカードの挿入/抜取 割り込みを許可する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_EnableInfo( void) -{ - if(SD_port_number == SDCARD_PORT0) - { - SD_AndFPGA(SD_INFO1,(~(SD_INFO1_INSERT | SD_INFO1_REMOVE))); /* SD_INFO1レジスタの card inserted removedをクリア */ - SD_AndFPGA(SD_INFO1_MASK,(~(SD_INFO1_MASK_INSERT | SD_INFO1_MASK_REMOVE))); /* 挿/抜 割り込み許可 */ - } - else if(SD_port_number == SDCARD_PORT1) - { /* ポート1はCD端子が繋がっていないので実質無効 */ - SD_AndFPGA(EXT_CD,(~(EXT_CD_PORT1_INSERT | EXT_CD_PORT1_REMOVE))); /* EXT_CD レジスタの card inserted removedをクリア */ - SD_AndFPGA(EXT_CD_MASK,(~(EXT_CD_MASK_PORT1INSERT | EXT_CD_MASK_PORT1REMOVE))); /* 挿抜 割り込み許可 */ - } -} -/*---------------------------------------------------------------------------* - Name: SD_DisableInfo - - Description: disable SD card insert and remove interrupts. - SDカードの挿入/抜取 割り込みを禁止する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_DisableInfo( void) -{ - if(SD_port_number == SDCARD_PORT0) - { - SD_AndFPGA(SD_INFO1,(~(SD_INFO1_INSERT | SD_INFO1_REMOVE))); /* SD_INFO1レジスタの card inserted removedをクリア */ - SD_OrFPGA(SD_INFO1_MASK,(SD_INFO1_MASK_INSERT | SD_INFO1_MASK_REMOVE)); /* 挿/抜 割り込み禁止 */ - } - else if(SD_port_number == SDCARD_PORT1) - { /* ポート1はCD端子が繋がっていないので実質無効 */ - SD_AndFPGA(EXT_CD,(~(EXT_CD_PORT1_INSERT | EXT_CD_PORT1_REMOVE))); /* EXT_CD レジスタの card inserted removedをクリア */ - SD_OrFPGA(EXT_CD_MASK,(EXT_CD_MASK_PORT1INSERT | EXT_CD_MASK_PORT1REMOVE)); /* 挿抜 割り込み禁止 */ - } -} - -/*---------------------------------------------------------------------------* - Name: SD_Command - - Description: send command that the card will response only. - コマンドを送出する(レスポンスが返ってくるだけのコマンド用) - - Arguments: ucCommand : command number - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_Command(u16 ucCommand) -{ - PRINTDEBUG( "command\n"); - SD_AndFPGA(SD_INFO2,(~SD_INFO2_ERR_ALLCLR)); /* SD Card I/F の 全エラーをクリア */ - SD_AndFPGA(SD_INFO1,(~SD_INFO1_RES_END)); /* SD_INFO1レジスタの Response end クリア */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み許可 */ - - SD_SetFPGA(SD_CMD,(ucCommand)); /* コマンド発行 */ - - while(!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_RES_END)){ /* Response end 待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if( (SD_INFO2 & SD_INFO2_MASK_ALLERRMASK) != 0) { //IPエラー発生? - SYSFPGA_irq(); - break; - } - if( SDCARD_ErrStatus != 0) { - break; - } - } - - /*ROM版はエラー割り込みが入らないためRES_ENDが立つとエラーを見逃すことがあるので最後にINFO2評価*/ - if( (SD_INFO2 & SD_INFO2_MASK_ALLERRMASK) != 0) { //IPエラー発生? - SYSFPGA_irq(); - } - - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の全エラー割込み禁止 */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_AppCommand - - Description: send apprication command. - アプリケーションコマンド(CMD55)を送出する - - Arguments: None - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_AppCommand(void) -{ - PRINTDEBUG( " CMD55 (APP_CMD)\n"); - - /* argumentをセット */ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits */ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - SD_Command(SD_CMD_CMD | APP_CMD); /* CMD55発行、レスポンス(R1)待ち */ - -#if ADD_CHECK - /*SD_CheckStatusを行うと、直前にCMD8を発行していた場合、SDHC以外はCardStatusの - IllegalCommandエラーフラグが立ってしまうので、ここで引っかかることになる - (このフラグがクリアされるのは1コマンドぶん遅れるため) - SD Physical Layer 仕様書の Card Status参照*/ -// SD_CheckStatus(FALSE); /* コマンドレスポンス(R1) の Card Status チェック */ -#endif - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_AppOpCond - - Description: get operating condition register data of SD card. - SDカードのACMD41を発行してOCRを取得する - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_AppOpCond(void) -{ - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウト以外のエラーをクリア */ - - while(!SDCARD_ErrStatus){ /* エラーが発生しない間は繰り返し */ - /* Argument(31:0) = OCR without busy (0x00100000 = 3.2-3.3V) */ - /*ホスト側で電圧を選択できる場合などは、初回にSD_ARG1を0にすることにより - カードが対応している電圧を問い合わせることができる。CTRは電圧3.3V決め打ち - なので問い合わせせず、いきなり3.3V対応をカードに要求する。対応できない - カードは Inactive Mode に移行する。*/ - SD_SetFPGA(SD_ARG0,(0x0000)); - if( SDCARD_SDHCFlag) { - SD_SetFPGA(SD_ARG1,(0x4010)); - }else{ - SD_SetFPGA(SD_ARG1,(0x0010)); - } - - PRINTDEBUG( " ACMD41 (SD_SEND_OP_COND)\n"); - SD_Command(SD_CMD_ACMD | SD_APP_OP_COND); /* ACMD41発行、レスポンス(R3)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?)*/ - SD_GetFPGA(SD_OCR[0],SD_RSP0); /* レスポンス(R3)からOCR取得 */ - SD_GetFPGA(SD_OCR[1],SD_RSP1); /* レスポンス(R3)からOCR取得 */ - if(SD_RSP1 & RSP_R3_OCR31){ /* OCR(レジスタ)の31bit目チェック(busy?) */ - break; - } - } - SD_AppCommand(); /* 決定済みのRCAを設定しCMD55発行 */ - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendOpCond - - Description: send CMD1 without busy for MMC - MMC の CMD1を発行する(SDのACMD41に位置するコマンド) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendOpCond(void) -{ - PRINTDEBUG( " CMD1 (SEND_OP_COND)\n"); - - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウトエラーをクリア */ - - while(!SDCARD_ErrStatus){ /* エラーが発生しない間は繰り返し */ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) for MMC (None for SD) */ - SD_SetFPGA(SD_ARG1,(0x0010)); /* Argument(31:16) for MMC (None for SD) */ - SD_Command(SD_CMD_CMD | SEND_OP_COND); /* CMD1発行、レスポンス(R1)待ち */ - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_GetFPGA(SD_OCR[0],SD_RSP0); - SD_GetFPGA(SD_OCR[1],SD_RSP1); - if(SD_RSP1 & RSP_R3_OCR31){ /* OCR(レジスタ)の31bit目チェック(busy?) */ - break; - } - } - } - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: SD_SendIfCond - - Description: send CMD8 - CMD8を発行する(Physical Layer 2.00で追加されたコマンド) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendIfCond(void) -{ -#if 0 - PRINTDEBUG( " CMD8 (SEND_IF_COND)\n"); - - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウトエラーをクリア */ - - /* (31:12) Reserved bits, (11:8) supply voltage(VHS), (7:0) check pattern */ - SD_SetFPGA(SD_ARG0,(0x01AA)); /* Argument */ - SD_SetFPGA(SD_ARG1,(0x0000)); /* Argument */ - - SD_Command(SD_CMD_CMD | SEND_IF_COND_EXT); /* CMD8発行、レスポンス(R7)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SDCARD_SDHCFlag = TRUE; /* SDHC */ -// SD_GetFPGA(SD_R7[0],SD_RSP0); -// SD_GetFPGA(SD_R7[1],SD_RSP1); - }else{ -#endif - SDCARD_SDHCFlag = FALSE; -#if 0 - } -#endif - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendRelativeAddr - - Description: send relative addr - CMD3を発行し、SDカードの場合はレスポンスのRCAを取得する - (RCAは他のコマンド発行時にArgumentとして必要) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendRelativeAddr(void) -{ - PRINTDEBUG( " CMD3 (SEND_RELATIVE_ADDR)\n"); - - if(SDCARD_MMCFlag){ /* MMCカードフラグ ON ? */ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) */ - SD_SetFPGA(SD_ARG1,(0x0001)); /* Argument(31:16) = 0x0001 (松下drvはなぜか0x0100にしていた) */ - } /* SDカードのときはArgument(31:0) = stuff bits */ - - SD_Command(SD_CMD_CMD | SEND_RELATIVE_ADDR); /* CMD3発行、レスポンス(R6)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - if(SDCARD_MMCFlag){ /* MMCカードフラグ ON ? */ - SD_RCA = 0x0001; /* RCA <- 1 (松下drvはなぜか0x0100にしていた) */ - }else{ - SD_GetFPGA(SD_RCA,SD_RSP1); /* レスポンスレジスタからRCAを取得 */ - } - } - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SelectCard - - Description: toggle card between the stand-by and transfer states. - CMD7を発行してスタンバイモードと転送モードを切り替える - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SelectCard(void) -{ - PRINTDEBUG( " CMD7 (SELECT#/DESELECT_CARD)\n"); - - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits*/ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - SD_Command(SD_CMD_CMD | SELECT_CARD); /* CMD7発行、レスポンス(R1b)待ち */ - -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1) の Card Status チェック */ -#endif - - return SDCARD_ErrStatus; - -} - -/*---------------------------------------------------------------------------* - Name: SD_SetBlockLength - - Description: set of block length. - SDカードのブロックレングスを設定する。 - 注意:multiple read のときに SD_SIZEレジスタに512以外の値を - 設定すると正しく動作しない(IP reg spec資料より)。 - - Arguments: ulBlockLength : bytes of a block ( must be multiplier of 2) - (memo : the default block length is as specified in the CSD.) - 1ブロックの長さ:2の乗数を指定すること - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SetBlockLength(u32 ulBlockLength) -{ - u16 usValue; - - PRINTDEBUG( " CMD16 (SET_BLOCKLEN)\n"); - - /*------- IPの transfer length を設定 -------*/ - if(ulBlockLength == 512){ - SD_SetFPGA(SD_SIZE,(SD_SIZE_DATA_LENGTH_512B)); /* SDカードデータ転送サイズ 512Bytes 設定 */ - }else{ - usValue = (u16)ulBlockLength; /* 16bitに変換 */ - SD_SetFPGA(SD_SIZE,(usValue)); /* IPにSDカードデータ転送サイズを設定 */ - }/*------------------------------------------*/ - - /*------- カードの設定 -------*/ - /* argument(31:0) = block length */ - SD_SetFPGA(SD_ARG0,(((LELONG *)&ulBlockLength)->dt2word.low)); - SD_SetFPGA(SD_ARG1,(((LELONG *)&ulBlockLength)->dt2word.high)); - - SD_Command(SD_CMD_CMD | SET_BLOCKLEN); /* CMD16発行、レスポンス(R1)待ち */ -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1) の Card Status チェック */ -#endif - /*----------------------------*/ - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: SD_SendCID - - Description: get card identification data (128bits). - SDカードのCID値を取得する - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendCID(void) -{ - PRINTDEBUG( " CMD2 (ALL_SEND_CID)\n"); - /* Argument(31:0) = stuff bits */ - SD_Command(SD_CMD_CMD | ALL_SEND_CID); /* CMD2発行、レスポンス(R2)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_GetFPGA(SD_CID[0],SD_RSP0); - SD_GetFPGA(SD_CID[1],SD_RSP1); - SD_GetFPGA(SD_CID[2],SD_RSP2); - SD_GetFPGA(SD_CID[3],SD_RSP3); - SD_GetFPGA(SD_CID[4],SD_RSP4); - SD_GetFPGA(SD_CID[5],SD_RSP5); - SD_GetFPGA(SD_CID[6],SD_RSP6); - SD_GetFPGA(SD_CID[7],SD_RSP7); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendCSD - - Description: get card specific data - SDカードのCSD値を取得する - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendCSD(void) -{ - PRINTDEBUG( " CMD9 (SEND_CSD)\n"); - - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits */ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - SD_Command(SD_CMD_CMD | SEND_CSD); /* CMD9発行、レスポンス(R2)待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_GetFPGA(SD_CSD[0],SD_RSP0); - SD_GetFPGA(SD_CSD[1],SD_RSP1); - SD_GetFPGA(SD_CSD[2],SD_RSP2); - SD_GetFPGA(SD_CSD[3],SD_RSP3); - SD_GetFPGA(SD_CSD[4],SD_RSP4); - SD_GetFPGA(SD_CSD[5],SD_RSP5); - SD_GetFPGA(SD_CSD[6],SD_RSP6); - SD_GetFPGA(SD_CSD[7],SD_RSP7); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendStatus - - Description: send status read command (compatible to the MMC protocol). - マルチメディアカード互換方式でのstatus取得コマンド発行 - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendStatus(void) -{ - PRINTDEBUG( " CMD13 (Send STATUS)\n"); - - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:0) = stuff bits */ - SD_SetFPGA(SD_ARG1,(SD_RCA)); /* Argument(31:16) = RCA */ - - /* カード排出の重複を防ぐため */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_ERR_ALLCLR)); /* SD Card I/F の 全てのエラーをクリア */ - SD_AndFPGA(SD_INFO1,(~SD_INFO1_RES_END)); /* SD_INFO1レジスタの Response end クリア */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み許可 */ - - SD_SetFPGA(SD_CMD,(SD_CMD_CMD | SD_SEND_STATUS)); /* CMD13発行 */ - - while(!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_RES_END)){ /* Response end (R1)待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if( (SD_INFO2 & SD_INFO2_MASK_ALLERRMASK) != 0) { //IPエラー発生? - SYSFPGA_irq(); - break; - } - if( SDCARD_ErrStatus != 0) { - break; - } - } - - /*ROM版はエラー割り込みが入らないためRES_ENDが立つとエラーを見逃すことがあるので最後にINFO2評価*/ - if( (SD_INFO2 & SD_INFO2_MASK_ALLERRMASK) != 0) { //IPエラー発生? - SYSFPGA_irq(); - } - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み禁止 */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SendSCR - - Description: get condition data. - SDカード内のSCRレジスタ値取得コマンド発行。この後カードは - DATライン経由で1ブロック(8Bytesに設定しておくこと)送信してくる。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendSCR(void) -{ - PRINTDEBUG( " ACMD51 (Send SCR)\n"); - /* Argument(31:0) = stuff bits */ -#if ADD_CHECK - SD_TransReadyFPGA(); /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/ - - SD_TransCommand((SD_CMD_ACMD | SEND_SCR)); /* SCR取得コマンド発行、レスポンス(R1)待ち */ -#endif - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SDStatus - - Description: send status read command (for SD card only). - SDカード専用方式でのstatus取得コマンド発行。この後カードは - DATライン経由で1ブロック(64Bytesに設定しておくこと)送信してくる。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SDStatus(void) -{ - PRINTDEBUG( " ACMD13 (SD_SD STATUS)\n"); - /* Argument(31:0) = stuff bits */ - SD_TransReadyFPGA(); /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/ - - SD_TransCommand((SD_CMD_ACMD | SD_STATUS)); /* ACMD13 Send the SD_CARD status コマンド発行、レスポンス(R1)待ち */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_MultiReadBlock - - Description: send multiple block read command. - マルチブロックリードコマンド発行。この後カードは - DATライン経由でデータを送信してくる。 - - Arguments: ulOffset : offset address to read(BYTE). - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_MultiReadBlock(u32 ulOffset) -{ - PRINTDEBUG( " CMD18 (READ_MULTIPLE_BLOCK)\n"); - - SD_TransReadyFPGA(); /* INFOレジスタ初期化 */ - if( !SDCARD_UseFifoFlag) { /* FIFOを使わないとき */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読出し要求割込み許可*/ - } - - /* 読み込み開始アドレス(オフセット)設定 */ - SD_SetFPGA(SD_ARG0,(((LELONG *)&ulOffset)->dt2word.low)); - SD_SetFPGA(SD_ARG1,(((LELONG *)&ulOffset)->dt2word.high)); - - SD_TransCommand((READ_MULTIPLE_BLOCK)); /* CMD18(マルチセクタリードコマンド)発行、レスポンス(R1)待ち */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_ClockDivSet - - Description: set clock speed into the SD card. - (notice : clock into IP is 33.51MHz.) - (memo : default clock is 262KHz.) - SDカードへのクロック速度を設定する。CTRからIMCLK端子でIPに供給 - される基本クロックは33.51MHz。 - 起動直後のデフォルトでは128分周(262KHz)が設定されている。 - - Arguments: CSD responce include "TRAN_SPEED". - 予めCSDをSDカードから読み出しておいた、TRAN_SPEEDが入っている - 部分のCSD(CSD[5])。SDカード側で対応可能な周波数を参照するため。 - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 SD_ClockDivSet(u16 usTranSpeed) -{ - u16 usTranTime; - - //CTRでは、IMCLKに入力されるクロックは 33.51Mhz - //SD_CLK_CTRL の default値は 0x0020( 128分周 = 262kHz) - /*------*/ - usTranTime = (u16)((usTranSpeed >> 11) & 0x000F); /* CSD[103:96] の time value(=4bit) 取得 */ - - usTranSpeed &= CSD_TRANSFER_RATE; /* CSD[103:96] の transfer rate unit を取得 */ - usTranSpeed = (u16)(usTranSpeed >> 8); /* transfer rate unit を下位8ビットに設定する */ - /*------*/ - - - switch( usTranSpeed) { - /*--- 100kbit/s(one dat line) = 100KHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_100K: - if(usTranTime > 0x000C){ /* time value が 5.5 より大きい? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_64)); /* 523KHz */ - } - else{ - if(usTranTime > 0x0006){ /* time value が 2.5 より大きい? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_128)); /* 262KHz */ - }else{ - if( usTranTime == 1) { /* time value が 1.0 ? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_512)); /* 65KHz */ - }else{ /* time value が 1.2〜2.5 のとき */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_256)); /* 131KHz */ - } - } - } - break; - /*--- 1Mbit/s(one dat line) = 1MHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_1M: - if(usTranTime == 0x0001){ /* time value が 1.0 ? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_64)); /* 523KHz */ - } - else{ - if(usTranTime <= 0x0005){ /* time value が 2.0 以下? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_32)); /* 1.05MHz */ - } - else{ - if(usTranTime <= 0x0009){ /* time value が 4.0 以下? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_16)); /* 2.095MHz */ - }else{ /* time value が 4.5 以上のとき */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_8)); /* 4.18MHz */ - } - } - } - break; - /*--- 10Mbit/s(one dat line) = 10MHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_10M: - if(usTranTime > 0x0004){ /* time value が 1.5 より大きい? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_2)); /* 16.76MHz */ - }else{ /* time value が 1.5 以下のとき */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_4)); /* 8.38MHz */ - } - break; - /*--- 100Mbit/s(one dat line) = 100MHz, の倍数のとき ---*/ - case CSD_TRAN_SPEED_100M: /* time value がどんな値であっても */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_2)); /* 16.76MHz */ - break; - default: - if( usTranSpeed != 7) { /* reserved値(=7)以外か? */ - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_2)); /* 16.76MHz */ - } /* (松下drvでは、4以上なら288KHzにしている) */ - break; /* transfer rate unit が 7 のときは何もしない */ - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_EnableClock - - Description: enable clock - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_EnableClock( void) -{ - SD_OrFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_SDCLKEN)); -} - -/*---------------------------------------------------------------------------* - Name: SD_DisableClock - - Description: disable clock (for power save). - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_DisableClock( void) -{ - SD_AndFPGA(SD_CLK_CTRL,(~SD_CLK_CTRL_SDCLKEN)); -} - - -/*---------------------------------------------------------------------------* - Name: SD_SelectBitWidth - - Description: set bus width for SD Card ( Not for MMC Card). - (The allowed data bus widths are given in SCR register.) - SDカードのDATラインバス幅を1bitまたは4bitに設定する。 - SDカードが4bitに対応していないか、MMCカードの場合はバス幅を4bitに - 設定することはできない。SDカードの許容するバス幅は、予め取得済みの - SCRレジスタによって参照している。 - - Arguments: b4bit : TRUE = 4bit, FALSE = 1bit - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 SD_SelectBitWidth(s16 b4bit) -{ - /*--- カードの仕様(SCR)を参照 ---*/ -#if ADD_CHECK - if( b4bit){ /* SCRレジスタがリード済であること! */ - if( !(SD_SCR[0] & SCR_DAT_BUS_WIDTH_4BIT)) { /* カードが4bit幅に対応していないか? */ - b4bit = FALSE; /* 対応していない場合は1bit幅を指定しておく */ - } - }/*------------------------------*/ -#endif - /*--- 4bit(TRUE) 指定のとき ---*/ - if(b4bit){ - if(!SDCARD_MMCFlag){ /* MMCカードフラグ OFF?(ONなら何もしない) */ - if(SD_AppCommand()){ /* RCA設定後 CMD55発行 */ - return SDCARD_ErrStatus; /* CMD55が正常終了しなかったらエラー終了 */ - } - SD_SetFPGA(SD_ARG0,(0x0002)); /* Argument(1:0) = (10) to 4bit,(00) to 1bit */ - SD_SetFPGA(SD_ARG1,(0x0000)); /* Argument(31:2) = stuff bits */ - PRINTDEBUG( " ACMD6 (SET_BUS_WIDTH:4bit)\n"); - SD_Command(SD_CMD_ACMD | SET_BUS_WIDTH); /* ACMD6(ビット幅選択コマンド)発行、レスポンス(R1)待ち */ -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ -#endif - if(!SDCARD_ErrStatus){ /* エラーなし? */ - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - } - } - }/*--- 1bit(FALSE) 指定のとき ---*/ - else{ - if(!SDCARD_MMCFlag){ /* MMCカードフラグ OFF?(ONなら何もしない) */ - if(SD_AppCommand()){ /* RCA設定後 CMD55発行処理 */ - return SDCARD_ErrStatus; /* CMD55が正常終了しなかったらエラー終了 */ - } - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(1:0) = bus width : 1bit */ - SD_SetFPGA(SD_ARG1,(0x0000)); /* Argument(31:2) = stuff bits */ - PRINTDEBUG( " ACMD6 (SET_BUS_WIDTH:1bit)\n"); - SD_Command(SD_CMD_ACMD | SET_BUS_WIDTH); /* ACMD6(ビット幅選択コマンド)発行、レスポンス(R1)待ち */ -#if ADD_CHECK - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ -#endif - } - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー無し?) */ - SD_OrFPGA(SD_OPTION,(SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(1bit幅) */ - } - }/*------------------------------*/ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: MMCP_WriteBusWidth - - Description: set bus width for SD Card ( Not for MMC Card). - (The allowed data bus widths are given in SCR register.) - MMCplusカードのDATラインバス幅を1bitまたは4bitに設定する。 - SDまたはMMCカードの場合はバス幅を4bitに設定することはできない。 - - Arguments: b4bit : TRUE = 4bit, FALSE = 1bit - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 MMCP_WriteBusWidth(s16 b4bit) -{ - if( !SDCARD_MMCFlag) { - return 1; - } - - /* 書き込み開始オフセット設定 */ - if( b4bit) { - SD_SetFPGA(SD_ARG0,(0x0100)); /* Argument(15:8)=(0x1) to 4bit,(0x0) to 1bit */ - }else{ - SD_SetFPGA(SD_ARG0,(0x0000)); /* Argument(15:8)=(0x1) to 4bit,(0x0) to 1bit */ - } - SD_SetFPGA(SD_ARG1,(0x03B7)); /* Argument(25:24)=(0x3)Write, (23:16)=(183)Index */ - - /* CMD6(ビット幅選択コマンド)発行、レスポンス(R1)待ち */ - SD_Command(SD_CMD_CMD | EXT_CSD_ACCESS); - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: MMCP_BusTest - - Description: バスのテストを行う。 - この後カードにDATライン経由でデータを送信する必要がある。 - - Arguments: readflag : リード時TRUE, ライト時FALSE - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -u16 MMCP_BusTest( BOOL readflag) -{ - /**/ - SD_TransReadyFPGA(); /* INFOレジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */ - - /**/ - SD_SetFPGA( SD_ARG0, 0); - SD_SetFPGA( SD_ARG1, 0); - - if( readflag) { - SD_TransCommand( 14); - }else{ - SD_TransCommand( 19); - } - - return( SDCARD_ErrStatus); -} - - -/*---------------------------------------------------------------------------* - Name: SD_FPGA_irq - - Description: handler of data transfer request interrupt from card, - check and clear interrupt register of IP. - カードからの転送要求(BREまたはBWE)割り込み発生時に - どちらかを調べて返し、INFO2の当該割り込み要求フラグをクリアする。 - - Arguments: None - - Returns: TRUE : BRE割り込み発生 - FALSE : BWE割り込み発生 - *---------------------------------------------------------------------------*/ -BOOL SD_FPGA_irq(void) -{ - /*--- FIFOを使うとき ---*/ - if( SDCARD_UseFifoFlag) { - if( SD_CheckFPGAReg( *SDIF_CNT_L, (u16)SDIF_CNT_FFIE)) { /* FULL割り込み許可のとき */ - return TRUE; - }else{ - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求あり? */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable リセット*/ - } - return FALSE; - } - }else{ /*--- FIFOを使わないとき ---*/ - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BRE)){ /* SDカードからのデータ読出し要求あり? */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BRE)); /* SD用バッファ制御 Read Enable リセット*/ - return TRUE; - } - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求あり? */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable リセット*/ - return FALSE; - } - } - return FALSE; -} - -/*---------------------------------------------------------------------------* - Name: SD_StopTransmission - - Description: manual send CMD12 to terminate translate. - 手動でCMD12を発行し、転送終了をFPGAに通知する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_StopTransmission(void) -{ - SD_OrFPGA(SD_STOP,(SD_STOP_STP)); /* データ転送終了設定 */ -} - -/*---------------------------------------------------------------------------* - Name: SD_TransEndFPGA - - Description: clear the transfer interrupt. - カード転送終了時に転送関連の割り込みを禁止に戻しておく - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_TransEndFPGA(void) -{ - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み禁止 */ - SD_OrFPGA(SD_INFO1_MASK,(SD_INFO1_MASK_ALL_END)); /* R/W アクセス終了割込み禁止 */ - - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BRE)){ /* SDカードからのデータ読込み要求割込み許可か? */ - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_BRE)); /* SDカードからのデータ読込み要求割込み禁止 */ - } - if(!SD_CheckFPGAReg(SD_INFO2_MASK,SD_INFO2_MASK_BWE)){ /* SDカードからのデータ書込み要求割込み許可か? */ - SD_OrFPGA(SD_INFO2_MASK,(SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み禁止 */ - } -} - -/*---------------------------------------------------------------------------* - Name: SD_CheckStatus - - Description: check the card status in the R1. - R1レスポンスのカードステータスをチェックする - - Arguments: bRead : 読み込み処理時 = TRUE - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_CheckStatus(BOOL bRead) -{ - /* コマンドレスポンス(R1)の[39:8] から Card status を取得 */ - SD_GetFPGA((((LELONG *)&SDCARD_Status)->dt2word.low),SD_RSP0); - SD_GetFPGA((((LELONG *)&SDCARD_Status)->dt2word.high),SD_RSP1); - - /*--- 松下サンプルドライバでやっている処理 ---*/ - if(bRead){ /* リード時か? */ - if(!(SDCARD_ErrStatus & SDMC_ERR_TIMEOUT)){ /* タイムアウト発生していないか? */ - SDCARD_Status &= ~SDCARD_STATUS_OUT_OF_RANGE; /* OUT_OF_RANGEフラグを落とす */ - } - }/*-------------------------------------------*/ - - PRINTDEBUG( " SD_CheckStatus ======== 0x%x\n", SDCARD_Status); - - if(SDCARD_Status & RSP_R1_STATUS_ERR){ /* コマンドレスポンス(R1)のカードステータスがエラーか確認 */ - SD_SetErr(SDMC_ERR_R1_STATUS); /* コマンドレスポンス(R1)のカードステータス エラー */ - } - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_SwapByte - - Description: swap bytes in a 16bit data. - 16bitデータの上位と下位を入れ換える - - Arguments: data : 16bit data - - Returns: swapped data - *---------------------------------------------------------------------------*/ -u16 SD_SwapByte(u16 *data) -{ - u16 usDATA; - - usDATA = *data; - usDATA = (u16)(((usDATA & 0x00FF) << 8) | ((usDATA & 0xFF00) >> 8)); - - return usDATA; -} - -/*---------------------------------------------------------------------------* - Name: SD_EnableSeccnt - - Description: enable SD_SECCNT register. - SD_SECCNT を有効化して値をセットする。 - - Arguments: ulSDCARD_SectorCount : セクタカウント値(1セクタ=512byte) - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_EnableSeccnt( u32 ulSDCARD_SectorCount) -{ - u16 usSector; - - usSector = (u16)ulSDCARD_SectorCount; - SD_OrFPGA(SD_STOP,SD_STOP_SEC_ENABLE); /* SD_SECCNTレジスタを有効にする */ - SD_SetFPGA(SD_SECCNT,usSector); /* SD_SECCNTレジスタに転送セクタカウントを設定 */ -} - -/*---------------------------------------------------------------------------* - Name: SD_DisableSeccnt<現在は未使用関数> - - Description: disable SD_SECCNT register. - SD_SECCNT を無効化する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_DisableSeccnt( void) -{ - u16 i; - - /*--- 松下ドライバでやっていること ---*/ - for ( i=0; i<50000; i++) /* カウント値50000では足りないことあり */ - { /* SD_INFO1レジスタの R/W access all end 待ち */ - if(SD_CheckFPGAReg(SD_INFO1,SD_INFO1_ALL_END)) { - break; - } - }/*-----------------------------------*/ - SD_AndFPGA(SD_STOP,(~SD_STOP_SEC_ENABLE)); /* SD_SECCNTレジスタを無効にする */ -} - -/*---------------------------------------------------------------------------* - Name: SD_SetErr - - Description: set error flag - 指定のエラーフラグをセットする - - Arguments: Error : error flag to set - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_SetErr(u16 Error) -{ - OSIntrMode irq_core_flag; - -#if (TARGET_OS_CTR == 1) - irq_core_flag = osDisableInterrupts(); /* 割込み禁止 */ - SDCARD_ErrStatus |= Error; /* エラーステータスを設定 */ - osRestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#else - irq_core_flag = OS_DisableInterrupts(); - SDCARD_ErrStatus |= Error; /* エラーステータスを設定 */ - OS_RestoreInterrupts( irq_core_flag); -#endif -} - -/*---------------------------------------------------------------------------* - Name: SD_ClrErr - - Description: clear error flag - 指定のエラーフラグをクリアする - - Arguments: Error : error flag to clear - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_ClrErr(u16 Error) -{ - OSIntrMode irq_core_flag; - -#if (TARGET_OS_CTR == 1) - irq_core_flag = osDisableInterrupts(); /* 割込み禁止 */ - SDCARD_ErrStatus &= ~(Error); /* エラーステータスをクリア */ - osRestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#else - irq_core_flag = OS_DisableInterrupts(); /* 割込み禁止 */ - SDCARD_ErrStatus &= ~(Error); /* エラーステータスをクリア */ - OS_RestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#endif -} - - -/*---------------------------------------------------------------------------* - Name: SD_TransReadyFPGA - - Description: setup for the command that the card will response and request data transfer. - DATラインでのデータ転送が発生するコマンド発行前の転送準備 - (BRE, BWE割り込みの許可は別途行うこと) - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SD_TransReadyFPGA(void) -{ - /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_ERR_ALLCLR)); /* SD Card I/F の 全てのエラーをクリア */ - SD_AndFPGA(SD_INFO1,(~(SD_INFO1_RES_END | SD_INFO1_ALL_END))); /* SD_INFO1レジスタの Response end と access all end クリア */ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BRE)); /* SD用バッファ制御 Read Enable クリア*/ - SD_AndFPGA(SD_INFO2,(~SD_INFO2_BWE)); /* SD用バッファ制御 Write Enable クリア*/ - SD_AndFPGA(SD_STOP,(~SD_STOP_STP)); /* データ転送終了クリア */ - - /* 割り込み関連許可 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_ALLERRMASK)); /* SD Card I/F の 全エラー割込み許可 */ - SD_AndFPGA(SD_INFO1_MASK,(~SD_INFO1_MASK_ALL_END)); /* R/W access all end 割込み許可(Responseはポーリングで見るため許可しない) */ -} - - -/*---------------------------------------------------------------------------* - Name: SD_TransCommand - - Description: send command that the card will response and request data transfer. - コマンドを送出する(DATラインでのデータ転送が発生するコマンド用) - - Arguments: ucCommand : command number - - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -u16 SD_TransCommand(u16 ucCommand) -{ - SD_SetFPGA(SD_CMD,(ucCommand)); /* コマンド発行 */ - - while(!SD_CheckFPGAReg(SD_INFO1,SD_INFO1_RES_END)){ /* Response end 待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if( (SD_INFO2 & SD_INFO2_MASK_ALLERRMASK) != 0) { //IPエラー発生? - SYSFPGA_irq(); - break; - } - if( SDCARD_ErrStatus != 0) { - break; - } - } - - /*ROM版はエラー割り込みが入らないためRES_ENDが立つとエラーを見逃すことがあるので最後にINFO2評価*/ - if( (SD_INFO2 & SD_INFO2_MASK_ALLERRMASK) != 0) { //IPエラー発生? - SYSFPGA_irq(); - } - - SD_CheckStatus(FALSE); /* R1レスポンスのcard statusチェック*/ - - if(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS){ - SD_StopTransmission(); /* カード転送終了をFPGAに通知 */ - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_CheckFPGAReg - - Description: check register bits. - レジスタの状態をチェックする - - Arguments: reg : 16bit register data - value : mask data - - Returns: TRUE : some of mask data bits are 1 on the register. - FALSE : no mask data bits is 1 on the register. - *---------------------------------------------------------------------------*/ -BOOL SD_CheckFPGAReg(u16 reg,u16 value) -{ - if( reg & value) { - return TRUE; - }else{ - return FALSE; - } -} - -/*---------------------------------------------------------------------------* - Name: SD_SendNumWRSectors - - Description: send "number of well written blocks" command (for SD card only). - SDカード専用方式でのライト済みセクタ数取得コマンド発行。この後カードは - DATライン経由で1ブロック(4Bytesに設定しておくこと)送信してくる。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_SendNumWRSectors(void) -{ - PRINTDEBUG( " ACMD22 (SEND_NUM_WR_SECTORS)\n"); - /* Argument(31:0) = stuff bits */ - SD_TransReadyFPGA(); /* 関連レジスタ初期化 */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BRE)); /* SDカードからのデータ読込み要求割込み許可 */ - - SD_TransCommand((SD_CMD_ACMD | SEND_NUM_WR_SECTORS)); /* ACMD22(書きこみ完了セクタ数取得コマンド)発行、レスポンス(R1)待ち */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SD_MultiWriteBlock - - Description: send multiple block write command. - マルチブロックライトコマンド発行。この後カードに - DATライン経由でデータを送信する必要がある。 - - Arguments: ulOffset : offset address to write(BYTE). - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -u16 SD_MultiWriteBlock(u32 ulOffset) -{ - PRINTDEBUG( " CMD25 (WRITE_MULTIPLE_BLOCK)\n"); - - SD_TransReadyFPGA(); /* INFOレジスタ初期化 */ -// if( !SDCARD_UseFifoFlag) { /* FIFOを使わないとき */ - SD_AndFPGA(SD_INFO2_MASK,(~SD_INFO2_MASK_BWE)); /* SDカードからのデータ書込み要求割込み許可 */ -// } - - /* 書き込み開始オフセット設定 */ - SD_SetFPGA(SD_ARG0,(((LELONG *)&ulOffset)->dt2word.low)); - SD_SetFPGA(SD_ARG1,(((LELONG *)&ulOffset)->dt2word.high)); - - SD_TransCommand(WRITE_MULTIPLE_BLOCK); /* CMD25(マルチセクタライトコマンド)発行 */ - - return SDCARD_ErrStatus; -} - - diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdif_ip.h b/build/libraries/fatfs/ARM7/rom_sdmc/sdif_ip.h deleted file mode 100644 index 83e2a67a..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdif_ip.h +++ /dev/null @@ -1,349 +0,0 @@ -/* -** Copyright (c) 2000-2001 Matsushita Electric Industrial Co., Ltd. -** All Rights Reserved. -*/ - -/* -** $Module SDカードアクセスモジュール・インクルード -** $Filename SD_CARD_IP.H -** $Version 1.0 版 -** $Date 01/02/16 -** $Log 01/02/16 rev1.0作成 -** 松下電器産業(株)半導体開発本部 -*/ - - -#ifndef __SD_CARD_IP_H__ -#define __SD_CARD_IP_H__ - -//#define IO3 0 /* Insert Remove SW = FALSE IO3 = TRUE */ - -//#define MAX_SD_CLOCK_4M 0 /* MAX SD Clock 4.608MHz */ -//#define MAX_SD_CLOCK_9M 1 /* MAX SD Clock 9.216MHz */ - - -/*--------------------------------------------- - ラッパーレジスタのビット制御(フラグ定義) ----------------------------------------------*/ -/* SD_CNTレジスタ */ -#define SDIF_CNT_USEDTC (0x0001) /* DTC使用フラグ (R/W) */ -#define SDIF_CNT_USEFIFO (0x0002) /* FIFO使用フラグ (R/W) */ -#define SDIF_CNT_FULL (0x0100) /* FIFO FULLフラグ (RO) */ -#define SDIF_CNT_NEMP (0x0200) /* FIFO NOT EMPTYフラグ (RO) */ -#define SDIF_CNT_FCLR (0x0400) /* FIFO クリアフラグ (WO) */ -#define SDIF_CNT_FFIE (0x0800) /* FIFO FULLで割り込み (R/W) */ -#define SDIF_CNT_FEIE (0x1000) /* FIFO EMPTYで割り込み (R/W) */ - -#define SDCARD_UseFifoFlag ((*SDIF_CNT) & SDIF_CNT_USEFIFO) - -/*------------------------------------- -レジスタのビット制御(フラグ定義) --------------------------------------*/ -/* SD_CMDレジスタ*/ -#define SD_CMD_CMD 0x0000 /* SDカードへの通常アクセス(CMD) */ -#define SD_CMD_ACMD 0x0040 /* SDカードへのセキュリティアクセス(ACMD) */ - -/* SD_STOPレジスタ */ -#define SD_STOP_STP 0x0001 /* データ転送終了を知らせる */ -#define SD_STOP_SEC_ENABLE 0x0100 /* SD_SECCNTレジスタ有効(セクタカウントレジスタ) */ - -/* SD_SECCNTレジスタ */ -#define SD_SECCNT_END 0x0000 /* SD_SECCNTレジスタ カウントチェック */ - -/* SD_SIZEレジスタ */ -#define SD_SIZE_DATA_LENGTH_1B 0x0001 /* SDカード転送データサイズ 1Bytes */ -#define SD_SIZE_DATA_LENGTH_2B 0x0002 /* SDカード転送データサイズ 2Bytes */ -#define SD_SIZE_DATA_LENGTH_4B 0x0004 /* SDカード転送データサイズ 4Bytes */ -#define SD_SIZE_DATA_LENGTH_8B 0x0008 /* SDカード転送データサイズ 8Bytes (SCR) */ -#define SD_SIZE_DATA_LENGTH_16B 0x0010 /* SDカード転送データサイズ 16Bytes */ -#define SD_SIZE_DATA_LENGTH_32B 0x0020 /* SDカード転送データサイズ 32Bytes */ -#define SD_SIZE_DATA_LENGTH_64B 0x0040 /* SDカード転送データサイズ 64Bytes (SD_Status) */ -#define SD_SIZE_DATA_LENGTH_128B 0x0080 /* SDカード転送データサイズ 128Bytes */ -#define SD_SIZE_DATA_LENGTH_256B 0x0100 /* SDカード転送データサイズ 256Bytes */ -#define SD_SIZE_DATA_LENGTH_512B 0x0200 /* SDカード転送データサイズ 512Bytes (データ) */ - -/* SD_OPTIONレジスタ */ -#define SD_OPTION_WIDTH_1BIT 0x8000 /* ビット幅の選択 1bit幅 */ -#define SD_OPTION_MSEL_C2NOUSE 0x4000 /* C2モジュール未使用 */ -#define SD_CD_DETECT_TIME 0xFFF0 /* CD 検出タイムだけをクリアするためのマスク */ - -/* SD_INFO2レジスタ */ -#define SD_INFO2_ERR_ILA 0x8000 /* イリーガルアクセスエラー */ -#define SD_INFO2_BWE 0x0200 /* SDカードから512byteのデータ書込み要求 */ -#define SD_INFO2_BRE 0x0100 /* SDカードから512byteのデータ読込み要求 */ -#define SD_INFO2_ERR_ALLCLR 0x807F /* SD Card エラーレジスタクリア */ -#define SD_INFO2_ERR_SDDAT0 0x0080 /* SD Card Busy bit */ -#define SD_INFO2_ERR_RESTIMEOUT 0x0040 /* レスポンスタイムアウトエラー */ -#define SD_INFO2_ERR_UNDERFLOW 0x0020 /* FIFO アンダーフローエラー */ -#define SD_INFO2_ERR_OVERFLOW 0x0010 /* FIFO オーバーフローエラー */ -#define SD_INFO2_ERR_TIMEOUT 0x0008 /* レスポンス以外のタイムアウトエラー */ -#define SD_INFO2_ERR_END 0x0004 /* フレーム終了認識できないときの(END)エラー */ -#define SD_INFO2_ERR_CRC 0x0002 /* CRC エラー */ -#define SD_INFO2_ERR_CMD 0x0001 /* CMDエラー */ - -#define SD_INFO2_RW_SET 0x0300 /* SDカード Read/Write 要求割込み要因チェック */ -#define SD_INFO2_ERROR_SET 0x807F /* SDカード エラー割込み要因チェック */ - -/* SD_INFO2_MASKレジスタ */ -#define SD_INFO2_MASK_ILA 0x8000 /* イリーガルアクセスエラー割込みマスク */ -#define SD_INFO2_MASK_BWE 0x0200 /* SDカードからのデータ書込み要求割込み禁止 */ -#define SD_INFO2_MASK_BRE 0x0100 /* SDカードからのデータ読込み要求割込み禁止 */ -#define SD_INFO2_MASK_ALLERRMASK 0x807F /* 全エラー割り込み禁止 */ -#define SD_INFO2_MASK_EXCEPT_OVERFLOW 0x802F /* 全エラー割り込み禁止 FIFO Overflow Errorを除く */ -#define SD_INFO2_MASK_RESTIMEOUT 0x0040 /* Time out 割込みEnable */ -#define SD_INFO2_MASK_UNDERFLOW 0x0020 /* FIFO アンダーフロー 割込みEnable */ -#define SD_INFO2_MASK_OVERFLOW 0x0010 /* FIFO オーバーフロー 割込みEnable */ -#define SD_INFO2_MASK_TIMEOUT 0x0008 /* Time out 割込みEnable */ -#define SD_INFO2_MASK_END 0x0004 /* END エラー 割込みEnable */ -#define SD_INFO2_MASK_CRC 0x0002 /* CRC エラー 割込みEnable */ -#define SD_INFO2_MASK_CMD 0x0001 /* CMD エラー 割込みEnable */ -#define SD_INFO2_MASK_ERRSET 0x807F /* SDカード エラー割込み要因チェック */ - -/* SD_INFO1レジスタ */ -#define SD_INFO1_DAT3DETECT 0x0400 /* (IO3検出) card detect(検出=1) : CTRでは使用できない*/ -#define SD_INFO1_DAT3INSERT 0x0200 /* (IO3検出) card inserted(挿入=1) : CTRでは使用できない */ -#define SD_INFO1_DAT3REMOVE 0x0100 /* (IO3検出) card removed(抜け=1) : CTRでは使用できない */ -#define SD_INFO1_DAT3INIT 0x0300 /* (IO3検出) の初期化 */ -#define SD_INFO1_WRITEPROTECT 0x0080 /* write protect(書き込み禁止=1) */ -#define SD_INFO1_DETECT 0x0020 /* card detect(検出=1) */ - -#define SD_INFO1_INSERT 0x0010 /* card inserted(挿入=1) */ -#define SD_INFO1_REMOVE 0x0008 /* card removed(抜け=1) */ - -#define SD_INFO1_ALL_END 0x0004 /* R/W access all end */ -#define SD_INFO1_RES_END 0x0001 /* Response end */ -#define SD_INFO1_INIT 0x0005 /* SD Cardの状態を初期化 */ - -#define SD_INFO1_SET 0x031D /* SDカード 挿抜 and RWアクセス終了 and レスポンス終了 要求割込み要因チェック */ - -/* SD_INFO1_MASKレジスタ (0:割り込み許可、1:割り込み禁止)*/ -#define SD_INFO1_MASK_DAT3INSERT 0x0200 /* (IO3検出) card inserted(挿入) 割込み禁止 */ -#define SD_INFO1_MASK_DAT3REMOVE 0x0100 /* (IO3検出) card removed(抜け) 割込み禁止 */ -#define SD_INFO1_MASK_INSERT 0x0010 /* card inserted(挿入) 割込み禁止 */ -#define SD_INFO1_MASK_REMOVE 0x0008 /* card removed(抜け) 割込み禁止 */ -#define SD_INFO1_MASK_ALL_END 0x0004 /* R/W access all end 割込み禁止 */ -#define SD_INFO1_MASK_RES_END 0x0001 /* Response end 割込み禁止 */ - -/* CC_EXT_MODEレジスタ */ -#define CC_EXT_MODE_PIO 0x0000 /* PIOモード */ -#define CC_EXT_MODE_DMA 0x0002 /* DMAモード */ - -/* SOFT_RSTレジスタ */ -#define SOFT_RST_SDIF_RST 0x0001 /* SD I/Fモジュールをリセット */ - -/* SD_CLK_CTRLレジスタ */ -#define SD_CLK_CTRL_SDCLKEN 0x0100 /* SDカードクロック出力イネーブル */ -#define SD_CLK_CTRL_512 0x0180 /* SDクロックの周波数(分周比512)*/ -#define SD_CLK_CTRL_256 0x0140 /* SDクロックの周波数(分周比256)*/ -#define SD_CLK_CTRL_128 0x0120 /* SDクロックの周波数(分周比128)*/ -#define SD_CLK_CTRL_64 0x0110 /* SDクロックの周波数(分周比 64)*/ -#define SD_CLK_CTRL_32 0x0108 /* SDクロックの周波数(分周比 32)*/ -#define SD_CLK_CTRL_16 0x0104 /* SDクロックの周波数(分周比 16)*/ -#define SD_CLK_CTRL_8 0x0102 /* SDクロックの周波数(分周比 8)*/ -#define SD_CLK_CTRL_4 0x0101 /* SDクロックの周波数(分周比 4)*/ -#define SD_CLK_CTRL_2 0x0100 /* SDクロックの周波数(分周比 2)*/ - - -/*------------------------------------- -マルチポート対応ビット制御(フラグ定義) --------------------------------------*/ -#define SDCARD_PORT_NO 0x0300 /* カードポート選択数 */ -#define SDCARD_PORT_NO_MAX 0x04//0x02 /* カードポート最大選択数 */ -#define SDCARD_PORT_NO_MIN 0x01 /* カードポート最小選択数 */ -#define SDCARD_PORT_SELECT_NO 0x0001 /* カードポート番号ビット */ -#define SDCARD_PORT0 0x0000 /* カードポート番号ビット */ -#define SDCARD_PORT1 0x0001 /* カードポート番号ビット */ - -/* EXT_WPレジスタ(ポート1以降のライトプロテクト) */ -#define EXT_WP_PORT1 0x0001 /* ポート1write protect(書き込み禁止=1)*/ - -/* EXT_CDレジスタ */ -#define EXT_CD_PORT1_REMOVE 0x0001 /* ポート1 card detect(検出=1) */ -#define EXT_CD_PORT1_INSERT 0x0002 /* ポート1 card inserted(挿入=1) */ -#define EXT_CD_PORT1_DETECT 0x0004 /* ポート1 card removed(抜け=1) */ - -/* EXT_CD_DAT3レジスタ */ -//#define EXT_CD_PORT1_DAT3INIT 0x0003 /* ポート1 card の状態 (IO3検出) の初期化 */ -#define EXT_CD_PORT1_DAT3REMOVE 0x0001 /* ポート1 dat3 card detect(検出=1) */ -#define EXT_CD_PORT1_DAT3INSERT 0x0002 /* ポート1 dat3 card inserted(挿入=1) */ -#define EXT_CD_PORT1_DAT3DETECT 0x0004 /* ポート1 dat3 card removed(抜け=1) */ - -/* EXT_CD_DAT3_MASKレジスタ */ -#define EXT_CD_MASK_PORT1INSERT 0x0002 /* port1 card inserted(挿入) 割込み禁止 */ -#define EXT_CD_MASK_PORT1REMOVE 0x0001 /* port1 card removed(抜け) 割込み禁止 */ -#define EXT_CD_MASK_PORT1DAT3INSERT 0x0002 /* port1 (IO3検出) card inserted(挿入) 割込み禁止 */ -#define EXT_CD_MASK_PORT1DAT3REMOVE 0x0001 /* port1 (IO3検出) card removed(抜け) 割込み禁止 */ - -/*------------------------------------- -カードの選択 ---------------------------------------*/ -#define SDCARD_DETECT_VISUAL_BIT 0x0400 /*** upper layer card detected visual bit ***/ - -/*------------------------------------- -ライトプロテクト --------------------------------------*/ -#define SDCARD_WP_PERMANENT_BIT 0x0020 /*** permanent write protection ***/ -#define SDCARD_WP_TEMPORARY_BIT 0x0010 /*** temporary write protection ***/ - -/*------------------------------------- -SD or MMCカードコマンド --------------------------------------*/ -#define GO_IDLE_STATE (0) /* resets all cards to idle state */ -#define SEND_OP_COND (1) /* Asks all cards in idle state to send their operation conditions */ -#define ALL_SEND_CID (2) /* send CID numbers */ -#define SEND_RELATIVE_ADDR (3) /* ask the card to publish a new relative address(RCA) */ -#define SET_BUS_WIDTH (6) /* ビット幅の選択 */ -#define SELECT_CARD (7) /* Command toggles acard between thr Stand-by and Transfer states */ -#define SEND_CSD (9) /* addressed card sends its card-specific data(CSD) */ -#define STOP_TRANSMISSION (12) /* forces the card to stop transmission */ -#define SD_SEND_STATUS (13) /* addressed card sends its status register */ -#define SET_BLOCKLEN (16) /* sets the block length */ -#define READ_MULTIPLE_BLOCK (18) /* マルチブロックリード */ -#define WRITE_MULTIPLE_BLOCK (25) /* マルチブロックライト */ -#define APP_CMD (55) /* CMD55 */ -#define SD_STATUS (13) /* ACMD13 Send the SD_CARD status */ -#define SEND_NUM_WR_SECTORS (22) /* ACMD22 書きこみ完了セクタ数取得 */ -#define SD_APP_OP_COND (41) /* ACMD41 */ -#define SEND_SCR (51) /* SD configuration register (SCR) */ - -/* MMCplus, eMMCの定義 */ -#define EXT_CSD_ACCESS (6) - -/* Extended Commandの定義 */ -#define EXT_NORMAL (0) -#define EXT_SDIO (0x4000) - -#define EXT_COM_R3 (0x0700) - -#define EXT_CMD (0x00C0) - -#define SEND_IF_COND (8) /* Physical Layer 2.0 で追加されたコマンド */ -#define SEND_IF_COND_EXT (EXT_SDIO | EXT_COM_R3 | EXT_CMD | SEND_IF_COND) - - -/*------------------------------------- -IP レジスタアクセス マクロ関数 --------------------------------------*/ -#define SD_OrFPGA(reg,value) ((reg) |= (value)); -#define SD_AndFPGA(reg,value) ((reg) &= (value)); -#define SD_SetFPGA(reg,value) ((reg) = (value)); -#define SD_GetFPGA(dest,reg) ((dest) = (reg)); - -/*********************************************************************** - 構造体定数 -***********************************************************************/ -typedef union{ - u32 dat; - struct { - u16 low; - u16 high; - } dt2word; -} LELONG; - -/*------------------------------------- -その他(ビット制御) --------------------------------------*/ -#define RSP_R3_OCR31 0x8000 /* Use OCR Busy bit Check */ -#define RSP_R3_OCR_VDD 0x0030 /* Use OCR VDD bit Check (3.2-3.3v,3.3-3.4v is OK)*/ - -/*--- SCR[0]に対する4bitバス幅対応フラグのマスク ---*/ -//SCRのbit50に相当するが、SCRとSD_STATUSはMSBから送られてくることを考慮してある -#define SCR_DAT_BUS_WIDTH_4BIT 0x0400 /* SCR DAT Bus width supported 4bit */ - -/*--- 127bitCSD (CSD[0]〜CSD[7])関連 ---*/ -#define CSD_VDD_R_CURR_MIN 0x0038 /* "VDD_R_CURR_MIN" (for CSD[3]) */ -#define CSD_VDD_R_CURR_MAX 0x0007 /* "VDD_R_CURR_MAX" (for CSD[3]) */ -#define CSD_VDD_W_CURR_MIN 0xE000 /* "VDD_W_CURR_MIN" (for CSD[2]) */ -#define CSD_VDD_W_CURR_MAX 0x1C00 /* "VDD_W_CURR_MAX" (for CSD[2]) */ - -#define CSD_READ_BL_LEN 0x0F00 /* "READ_BL_LEN" (for CSD[4])*/ -#define CSD_WRITE_BL_LEN_BIT_25_24 0x0003 /* "WRITE_BL_LEN" (for CSD[1])*/ -#define CSD_WRITE_BL_LEN_BIT_23_22 0xC000 /* "WRITE_BL_LEN" (for CSD[0]*/ -#define CSD_READ_BL_PARTIAL 0x0080 /* "READ_BL_PARTIAL" (for CSD[4]) */ -#define CSD_TRANSFER_RATE 0x0700 /* "Transfer rate unit" of "TRAN_SPEED" (for CSD[5]) */ -#define CSD_TRAN_SPEED_100K 0x0000 /* 100Kbit/s (for CSD Transfer rate) */ -#define CSD_TRAN_SPEED_1M 0x0001 /* 1Mbit/s (for CSD Transfer rate) */ -#define CSD_TRAN_SPEED_10M 0x0002 /* 10Mbit/s (for CSD Transfer rate) */ -#define CSD_TRAN_SPEED_100M 0x0003 /* 100Mbit/s (for CSD Transfer rate) */ -#define CSD_TRAN_SPEED_OTHER 0x0004 /* Reserve (for CSD Transfer rate) */ - -#define CSD_C_SIZE_MULT 0x0380 /* RSP2 の bit[49:47] */ -#define CSD_C_SIZE_BIT_73_72 0x0003 /* RSP3 の bit[73:72](C_SIZE) */ -#define CSD_C_SIZE_BIT_71_62 0xFFC0 /* RSP3 の bit[71:62](C_SIZE) */ -//SDHC(CSD format version2)の場合 -#define CSD_C_SIZE_BIT_69_56 0x3FFF /* SD_CSD[3] */ -#define CSD_C_SIZE_BIT_55_48 0xFF00 /* SD_CSD[2] */ - -#define CSD_STRUCT_BIT_127_126 0x00C0 /* SD_CSD[7] */ - -//#define VDD_R_CURR_MIN 0x0000 /* CSD max read current@VDD min */ -//#define VDD_R_CURR_MAX 0x0007 /* CSD max read current@VDD max */ -//#define VDD_W_CURR_MIN 0x0000 /* CSD max write current@VDD min */ -//#define VDD_W_CURR_MAX 0x0007 /* CSD max write current@VDD max */ - -/*--- R1レスポンスの card status(32bit)に対するマスク ---*/ -#define RSP_R1_STATUS_ERR 0xF9FF0008 /* R1(レスポンス)のカードステータスのチェック */ -#define SDCARD_STATUS_OUT_OF_RANGE 0x80000000 /* Card Status OUT_OF_RANGE のチェック */ -#define RSP_R1_CURRENT_STATE 0x1E00 /* CARD current state */ -/*-------------------------------------------------------*/ - -/* レスポンスのRSP0 & RSP_R1_CURRENT_STATEを1ビット右シフトした値に対するフラグ */ -#define CURRENT_STATE_DATA 0x0500 /* CARD current state data */ -#define CURRENT_STATE_RCV 0x0600 /* CARD current state rcv */ - -/* カードステータス */ -#define SD_MEMORY_CARD 0x00FF /* SD_CARD_TYPE SD memory card */ - - -/*------------------------------------- -プロトタイプ宣言 --------------------------------------*/ -void SD_Init(void); /* SD Cardインターフェース部をリセット&初期設定 */ -void SD_EnableInfo(void); /* SD Card 挿抜 割り込みイネーブル・ディスエーブル */ -u16 SD_Command(u16 ucCommand); /* SDカードコマンド送出 */ -u16 SD_AppCommand(void); /* SDカード RCA = 1をセット後 CMD55 発行 */ -u16 SD_AppOpCond(void); /* ACMD41 発行 busyでなくなるまで繰り返し */ -u16 SD_SendOpCond(void); /* CMD1 発行 busyでなくなるまで繰り返し */ -u16 SD_SendIfCond(void); /* CMD8 発行 (SDHCのみ反応してくる) */ -u16 SD_SendRelativeAddr(void); /* CMD3 発行 正常終了時 RCA<-ResのRCA */ -u16 SD_SelectCard(void); /* CMD7 発行 Command toggles acard between the Stand-by and Transfer states */ -u16 SD_SetBlockLength(u32 ulBlockLength); /* ブロックレングス(1セクタの転送量)の設定 */ -u16 SD_SendCID(void); /* card identification data の取得コマンド発行 */ -u16 SD_SendCSD(void); /* card-specific data の取得コマンド発行 */ -u16 SD_SendSCR(void); /* SD register の取得コマンド発行 */ -u16 SD_SDStatus(void); /* SD STATUS の取得コマンド発行 */ -u16 SD_SendStatus(void); /* SD status register の取得コマンド発行 */ -u16 SD_MultiReadBlock(u32 ulOffset); /* マルチセクタリードコマンド発行 */ -u16 SD_ClockDivSet(u16 usTranSpeed); /* カードの動作クロック設定 */ - -void SD_EnableClock( void); /* SDカードのクロック有効 */ -void SD_DisableClock( void); /* SDカードのクロック無効(省電力) */ - -u16 SD_SelectBitWidth(s16 b4bit); /* ビット幅の選択 */ - -u16 MMCP_WriteBusWidth(s16 b4bit); -u16 MMCP_BusTest( BOOL readflag); - - -BOOL SD_FPGA_irq(void); /* カード転送要求時のFPGAの制御 */ -void SD_StopTransmission(void); /* カード転送終了をFPGAに通知する。 */ -void SD_TransEndFPGA(void); /* カード転送の終了処理(割り込みマスクを戻す) */ -u16 SD_CheckStatus(BOOL bRead); /* Normal response command カードステータスのチェック */ -u16 SD_SwapByte(u16 *data); /* 上位byte、下位byteを入れ替える関数 */ - -void SD_EnableSeccnt( u32 ulSDCARD_SectorCount); /* SD_SECCNTレジスタ有効化&値設定 */ -void SD_DisableSeccnt( void); /* SD_SECCNTレジスタ無効化 */ - -void SD_SetErr(u16 Error); /* エラーステータスを設定する */ -void SD_ClrErr(u16 Error); /* エラーステータスをクリアする */ - -BOOL SD_CheckFPGAReg(u16 reg,u16 value); /* IPレジスタにフラグが立っているか判定 */ - -void SD_TransReadyFPGA(void); /* 転送処理準備FPGA設定 */ -u16 SD_TransCommand(u16 ucCommand); /* 命令発行処理 */ - -u16 SD_MultiWriteBlock(u32 ulOffset); /* マルチセクタライトコマンド発行 */ -u16 SD_SendNumWRSectors(void); /* ACMD22 書きこみ完了セクタ数取得コマンド発行 */ - - -#endif /* __SD_CARD_IP_H__ */ diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdif_reg.h b/build/libraries/fatfs/ARM7/rom_sdmc/sdif_reg.h deleted file mode 100644 index a5f4f862..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdif_reg.h +++ /dev/null @@ -1,118 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: TwlBrom - SD driver - File: sd_ip_reg.h - - Copyright 2006 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - *---------------------------------------------------------------------------*/ - -#ifndef __SD_IP_REG_H__ -#define __SD_IP_REG_H__ - -/********************************************* - SD IPレジスタ - - (R/W) : readable and writable - (RO) : read only -*********************************************/ -/*#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) -#define SD_IP_BASE (0x08030000) // NTR用ブレッドボード設定 -#else -#define SD_IP_BASE (0x400B0000) // IOP実機設定 -#endif*/ -#define SD_IP_BASE (0x04004800) // TWL ARM7設定 - - -#define SD_CMD (*(vu16 *)(SD_IP_BASE + 0x00)) /* CMD発行レジスタ(R/W) */ -#define SD_PORTSEL (*(vu16 *)(SD_IP_BASE + 0x02)) /* ポート選択レジスタ(R/W) */ -#define SD_ARG0 (*(vu16 *)(SD_IP_BASE + 0x04)) /* Argument[15:0] (R/W) */ -#define SD_ARG1 (*(vu16 *)(SD_IP_BASE + 0x06)) /* Argument[31:16] (R/W) */ -#define SD_STOP (*(vu16 *)(SD_IP_BASE + 0x08)) /* 転送終了後STOP、SD_SECCNT有効 (R/W) */ -#define SD_SECCNT (*(vu16 *)(SD_IP_BASE + 0x0A)) /* 転送セクタ数制御 (R/W) */ -#define SD_RSP0 (*(vu16 *)(SD_IP_BASE + 0x0C)) /* Response [23:8] (RO) */ -#define SD_RSP1 (*(vu16 *)(SD_IP_BASE + 0x0E)) /* Response [39:24] (RO) */ -#define SD_RSP2 (*(vu16 *)(SD_IP_BASE + 0x10)) /* Response [55:40] (RO) */ -#define SD_RSP3 (*(vu16 *)(SD_IP_BASE + 0x12)) /* Response [71:56] (RO) */ -#define SD_RSP4 (*(vu16 *)(SD_IP_BASE + 0x14)) /* Response [87:72] (RO) */ -#define SD_RSP5 (*(vu16 *)(SD_IP_BASE + 0x16)) /* Response [103:88] (RO) */ -#define SD_RSP6 (*(vu16 *)(SD_IP_BASE + 0x18)) /* Response [119:104] (RO) */ -#define SD_RSP7 (*(vu16 *)(SD_IP_BASE + 0x1A)) /* Response [127:120] (RO) */ -#define SD_INFO1 (*(vu16 *)(SD_IP_BASE + 0x1C)) /* SDメモリーカードの状態 (R/W) */ -#define SD_INFO2 (*(vu16 *)(SD_IP_BASE + 0x1E)) /* バッファ制御とエラー情報 (R/W) */ -#define SD_INFO1_MASK (*(vu16 *)(SD_IP_BASE + 0x20)) /* SD_INFO1割込みマスク (R/W) */ -#define SD_INFO2_MASK (*(vu16 *)(SD_IP_BASE + 0x22)) /* SD_INFO2割込みマスク (R/W) */ -#define SD_CLK_CTRL (*(vu16 *)(SD_IP_BASE + 0x24)) /* SDクロック設定 (R/W) */ -#define SD_SIZE (*(vu16 *)(SD_IP_BASE + 0x26)) /* ビット幅と転送データ長の設定 (R/W) */ -#define SD_OPTION (*(vu16 *)(SD_IP_BASE + 0x28)) /* タイムアウト、width、CD検出タイム (R/W) */ -#define SD_ERR_STS1 (*(vu16 *)(SD_IP_BASE + 0x2C)) /* CMD, CRC, ENDエラー割込み原因 (RO) */ -#define SD_ERR_STS2 (*(vu16 *)(SD_IP_BASE + 0x2E)) /* タイムアウトエラー割込み原因 (RO) */ -#define SD_BUF0 (vu16 *)(SD_IP_BASE + 0x30) /* SDバッファ読込/書込データポート (R/W) */ -#define CC_EXT_MODE (*(vu16 *)(SD_IP_BASE + 0xD8)) /* DMAモード/PIOモード切り替え */ -#define SOFT_RST (*(vu16 *)(SD_IP_BASE + 0xE0)) /* ソフトウェアリセット (R/W) */ -#define VERSION (*(vu16 *)(SD_IP_BASE + 0xE2)) /* Version レジスタ (RO) */ -#define EXT_WP (*(vu16 *)(SD_IP_BASE + 0xF6)) /* 拡張SD Card ライトプロテクト (RO) */ -#define EXT_CD (*(vu16 *)(SD_IP_BASE + 0xF8)) /* 拡張SD Card 検出、挿入、抜け フラグ (R/W) */ -#define EXT_CD_DAT3 (*(vu16 *)(SD_IP_BASE + 0xFA)) /* 拡張SD Card 検出、挿入、抜け フラグ (R/W) */ -#define EXT_CD_MASK (*(vu16 *)(SD_IP_BASE + 0xFC)) /* 拡張SD Card 検出、挿入、抜け 割込みマスク (R/W) */ -#define EXT_CD_DAT3_MASK (*(vu16 *)(SD_IP_BASE + 0xFE)) /* 拡張SD Card 検出、挿入、抜け 割込みマスク (R/W) */ - - - -/********************************************* - SD I/F(ラッパー)レジスタ -*********************************************/ -/*#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) -#define SD_IF_BASE (0x08030100) // NTR用ブレッドボード設定 -#else -#define SD_IF_BASE (0x400B0100) // IOP実機設定 -#endif*/ -#define SD_IF_BASE (0x04004900) // IOP実機設定 - - -#define SDIF_CNT ((vu32 *)(SD_IF_BASE+0x00)) /* コントロール */ -#define SDIF_FDS ((vu32 *)(SD_IF_BASE+0x04)) /* FIFOサイズ */ -#define SDIF_FSC ((vu32 *)(SD_IF_BASE+0x08)) /* セクタカウント */ -#define SDIF_FI ((vu32 *)(SD_IF_BASE+0x0c)) /* FIFOウィンドウ */ - -#define SDIF_CNT_L ((vu16 *)(SD_IF_BASE+0x00)) -#define SDIF_CNT_H ((vu16 *)(SD_IF_BASE+0x02)) -#define SDIF_FDS_L ((vu16 *)(SD_IF_BASE+0x04)) -#define SDIF_FDS_H ((vu16 *)(SD_IF_BASE+0x06)) -#define SDIF_FSC_L ((vu16 *)(SD_IF_BASE+0x08)) -#define SDIF_FSC_H ((vu16 *)(SD_IF_BASE+0x0a)) -#define SDIF_FI_L ((vu16 *)(SD_IF_BASE+0x0c)) -#define SDIF_FI_H ((vu16 *)(SD_IF_BASE+0x0e)) - - - -/********************************************* - INTCレジスタ -*********************************************/ -/*#if (CTR_DEF_ENVIRONMENT_DSEMU == 1) -#define CTR_INT_BASE (0x08000000) -#else -#define CTR_INT_BASE (0x40010000) -#endif - - -#define CTR_INT_SE (CTR_INT_BASE + 0x00) //割り込み要求選択レジスタ -#define CTR_INT_IE (CTR_INT_BASE + 0x04) //IE -#define CTR_INT_IF (CTR_INT_BASE + 0x08) //IF - -#define CTR_IE_SD_MASK (1<<13) //SD割り込みフラグ -*/ -#define CTR_INT_BASE (0x04000000) - -#define CTR_INT_SE (CTR_INT_BASE + 0x208) //割り込み要求選択レジスタ -#define CTR_INT_IE (CTR_INT_BASE + 0x218) //IE -#define CTR_INT_IF (CTR_INT_BASE + 0x21C) //IF - -#define CTR_IE_SD_MASK (1<<8) //SD割り込みフラグ - - -#endif /* __SD_IP_REG_H__ */ diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc.c b/build/libraries/fatfs/ARM7/rom_sdmc/sdmc.c deleted file mode 100644 index 5ec06979..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc.c +++ /dev/null @@ -1,2861 +0,0 @@ -/* - Project: TwlBrom SD port driver - File: sdmc.c - - 2006-2007, Research and Development Department, Nintendo. -*/ - -#include "sdmc.h" -#include "sdif_ip.h" -#include "sdif_reg.h" -#include "sdmc_config.h" -#include - -//#include -//#include "sdmc_config.h" -//#include "sdif_reg.h" /* IP 対応レジスタ定義 */ - //TODO:現状include/firmのほうからsdmc.hをひっぱってきている -//#include -//#include "sdif_ip.h" /* IP 対応フラグ定義 */ - -/*#if (SD_DEBUG_PRINT_ON == 1) - #if (CTR_DEF_ENVIRONMENT_DSEMU == 1) - #define PRINTDEBUG osTPrintf - #else - #include - #define PRINTDEBUG vlink_dos_printf - #endif -#else - #define PRINTDEBUG( ...) ((void)0) -#endif*/ -// #define PRINTDEBUG OS_TPrintf - #define PRINTDEBUG( ...) ((void)0) - - -/*********************************************************************** - 定数 -***********************************************************************/ -#define SD_OPERATION_INIT (0) -#define SD_OPERATION_READ (1) -#define SD_OPERATION_READ_WITH_FIFO (2) -#define SD_OPERATION_WRITE (3) -#define SD_OPERATION_WRITE_WITH_FIFO (4) -#define SD_OPERATION_READ_WITH_FIFO_STREAM_BEGIN (5) -#define SD_OPERATION_READ_WITH_FIFO_STREAM_END (6) - - -/*********************************************************************** - extern変数 -***********************************************************************/ -static u32 sdmc_dma_no; - -/*********************************************************************** - global変数 -***********************************************************************/ -static BOOL sdmc_tsk_created = FALSE; -static u16 sdmc_base_tick; -static u32 sdmc_timeout_ms; - - -/* drsdmc.cでも参照 */ -static SdmcSpec sdmc_current_spec; //TODO:ポート切り替え時、Port0とPort1に保存するように - -typedef struct { //OSMessage - void* buf; - u32 bufsize; - u32 offset; - void (*func)(void); - SdmcResultInfo* info; - u32 operation; - void (*func2)(void); -} SDCARDMsg; - - -/*********************************************************************** - static関数の宣言 -***********************************************************************/ -static SDMC_ERR_CODE i_sdmcSavePortContext( SDPortContext* buf_adr, u16 port_no); -static SDMC_ERR_CODE i_sdmcLoadPortContext( SDPortContext* buf_adr, u16* port_no); - -static void SDCARD_Backup_port0(void); -static void SDCARD_Backup_port1(void); -static void SDCARD_Restore_port0(void); -static void SDCARD_Restore_port1(void); - -static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info); - -static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -static SDMC_ERR_CODE SDCARDi_ReadBegin(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -static SDMC_ERR_CODE SDCARDi_ReadEnd( BOOL library_flag); -static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info); - -int MMCP_SetBusWidth( BOOL b4bit); /* ビット幅の選択(MMCplus, eMMC, moviNAND) */ - -static SDMC_ERR_CODE SDCARD_Thread( SDCARDMsg* SdMsg); //SDスレッド -static void SDCARD_Intr_Thread( void* arg); //SD割り込み処理スレッド - -SDMC_ERR_CODE sdmcGoIdle( void (*func1)(),void (*func2)()); -static SDMC_ERR_CODE i_sdmcInit( void); -static SDMC_ERR_CODE SDCARD_Layer_Init(void); -static SDMC_ERR_CODE i_sdmcMPInit( void); /* カードドライバ初期化(マルチポート対応) */ - -static u16 i_sdmcErrProcess(void); /* エラー時の処理 */ -static u16 i_sdmcGetResid(u32 *pResid); /* 書きこみ完了セクタ数の取得 */ -static u16 i_sdmcCheckWP(void); /* SDCARD ライトプロテクトチェック */ - -static void i_sdmcEnable( void); /* SD使用のためのOS準備 */ -static void i_sdmcDisable( void); - -static u16 i_sdmcSendSCR(void); /* SCRの読み出し */ -static u16 SDCARD_SD_Status(void); /* SD_STATUSの取得 */ -static u32 SDCARD_GetR1Status(void); /* Normal response command カードステータスを取得 */ - -static void SDCARD_Dmy_Handler( void); /* 何もしない */ - -void SDCARD_Timer_irq(void* arg); /* タイムアウト割り込みハンドラ */ - -static void SDCARD_irq_Handler( void); /* SD-IPからの割り込みハンドラ */ -static void SDCARD_FPGA_irq(void); /* カードリードライト割り込み処理 */ -static void SDCARD_ATC0_irq(void); /* ATC0転送完了割り込み処理 */ -void SYSFPGA_irq(void); /* SYSFPGAエラー割り込み処理 */ - -void SDCARD_TimerCheck( void); -/*ポート1は無線固定なのでポート選択関数は公開しない*/ -//u16 sdmcSelectedNo(void); /* カードポートの選択 */ -//u16 sdmcSelect(u16 select); /* 現在のカードポート番号のチェック */ - - - - -/*********************************************************************** - 外部参照変数 -***********************************************************************/ -void SDCARD_TimerStart(u32 tim); /* タイムアウト計測スタート */ -void SDCARD_TimerStop(void); /* タイムアウト計測停止 */ - -extern u16 SD_CID[8]; /* CID値保存用 */ -extern u16 SD_CSD[8]; /* CSD値保存用 */ -extern u16 SD_OCR[2]; /* OCR値保存用 */ -extern u16 SD_SCR[4]; /* SCR値保存用 */ -extern u16 SD_RCA; /* RCA値保存用 */ - -extern s16 SDCARD_MMCFlag; /* MMCカードフラグ */ -extern s16 SDCARD_SDHCFlag; /* SDHCカードフラグ */ -extern u16 SD_port_number; /* 現在ポート番号 */ - - -/*********************************************************************** - グローバル -***********************************************************************/ -static u16 SD_SDSTATUS[32]; /* SD_STATUSレジスタ保存用 */ -static u16 SDCARD_WP_FLAG0; /* カードライトプロテクトフラグ。0=なし、1=有り */ -static u16 SDCARD_WP_FLAG1; /* カードライトプロテクトフラグ。0=なし、1=有り */ -static u16 SDCARD_WP_PERMANENT; /* カードライトプロテクト永久フラグ。0=なし、1=有り */ -static u16 SDCARD_WP_TEMPORARY; /* カードライトプロテクト一時フラグ。0=なし、1=有り */ - -static u16* pSDCARD_BufferAddr; /* 保存用データ格納バッファアドレス */ - -static BOOL SDCARD_STREAM_FLAG = FALSE; -static sdmcTransferFunction SDCARD_USR_TRANSFER_FUNC = NULL; /* ユーザ転送関数 */ -//sdmcTransferFunction CURRENT_TRANSFER_FUNC; /* カレント転送関数 */ - -static BOOL SDCARD_DataFlag; /* データフラグ(転送種別) */ -static u32 ulSDCARD_SectorCount; /* 転送セクタ数 */ -static u32 ulSDCARD_RestSectorCount; /* 残り転送セクタ数 */ -static u32 SDCARD_SectorSize; /* セクタサイズ デフォルト 512bytes */ - -static u16 SD_INFO1_VALUE; /* SD_INFO1レジスタ取得用変数 */ -static u16 SD_INFO1_MASK_VALUE; /* SD_INFO1割込みマスク用変数(0で許可, 1で禁止) */ -static u16 SD_INFO2_VALUE; /* SD_INFO2レジスタ取得用変数 */ -static u16 SD_INFO2_MASK_VALUE; /* SD_INFO2割り込みマスク用変数(0で許可, 1で禁止) */ -static u16 SD_INFO_ERROR_VALUE; /* SD_INFO2, SD_INFO1のエラービット確認用変数 */ - -static u16 SD_port_en_numbers; /* サポートするポート数 */ - - - -/*ポート状態保存*/ -static SDPortContext SDPort0Context; -static SDPortContext SDPort1Context; -//SDPortContext *SDPortCurrentContext = &SDPort0Context; /*TODO*/ - - - -static u16 TransCount; /* R/W転送カウント変数 */ - -static u32 ulSDCARD_Size; /* カード全セクタ数 */ - -static volatile s16 SDCARD_ATC0_Flag; /* 全ATC完了フラグ */ -static volatile s16 SDCARD_FPGA_Flag; /* FPGA処理完了フラグ */ -static volatile s16 SDCARD_EndFlag; /* 転送処理完了フラグ */ - -extern volatile SDMC_ERR_CODE SDCARD_ErrStatus; /* エラーステータス */ -extern volatile u32 SDCARD_Status; /* カードステータス */ - -static s16 SDCARD_SDFlag; /* SDカードフラグ */ - -static volatile s16 SDCARD_OutFlag; /* カード排出発生判定フラグ */ -static SdmcResultInfo *pSDCARD_info; /* 保存用実行結果構造体ポインタ */ - -static u16 SDCARD_IO_Port; /* カード挿入/排出割り込み発生時のポート番号 */ - -void (*func_SDCARD_In)(void); /* カード挿入イベント用コールバック保存用 */ -void (*func_SDCARD_Out)(void); /* カード排出イベント用コールバック保存用 */ -/* void (*func_SDCARD_CallBack)(SdmcResultInfo *info); 処理結果通知用コールバック保存用 */ - - -/*---------------------------------------------------------------------------* - Name: sdmcClearPortContext - - Description: - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void sdmcClearPortContext( SDPortContext* buf_adr) -{ - MI_CpuFill8( buf_adr, 0x00, sizeof(SDPortContext)); -} - -/*---------------------------------------------------------------------------* - Name: sdmcCheckPortContext - - Description: - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcCheckPortContext( SDPortContext* buf_adr) -{ - if( (buf_adr->SD_CID[0] != 0)&&(buf_adr->port_no < 2)) { - return( SDMC_NORMAL); - }else{ - return( SDMC_ERR_PARAM); - } -} - -/*---------------------------------------------------------------------------* - Name: sdmcSavePortContext - - Description: ポート0のレジスタや変数をユーザバッファに退避する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcSavePortContext( SDPortContext* buf_adr, u16 port_no) -{ - if( buf_adr == NULL) { - return( SDMC_ERR_PARAM); - } - switch( port_no) { - case 0: - MI_CpuCopy8( &SDPort0Context, buf_adr, sizeof(SDPortContext)); - buf_adr->port_no = 0; - break; - case 1: - MI_CpuCopy8( &SDPort1Context, buf_adr, sizeof(SDPortContext)); - buf_adr->port_no = 1; - break; - default: return( SDMC_ERR_PARAM); - } - return( SDMC_NORMAL); -} - -/*---------------------------------------------------------------------------* - Name: sdmcLoadPortContext - - Description: ポート0のレジスタや変数をユーザバッファから復帰する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcLoadPortContext( SDPortContext* buf_adr, u16* port_no) -{ - if( buf_adr == NULL) { - return( SDMC_ERR_PARAM); - } - switch( buf_adr->port_no) { - case 0: - MI_CpuCopy8( buf_adr, &SDPort0Context, sizeof(SDPortContext)); - *port_no = 0; - break; - case 1: - MI_CpuCopy8( buf_adr, &SDPort1Context, sizeof(SDPortContext)); - *port_no = 1; - break; - default: return( SDMC_ERR_PARAM); - } - return( SDMC_NORMAL); -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_Backup_port0 - - Description: backup registers and variables of port0. - ポート0のレジスタや変数をバックアップする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Backup_port0(void) -{ - /* registers */ - SD_GetFPGA(SDPort0Context.SD_CLK_CTRL_VALUE,SD_CLK_CTRL); - SD_GetFPGA(SDPort0Context.SD_OPTION_VALUE, SD_OPTION); - - /* variables */ - SDPort0Context.SD_RCA = SD_RCA; - SDPort0Context.ErrStatus = SDCARD_ErrStatus; - SDPort0Context.Status = SDCARD_Status; - SDPort0Context.MMCFlag = SDCARD_MMCFlag; - SDPort0Context.SDHCFlag = SDCARD_SDHCFlag; - SDPort0Context.SDFlag = SDCARD_SDFlag; - - SDPort0Context.OutFlag = SDCARD_OutFlag; - - /*media registers*/ - MI_CpuCopy8( SD_CID, SDPort0Context.SD_CID, 16); - MI_CpuCopy8( SD_CSD, SDPort0Context.SD_CSD, 16); - MI_CpuCopy8( SD_OCR, SDPort0Context.SD_OCR, 4); - MI_CpuCopy8( SD_SCR, SDPort0Context.SD_SCR, 8); -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Backup_port1 - - Description: backup registers and variables of port1. - ポート1のレジスタや変数をバックアップする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Backup_port1(void) -{ - /* registers */ - SD_GetFPGA(SDPort1Context.SD_CLK_CTRL_VALUE,SD_CLK_CTRL); - SD_GetFPGA(SDPort1Context.SD_OPTION_VALUE, SD_OPTION); - - /* variables */ - SDPort1Context.SD_RCA = SD_RCA; - SDPort1Context.ErrStatus = SDCARD_ErrStatus; - SDPort1Context.Status = SDCARD_Status; - SDPort1Context.MMCFlag = SDCARD_MMCFlag; - SDPort1Context.SDHCFlag = SDCARD_SDHCFlag; - SDPort1Context.SDFlag = SDCARD_SDFlag; - - /*TODO:削れる*/ - SDPort1Context.OutFlag = SDCARD_OutFlag; - - /*media registers*/ - MI_CpuCopy8( SD_CID, SDPort1Context.SD_CID, 16); - MI_CpuCopy8( SD_CSD, SDPort1Context.SD_CSD, 16); - MI_CpuCopy8( SD_OCR, SDPort1Context.SD_OCR, 4); - MI_CpuCopy8( SD_SCR, SDPort1Context.SD_SCR, 8); -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcEnable - - Description: assign OS resouce for using SD memory card. - SDカードを使うための準備をする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void i_sdmcEnable( void) -{ -#if (TARGET_OS_CTR == 1) - /*SD interrupt setting*/ -// osInitIntrFlag(); -// osClearInterruptPendingID( OS_INTR_ID_SD); -// *(vu32*)CTR_INT_IF = CTR_IE_SD_MASK; - osSetInterruptHandler( OS_INTR_ID_SD, SDCARD_irq_Handler); - osEnableInterruptID( OS_INTR_ID_SD); -// *(vu32*)CTR_INT_SE = CTR_IE_SD_MASK; //割り込み(IRQ)発生許可 -// *(vu32*)CTR_INT_IE = CTR_IE_SD_MASK; -// osEnableInterrupts(); -// *(vu16*)0x04000208 = 1; -#else - /*SD割り込みのIF解除*/ -PRINTDEBUG( "%d\n", __LINE__); - *(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; - OS_SetIrqFunction( OS_IE_SD1, SDCARD_irq_Handler); - OS_EnableIrqMask( OS_IE_SD1); -#endif -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcDisable - - Description: under construction - 工事中 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void i_sdmcDisable( void) -{ -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_irq_Handler - - Description: SD interrupt handler - SD割り込みハンドラ - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_irq_Handler( void) -{ -#if (TARGET_OS_CTR == 1) - iwup_tsk( sdmc_intr_tsk_id); -#else - PRINTDEBUG( "SD irq!\n"); - OS_SetIrqCheckFlag( OS_IE_SD1); - SDCARD_Intr_Thread( NULL); -//TODO! OS_WakeupThreadDirect( &sdmc_intr_tsk); -#endif -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Dmy_Handler - - Description: dmy handler for timer interrupt. - タイマー割り込み用ダミーハンドラ - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Dmy_Handler( void) -{ -} - -/*---------------------------------------------------------------------------* - Name: sdmcInit - - Description: Initialize SD interface and SD card. - 初期化 - - Arguments: dma_no : 使用するDMA番号 - func1 : カード挿入時コールバック関数 - func2 : カード排出時コールバック関数 - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)()) -{ - SDMC_ERR_CODE api_result; - - /**/ - sdmc_dma_no = dma_no; - - if( sdmc_tsk_created == FALSE) { -#if 0 - /*---------- OS準備 ----------*/ - if( !OS_IsAlarmAvailable()) { /* アラームチェック(OS_InitAlarm済みか?) */ - SDCARD_ErrStatus |= SDMC_ERR_END; - }else{ - OS_CreateAlarm( &sdmc_alm); //使用可能であれば初期化 - } - /*----------------------------*/ -#endif - /**/ - sdmc_tsk_created = TRUE; - } - - /**/ - func_SDCARD_In = func1; /* カード挿入イベント用関数のアドレスを設定 */ - func_SDCARD_Out = func2; /* カード排出イベント用関数のアドレスを設定 */ - api_result = sdmcGoIdle( func1, func2); -// api_result = SDMC_NORMAL; - - return api_result; -} - -/* カードが入れ換わったときなどに初期化(RTFS用)*/ -SDMC_ERR_CODE sdmcGoIdle( void (*func1)(),void (*func2)()) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; - - func_SDCARD_In = func1; /* カード挿入イベント用関数のアドレスを設定 */ - func_SDCARD_Out = func2; /* カード排出イベント用関数のアドレスを設定 */ - - /*----- SDスレッドと通信 -----*/ - SdMsg.operation = SD_OPERATION_INIT; - api_result = SDCARD_Thread( &SdMsg); - /*----------------------------*/ - - return api_result; -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcInit - - Description: Initialize SD interface and SD card. - 初期化 - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcInit( void) -{ - i_sdmcEnable(); - - /* SD初期化 */ - SDCARD_ErrStatus = sdmcReset(); - - if(!SDCARD_ErrStatus) { - SDCARD_ErrStatus = i_sdmcMPInit(); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: sdmcReset - - Description: reset SD card. - リセット - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReset( void) -{ - OSIntrMode irq_core_flag; - ulSDCARD_Size = 0; /* カード全セクタ数クリア */ - SDCARD_MMCFlag = FALSE; /* MMCカード判定フラグクリア */ - SDCARD_SDHCFlag = FALSE; - SDCARD_SDFlag = FALSE; /* SDカード判定フラグクリア */ - - /*** カードステータスをクリア ***/ - SDCARD_ErrStatus = SDMC_NORMAL; - SDCARD_Status = SDMC_NORMAL; - - /*** カードCSD WPビットをクリア ***/ - SDCARD_WP_FLAG0 = 0; - SDCARD_WP_FLAG1 = 0; - SDCARD_WP_PERMANENT = 0; - SDCARD_WP_TEMPORARY = 0; - - pSDCARD_info = NULL; - SDCARD_OutFlag = FALSE; /* カード排出発生判定フラグクリア */ - -#if (TARGET_OS_CTR == 1) - irq_core_flag = osDisableInterrupts(); /* 割込み禁止 */ -#else - irq_core_flag = OS_DisableInterrupts(); /* 割込み禁止 */ -#endif - *SDIF_CNT_L = 0x0402; //ラッパーレジスタ - *SDIF_CNT_L = 0x0000; //ラッパーレジスタ - *SDIF_FDS_L = 0; - *SDIF_FSC_L = 1; - SD_Init(); /* SD Card I/F 初期化処理 */ - SD_AndFPGA( SD_OPTION, SD_CD_DETECT_TIME); /* CD 検出タイムをゼロクリア */ - - SD_port_en_numbers = SDCARD_PORT_NO_MAX; /*** サポートするポート数をデフォルトに設定 ***/ - SD_port_number = 0; /*** 現在のポート番号をデフォルトに設定 ***/ - - SDCARD_Backup_port0(); /* port0 backup */ - SDCARD_Backup_port1(); /* port1 backup */ - -#if (TARGET_OS_CTR == 1) - osRestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#else - OS_RestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ -#endif - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Layer_Init - - Description: initialize sequence for SD card. - SDカード規定の初期化手順 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARD_Layer_Init(void) -{ - u32 ulCSize; - u16 read_block_len_val, mult_val; - -// u16 memory_exist, function_number; - SDCARD_Status = SDMC_NORMAL; /* カードステータスをクリア */ -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグセット */ - SDCARD_MMCFlag = FALSE; /* MMCカード判定フラグクリア */ - SDCARD_SDHCFlag = FALSE; - SDCARD_SDFlag = FALSE; /* SDカード判定フラグクリア */ - SDCARD_OutFlag = FALSE; /* カード排出発生判定フラグクリア */ - ulSDCARD_Size = 0; /* カード全セクタ数クリア */ - TransCount = 0; /* 転送カウント変数クリア */ - - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_128)); /* SDクロックの周波数 261KHz(初期化時は100〜400khz) */ - SD_EnableClock(); /* SDカードのクロックをイネーブルにする */ - - /* SD I/F部ダミー80クロック(1mSec)転送待ち(タイマーで待ちを実装しても良い) */ - SVC_WaitByLoop( 17900); //179*4サイクル=716サイクル=10024ns=10us - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスをクリア */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RESET_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - - PRINTDEBUG( " CMD0(GO_IDLE_STATE)\n"); - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウト以外のエラーをクリア */ - { -/*PRINTDEBUG( "SD_INFO1 : 0x%x\n", SD_INFO1); -PRINTDEBUG( "SD_INFO2 : 0x%x\n", SD_INFO2); -PRINTDEBUG( "SD_INFO1_MASK : 0x%x\n", SD_INFO1_MASK); -PRINTDEBUG( "SD_INFO2_MASK : 0x%x\n", SD_INFO2_MASK); -PRINTDEBUG( "SD_CLK_CTRL : 0x%x\n", SD_CLK_CTRL); -PRINTDEBUG( "SD_SIZE : 0x%x\n", SD_SIZE); - -PRINTDEBUG( "SD_INFO1_MASK : 0x%x\n", (*(vu32 *)(SD_IP_BASE + 0x20)));*/ - } - SD_Command(SD_CMD_CMD | GO_IDLE_STATE); /* CMD0発行、レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /*------- idle state -------*/ - SVC_WaitByLoop( 17900); //179*4サイクル=716サイクル=10024ns=10us - SD_SendIfCond(); /* CMD8発行、レスポンス確認 */ - if( !SDCARD_SDHCFlag) { /* SDHC以外は失敗してるはずなので */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーフラグをクリアしておく */ - } - - while(!(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT)){ /* タイムアウトになったら抜ける */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); - - SD_RCA = 0; /* RCA = 0をセット */ - if(!SDCARD_MMCFlag){ /* MMCカードフラグが 0(OFF) か? */ - if(!SD_AppCommand()){ /* CMD55 発行処理が正常か? */ - SDCARD_MMCFlag = FALSE; /* MMCカードフラグクリア */ - if(!SD_AppOpCond()){ /* ACMD41発行処理が正常か?(OCR31bit = L の時 No Response) */ - SDCARD_SDFlag = TRUE; /* SDカードフラグセット */ - break; - } - }else{ /* CMD55 が正常終了しない */ - if(SDCARD_ErrStatus == SDMC_ERR_TIMEOUT){ /* タイムアウト(==No Response)か? */ - SDCARD_MMCFlag = TRUE; /* MMCカードフラグセット */ - }else{ -// break; //コメントアウトしないとSDカードの初期化に失敗する - } - } - } - if(SDCARD_MMCFlag){ /* MMCカードフラグが 1(ON) のとき */ - SD_RCA = 1; /* RCA = 1をセット */ - if(!SD_SendOpCond()){ /* CMD1発行処理が正常か? */ - break; - } - } - } -/* - if( SDCARD_SDHCFlag) { - SD_ReadOCR(); - } -*/ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーかチェック */ - SD_ClrErr(SDMC_ERR_FPGA_TIMEOUT); /* タイムアウトエラーの設定クリア */ - SD_SetErr(SDMC_ERR_RESET); /* 初期化カードリセットコマンド時1.5秒タイムアウトエラーの設定 */ - } - SDCARD_MMCFlag = FALSE; /* MMCカードフラグクリア */ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_INITIAL_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif -PRINTDEBUG( "%d\n", __LINE__); - - SD_SendCID(); /* CMD2発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - while(1){ - /******************/ - SDCARD_TimerCheck(); - /******************/ - SD_SendRelativeAddr(); /* CMD3発行 レスポンス確認 正常終了時 RCA<-ResのRCA */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - if(SD_RCA != 0){ - break; - } - } - - /*------- standby state -------*/ - SD_SendCSD(); /* CMD9発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); - - /* 転送速度設定 */ - SD_ClockDivSet(SD_RSP5); /* SDカードの動作クロック設定 (CSD[5]) */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /* Command toggles acard between the Stand-by and Transfer states */ - SD_SelectCard(); /* CMD7発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /*------- translate state -------*/ - - SDCARD_SectorSize = SECTOR_SIZE; /* セクタサイズ デフォルト 512bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* CMD16 ブロックサイズの設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - -#if SCR - SD_SelectBitWidth(FALSE); /* CMD55->ACMD6 ビット幅の選択 1bit */ - - /* ACMD51 発行 SD configuration register (SCR) */ - if(SDCARD_SDFlag){ /* SDカードフラグ ON かチェック */ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - i_sdmcSendSCR(); - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } -#if TIMEOUT - SDCARD_TimerStart(SDCARD_CLOCK_WAIT);/* タイムアウト判定用タイマスタート */ -#endif - } -#endif - SD_EnableClock(); /* SD-CLK Enable */ - - if(SDCARD_MMCFlag){ /* MMCカード ON かチェック */ - if( ((SD_CSD[7] & 0x3C)>>2) >= 4) { - MMCP_SetBusWidth( TRUE); - } -// SD_SelectBitWidth(FALSE); /* CMD55->ACMD6 ビット幅の選択 1bit */ - }else{ - SD_SelectBitWidth(TRUE); /* CMD55->ACMD6 ビット幅の選択 4bit */ - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - - if(SDCARD_SDFlag){ /* SDカードフラグ ON かチェック */ - if (SDCARD_SD_Status()) /* CMD55->ACMD13 カードステータスを取得 */ - return SDCARD_ErrStatus; - if(SD_SDSTATUS[1] & SD_MEMORY_CARD){ - SDCARD_SDFlag = FALSE; /* SDカードフラグクリア */ - } - } - - /*--------------カードサイズの算出---------------*/ - if( ((SD_CSD[7] & CSD_STRUCT_BIT_127_126) >> 6) == 0x1) { //SDHCのとき - sdmc_current_spec.csd_ver2_flag = 1; - ulCSize = (u32)((((u32)(SD_CSD[3]) & CSD_C_SIZE_BIT_69_56) << 8) + - ((SD_CSD[2] & CSD_C_SIZE_BIT_55_48) >> 8) + 1); - ulCSize = ulCSize * 1024; //もともと512KByte単位なのを512Byte単位にする - /* データ領域サイズ算出 */ - sdmc_current_spec.memory_capacity = ulCSize; - ulSDCARD_Size = ulCSize; - /* プロテクト領域サイズ算出 */ - sdmc_current_spec.protected_capacity = (((SD_SwapByte( &SD_SDSTATUS[2])) << 16) + - (SD_SwapByte( &SD_SDSTATUS[3]))) / 0x200; - /*トータルサイズ算出 */ - sdmc_current_spec.card_capacity = sdmc_current_spec.memory_capacity + - sdmc_current_spec.protected_capacity; - - }else{ //従来SDカードのとき - sdmc_current_spec.csd_ver2_flag = 0; - ulCSize = (u32)(((SD_CSD[3] & CSD_C_SIZE_BIT_71_62) >> 6) + - ((SD_CSD[4] & CSD_C_SIZE_BIT_73_72) << 10) + 1); - mult_val = ((SD_CSD[2] & CSD_C_SIZE_MULT) >> 7) + 2; //2の乗数 - ulCSize = ulCSize << mult_val; - if(SDCARD_MMCFlag){ /* MMCカードフラグON かチェック */ - read_block_len_val = ((SD_CSD[4] & CSD_READ_BL_LEN) >> 8); - ulCSize = (ulCSize << read_block_len_val); - }else{ /* SDカードフラグ(SDCARD_SDFlag)ON のはず */ - read_block_len_val = (((SD_CSD[1] & CSD_WRITE_BL_LEN_BIT_25_24) << 2) | - ((SD_CSD[0] & CSD_WRITE_BL_LEN_BIT_23_22) >> 14)); - ulCSize = (ulCSize << read_block_len_val); - } - /* データ領域サイズ算出 */ - ulCSize /= SDCARD_SectorSize; /* 全セクタ数の算出 */ - sdmc_current_spec.memory_capacity = ulCSize; - ulSDCARD_Size += ulCSize; /* 全セクタ数のセット */ - /* プロテクト領域サイズ算出 */ - sdmc_current_spec.protected_capacity = ((SD_SwapByte( &SD_SDSTATUS[2])) << 16) + - (SD_SwapByte( &SD_SDSTATUS[3])); - sdmc_current_spec.protected_capacity <<= mult_val; - sdmc_current_spec.protected_capacity <<= read_block_len_val; - sdmc_current_spec.protected_capacity /= SDCARD_SectorSize; //TODO:構造体にまとめること - /*トータルサイズ算出 */ - sdmc_current_spec.card_capacity = sdmc_current_spec.memory_capacity + - sdmc_current_spec.protected_capacity; - } - sdmc_current_spec.SS = SDCARD_SectorSize; - - PRINTDEBUG( "SD memory capacity : 0x%x\n", sdmc_current_spec.memory_capacity); - PRINTDEBUG( "SD protected capacity : 0x%x\n", sdmc_current_spec.protected_capacity); - PRINTDEBUG( "SD total capacity : 0x%x\n", sdmc_current_spec.card_capacity); - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcMPInit - - Description: initialize SD card in multi ports. - マルチポートのSDカード初期化 - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcMPInit( void) -{ - u16 load_port_no; - SDPortContext* SDNandContext; - - //予約領域のポートコンテキスト参照 - SDNandContext = (SDPortContext*)&(((OSFromBromBuf*)OSi_GetFromBromAddr())->SDNandContext); -#if 0 - OS_TPrintf( "CID[0]:0x%x\n", SDNandContext->SD_CID[0]); - OS_TPrintf( "CID[1]:0x%x\n", SDNandContext->SD_CID[1]); - OS_TPrintf( "CID[2]:0x%x\n", SDNandContext->SD_CID[2]); - OS_TPrintf( "CID[3]:0x%x\n", SDNandContext->SD_CID[3]); - OS_TPrintf( "CID[4]:0x%x\n", SDNandContext->SD_CID[4]); - OS_TPrintf( "CID[5]:0x%x\n", SDNandContext->SD_CID[5]); - OS_TPrintf( "CID[6]:0x%x\n", SDNandContext->SD_CID[6]); - OS_TPrintf( "CID[7]:0x%x\n", SDNandContext->SD_CID[7]); - OS_TPrintf( "port_no:0x%x\n", SDNandContext->port_no); -#endif - - //NANDスロットの初期化 - SD_SetFPGA( SD_PORTSEL, SDMC_PORT_NAND); /* NANDポート選択 */ - -// OS_TPrintf( "SDNandContext : 0x%x\n", SDNandContext); - //初期化済みでないときだけ初期化 - if( sdmcCheckPortContext( SDNandContext) != SDMC_NORMAL) { -// OS_TPrintf( "sdmcCheckPortContext : ERR!\n"); - SDCARD_ErrStatus = SDCARD_Layer_Init(); - - SDCARD_Backup_port1(); //TODO:ポート番号 - //ポートコンテキストの保存 - if( i_sdmcSavePortContext( SDNandContext, 1) != SDMC_NORMAL) { -// OS_TPrintf( "i_sdmcSavePortContext failed\n"); - return( SDMC_ERR_PARAM); - } - }else{ //ポートコンテキストの復帰 -// OS_TPrintf( "sdmcCheckPortContext : NORMAL\n"); - - /*SDCARD_Layer_Init()の代わり*/ - SDCARD_SectorSize = SECTOR_SIZE; /* セクタサイズ デフォルト 512bytes */ - - if( i_sdmcLoadPortContext( SDNandContext, &load_port_no) != SDMC_NORMAL) { -// OS_TPrintf( "i_sdmcLoadPortContext failed\n"); - return( SDMC_ERR_PARAM); - } - SDCARD_Restore_port1(); //TODO:load_port_no値判定 - } - - SDCARD_OutFlag = FALSE; /* 排出フラグをリセット */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - SD_DisableClock(); /* SD-CLK Disable */ - SD_EnableInfo(); /* SD Card 挿抜 割り込み許可 */ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcGetStatus - - Description: get card status - カードの状態を取得する - bit15 SDカード判別ビット(検出したら1) - bit14 MMCカード判別ビット(検出したら1) - bit10 IO3 card detect(検出したら1) ※CTRではプルアップのため使えない - bit9 IO3 card inserted(挿入動作で1) ※CTRではプルアップのため使えない - bit8 IO3 card removed(脱動作で1) ※CTRではプルアップのため使えない - bit7 write protect(書き込み禁止の場合1) - bit5 card detect(検出したら1) - bit4 card inserted(挿入動作で1) - bit3 card removed(脱動作で1) - bit2 R/W access all end - bit0 Response end - - Arguments: *status : カードの状態を格納する変数へのポインタ - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -/*----------------------------------------------- -SD_INFO1レジスタ -bit[10,9,8,7] = DAT3CD, DAT3IN, DAT3OUT, WP -bit[5, 4, 3, 2] = CD, INS, REM, ALLEND -bit0 = RESEND -------------------------------------------------- -EXT_CDレジスタ -bit[2,1,0] = P1CD, P1INS, P1REM -------------------------------------------------- -EXT_CD_DAT3レジスタ -bit[2, 1, 0] = P1DCD, P1DINS, P1DREM -------------------------------------------------- -EXT_WPレジスタ -bit0 = P1WP ------------------------------------------------*/ -SDMC_ERR_CODE sdmcGetStatus(u16 *status) -{ - u16 SD_INFO1_STATUS; - - SD_INFO1_STATUS = SD_INFO1; /* SD_INFO1レジスタ読み出し */ - *status = SD_INFO1_STATUS; /* 論理反転 */ - - /*--- ポート0のとき ---*/ - if(SD_port_number == SDCARD_PORT0) - { - *status &= SDCARD_FLAG_CLR; /* SD/MMCフラグクリア */ - } - /*--- ポート1のとき ---*/ - else if (SD_port_number == SDCARD_PORT1) - { - *status &= SDCARD_PORT1_CLR; /* port1に関係ない部分をクリア */ - SD_INFO1_STATUS = (u16)((EXT_CD & 0x0007) << 3); - SD_INFO1_STATUS |= ((EXT_CD_DAT3 & 0x0007) << 8); - SD_INFO1_STATUS |= ((EXT_WP & 0x0001) << 7); - *status |= SD_INFO1_STATUS; /* カードport1フラグ設定 */ - } - /*--- SD/MMCフラグをセット ---*/ - if( SDCARD_MMCFlag) { /* 検出したカードがMMCカードの時 */ - *status |= SDCARD_FLAG_MMC; /* カード判定部分MMCカード */ - } - if( SDCARD_SDFlag) { /* 検出したカードがSDカードの時 */ - *status |= SDCARD_FLAG_SD; /* カード判定部分SDカード */ - } - - return SDMC_NORMAL; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_GetR1Status - - Description: get the card status of R1 response. - R1レスポンスのカードステータスを取得する。 - - Arguments: None - - Returns: SDCARD_Status : R1の[39:8] - *---------------------------------------------------------------------------*/ -static u32 SDCARD_GetR1Status(void) -{ - /* SD_CheckStatusでSDCARD_Statusに値が入る */ - return SDCARD_Status; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcReadFifo - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; //SDCARD関数の返り値 - - SDCARD_USR_TRANSFER_FUNC = NULL; //ライブラリ内部関数によるリード - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ_WITH_FIFO; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: sdmcReadStreamBegin - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReadStreamBegin( u32 offset, SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; //SDCARD関数の返り値 - - SDCARD_STREAM_FLAG = TRUE; - - SdMsg.buf = NULL; - SdMsg.bufsize = 1; - SdMsg.offset = offset; - SdMsg.func = NULL; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ_WITH_FIFO_STREAM_BEGIN; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: sdmcReadStreamEnd - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReadStreamEnd( SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; //SDCARD関数の返り値 - - SDCARD_STREAM_FLAG = FALSE; - - SdMsg.buf = NULL; - SdMsg.bufsize = 1; - SdMsg.func = NULL; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ_WITH_FIFO_STREAM_END; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcReadFifoDirect - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcReadFifoDirect(sdmcTransferFunction usr_func, - u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; //SDCARD関数の返り値 - - SDCARD_USR_TRANSFER_FUNC = usr_func; //User関数による直接リード - - SdMsg.buf = NULL; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ_WITH_FIFO; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARDi_ReadFifo - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_ReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDMC_ERR_CODE result; - - /* FIFO Empty割り込み無効、FIFO Full割り込み有効 */ - *(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FEIE)) | SDIF_CNT_FFIE; - *(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */ - *(SDIF_FSC) = bufsize; - *(SDIF_CNT) |= (SDIF_CNT_USEFIFO | SDIF_CNT_FCLR); /* FIFO使用フラグON */ - CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */ - - result = SDCARDi_Read( buf, bufsize, offset, func, info); - - /* FIFO無効に */ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* FIFO使用フラグOFF */ - CC_EXT_MODE = CC_EXT_MODE_PIO; /* PIOモード(DMAモードOFF) */ - - return result; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARDi_ReadFifoStreamBegin - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_ReadFifoStreamBegin(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - /* FIFO Empty割り込み無効、FIFO Full割り込み有効 */ - *(SDIF_CNT) = (*(SDIF_CNT) & (~SDIF_CNT_FEIE)) | SDIF_CNT_FFIE; - *(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */ - *(SDIF_FSC) = bufsize; - *(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用フラグON */ - CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */ - - SDCARDi_ReadBegin( buf, bufsize, offset, func, info); - - return SDMC_NORMAL; -} - -/*---------------------------------------------------------------------------* - Name: SDCARDi_ReadFifoStreamEnd - - Description: read from card. - ラッパーのFIFOを使用してカードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_ReadFifoStreamEnd( void) -{ - SDMC_ERR_CODE result; - - result = SDCARDi_ReadEnd( FALSE); - - /* FIFO無効に */ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* FIFO使用フラグOFF */ - CC_EXT_MODE = CC_EXT_MODE_PIO; /* PIOモード(DMAモードOFF) */ - - return result; -} - - - -#if 0 -/*---------------------------------------------------------------------------* - Name: sdmcRead - - Description: read from card. - カードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcRead(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_READ; - - api_result = SDCARD_Thread( &SdMsg); - return api_result; -} -#endif - -/*---------------------------------------------------------------------------* - Name: SDCARDi_Read - - Description: read from card. - カードからの読み出し。 - - Arguments: buf : 読み出したデータを格納するためのバッファのアドレス - bufsize : 読み出しサイズ(セクタ数) - offset : 読み出し開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_Read(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ - SDMC_ERR_CODE result; - - SDCARDi_ReadBegin( buf, bufsize, offset, func, info); - result = SDCARDi_ReadEnd( TRUE); - - return result; -} - - -static SDMC_ERR_CODE SDCARDi_ReadBegin(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info) -{ -// s16 nRetryCount; /* リトライ回数カウント */ - -// for( nRetryCount=0; nRetryCountresult = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } - } - }else{ /*--- 残りセクタ数が 0 でないとき ---*/ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - } -} - -/*---------------------------------------------------------------------------* - Name: SYSFPGA_irq - - Description: insert/remove/error/access end interrupt handler. - BREやBWE割り込みを除く割り込みのハンドラ。挿抜、エラー発生、 - アクセス終了の割り込み発生時にそれぞれの処理を行う。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SYSFPGA_irq(void) -{ - /*--- ポート0の挿抜割り込みチェックとコールバック起動 ---*/ - if(!SD_CheckFPGAReg( SD_INFO1_MASK, SD_INFO1_MASK_REMOVE)){ /* SD Card 抜け 割込み許可状態か? */ - if( SD_CheckFPGAReg( SD_INFO1, SD_INFO1_REMOVE)){ /* SD Card 抜け 発生か? */ - SD_AndFPGA( SD_INFO1,(~SD_INFO1_REMOVE)); /* INFO1の抜けフラグを落とす */ - SDCARD_OutFlag = TRUE; /* 排出フラグセット */ - if(func_SDCARD_Out){ /* コールバック関数のNullチェック */ - SDCARD_IO_Port = SDCARD_PORT0; /* カード抜けポート番号を設定 */ - func_SDCARD_Out(); /* カード抜けコールバック関数呼び出し */ - } - } - } - if(!SD_CheckFPGAReg( SD_INFO1_MASK, SD_INFO1_MASK_INSERT)){ /* SD Card 挿入 割込み許可状態か? */ - if( SD_CheckFPGAReg( SD_INFO1, SD_INFO1_INSERT)){ /* SD Card 挿入 発生か? */ - SD_AndFPGA( SD_INFO1, (~SD_INFO1_INSERT)); /* INFO1の挿入フラグを落とす */ - SDCARD_OutFlag = FALSE; /* 排出フラグリセット */ - if(func_SDCARD_In){ /* コールバック関数のNullチェック */ - SDCARD_IO_Port = SDCARD_PORT0; /* カード挿入ポート番号を設定 */ - func_SDCARD_In(); /* カード挿入コールバック関数呼び出し */ - } - } - } - /* (CTRはポート1のCD端子が未接続(常に挿入状態)なので、ポート1の挿抜チェックは行わない) */ - - /*--- 割り込み要求と割り込みマスクを保存 ---*/ - SD_GetFPGA( SD_INFO1_VALUE, SD_INFO1); - SD_GetFPGA( SD_INFO1_MASK_VALUE, SD_INFO1_MASK); - SD_GetFPGA( SD_INFO2_VALUE, SD_INFO2); - SD_GetFPGA( SD_INFO2_MASK_VALUE, SD_INFO2_MASK); - /*------------------------------------------*/ - - /*--- SD_INFO2のエラーフラグ作成 ---*/ - SD_INFO_ERROR_VALUE = (u16)(SD_INFO2_VALUE & (~SD_INFO2_MASK_VALUE)); - /*--- エラーステータス作成 (RESTIMEOUTとILAエラーのフラグは反映しない) ---*/ - SDCARD_ErrStatus |= SD_INFO_ERROR_VALUE & (~(SD_INFO2_ERR_RESTIMEOUT)) & - (~(SD_INFO2_ERR_ILA)) & SD_INFO2_MASK_ERRSET; - - /*--- RESTIMEOUTとILAエラーはフラグの位置をずらして反映する ---*/ - if( SD_INFO_ERROR_VALUE & SD_INFO2_ERR_ILA) { - SDCARD_ErrStatus |= SDMC_ERR_ILA; /* イリーガルアクセスエラー発生 */ - } - if( SD_INFO_ERROR_VALUE & SD_INFO2_ERR_RESTIMEOUT) { - SDCARD_ErrStatus |= SDMC_ERR_TIMEOUT; /* Response Time out エラー発生 */ - }/*------------------------------------------------------------*/ - - SD_AndFPGA( SD_INFO2,(~(SD_INFO2_ERROR_SET))); /* SD_INFO2のエラーフラグを全て落とす */ - if ( SDCARD_ErrStatus) { /* 何らかのエラーが発生しているか? */ - SD_OrFPGA( SD_INFO2_MASK, SD_INFO2_MASK_ERRSET); /* 全てのエラー割り込みを禁止 */ - } - /*--- SD_INFO2のエラーチェック終了 ---*/ - - - /*--- SD_INFO1の割り込み発生状況フラグ作成 ---*/ - SD_INFO_ERROR_VALUE = (u16)(SD_INFO1_VALUE & (~SD_INFO1_MASK_VALUE)); - - if( SD_INFO_ERROR_VALUE & SD_INFO1_MASK_ALL_END) { /* R/W access all end 割込み発生か? */ - SD_OrFPGA( SD_INFO1_MASK, SD_INFO1_MASK_ALL_END); /* INFO1の access all end 割込み禁止 */ - SDCARD_FPGA_Flag = TRUE; /* R/Wアクセス終了(IP処理完了)フラグセット */ - if( SDCARD_ATC0_Flag) { /* 転送完了処理(SDCARD_ATC0_irq)が完了しているか? */ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - SD_TransEndFPGA(); /* 転送終了処理(割り込みマスクを禁止に戻す) */ - if( SDCARD_EndFlag == FALSE) { /* 転送が終了していないか? */ - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグセット */ - if( pSDCARD_info) { /* Nullチェック */ - pSDCARD_info->result = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } /* 転送が終了済みのとき */ - return; - } /* 全ATC完了フラグ OFF の場合 */ - if( SDCARD_ErrStatus != SDMC_NORMAL) { /* エラーが発生している場合 */ - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - if( SDCARD_EndFlag == FALSE) { /* 転送が終了していないか? */ - SD_TransEndFPGA(); /* カード転送の終了処理 */ - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグセット */ - /* SD_Init(); */ /* SD Cardインターフェース部をリセット&初期設定 */ - if( pSDCARD_info) { /* Nullチェック */ - pSDCARD_info->result = SDCARD_ErrStatus; /* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } - } - } /* R/W access all end 割り込み未発生 */ -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_TimerCheck - - Description: - - Arguments: - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_TimerCheck( void) -{ - u16 now_tick, eval_tick; - - now_tick = ((u16)OS_GetTickLo()); - eval_tick = now_tick - sdmc_base_tick; //Tickのoverflowは1周まで許容 - - /**/ - PRINTDEBUG( "timeout : %d\n", sdmc_timeout_ms); - PRINTDEBUG( "base_tick:0x%x, now_tick:0x%x, eval_tick:0x%x\n", - sdmc_base_tick, now_tick, eval_tick); - PRINTDEBUG( "eval_tick to ms : %d\n", OS_TicksToMilliSecondsBROM32( eval_tick)); - - /**/ - if( OS_TicksToMilliSecondsBROM32( eval_tick) > sdmc_timeout_ms) { - SDCARD_Timer_irq( NULL); - } -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_TimerStart - - Description: start timer for measure timeout. - タイムアウト計測を開始する - - Arguments: tim : ms単位のタイムアウト時間 - (50msを超える値の場合は50ms単位になる) - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_TimerStart(u32 tim) -{ -#if 0 - OSTick tim_tick; - - tim_tick = OS_MilliSecondsToTicks( tim); //us単位からTick単位へ - - OS_CancelAlarm( &sdmc_alm); //アラーム破棄 - OS_SetAlarm( &sdmc_alm, tim_tick, SDCARD_Timer_irq, NULL); //アラームセット -#endif - sdmc_timeout_ms = tim; - sdmc_base_tick = OS_GetTickLo(); -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_TimerStop - - Description: stop timer - タイムアウト計測を停止する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -void SDCARD_TimerStop(void) -{ -#if 0 - OS_DisableIrq(); - OS_CancelAlarm( &sdmc_alm); - OS_EnableIrq(); -#endif -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Timer_irq - - Description: timer interrupt handler. - タイマー割り込みハンドラ - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Timer_irq(void* arg) -{ -#if (SD_DEBUG_PRINT_ON == 1) - u16 tmp; - - PRINTDEBUG( ">>>Timer intr(Timeout)\n"); - - tmp = SD_INFO1; - PRINTDEBUG( "SD_INFO1 : 0x%x\n", tmp); - tmp = SD_INFO1_MASK; - PRINTDEBUG( "SD_INFO1_MASK : 0x%x\n", tmp); - tmp = SD_INFO2; - PRINTDEBUG( "SD_INFO2 : 0x%x\n", tmp); - tmp = SD_INFO2_MASK; - PRINTDEBUG( "SD_INFO2_MASK : 0x%x\n", tmp); - tmp = SD_ERR_STS1; - PRINTDEBUG( "SD_ERR_STS1 : 0x%x\n", tmp); - tmp = SD_ERR_STS2; - PRINTDEBUG( "SD_ERR_STS2 : 0x%x\n", tmp); - tmp = *(vu16 *)(SD_IF_BASE+0x00); - PRINTDEBUG( "SD_CNT : 0x%x\n", tmp); - tmp = SD_SECCNT; - PRINTDEBUG( "SD_SECCNT : 0x%x\n", tmp); -#endif - - SDCARD_ErrStatus |= SDMC_ERR_FPGA_TIMEOUT; /* タイムアウトエラービットの設定 */ - - if(SDCARD_EndFlag == FALSE){ /* 転送処理完了フラグの確認(クリア?)*/ - SDCARD_EndFlag = TRUE; /* 転送処理完了フラグをセット */ - /* SD_TransEndFPGA(); */ /* カード転送の終了処理 */ - /* SD_StopTransmission(); */ /* カード転送終了設定 */ - /* SD_Init(); */ /* SD Cardインターフェース部をリセット&初期設定 */ - if(pSDCARD_info){ /* Nullチェック */ - pSDCARD_info->result = SDCARD_ErrStatus;/* SdmcResultInfo に情報設定 */ - pSDCARD_info->resid = (ulSDCARD_SectorCount - ulSDCARD_RestSectorCount) * - SDCARD_SectorSize; /* SdmcResultInfo に処理セクタ数設定 */ - } - } - - /**/ - PRINTDEBUG( "--Wup sdTsk(Time)--\n"); -// OS_WakeupThreadDirect( &sdmc_tsk); -// OS_WakeupThread( &sdmc_tsk_q); -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcSendSCR - - Description: get SCR register. - SCRを取得する(DATライン経由で8バイト送られてくる)。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 i_sdmcSendSCR(void) -{ - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ - - SD_EnableClock(); /* SD-CLK Enable */ - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 8; /* SCR レジスタ 転送サイズ 8bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 8byte 設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - - if(SD_AppCommand()){ /* RCA設定後 CMD55発行処理が正常終了しない? */ - SD_DisableClock(); /* SD-CLK Disable */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1; /* 残りセクタサイズ、セクタカウントに1を設定 */ - pSDCARD_BufferAddr = SD_SCR; /* データ格納バッファのアドレスを設定 */ - - /* 転送前の準備処理 */ - SDCARD_DataFlag = FALSE; - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if SCR - SD_SendSCR(); /* SCRの取得コマンド発行 */ - PRINTDEBUG( "--Slp Tsk--\n"); - -// OS_SleepThread( NULL); -// OS_SleepThread( &sdmc_tsk_q); - - PRINTDEBUG( "waked\n"); - - while(!SDCARD_EndFlag){ /* カードアクセス終了待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - - PRINTDEBUG( "IF:0x%x\n", *(vu16*)CTR_INT_IF); - PRINTDEBUG( "IE:0x%x\n", *(vu16*)CTR_INT_IE); - } - - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_SendStatus(); /* カードステータスの取得コマンド発行処理 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - } - } - SaveStatus = SDCARD_Status; /* カードステータスの保存 */ - SaveErrStatus = SDCARD_ErrStatus; /* エラーステータスの保存 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - i_sdmcErrProcess(); /* エラー時の処理 */ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - SDCARD_Status = SaveStatus; /* カードステータスの復帰 */ - SDCARD_ErrStatus = SaveErrStatus; /* エラーステータスの復帰 */ -#endif - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを戻す(default:512bytes)*/ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ - - SD_DisableClock(); /* SD-CLK Disable */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcErrProcess - - Description: when error is occured, get Card Status to check and stop the - transfer. - エラー発生時の処理。カードステータスを取得し、データ転送中で - あればストップさせる。 - - Arguments: None - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 i_sdmcErrProcess(void) -{ - u16 usRSP0; - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_ERRPROC_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - SD_SendStatus(); /* CMD13 addressed card sends its status register 発行、レスポンス待ち */ - - if(!SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - SD_GetFPGA( usRSP0, SD_RSP0); - usRSP0 = (u16)(( usRSP0 & RSP_R1_CURRENT_STATE) >> 1); /* カレントステートを取り出す */ - if((usRSP0 == CURRENT_STATE_DATA) || (usRSP0 == CURRENT_STATE_RCV)){ /* SDCARD Status が data rcv の時 */ - SD_Command(SD_CMD_CMD | STOP_TRANSMISSION); /* CMD12(StopTransmission)発行処理 */ - } - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: sdmcGetCardSize - - Description: get card size (number of sectors). - カードのセクタ数を取得する - - Arguments: None - - Returns: number of sectors in the SD card which inserted. - *---------------------------------------------------------------------------*/ -u32 sdmcGetCardSize(void) -{ - /* カード全セクタ数 (SDCARD_Layer_Init関数内で算出される) */ - return ulSDCARD_Size; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_SD_Status - - Description: get SD Status. - SDステータスを取得する(DATライン経由で64バイト送られてくる)。 - カードステータスではないことを留意。 - MultiBlock R/W と異なり、DATライン経由で転送されてくるSDカードの - レジスタは、MSBから先に送られてくることに注意。 - (Physical Layer Specification 2.00 p12-13参照) - - Arguments: None - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 SDCARD_SD_Status(void) -{ - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ - u32 ulSaveRestSectorCount; /* 残りセクタサイズ保存用 */ - - SD_EnableClock(); /* SD-CLK Enable */ - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 64; /* SD_STATUS 転送サイズ 64bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 64byte 設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - if(SD_AppCommand()){ /* RCA設定後 CMD55発行処理 が正常終了しない?*/ - SD_DisableClock(); /* SD-CLK Disable */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - ulSaveRestSectorCount = ulSDCARD_RestSectorCount; /* 残りセクタサイズを保存(TODO:いらない?) */ - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1; /* 残りセクタサイズ、セクタカウントを1に設定 */ - pSDCARD_BufferAddr = SD_SDSTATUS; /* データ格納バッファのアドレスを設定 */ - - /* 転送前の準備処理 */ - SDCARD_DataFlag = FALSE; - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - - SD_SDStatus(); /* ACMD13 SD_STATUSの取得コマンド発行処理 */ - PRINTDEBUG( "--Slp Tsk--\n"); - -// OS_SleepThread( NULL); -// OS_SleepThread( &sdmc_tsk_q); - - PRINTDEBUG( "waked\n"); - - while(!SDCARD_EndFlag){ /* カードアクセス終了待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - } - - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスが何らかのエラーでないか確認 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_SendStatus(); /* カードステータス取得コマンド発行、レスポンス(R1)待ち */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - } - } - SaveStatus = SDCARD_Status; /* カードステータスの保存 */ - SaveErrStatus = SDCARD_ErrStatus; /* エラーステータスの保存 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - i_sdmcErrProcess(); /* エラー時の処理 */ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - SDCARD_Status = SaveStatus; /* カードステータスの復帰 */ - SDCARD_ErrStatus = SaveErrStatus; /* エラーステータスの復帰 */ - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを戻す(default:512bytes)*/ - SD_SetBlockLength(SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ - ulSDCARD_RestSectorCount = ulSaveRestSectorCount; /* 保存していた残りセクタサイズを戻す(TODO:いらない?)*/ - - SD_DisableClock(); /* SD-CLK Disable */ - - return SDCARD_ErrStatus; -} - -/*******************************************************************************/ -int MMCP_SetBusWidth( BOOL b4bit) -{ - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ -// u16 TestData; - u16 Resid; - - SD_EnableClock(); /* SD-CLK Enable */ - -#if 0 - TestData = 0x5A;//0xA5; - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 4; /* 転送サイズ 1バイト */ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 1byte 設定 */ -#endif - /*コマンド6発行*/ - MMCP_WriteBusWidth( b4bit); - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - -#if 0 - /**/ - pSDCARD_info = NULL; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1; - pSDCARD_BufferAddr = &TestData; /* データ格納バッファのアドレスを設定 */ - SDCARD_DataFlag = FALSE; - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - /* IPのSD_SECCNTレジスタ有効化、転送セクタ数設定(自動CMD12発行のため) */ -// SD_EnableSeccnt( ulSDCARD_RestSectorCount); - - /*バステスト*/ - MMCP_BusTest( FALSE); - - /**/ - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - - - /**/ - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */ - pSDCARD_BufferAddr = &Resid; /* データ格納バッファのアドレスを設定 */ - SDCARD_DataFlag = FALSE; - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - /**/ - MMCP_BusTest( TRUE); - - /**/ - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if( SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - - /*バステスト合格ならバス幅を4bitに拡張*/ -// if( TestData == (~(Resid))) { - if( Resid == 0xA5) { - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - }else{ - SD_OrFPGA(SD_OPTION,(SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(1bit幅) */ - } - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを設定(デフォルト 512bytesに戻す)*/ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ -#endif - return( 0); -} -/*******************************************************************************/ - - -/*---------------------------------------------------------------------------* - Name: i_sdmcCheckWP - - Description: check the write protect bit in the SD_INFO1 register. - SD_INFO1レジスタのライトプロテクトビットを調べる - (0:ライトプロテクトされている、1:ライトプロテクトされていない)。 - CTRではポート1は常に1。 - - Arguments: None - - Returns: number of sectors in the SD card which inserted. - *---------------------------------------------------------------------------*/ -static u16 i_sdmcCheckWP(void) -{ - if (SD_port_number == SDCARD_PORT0) /* ポート0のとき */ - { - if(!(SD_CheckFPGAReg(SD_INFO1,SD_INFO1_WRITEPROTECT))) { //WPフラグが立っていないか? - SDCARD_ErrStatus |= SDMC_ERR_WP; //エラーフラグのWPエラービットを立てる - }else{ //WPフラグが立っていたとき - SDCARD_ErrStatus &= ~SDMC_ERR_WP; //エラーフラグのWPエラービットを落とす - } - return SDCARD_ErrStatus; - } - else if (SD_port_number == SDCARD_PORT1) /* ポート1のとき */ - { /*TWLのポート1はライトプロテクトビットが常に0(プロテクト状態)なので反転して評価*/ - if((SD_CheckFPGAReg(EXT_WP,EXT_WP_PORT1))) { //WPフラグが立っていないか? - SDCARD_ErrStatus |= SDMC_ERR_WP; //エラーフラグのWPエラービットを立てる - }else{ //WPフラグが立っていたとき - SDCARD_ErrStatus &= ~SDMC_ERR_WP; //エラーフラグのWPエラービットを落とす - } - return SDCARD_ErrStatus; - } - return SDMC_ERR_END; //ここには来ない -} - -/*---------------------------------------------------------------------------* - Name: sdmcWriteFifo - - Description: write to card. - ラッパーのFIFOを使用してカードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - - SDMC_ERR_CODE api_result; - - SDCARD_USR_TRANSFER_FUNC = NULL; //ライブラリ内部関数によるリード - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_WRITE_WITH_FIFO; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} - -/*---------------------------------------------------------------------------* - Name: sdmcWriteFifoDirect - - Description: write to card. - ラッパーのFIFOを使用してカードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcWriteFifoDirect(sdmcTransferFunction usr_func, - u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; - - SDCARD_USR_TRANSFER_FUNC = usr_func; //User関数による直接リード - - SdMsg.buf = NULL; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_WRITE_WITH_FIFO; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} - - -/*---------------------------------------------------------------------------* - Name: SDCARDi_WriteFifo - - Description: write to card. - ラッパーのFIFOを使用してカードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_WriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDMC_ERR_CODE result; - - /* FIFO割り込み禁止 */ - *(SDIF_CNT) = (*(SDIF_CNT) & (~(SDIF_CNT_FFIE | SDIF_CNT_FEIE))); - *(SDIF_FDS) = (u16)SDCARD_SectorSize; /* FIFOのデータサイズ */ - *(SDIF_FSC) = bufsize; - *(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用フラグON */ - CC_EXT_MODE = CC_EXT_MODE_DMA; /* DMAモードON */ - - result = SDCARDi_Write( buf, bufsize, offset, func, info); - - /* FIFO無効に */ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* FIFO使用フラグOFF */ - CC_EXT_MODE = CC_EXT_MODE_PIO; /* PIOモード(DMAモードOFF) */ - - return result; -} -#if 0 -/*---------------------------------------------------------------------------* - Name: sdmcWrite - - Description: write to card. - カードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcWrite(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - SDCARDMsg SdMsg; - SDMC_ERR_CODE api_result; - - SdMsg.buf = buf; - SdMsg.bufsize = bufsize; - SdMsg.offset = offset; - SdMsg.func = func; - SdMsg.info = info; - SdMsg.operation = SD_OPERATION_WRITE; - - api_result = SDCARD_Thread( &SdMsg); - - return api_result; -} -#endif - -/*---------------------------------------------------------------------------* - Name: SDCARDi_Write - - Description: write to card. - カードへの書き込み。 - - Arguments: buf : 書き込みデータが格納されているバッファのアドレス - bufsize : 書き込むサイズ(セクタ数) - offset : 書き込み開始オフセット(セクタ番号) - info : 実行結果を格納するための構造体へのアドレス - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARDi_Write(void* buf,u32 bufsize,u32 offset,void(*func)(),SdmcResultInfo *info) -{ - s16 nRetryCount; - u32 ulResid; - SDMC_ERR_CODE SaveErrStatus; /* エラーステータス保存用 */ - u32 SaveStatus; /* カードステータス保存用 */ - - if( func != NULL){ /* コールバック関数のNullチェック */ - return SDMC_ERR_PARAM; /* コマンドパラメータエラー */ - } - -#if WP_ena - if( i_sdmcCheckWP()) { - return SDMC_ERR_WP; /*** ライトプロテクトのチェック ***/ - } -#endif - for(nRetryCount = 0;nRetryCount < SDCARD_RETRY_COUNT;nRetryCount++){ - - SD_EnableClock(); /* SD-CLK Enable */ - -/* func_SDCARD_CallBack = func; */ - pSDCARD_info = info; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = bufsize; - pSDCARD_BufferAddr = buf; /* データ格納バッファのアドレスを設定 */ - - SDCARD_DataFlag = TRUE; - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - /* IPのSD_SECCNTレジスタ有効化、転送セクタ数設定(自動CMD12発行のため) */ - SD_EnableSeccnt( ulSDCARD_RestSectorCount); - - /*--- ライトコマンド発行 ---*/ - if( SDCARD_SDHCFlag) { - SD_MultiWriteBlock( offset); /* ライトコマンド発行(引数:オフセット) */ - }else{ - SD_MultiWriteBlock( offset * SDCARD_SectorSize); /* ライトコマンド発行(引数:オフセット*セクタサイズ) */ - } - /*--------------------------*/ - - /**/ - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - - /* エラーが発生していないか、タイムアウト以外のエラーの場合 */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - if(!(SDCARD_ErrStatus & SDMC_ERR_R1_STATUS)){ /* コマンドレスポンス(R1)のカードステータスがエラーでないか確認 */ - SD_SendStatus(); /* カードステータスの取得コマンド発行処理 */ - SD_CheckStatus(FALSE); /* コマンドレスポンス(R1)の Card Status チェック */ - } - } - SaveStatus = SDCARD_Status; /* カードステータスの保存 */ - SaveErrStatus = SDCARD_ErrStatus; /* エラーステータスの保存 */ - if( SDCARD_ErrStatus) { /* エラーステータスの確認(エラー有り?)*/ - i_sdmcErrProcess(); /* エラー時の処理(status取得、強制停止) */ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; /* エラー終了 */ - } -#if RESID - if( SDCARD_SDFlag) { /* SDカード(MMCでない)の場合 */ - if( SDCARD_UseFifoFlag) { /*--- FIFOを使用しているときは ---*/ - *(SDIF_CNT) &= (~SDIF_CNT_USEFIFO); /* 一時的にFIFO未使用モードにする */ - CC_EXT_MODE = CC_EXT_MODE_PIO; - i_sdmcGetResid(&ulResid); /* 書き込み完了セクタ数の取得 */ - *(SDIF_CNT) |= SDIF_CNT_USEFIFO; /* FIFO使用モードに戻す */ - CC_EXT_MODE = CC_EXT_MODE_DMA; - }else{ /*--- FIFOを使用していないとき ---*/ - i_sdmcGetResid(&ulResid); /* 書き込み完了セクタ数の取得 */ - } - if(info){ - info->resid = ulResid * SDCARD_SectorSize;/*** pSDCARD_info->resid をinfo->resid に修正 柏 2000.08.31. ***/ - } - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか確認 */ - return SDCARD_ErrStatus; - } - } -#endif - SDCARD_Status = SaveStatus; /* カードステータスの復帰 */ - SDCARD_ErrStatus = SaveErrStatus; /* エラーステータスの復帰 */ -#if RESID - if( SDCARD_SDFlag) { /* SDカード(MMCでない)の場合 */ - if( bufsize != ulResid){ /* ライト済みセクタ数が正しくないか? */ - SD_SetErr( SDMC_ERR_NUM_WR_SECTORS); /* エラーフラグセット */ - } - } -#endif - if( SDCARD_ErrStatus == SDMC_NORMAL) { /* エラーステータスの確認(エラー無し?)*/ - break; - } - } - - SD_DisableClock(); /* クロック供給停止 */ - - return SDCARD_ErrStatus; -} - - -/*---------------------------------------------------------------------------* - Name: i_sdmcGetResid - - Description: get the numbers of the well written(without errors) blocks. - 書き込みが完了したセクタの数を取得する。 - - - Arguments: pResid : 書き込み完了セクタ数を返す変数へのポインタ - - Returns: 0 : success - > 0 : error - *---------------------------------------------------------------------------*/ -static u16 i_sdmcGetResid(u32 *pResid) -{ - u16 Resid[2]; - u32 ulSave_SectorSize; /* セクタサイズ保存用 */ - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスをクリア */ - - /* ブロックサイズの設定 */ - ulSave_SectorSize = SDCARD_SectorSize; /* セクタサイズの保存 */ - SDCARD_SectorSize = 4; /* 転送サイズ 4バイト */ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 4byte 設定 */ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ -#endif - - if( SD_AppCommand()) { /* RCA設定後 CMD55発行処理 */ - return SDCARD_ErrStatus; /* エラー発生(CMD55が正常終了しない)なら戻る */ - } - -/* func_SDCARD_CallBack = NULL; */ - pSDCARD_info = NULL; - ulSDCARD_RestSectorCount = ulSDCARD_SectorCount = 1;/* 残りセクタサイズ、セクタカウントに1を設定 */ - pSDCARD_BufferAddr = Resid; /* データ格納バッファのアドレスを設定 */ - - SDCARD_DataFlag = FALSE; - SDCARD_ATC0_Flag = FALSE; /* 全ATC完了フラグクリア */ - SDCARD_FPGA_Flag = FALSE; /* FPGA処理完了フラグクリア */ - SDCARD_EndFlag = FALSE; /* 転送処理完了フラグクリア */ - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスのクリア */ - - /*--- ACMD22 ライト済みセクタ数取得コマンド発行 ---*/ - SD_SendNumWRSectors(); - /*-------------------------------------------------*/ - PRINTDEBUG( "--Slp Tsk--\n"); - PRINTDEBUG( "waked\n"); - - while( !SDCARD_EndFlag) { /* カードアクセス終了待ち */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - if( SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーか? */ - return SDCARD_ErrStatus; /* エラー終了 */ - } - } - /* エラーが発生していないか、タイムアウト以外のエラーの場合 */ - if( SDCARD_ErrStatus) { /* (タイムアウト以外に)エラー発生か? */ - i_sdmcErrProcess(); /* エラー時の処理 */ - *pResid = 0L; /* ライト済みセクタ数に 0 を設定 */ - }else{ /* エラーが発生していない場合 */ - /* SDカードのレジスタはMSBから送られてくるため並べ替えを行う */ - Resid[1] = SD_SwapByte(&Resid[1]); /* 上位 1byte と下位 1byte を入れ替える */ - (((LELONG *)pResid)->dt2word.low) = Resid[1]; /* Resid[1]の設定 */ - Resid[0] = SD_SwapByte(&Resid[0]); /* 上位 1byte と下位 1byte を入れ替える */ - (((LELONG *)pResid)->dt2word.high) = Resid[0]; /* Resid[0]の設定 */ - } - - SDCARD_SectorSize = ulSave_SectorSize; /* 保存していたセクタサイズを設定(デフォルト 512bytesに戻す)*/ - SD_SetBlockLength( SDCARD_SectorSize); /* SDカードデータ転送サイズ 512bytes 設定 */ - /* SetBlockLengthでエラーが出たらどうする? */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Restore_port0 - - Description: restore registers and variables of port0. - ポート0のレジスタや変数を復帰する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Restore_port0(void) -{ - /* registers */ - SD_SetFPGA( SD_CLK_CTRL, SDPort0Context.SD_CLK_CTRL_VALUE); - SD_SetFPGA( SD_OPTION, SDPort0Context.SD_OPTION_VALUE); - - /* variables */ - SD_RCA = SDPort0Context.SD_RCA; - SDCARD_ErrStatus = SDPort0Context.ErrStatus; - SDCARD_Status = SDPort0Context.Status; - SDCARD_MMCFlag = SDPort0Context.MMCFlag; - SDCARD_SDHCFlag = SDPort0Context.SDHCFlag; - SDCARD_SDFlag = SDPort0Context.SDFlag; - - SDCARD_OutFlag = SDPort0Context.OutFlag; - pSDCARD_info = NULL; - - /*media registers*/ - MI_CpuCopy8( SDPort0Context.SD_CID, SD_CID, 16); - MI_CpuCopy8( SDPort0Context.SD_CSD, SD_CSD, 16); - MI_CpuCopy8( SDPort0Context.SD_OCR, SD_OCR, 4); - MI_CpuCopy8( SDPort0Context.SD_SCR, SD_SCR, 8); - - /*recalc*/ - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Restore_port1 - - Description: restore registers and variables of port0. - ポート1のレジスタや変数を復帰する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Restore_port1(void) -{ - /* registers */ - SD_SetFPGA( SD_CLK_CTRL, SDPort1Context.SD_CLK_CTRL_VALUE); - SD_SetFPGA( SD_OPTION, SDPort1Context.SD_OPTION_VALUE); - - /* variables */ - SD_RCA = SDPort1Context.SD_RCA; - SDCARD_ErrStatus = SDPort1Context.ErrStatus; - SDCARD_Status = SDPort1Context.Status; - SDCARD_MMCFlag = SDPort1Context.MMCFlag; - SDCARD_SDHCFlag = SDPort1Context.SDHCFlag; - SDCARD_SDFlag = SDPort1Context.SDFlag; - - SDCARD_OutFlag = SDPort1Context.OutFlag; - pSDCARD_info = NULL; - - /*media registers*/ - MI_CpuCopy8( SDPort1Context.SD_CID, SD_CID, 16); - MI_CpuCopy8( SDPort1Context.SD_CSD, SD_CSD, 16); - MI_CpuCopy8( SDPort1Context.SD_OCR, SD_OCR, 4); - MI_CpuCopy8( SDPort1Context.SD_SCR, SD_SCR, 8); - - /*recalc*/ - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); -} - - -/*---------------------------------------------------------------------------* - Name: sdmcSelectedNo - - Description: get selected port number. - 選択されているポート番号を取得する - - Arguments: None - - Returns: [15:8]port numbers which supported(サポートされているポート数) - [7:0]port number which selected now(選択されているポート番号) - *---------------------------------------------------------------------------*/ -u16 sdmcSelectedNo(void) -{ - u16 i_sdmcSelect_Value; - - SD_GetFPGA(i_sdmcSelect_Value,SD_PORTSEL); /* SD_PORTSELレジスタ値を取得 */ - - return i_sdmcSelect_Value; -} - -/*---------------------------------------------------------------------------* - Name: sdmcSelect - - Description: select port. - ポートを選択する - - Arguments: select : [15:8]port numbers which supported(サポートされているポート数) - [7:0]port number which selected now(選択するポート番号) - Returns: 0 : success - >0 : error - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcSelect(u16 select) -{ - union - { - u16 Val; - struct - { - u8 L; /* 指定したいポート */ - u8 H; /* サポートされているポート */ - } PSel; - } SDCARD_PSel; - - //TODO : transferモードからstand-byモードにする? -/* if( !SDCARD_EndFlag) { // 転送が残っている場合はエラー - return SDMC_ERR_END; - } -*/ - SDCARD_PSel.Val = select; - if ((SDCARD_PSel.PSel.H > SDCARD_PORT_NO_MAX) - | (SDCARD_PSel.PSel.H < SDCARD_PORT_NO_MIN) - | (SDCARD_PSel.PSel.L > SDCARD_PORT_SELECT_NO)) - { - return SDMC_ERR_PARAM; /* コマンドパラメータエラー */ - }else{ - SD_port_en_numbers = SDCARD_PSel.PSel.H; /* 新しくサポートするポート数を保存 */ - SD_port_number = SDCARD_PSel.PSel.L; /* 新しく選択するポート番号を保存 */ - - SD_GetFPGA(SDCARD_PSel.Val,SD_PORTSEL); /* 現在のレジスタを取得 */ - - if (SDCARD_PSel.PSel.L == 0) /* 現在選択されているポートが 0 ? */ - { - SDCARD_Backup_port0(); - }else{ - SDCARD_Backup_port1(); - } - - SDCARD_PSel.Val= select; - - if (SDCARD_PSel.PSel.L == 0) /* 新しく選択されたポートが 0 ? */ - { - SDCARD_Restore_port0(); - }else{ - SDCARD_Restore_port1(); - } - - SD_SetFPGA(SD_PORTSEL,select); /* レジスタへセット */ - return SDMC_NORMAL; /* 0 リターン */ - } -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_Thread - - Description: SDメモリカードメインタスク - - Arguments: - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARD_Thread( SDCARDMsg* SdMsg) -{ - SDMC_ERR_CODE api_result; - - while( TRUE) { - /* メッセージ待ち */ - PRINTDEBUG( "rcv mes sdThread\n"); - PRINTDEBUG( "sd task : receive command : %d\n", SdMsg->operation); - - switch( SdMsg->operation) { - case SD_OPERATION_INIT: - api_result = i_sdmcInit(); - break; -#if 0 - case SD_OPERATION_READ: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_Read( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; -#endif - case SD_OPERATION_READ_WITH_FIFO: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_ReadFifo( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - /*--stream--*/ - case SD_OPERATION_READ_WITH_FIFO_STREAM_BEGIN: - api_result = SDCARDi_ReadFifoStreamBegin( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - case SD_OPERATION_READ_WITH_FIFO_STREAM_END: - api_result = SDCARDi_ReadFifoStreamEnd(); - break; - /*----------*/ -#if 0 - case SD_OPERATION_WRITE: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_Write( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; -#endif - case SD_OPERATION_WRITE_WITH_FIFO: - PRINTDEBUG( "from:0x%x, sectors:0x%x\n", SdMsg->offset, SdMsg->bufsize); - api_result = SDCARDi_WriteFifo( SdMsg->buf, SdMsg->bufsize, - SdMsg->offset, SdMsg->func, - SdMsg->info); - break; - default: - PRINTDEBUG( "sdmc-thread error : undefined command.\n"); - api_result = SDMC_ERR_COMMAND; - break; - } - - PRINTDEBUG( "sd task : operation ends(result : 0x%x), send message begin\n", api_result); - - /*メッセージ返送*/ - return( api_result); - } -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Intr_Thread - - Description: SDメモリカード割り込み処理タスク - - Arguments: - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Intr_Thread( void* arg) -{ - u16 sd_info1;//, sd_info2; - OSIntrMode enabled; - -// while( 1) { -// PRINTDEBUG( "next_tsk:0x%x\n", OS_SelectThread()); - PRINTDEBUG( "Slp sdIntr\n"); - - PRINTDEBUG( "sdIntr waked\n"); - /*SD割り込みのIF解除*/ - *(vu16*)CTR_INT_IF = CTR_IE_SD_MASK; - - /*--- FIFOを使うとき ---*/ - if( SDCARD_UseFifoFlag) { - sd_info1 = SD_INFO1; - if( ((*SDIF_CNT & SDIF_CNT_FULL)&&(*SDIF_CNT & SDIF_CNT_FFIE)) || - ((!(*SDIF_CNT & SDIF_CNT_NEMP))&&(*SDIF_CNT & SDIF_CNT_FEIE))) { - - PRINTDEBUG( ">>>SD Intr(FIFO)\n");// Full or Empty)\n"); - - OS_DisableIrqMask( OS_IE_SD1); - - SDCARD_FPGA_irq(); /*カードからのリードライト要求割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - - /* FIFO割り込みとALLEND割り込みがほぼ同時の場合に対応 */ - if( SD_CheckFPGAReg( sd_info1, SD_INFO1_ALL_END)) { - OS_DisableIrqMask( OS_IE_SD1); - - SYSFPGA_irq(); - OS_EnableIrqMask( OS_IE_SD1); - } - }else{ - if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) { - PRINTDEBUG( ">>>SD Intr(R/W Req)\n"); - //ここで自動的にラッパーのFIFO<->SD_BUF0間で通信が行われる - // if((!(*SDIF_CNT & SDIF_CNT_NEMP))&&(*SDIF_CNT & SDIF_CNT_FEIE)) { - OS_DisableIrqMask( OS_IE_SD1); - - PRINTDEBUG( "begin\n"); - SDCARD_FPGA_irq(); - PRINTDEBUG( "end\n"); - OS_EnableIrqMask( OS_IE_SD1); - }else{ - PRINTDEBUG( ">>>SD Intr(End or Err)\n"); - OS_DisableIrqMask( OS_IE_SD1); - - SYSFPGA_irq(); /*完了またはエラー割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - /**/ - } - } - /*--- FIFOを使わないとき ---*/ - }else{ - if( SD_CheckFPGAReg( SD_INFO2, (SD_INFO2_MASK_BRE | SD_INFO2_MASK_BWE))) { - PRINTDEBUG( ">>>SD Intr(R/W Req)\n"); - OS_DisableIrqMask( OS_IE_SD1); - - PRINTDEBUG( "begin\n"); - SDCARD_FPGA_irq(); /*カードからのリードライト要求割り込み*/ - PRINTDEBUG( "end\n"); - OS_EnableIrqMask( OS_IE_SD1); - }else{ - PRINTDEBUG( ">>>SD Intr(End or Err)\n"); - OS_DisableIrqMask( OS_IE_SD1); - SYSFPGA_irq(); /*完了またはエラー割り込み*/ - OS_EnableIrqMask( OS_IE_SD1); - /**/ - } - } -// } -} diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc.h b/build/libraries/fatfs/ARM7/rom_sdmc/sdmc.h deleted file mode 100644 index 9b97f080..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc.h +++ /dev/null @@ -1,77 +0,0 @@ - -#ifndef __SDMC_H__ -#define __SDMC_H__ - -//#include -//#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/********************************************* - RTFS用ドライバインタフェース -*********************************************/ -#if 0 -BOOL sdmcRtfsIo( int driveno, dword block, void* buffer, word count, BOOLEAN reading); -int sdmcRtfsCtrl( int driveno, int opcode, void* pargs); -BOOL sdmcRtfsAttach( int driveno); -#endif - -BOOL sdmcCheckMedia( void); - - -/********************************************* - データ転送関数の登録関連 -*********************************************/ -typedef void (*sdmcTransferFunction)( void* sd_adr, u32 size, BOOL read_flag); - -//void sdmcSetTransferFunction( sdmcTransferFunction usr_func); - - -/********************************************* - 基本API -*********************************************/ -void sdmcClearPortContext( SDPortContext* buf_adr); -SDMC_ERR_CODE sdmcCheckPortContext( SDPortContext* buf_adr); - - -SDMC_ERR_CODE sdmcInit( SDMC_DMA_NO dma_no, void (*func1)(),void (*func2)());/* カードドライバ初期化 */ -SDMC_ERR_CODE sdmcReset( void); /* カードリセット */ - -SDMC_ERR_CODE sdmcGetStatus(u16 *status); /* カードドライバの現在の状態を取得する */ -u32 sdmcGetCardSize(void); /* カード全サイズの取得 */ - -/*SD I/FのFIFOを使ってリードする(高速)*/ -SDMC_ERR_CODE sdmcReadFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -SDMC_ERR_CODE sdmcReadFifoDirect( sdmcTransferFunction usr_func, - u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); - -SDMC_ERR_CODE sdmcReadStreamBegin( u32 offset, SdmcResultInfo *info); -SDMC_ERR_CODE sdmcReadStreamEnd( SdmcResultInfo *info); - - -/*リードする*/ -//SDMC_ERR_CODE sdmcRead(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); - -/*SD I/FのFIFOを使ってライトする(高速)*/ -SDMC_ERR_CODE sdmcWriteFifo(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -SDMC_ERR_CODE sdmcWriteFifoDirect(sdmcTransferFunction usr_func, - u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); -/*ライトする*/ -//SDMC_ERR_CODE sdmcWrite(void* buf,u32 bufsize,u32 offset,void(*func)(void),SdmcResultInfo *info); - -/*ポート選択*/ -u16 sdmcSelectedNo(void); -SDMC_ERR_CODE sdmcSelect(u16 select); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - - -#endif /*__SDMC_H__*/ diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc_config.h b/build/libraries/fatfs/ARM7/rom_sdmc/sdmc_config.h deleted file mode 100644 index 7c645077..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc_config.h +++ /dev/null @@ -1,87 +0,0 @@ -/* -** Copyright (c) 2000-2001 Matsushita Electric Industrial Co., Ltd. -** All Rights Reserved. -*/ - -/* -** $System IP1.1 without C2 サンプルソフト -** $Subsystem カードドライバ -** $Filename CARDDRV.H -** $Version 1.0 版 -** $Date 01/02/16 -** $Log 01/02/16 rev1.0作成 -** 松下電器産業(株)半導体開発本部 -*/ - - -#ifndef __SDMC_CONFIG_H__ -#define __SDMC_CONFIG_H__ - - -#include - -#ifdef USE_OS -#include /* IP 対応レジスタ定義 */ -#endif - - - -/********************************************* - ターゲットOS -*********************************************/ -#define TARGET_OS_CTR (0) -#define TARGET_OS_NITRO (TARGET_OS_CTR ^ 1) - - -/********************************************* - SDドライバ コンフィグレーション -*********************************************/ -#define SD_DEBUG_PRINT_ON 0 /* デバッグ表示 */ - -#define WP_ena 1 /* ライトプロテクトのチェック有効 */ -#define TIMEOUT 1 /* FPGA Timeout none = FALSE */ -#define SCR 1 /* Send SCR Command = TRUE */ -#define RESID 1 /* Write Error Resid enable = TRUE */ -#define ATC_ON 0 /* ATC転送 使用/未使用 */ - -#define SecEnable 1 /* SD_SECCNTレジスタ Enable */ -#define SecDisenable 0 /* SD_SECCNTレジスタ Disable */ -//#define STANDBYMODE 0x04 /*** 5772 standby control bit ***/ - -#define SDCARD_TIMER_ID (OS_TIMER_3) - - -/********************************************* - タイムアウト設定値(ms単位) -*********************************************/ -#define SDCARD_RW_TIMEOUT (2000) -#define SDCARD_STDBY_TIMEOUT (50) -#define SDCARD_CLOCK_WAIT (500) -#define SDCARD_SDCLK_WAIT (10) -#define SDCARD_INITIAL_TIMEOUT (800) -#define SDCARD_RESET_TIMEOUT (1500) -#define SDCARD_ERASE_TIMEOUT (1) -#define SDCARD_ERRPROC_TIMEOUT (2000) - - -/********************************************* - リトライ回数(Multiple Block R/W のとき) -*********************************************/ -#define SDCARD_RETRY_COUNT (3) - -/********************************************* - その他 -*********************************************/ -#define SECTOR_SIZE (512) /* 1セクタのバイト数 */ -#define SECTOR_MAX (255) /* SYSFPGA アクセス最大セクタ数 */ - -/*--- 上位レイヤに返すステータス値(SDCARD_Getstatus参照)用 ---*/ -#define SDCARD_FLAG_CLR (0x3FFF) /* カード判定部分クリア用 */ -#define SDCARD_FLAG_SD (0x8000) /* カード判定部分SDカード */ -#define SDCARD_FLAG_MMC (0x4000) /* カード判定部分MMCカード */ -#define SDCARD_PORT1_CLR (0x0007) /* カードポート1判定部分クリア用 */ - - - - -#endif /*__SDMC_CONFIG_H__*/ diff --git a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc_nandinit.c b/build/libraries/fatfs/ARM7/rom_sdmc/sdmc_nandinit.c deleted file mode 100644 index 8e88c79d..00000000 --- a/build/libraries/fatfs/ARM7/rom_sdmc/sdmc_nandinit.c +++ /dev/null @@ -1,637 +0,0 @@ -/* - Project: TwlBrom SD port driver - File: Carddrv.c - - 2006, Research and Development Department, Nintendo. -*/ - -#include "sdmc_config.h" -#include "sdmc.h" -#include "sdif_reg.h" -#include "sdif_ip.h" -#include -//#include -//#include "sdmc_config.h" -//#include "sdif_reg.h" /* IP 対応レジスタ定義 */ -//#include -//#include "sdif_ip.h" /* IP 対応フラグ定義 */ - -// #define PRINTDEBUG OS_TPrintf - #define PRINTDEBUG( ...) ((void)0) - - -/*********************************************************************** - 定数 -***********************************************************************/ -static BOOL sdmcGetErrStat( void); - - -/*********************************************************************** - static関数の宣言 -***********************************************************************/ -static void SDCARD_Backup_port1(void); -static void SDCARD_Restore_port1(void); - -static int MMCP_SetBusWidth( BOOL b4bit); /* ビット幅の選択(MMCplus, eMMC, moviNAND) */ - -static SDMC_ERR_CODE SDCARD_Layer_Init(void); -static SDMC_ERR_CODE i_sdmcMPInit( void); /* カードドライバ初期化(マルチポート対応) */ - -/*********************************************************************** - 外部参照変数 -***********************************************************************/ -extern void SDCARD_Timer_irq(void* arg); /* タイムアウト割り込みハンドラ */ -extern void SDCARD_TimerCheck( void); -extern void SDCARD_TimerStart(u32 tim); /* タイムアウト計測スタート */ -extern void SDCARD_TimerStop(void); /* タイムアウト計測停止 */ - - -extern u16 SD_CID[8]; /* CID値保存用 */ -extern u16 SD_CSD[8]; /* CSD値保存用 */ -extern u16 SD_OCR[2]; /* OCR値保存用 */ -extern u16 SD_SCR[4]; /* SCR値保存用 */ -extern u16 SD_RCA; /* RCA値保存用 */ - -extern s16 SDCARD_MMCFlag; /* MMCカードフラグ */ -extern s16 SDCARD_SDHCFlag; /* SDHCカードフラグ */ -extern u16 SD_port_number; /* 現在ポート番号 */ - - -/*********************************************************************** - グローバル -***********************************************************************/ -static u16 SD_SDSTATUS[32]; /* SD_STATUSレジスタ保存用 */ -static u16 SDCARD_WP_FLAG0; /* カードライトプロテクトフラグ。0=なし、1=有り */ -static u16 SDCARD_WP_FLAG1; /* カードライトプロテクトフラグ。0=なし、1=有り */ -static u16 SDCARD_WP_PERMANENT; /* カードライトプロテクト永久フラグ。0=なし、1=有り */ -static u16 SDCARD_WP_TEMPORARY; /* カードライトプロテクト一時フラグ。0=なし、1=有り */ - -static u32 SDCARD_SectorSize; /* セクタサイズ デフォルト 512bytes */ - -static u16 SD_INFO1_VALUE; /* SD_INFO1レジスタ取得用変数 */ -static u16 SD_INFO1_MASK_VALUE; /* SD_INFO1割込みマスク用変数(0で許可, 1で禁止) */ -static u16 SD_INFO2_VALUE; /* SD_INFO2レジスタ取得用変数 */ -static u16 SD_INFO2_MASK_VALUE; /* SD_INFO2割り込みマスク用変数(0で許可, 1で禁止) */ -static u16 SD_INFO_ERROR_VALUE; /* SD_INFO2, SD_INFO1のエラービット確認用変数 */ - - -/*ポート状態保存*/ -static SDPortContext SDPort0Context; -static SDPortContext SDPort1Context; -//SDPortContext *SDPortCurrentContext = &SDPort0Context; /*TODO*/ - - - -extern volatile SDMC_ERR_CODE SDCARD_ErrStatus; /* エラーステータス */ -extern volatile u32 SDCARD_Status; /* カードステータス */ - -static s16 SDCARD_SDFlag; /* SDカードフラグ */ - -static volatile s16 SDCARD_OutFlag = 0; /* カード排出発生判定フラグ */ -static SdmcResultInfo *pSDCARD_info = NULL; /* 保存用実行結果構造体ポインタ */ - - -static SDMC_ERR_CODE i_sdmcSavePortContext( SDPortContext* buf_adr, u16 port_no); -static SDMC_ERR_CODE i_sdmcLoadPortContext( SDPortContext* buf_adr, u16* port_no); - - -/*---------------------------------------------------------------------------* - Name: sdmcSavePortContext - - Description: ポート0のレジスタや変数をユーザバッファに退避する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcSavePortContext( SDPortContext* buf_adr, u16 port_no) -{ - if( buf_adr == NULL) { - return( SDMC_ERR_PARAM); - } - switch( port_no) { - case 0: - MI_CpuCopy8( &SDPort0Context, buf_adr, sizeof(SDPortContext)); - buf_adr->port_no = 0; - break; - case 1: - MI_CpuCopy8( &SDPort1Context, buf_adr, sizeof(SDPortContext)); - buf_adr->port_no = 1; - break; - default: return( SDMC_ERR_PARAM); - } - return( SDMC_NORMAL); -} - -/*---------------------------------------------------------------------------* - Name: sdmcLoadPortContext - - Description: ポート0のレジスタや変数をユーザバッファから復帰する - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcLoadPortContext( SDPortContext* buf_adr, u16* port_no) -{ - if( buf_adr == NULL) { - return( SDMC_ERR_PARAM); - } - switch( buf_adr->port_no) { - case 0: - MI_CpuCopy8( buf_adr, &SDPort0Context, sizeof(SDPortContext)); - *port_no = 0; - break; - case 1: - MI_CpuCopy8( buf_adr, &SDPort1Context, sizeof(SDPortContext)); - *port_no = 1; - break; - default: return( SDMC_ERR_PARAM); - } - return( SDMC_NORMAL); -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_Backup_port1 - - Description: backup registers and variables of port1. - ポート1のレジスタや変数をバックアップする - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Backup_port1(void) -{ - /* registers */ - SD_GetFPGA(SDPort1Context.SD_CLK_CTRL_VALUE,SD_CLK_CTRL); - SD_GetFPGA(SDPort1Context.SD_OPTION_VALUE, SD_OPTION); - - /* variables */ - SDPort1Context.SD_RCA = SD_RCA; - SDPort1Context.ErrStatus = SDCARD_ErrStatus; - SDPort1Context.Status = SDCARD_Status; - SDPort1Context.MMCFlag = SDCARD_MMCFlag; - SDPort1Context.SDHCFlag = SDCARD_SDHCFlag; - SDPort1Context.SDFlag = SDCARD_SDFlag; - - SDPort1Context.OutFlag = SDCARD_OutFlag; - - /*media registers*/ - MI_CpuCopy8( SD_CID, SDPort1Context.SD_CID, 16); - MI_CpuCopy8( SD_CSD, SDPort1Context.SD_CSD, 16); - MI_CpuCopy8( SD_OCR, SDPort1Context.SD_OCR, 4); - MI_CpuCopy8( SD_SCR, SDPort1Context.SD_SCR, 8); -} - - -/*---------------------------------------------------------------------------* - Name: SDCARD_Restore_port1 - - Description: restore registers and variables of port0. - ポート1のレジスタや変数を復帰する。 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static void SDCARD_Restore_port1(void) -{ - /* registers */ - SD_SetFPGA( SD_CLK_CTRL, SDPort1Context.SD_CLK_CTRL_VALUE); - SD_SetFPGA( SD_OPTION, SDPort1Context.SD_OPTION_VALUE); - - /* variables */ - SD_RCA = SDPort1Context.SD_RCA; - SDCARD_ErrStatus = SDPort1Context.ErrStatus; - SDCARD_Status = SDPort1Context.Status; - SDCARD_MMCFlag = SDPort1Context.MMCFlag; - SDCARD_SDHCFlag = SDPort1Context.SDHCFlag; - SDCARD_SDFlag = SDPort1Context.SDFlag; - - SDCARD_OutFlag = SDPort1Context.OutFlag; - pSDCARD_info = NULL; - - /*media registers*/ - MI_CpuCopy8( SDPort1Context.SD_CID, SD_CID, 16); - MI_CpuCopy8( SDPort1Context.SD_CSD, SD_CSD, 16); - MI_CpuCopy8( SDPort1Context.SD_OCR, SD_OCR, 4); - MI_CpuCopy8( SDPort1Context.SD_SCR, SD_SCR, 8); - - /*recalc*/ - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); -} - - -/*---------------------------------------------------------------------------* - Name: sdmcNandInit - - Description: Initialize SD interface and SD card. - 初期化 - - Arguments: dma_no : 使用するDMA番号 - func1 : カード挿入時コールバック関数 - func2 : カード排出時コールバック関数 - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -SDMC_ERR_CODE sdmcNandInit( void) -{ - /* SD初期化 */ - SDCARD_ErrStatus = sdmcReset(); - - if(!SDCARD_ErrStatus) { - SDCARD_ErrStatus = i_sdmcMPInit(); - } - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: sdmcReset - - Description: reset SD card. - リセット - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE sdmcReset( void) -{ - OSIntrMode irq_core_flag; - SDCARD_MMCFlag = FALSE; /* MMCカード判定フラグクリア */ - SDCARD_SDHCFlag = FALSE; - SDCARD_SDFlag = FALSE; /* SDカード判定フラグクリア */ - - /*** カードステータスをクリア ***/ - SDCARD_ErrStatus = SDMC_NORMAL; - SDCARD_Status = SDMC_NORMAL; - - /*** カードCSD WPビットをクリア ***/ - SDCARD_WP_FLAG0 = 0; - SDCARD_WP_FLAG1 = 0; - SDCARD_WP_PERMANENT = 0; - SDCARD_WP_TEMPORARY = 0; - - irq_core_flag = OS_DisableInterrupts(); /* 割込み禁止 */ - - *SDIF_CNT_L = 0x0402; //ラッパーレジスタ - *SDIF_CNT_L = 0x0000; //ラッパーレジスタ - *SDIF_FDS_L = 0; - *SDIF_FSC_L = 1; - SD_Init(); /* SD Card I/F 初期化処理 */ - SD_AndFPGA( SD_OPTION, SD_CD_DETECT_TIME); /* CD 検出タイムをゼロクリア */ - - SD_port_number = SDCARD_PORT1; /*** 現在のポート番号をデフォルトに設定 ***/ - -// SDCARD_Backup_port1(); /* port1 backup */ - - OS_RestoreInterrupts( irq_core_flag); /* 割り込み設定を元に戻す */ - - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: SDCARD_Layer_Init - - Description: initialize sequence for SD card. - SDカード規定の初期化手順 - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE SDCARD_Layer_Init(void) -{ - u32 ulCSize; - u16 read_block_len_val, mult_val; - -// u16 memory_exist, function_number; - SDCARD_Status = SDMC_NORMAL; /* カードステータスをクリア */ - SDCARD_MMCFlag = FALSE; /* MMCカード判定フラグクリア */ - SDCARD_SDHCFlag = FALSE; - SDCARD_SDFlag = FALSE; /* SDカード判定フラグクリア */ - - SD_SetFPGA(SD_CLK_CTRL,(SD_CLK_CTRL_128)); /* SDクロックの周波数 261KHz(初期化時は100〜400khz) */ - SD_EnableClock(); /* SDカードのクロックをイネーブルにする */ - - /* SD I/F部ダミー80クロック(1mSec)転送待ち(タイマーで待ちを実装しても良い) */ - SVC_WaitByLoop( 17900); //179*4サイクル=716サイクル=10024ns=10us - - SDCARD_ErrStatus = SDMC_NORMAL; /* エラーステータスをクリア */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_RESET_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - - PRINTDEBUG( " CMD0(GO_IDLE_STATE)\n"); - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); /* タイムアウト以外のエラーをクリア */ - SD_Command(SD_CMD_CMD | GO_IDLE_STATE); /* CMD0発行、レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /*------- idle state -------*/ - SVC_WaitByLoop( 17900); //179*4サイクル=716サイクル=10024ns=10us - - while(!(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT)){ /* タイムアウトになったら抜ける */ - /******************/ - SDCARD_TimerCheck(); - /******************/ - SD_ClrErr((u16)(~SDMC_ERR_FPGA_TIMEOUT)); - - SD_RCA = 0; /* RCA = 0をセット */ - - if(!SDCARD_MMCFlag){ /* MMCカードフラグが 0(OFF) か? */ - - if( SD_AppCommand() == SDMC_NORMAL) { /* CMD55 発行処理が正常か? */ - - SDCARD_MMCFlag = FALSE; /* MMCカードフラグクリア */ - if(!SD_AppOpCond()){ /* ACMD41発行処理が正常か?(OCR31bit = L の時 No Response) */ - - SDCARD_SDFlag = TRUE; /* SDカードフラグセット */ - break; - } - }else{ /* CMD55 が正常終了しない */ - if(SDCARD_ErrStatus == SDMC_ERR_TIMEOUT){ /* タイムアウト(==No Response)か? */ - SDCARD_MMCFlag = TRUE; /* MMCカードフラグセット */ - }else{ -// break; //コメントアウトしないとSDカードの初期化に失敗する - } - } - } - if(SDCARD_MMCFlag){ /* MMCカードフラグが 1(ON) のとき */ - SD_RCA = 1; /* RCA = 1をセット */ - if(!SD_SendOpCond()){ /* CMD1発行処理が正常か? */ - break; - } - } - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?)*/ - if(SDCARD_ErrStatus & SDMC_ERR_FPGA_TIMEOUT){ /* タイムアウトエラーかチェック */ - SD_ClrErr(SDMC_ERR_FPGA_TIMEOUT); /* タイムアウトエラーの設定クリア */ - SD_SetErr(SDMC_ERR_RESET); /* 初期化カードリセットコマンド時1.5秒タイムアウトエラーの設定 */ - } - SDCARD_MMCFlag = FALSE; /* MMCカードフラグクリア */ - return SDCARD_ErrStatus; - } - -#if TIMEOUT - SDCARD_TimerStart(SDCARD_INITIAL_TIMEOUT); /* タイムアウト判定用タイマスタート */ -#endif - - SD_SendCID(); /* CMD2発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - while(1){ - /******************/ - SDCARD_TimerCheck(); - /******************/ - SD_SendRelativeAddr(); /* CMD3発行 レスポンス確認 正常終了時 RCA<-ResのRCA */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - if(SD_RCA != 0){ - break; - } - } - - /*------- standby state -------*/ - SD_SendCSD(); /* CMD9発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - SDCARD_WP_PERMANENT = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_PERMANENT_BIT)); - SDCARD_WP_TEMPORARY = (u16)(SD_CSD[0] & (u16)(SDCARD_WP_TEMPORARY_BIT)); - - /* 転送速度設定 */ - SD_ClockDivSet(SD_RSP5); /* SDカードの動作クロック設定 (CSD[5]) */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /* Command toggles acard between the Stand-by and Transfer states */ - SD_SelectCard(); /* CMD7発行 レスポンス確認 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - /*------- translate state -------*/ - - SDCARD_SectorSize = SECTOR_SIZE; /* セクタサイズ デフォルト 512bytes */ - SD_SetBlockLength(SDCARD_SectorSize); /* CMD16 ブロックサイズの設定 */ - if(SDCARD_ErrStatus){ /* エラーステータスの確認(エラー有り?) */ - return SDCARD_ErrStatus; - } - - SD_SCR[0] |= SCR_DAT_BUS_WIDTH_4BIT; //SCRの必要な部分のみ - - SD_EnableClock(); /* SD-CLK Enable */ - - if(SDCARD_MMCFlag){ /* MMCカード ON かチェック */ - if( ((SD_CSD[7] & 0x3C)>>2) >= 4) { - MMCP_SetBusWidth( TRUE); - } -// SD_SelectBitWidth(FALSE); /* CMD55->ACMD6 ビット幅の選択 1bit */ - }else{ - SD_SelectBitWidth(TRUE); /* CMD55->ACMD6 ビット幅の選択 4bit */ - } - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - return SDCARD_ErrStatus; -} - -/*---------------------------------------------------------------------------* - Name: i_sdmcMPInit - - Description: initialize SD card in multi ports. - マルチポートのSDカード初期化 - - Arguments: - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -static SDMC_ERR_CODE i_sdmcMPInit( void) -{ - u16 load_port_no; - SDPortContext* SDNandContext; - - //予約領域のポートコンテキスト参照 - SDNandContext = (SDPortContext*)&(((OSFromBromBuf*)OSi_GetFromBromAddr())->SDNandContext); - - //NANDスロットの初期化 - SD_SetFPGA( SD_PORTSEL, SDMC_PORT_NAND); /* NANDポート選択 */ - -// OS_TPrintf( "SDNandContext : 0x%x\n", SDNandContext); - //初期化済みでないときだけ初期化 - if( sdmcCheckPortContext( SDNandContext) != SDMC_NORMAL) { -// OS_TPrintf( "sdmcCheckPortContext : ERR!\n"); - SDCARD_ErrStatus = SDCARD_Layer_Init(); - - SDCARD_Backup_port1(); - //ポートコンテキストの保存 - if( i_sdmcSavePortContext( SDNandContext, 1) != SDMC_NORMAL) { -// OS_TPrintf( "i_sdmcSavePortContext failed\n"); - return( SDMC_ERR_PARAM); - } - }else{ //ポートコンテキストの復帰 -// OS_TPrintf( "sdmcCheckPortContext : NORMAL\n"); - - /*SDCARD_Layer_Init()の代わり*/ - SDCARD_SectorSize = SECTOR_SIZE; /* セクタサイズ デフォルト 512bytes */ - - if( i_sdmcLoadPortContext( SDNandContext, &load_port_no) != SDMC_NORMAL) { -// OS_TPrintf( "i_sdmcLoadPortContext failed\n"); - return( SDMC_ERR_PARAM); - } - SDCARD_Restore_port1(); //TODO:load_port_no値判定 - } - - SDCARD_OutFlag = FALSE; /* 排出フラグをリセット */ - - SDCARD_TimerStop(); /* タイムアウト判定用タイマストップ */ - SD_DisableClock(); /* SD-CLK Disable */ - SD_EnableInfo(); /* SD Card 挿抜 割り込み許可 */ - - return SDCARD_ErrStatus; -} - -#if 0 -/*---------------------------------------------------------------------------* - Name: sdmcGetStatus - - Description: get card status - カードの状態を取得する - bit15 SDカード判別ビット(検出したら1) - bit14 MMCカード判別ビット(検出したら1) - bit10 IO3 card detect(検出したら1) ※CTRではプルアップのため使えない - bit9 IO3 card inserted(挿入動作で1) ※CTRではプルアップのため使えない - bit8 IO3 card removed(脱動作で1) ※CTRではプルアップのため使えない - bit7 write protect(書き込み禁止の場合1) - bit5 card detect(検出したら1) - bit4 card inserted(挿入動作で1) - bit3 card removed(脱動作で1) - bit2 R/W access all end - bit0 Response end - - Arguments: *status : カードの状態を格納する変数へのポインタ - - Returns: 0 : success - > 0 : error code - *---------------------------------------------------------------------------*/ -/*----------------------------------------------- -SD_INFO1レジスタ -bit[10,9,8,7] = DAT3CD, DAT3IN, DAT3OUT, WP -bit[5, 4, 3, 2] = CD, INS, REM, ALLEND -bit0 = RESEND -------------------------------------------------- -EXT_CDレジスタ -bit[2,1,0] = P1CD, P1INS, P1REM -------------------------------------------------- -EXT_CD_DAT3レジスタ -bit[2, 1, 0] = P1DCD, P1DINS, P1DREM -------------------------------------------------- -EXT_WPレジスタ -bit0 = P1WP ------------------------------------------------*/ -SDMC_ERR_CODE sdmcGetStatus(u16 *status) -{ - u16 SD_INFO1_STATUS; - - SD_INFO1_STATUS = SD_INFO1; /* SD_INFO1レジスタ読み出し */ - *status = SD_INFO1_STATUS; /* 論理反転 */ - - /*--- ポート0のとき ---*/ - if(SD_port_number == SDCARD_PORT0) - { - *status &= SDCARD_FLAG_CLR; /* SD/MMCフラグクリア */ - } - /*--- ポート1のとき ---*/ - else if (SD_port_number == SDCARD_PORT1) - { - *status &= SDCARD_PORT1_CLR; /* port1に関係ない部分をクリア */ - SD_INFO1_STATUS = (u16)((EXT_CD & 0x0007) << 3); - SD_INFO1_STATUS |= ((EXT_CD_DAT3 & 0x0007) << 8); - SD_INFO1_STATUS |= ((EXT_WP & 0x0001) << 7); - *status |= SD_INFO1_STATUS; /* カードport1フラグ設定 */ - } - /*--- SD/MMCフラグをセット ---*/ - if( SDCARD_MMCFlag) { /* 検出したカードがMMCカードの時 */ - *status |= SDCARD_FLAG_MMC; /* カード判定部分MMCカード */ - } - if( SDCARD_SDFlag) { /* 検出したカードがSDカードの時 */ - *status |= SDCARD_FLAG_SD; /* カード判定部分SDカード */ - } - - return SDMC_NORMAL; -} -#endif - - -/*******************************************************************************/ -static int MMCP_SetBusWidth( BOOL b4bit) -{ - SD_EnableClock(); /* SD-CLK Enable */ - - /*コマンド6発行*/ - MMCP_WriteBusWidth( b4bit); - SD_AndFPGA(SD_OPTION,(~SD_OPTION_WIDTH_1BIT)); /* IPにビット幅の設定(4bit幅) */ - - return( 0); -} -/*******************************************************************************/ - - - -/*---------------------------------------------------------------------------* - Name: sdmcGetErrStat - - Description: エラー取得 - - Arguments: - - Returns: TRUE : success - FALSE : error - *---------------------------------------------------------------------------*/ -static BOOL sdmcGetErrStat( void) -{ - PRINTDEBUG( "SD_INFO2:0x%x\n", SD_INFO2); - - /*--- 取得 ---*/ - SD_GetFPGA( SD_INFO2_VALUE, SD_INFO2); - /*------------------------------------------*/ - - /*--- SD_INFO2のエラーフラグ作成 ---*/ - SD_INFO_ERROR_VALUE = (u16)(SD_INFO2_VALUE & 0x807F);// - /*--- エラーステータス作成 (RESTIMEOUTとILAエラーのフラグは反映しない) ---*/ - SDCARD_ErrStatus |= SD_INFO_ERROR_VALUE & (~(SD_INFO2_ERR_RESTIMEOUT)) & - (~(SD_INFO2_ERR_ILA)) & SD_INFO2_MASK_ERRSET; - - /*--- RESTIMEOUTとILAエラーはフラグの位置をずらして反映する ---*/ - if( SD_INFO_ERROR_VALUE & SD_INFO2_ERR_ILA) { - SDCARD_ErrStatus |= SDMC_ERR_ILA; /* イリーガルアクセスエラー発生 */ - } - if( SD_INFO_ERROR_VALUE & SD_INFO2_ERR_RESTIMEOUT) { - SDCARD_ErrStatus |= SDMC_ERR_TIMEOUT; /* Response Time out エラー発生 */ - }/*------------------------------------------------------------*/ - - SD_AndFPGA( SD_INFO2,(~(SD_INFO2_ERROR_SET))); /* SD_INFO2のエラーフラグを全て落とす */ - - if( (SD_INFO_ERROR_VALUE) != 0) { - return( FALSE); - }else{ - return( TRUE); - } -} diff --git a/build/libraries/fatfs/ARM7/src/fatfs_firm.c b/build/libraries/fatfs/ARM7/src/fatfs_firm.c index 2f5fe94f..655ef150 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_firm.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_firm.c @@ -24,12 +24,6 @@ #include #include -//#include - -#define OS_InitDebugLED() (TRUE) -#define OS_SetDebugLED(pattern) (TRUE) -#define OS_GetDebugLED() (TRUE) - extern u32 NAND_FAT_PARTITION_COUNT; #define DMA_PIPE 2 @@ -93,6 +87,15 @@ static inline void MIi_NDmaRecv(u32 ndmaNo, const void *src, void *dest, u32 siz MIi_SetWordCount( ndmaNo, size/4 ); MIi_SetControl( ndmaNo, MI_NDMA_BWORD_16 | MI_NDMA_SRC_FIX | MIi_DEST_INC | MIi_IMM | MI_NDMA_ENABLE ); } +static inline void MIi_Sd1_NDmaRecv(u32 ndmaNo, void *dest, u32 size) +{ + MIi_SetSrc( ndmaNo, (u32)SDIF_FI ); + MIi_SetDest( ndmaNo, (u32)dest ); + MIi_SetInterval( ndmaNo, MI_NDMA_NO_INTERVAL, MI_NDMA_INTERVAL_PS_1 ); + MIi_SetTotalWordCount( ndmaNo, size/4 ); + MIi_SetWordCount( ndmaNo, SECTOR_SIZE/4 ); + MIi_SetControl( ndmaNo, MI_NDMA_BWORD_128 | MI_NDMA_SRC_FIX | MIi_DEST_INC | MI_NDMA_TIMING_SD_1 | MI_NDMA_ENABLE ); +} static inline void MIi_NDmaPipeSetup(u32 ndmaNo, const void *src, void *dest, u32 size) { @@ -113,13 +116,12 @@ static inline void MIi_NDmaRestart(u32 ndmaNo) /* 専用NAND関数 */ -//extern void SDCARD_TimerStart(u32 tim); /* タイムアウト計測スタート */ extern volatile SDMC_ERR_CODE SDCARD_ErrStatus; extern s16 SDCARD_SDHCFlag; /* SDHCカードフラグ */ +extern SDPortContext* SDNandContext; /* NAND初期化パラメータ */ static inline void WaitFifoFull( void ) { -// SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ while( (*SDIF_CNT & SDIF_CNT_FULL) == 0 ) { if ( SDCARD_ErrStatus != SDMC_NORMAL ) // an error was occurred @@ -133,11 +135,10 @@ static void StartToRead(u32 block, u32 count) { *SDIF_FSC = count; *SDIF_FDS = SECTOR_SIZE; - *SDIF_CNT = (*SDIF_CNT & ~SDIF_CNT_FEIE) | SDIF_CNT_FFIE | SDIF_CNT_FCLR | SDIF_CNT_USEFIFO; + *SDIF_CNT = (*SDIF_CNT & ~(SDIF_CNT_FEIE | SDIF_CNT_FFIE)) | SDIF_CNT_FCLR | SDIF_CNT_USEFIFO; CC_EXT_MODE = CC_EXT_MODE_DMA; SDCARD_ErrStatus = SDMC_NORMAL; -// SDCARD_TimerStart(SDCARD_RW_TIMEOUT); /* タイムアウト判定用タイマスタート(2000msec) */ SD_EnableClock(); SD_EnableSeccnt(count); if ( SDCARD_SDHCFlag ) @@ -146,13 +147,13 @@ static void StartToRead(u32 block, u32 count) } else { - SD_MultiReadBlock(block * SECTOR_SIZE); + SD_MultiReadBlock( block * SECTOR_SIZE ); } } static void StopToRead( void ) { - if( !SD_CheckFPGAReg(SD_STOP,SD_STOP_SEC_ENABLE) ){ + if( !SD_CheckFPGAReg( SD_STOP,SD_STOP_SEC_ENABLE ) ){ SD_StopTransmission(); /* カード転送終了をFPGAに通知(CMD12発行) */ } SD_TransEndFPGA(); /* 転送終了処理(割り込みマスクを禁止に戻す) */ @@ -208,29 +209,18 @@ void FATFS_DisableAES( void ) dest: dest address (4 bytes alignment) count: sectors to transfer - Returns: None + Returns: 0 if success *---------------------------------------------------------------------------*/ -static void ReadNormal(u32 block, void *dest, u16 count) +static u16 ReadNormal(u32 block, void *dest, u16 count) { -OS_SetDebugLED((u8)(0x80 | block)); - //MI_StopNDma( DMA_PIPE ); // already stopped - //MI_StopNDma( DMA_RECV ); // already stopped + OS_TPrintf("ReadNormal(%d, 0x%08X, %d) is calling.\n", block, dest, count); + MIi_Sd1_NDmaRecv( DMA_PIPE, dest, (u32)(count * SECTOR_SIZE) ); StartToRead( block, count ); - if ( SDCARD_ErrStatus != SDMC_NORMAL ) - { - return; - } - - while ( count-- ) // TODO: 自動起動DMA1つで十分なはず - { - WaitFifoFull(); - MIi_NDmaRecv( DMA_PIPE, (void*)SDIF_FI, dest, SECTOR_SIZE ); - MI_WaitNDma( DMA_PIPE ); - dest = (void*)((u32)dest + SECTOR_SIZE); - } + MI_WaitNDma( DMA_PIPE ); StopToRead(); -OS_SetDebugLED((u8)(0x90 | block)); + + return SDCARD_ErrStatus; } /*---------------------------------------------------------------------------* @@ -242,15 +232,14 @@ OS_SetDebugLED((u8)(0x90 | block)); dest: dest address (4 bytes alignment) count: sectors to transfer - Returns: None + Returns: 0 if success *---------------------------------------------------------------------------*/ #define PIPE_SIZE 64 -static void ReadAES(u32 block, void *dest, u16 count) +static u16 ReadAES(u32 block, void *dest, u16 count) { u32 offset = 0; // in bytes -OS_SetDebugLED((u8)(0xC0 | block)); - //MI_StopNDma( DMA_PIPE ); // already stopped - //MI_StopNDma( DMA_RECV ); // already stopped + + OS_TPrintf("ReadAES(%d, 0x%08X, %d) is calling.\n", block, dest, count); MIi_NDmaPipeSetup( DMA_PIPE, (void*)SDIF_FI, (void*)REG_AES_IFIFO_ADDR, PIPE_SIZE ); @@ -267,7 +256,7 @@ OS_SetDebugLED((u8)(0xC0 | block)); StartToRead( block, count ); if ( SDCARD_ErrStatus != SDMC_NORMAL ) { - return; + goto err; } while ( block * SECTOR_SIZE > offset ) @@ -278,6 +267,10 @@ OS_SetDebugLED((u8)(0xC0 | block)); if ( (offset & SECTOR_SIZE) == 0 ) { WaitFifoFull(); + if ( SDCARD_ErrStatus != SDMC_NORMAL ) + { + goto err; + } } MIi_NDmaRestart( DMA_PIPE ); offset += PIPE_SIZE; @@ -285,7 +278,14 @@ OS_SetDebugLED((u8)(0xC0 | block)); MI_WaitNDma( DMA_PIPE ); StopToRead(); MI_WaitNDma( DMA_RECV ); -OS_SetDebugLED((u8)(0xD0 | block)); + return SDCARD_ErrStatus; + +err: + MI_StopNDma( DMA_RECV ); + MI_StopNDma( DMA_PIPE ); + StopToRead(); + AESi_Reset(); + return SDCARD_ErrStatus; } /*---------------------------------------------------------------------------* @@ -301,36 +301,26 @@ OS_SetDebugLED((u8)(0xD0 | block)); Returns: TRUE/FALSE *---------------------------------------------------------------------------*/ -static BOOL nandRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOOL reading) +static BOOL nandRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOOL reading ) { - u16 result; - SdmcResultInfo SdResult; + u16 result; #pragma unused( driveno) - /**/ sdmcSelect( (u16)SDMC_PORT_NAND); - if( reading) { - if (useAES) - { - ReadAES(block, buffer, count); - } - else - { - ReadNormal(block, buffer, count); - } - result = 0; // always success -// result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcRead( buffer, count, block, NULL, &SdResult); - }else{ - result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcWrite( buffer, count, block, NULL, &SdResult); + if( reading ) + { + result = useAES ? + ReadAES( block, buffer, count ) : + ReadNormal( block, buffer, count ); } - if( result) { - return FALSE; + else + { + SdmcResultInfo SdResult; + result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult ); } - return TRUE; + return result ? FALSE : TRUE; } /*---------------------------------------------------------------------------* @@ -346,36 +336,26 @@ static BOOL nandRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOO Returns: TRUE/FALSE *---------------------------------------------------------------------------*/ -static BOOL sdmcRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOOL reading) +static BOOL sdmcRtfsIoFirm( int driveno, u32 block, void* buffer, u16 count, BOOL reading ) { - u16 result; - SdmcResultInfo SdResult; + u16 result; #pragma unused( driveno) - /**/ - sdmcSelect( (u16)SDMC_PORT_CARD); + sdmcSelect( (u16)SDMC_PORT_CARD ); - if( reading) { - if (useAES) - { - ReadAES(block, buffer, count); - } - else - { - ReadNormal(block, buffer, count); - } - result = 0; // always success -// result = sdmcReadFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcRead( buffer, count, block, NULL, &SdResult); - }else{ - result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult); -// result = sdmcWrite( buffer, count, block, NULL, &SdResult); + if( reading ) + { + result = useAES ? + ReadAES( block, buffer, count ) : + ReadNormal( block, buffer, count ); } - if( result) { - return FALSE; + else + { + SdmcResultInfo SdResult; + result = sdmcWriteFifo( buffer, count, block, NULL, &SdResult ); } - return TRUE; + return result ? FALSE : TRUE; } /*---------------------------------------------------------------------------* @@ -394,8 +374,9 @@ static BOOL nandRtfsAttachFirm( int driveno, int partition_no) BOOLEAN result; DDRIVE pdr; - if( partition_no >= NAND_FAT_PARTITION_COUNT) { - return( FALSE); + if( partition_no >= NAND_FAT_PARTITION_COUNT ) + { + return FALSE; } pdr.dev_table_drive_io = nandRtfsIoFirm; @@ -408,25 +389,26 @@ static BOOL nandRtfsAttachFirm( int driveno, int partition_no) pdr.controller_number = 0; pdr.logical_unit_number = 0; - switch( partition_no) { - case 0: - result = rtfs_attach( driveno, &pdr, "SD1p0"); //構造体がFSライブラリ側にコピーされる + switch( partition_no ) + { + case 0: + result = rtfs_attach( driveno, &pdr, "SD1p0" ); //構造体がFSライブラリ側にコピーされる break; - case 1: - result = rtfs_attach( driveno, &pdr, "SD1p1"); //構造体がFSライブラリ側にコピーされる + case 1: + result = rtfs_attach( driveno, &pdr, "SD1p1" ); //構造体がFSライブラリ側にコピーされる break; - case 2: - result = rtfs_attach( driveno, &pdr, "SD1p2"); //構造体がFSライブラリ側にコピーされる + case 2: + result = rtfs_attach( driveno, &pdr, "SD1p2" ); //構造体がFSライブラリ側にコピーされる break; - case 3: - result = rtfs_attach( driveno, &pdr, "SD1p3"); //構造体がFSライブラリ側にコピーされる + case 3: + result = rtfs_attach( driveno, &pdr, "SD1p3" ); //構造体がFSライブラリ側にコピーされる break; - default: + default: result = FALSE; break; } - return( result); + return result; } /*---------------------------------------------------------------------------* @@ -455,9 +437,9 @@ static BOOL sdmcRtfsAttachFirm( int driveno) pdr.controller_number = 0; pdr.logical_unit_number = 0; - result = rtfs_attach( driveno, &pdr, "SD0"); //構造体がFSライブラリ側にコピーされる + result = rtfs_attach( driveno, &pdr, "SD0" ); //構造体がFSライブラリ側にコピーされる - return( result); + return result; } /*---------------------------------------------------------------------------* @@ -469,16 +451,19 @@ static BOOL sdmcRtfsAttachFirm( int driveno) Returns: None *---------------------------------------------------------------------------*/ -BOOL FATFS_InitFIRM( void ) +BOOL FATFS_InitFIRM( void* nandContext ) { /* RTFSライブラリを初期化 */ - if(!FATFSi_rtfs_init()) + if( !FATFSi_rtfs_init() ) { return FALSE; } + /* NAND初期化パラメータの設定 */ + SDNandContext = (SDPortContext*)nandContext; + /* SDドライバ初期化 */ - if (FATFSi_sdmcInit(SDMC_NOUSE_DMA, NULL, NULL) != SDMC_NORMAL) + if ( FATFSi_sdmcInit( SDMC_NOUSE_DMA, NULL, NULL ) != SDMC_NORMAL ) { return FALSE; } @@ -496,22 +481,22 @@ BOOL FATFS_InitFIRM( void ) *---------------------------------------------------------------------------*/ BOOL FATFS_MountDriveFirm( int driveno, FATFSMediaType media, int partition_no ) { - if (media == FATFS_MEDIA_TYPE_NAND) + if ( media == FATFS_MEDIA_TYPE_NAND ) { // CAUTION!: 同じ関数を2回呼び出す理由について要確認。 - if ( !nandRtfsAttachFirm(driveno, partition_no) || nandRtfsAttachFirm(driveno, partition_no)) + if ( !nandRtfsAttachFirm( driveno, partition_no ) || nandRtfsAttachFirm( driveno, partition_no ) ) { return FALSE; } } else { - if (partition_no) // support only 0 + if ( partition_no ) // support only 0 { return FALSE; } // CAUTION!: 同じ関数を2回呼び出す理由について要確認。 - if ( !sdmcRtfsAttachFirm(driveno) || sdmcRtfsAttachFirm(driveno)) + if ( !sdmcRtfsAttachFirm( driveno ) || sdmcRtfsAttachFirm( driveno ) ) { return FALSE; } diff --git a/build/libraries/fatfs/ARM7/src/fatfs_loader.c b/build/libraries/fatfs/ARM7/src/fatfs_loader.c index 69b4dd17..fea88a0a 100644 --- a/build/libraries/fatfs/ARM7/src/fatfs_loader.c +++ b/build/libraries/fatfs/ARM7/src/fatfs_loader.c @@ -40,7 +40,7 @@ static int menu_fd = -1; *---------------------------------------------------------------------------*/ BOOL FATFS_OpenRecentMenu( int driveno ) { - char menufile[] = "A:\\ipl\\menu.srl"; + char *menufile = (char*)L"A:\\ipl\\menu.srl"; if (driveno < 0 || driveno >= 26) { return FALSE; diff --git a/build/libraries/init/ARM7/crt0_firm.c b/build/libraries/init/ARM7/crt0_firm.c index e2d03a55..f3efb359 100644 --- a/build/libraries/init/ARM7/crt0_firm.c +++ b/build/libraries/init/ARM7/crt0_firm.c @@ -17,6 +17,8 @@ #include #include +#define FIRM_ENABLE_JTAG + extern void TwlMain(void); extern void OS_IrqHandler(void); extern void *const _start_ModuleParams[]; @@ -54,10 +56,12 @@ extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload infor *---------------------------------------------------------------------------*/ SDK_WEAK_SYMBOL asm void _start( void ) { +#ifdef FIRM_ENABLE_JTAG ldr r1, =REG_JTAG_ADDR ldrh r2, [r1] orr r2, r2, #REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK strh r2, [r1] +#endif //---- set IME = 0 // ( use that LSB of HW_REG_BASE equal to 0 ) @@ -234,13 +238,19 @@ SDK_WEAK_SYMBOL asm void _start_AutoloadDoneCallback( void* argv[] ) Description: detect main memory size. result is written into (u32*)HW_MMEMCHECKER_SUB. - value is [OS_CONSOLE_SIZE_4MB|OS_CONSOLE_SIZE_8MB] + value is [OS_CONSOLE_SIZE_4MB|OS_CONSOLE_SIZE_8MB| + OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32MB] + + + + Arguments: None. Returns: None. *---------------------------------------------------------------------------*/ -#define OSi_IMAGE_DIFFERENCE 0x400000 +#define OSi_IMAGE_DIFFERENCE 0x400000 +#define OSi_IMAGE_DIFFERENCE2 0xb00000 static asm void detect_main_memory_size( void ) { @@ -254,13 +264,39 @@ static asm void detect_main_memory_size( void ) ldrh r12, [r3] cmp r1, r12 - movne r0, #OS_CONSOLE_SIZE_8MB + bne @2 add r1, r1, #1 cmp r1, #2 // check 2 loop bne @1 + b @4 + + //---- 8MB or 16MB or 32MB @2: + // check if running on twl/nitro + ldr r1, =REG_CLK_ADDR + ldrh r12, [r1] + tst r12, #REG_SCFG_CLK_WRAMHCLK_MASK + moveq r0, #OS_CONSOLE_SIZE_8MB + beq @4 + + //---- 16MB or 32MB + mov r1, #0 + add r3, r2, #OSi_IMAGE_DIFFERENCE2 +@3: + strh r1, [r2] + ldrh r12, [r3] + cmp r1, r12 + + movne r0, #OS_CONSOLE_SIZE_32MB + bne @4 + + add r1, r1, #1 + cmp r1, #2 // check 2 loop + bne @3 + mov r0, #OS_CONSOLE_SIZE_16MB +@4: strh r0, [r2] bx lr } diff --git a/build/libraries/mi/ARM9/mi_loader.c b/build/libraries/mi/ARM9/mi_loader.c index cac3af7b..8226fda7 100644 --- a/build/libraries/mi/ARM9/mi_loader.c +++ b/build/libraries/mi/ARM9/mi_loader.c @@ -149,7 +149,6 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key ) #endif { SignatureData sd; -#if 0 int i; BOOL result = TRUE; SVC_DecryptoSign(pool, &sd, rh->signature, rsa_key); @@ -160,13 +159,12 @@ BOOL MI_LoadHeader( int* pool, const void* rsa_key ) result = FALSE; } } -#endif -#if 0 if ( !result ) { +#if 0 return FALSE; - } #endif + } PXI_NotifyID( FIRM_PXI_ID_AUTH_HEADER ); // PXI_SendDataByFifo( PXI_FIFO_TAG_DATA, sd.aes_key_seed, AES_BLOCK_SIZE ); MI_CpuClear8(&sd, sizeof(sd)); @@ -188,16 +186,16 @@ static inline BOOL MIi_LoadModule(void* dest, u32 size, const u8 digest[DIGEST_S { return FALSE; } -#if 0 SHA1_GetHash(&ctx, md); for ( i = 0; i < DIGEST_SIZE_SHA1; i++ ) { if ( md[i] != digest[i] ) { +#if 0 result = FALSE; +#endif } } -#endif return result; } diff --git a/build/libraries/os/common/os_boot.c b/build/libraries/os/common/os_boot.c index 73c3378f..3794305e 100644 --- a/build/libraries/os/common/os_boot.c +++ b/build/libraries/os/common/os_boot.c @@ -199,7 +199,7 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) // clear stack with r4-r9 mov r0, #0 -#if 1 +#if 0 ldr r1, =HW_FIRM_STACK ldr r2, =HW_FIRM_STACK_SIZE bl MIi_CpuClearFast @@ -208,7 +208,7 @@ asm void OSi_BootCore( OSEntryPoint p, MIHeader_WramRegs* w ) mov lr, r11 // clear registers -#if 1 +#if 0 ldr sp, =HW_FIRM_STACK ldmia sp, {r0-r12,sp} #endif diff --git a/build/libraries/os/common/os_init_firm.c b/build/libraries/os/common/os_init_firm.c index 6c1886a6..a8b4a655 100644 --- a/build/libraries/os/common/os_init_firm.c +++ b/build/libraries/os/common/os_init_firm.c @@ -32,7 +32,7 @@ void OS_InitFIRM(void) { #ifdef SDK_ARM9 //---- system shared area check - SDK_ASSERT((u32)&(OS_GetSystemWork()->command_area) == HW_CMD_AREA); +// SDK_ASSERT((u32)&(OS_GetSystemWork()->command_area) == HW_CMD_AREA); //---------------------------------------------------------------- // for ARM9 @@ -64,7 +64,7 @@ void OS_InitFIRM(void) OS_SetIrqStackChecker(); //---- Init Exception System - OS_InitException(); +// OS_InitException(); //---- Init MI (Wram bank and DMA0 arranged) MI_Init(); diff --git a/build/nandfirm/nandfirm-loader/ARM7/main.c b/build/nandfirm/nandfirm-loader/ARM7/main.c index 33c0c6c3..daddfb84 100644 --- a/build/nandfirm/nandfirm-loader/ARM7/main.c +++ b/build/nandfirm/nandfirm-loader/ARM7/main.c @@ -20,7 +20,6 @@ #include //#define BOOT_SECURE_SRL // 本番SRLをブートするときにだけ定義する -//#define FIRM_ENABLE_JTAG #define FATFS_HEAP_SIZE (64*1024) @@ -46,52 +45,79 @@ static u64 fatfs_arena[FATFS_HEAP_SIZE/sizeof(u64)]; static u8 step = 0x80; #endif +static SDPortContext nandContext; + void TwlSpMain( void ) { -// OS_TPrintf( "\nNAND Boot time is %d msec.\n", OS_TicksToMilliSecondsBROM32(OS_GetTick())); - -#ifndef BOOT_SECURE_SRL - MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); + /* FromBromで必要なものはここで待避 */ + nandContext = OSi_GetFromBromAddr()->SDNandContext; +#ifdef BOOT_SECURE_SRL + /* 鍵はどこへ? */ #endif - -// I2Ci_WriteRegister(I2C_SLAVE_DEBUG_LED, 0x03, 0x00); -// I2Ci_WriteRegister(I2C_SLAVE_DEBUG_LED, 0x01, (0xff)); - + MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); #ifdef FIRM_ENABLE_JTAG reg_SCFG_JTAG = REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK; #endif // FIRM_ENABLE_JTAG OS_InitFIRM(); +OS_TPrintf("OS_InitFIRM() was called\n"); OS_InitDebugLED(); OS_SetDebugLED(++step); PM_InitFIRM(); +OS_TPrintf("PM_InitFIRM() was called\n"); OS_SetDebugLED(++step); +OS_TPrintf("OS_GetMainArenaHi() = 0x%08X\n", OS_GetMainArenaHi()); +OS_TPrintf("OS_GetMainArenaLo() = 0x%08X\n", OS_GetMainArenaLo()); +OS_TPrintf("OS_GetSubPrivArenaHi() = 0x%08X\n", OS_GetSubPrivArenaHi()); +OS_TPrintf("OS_GetSubPrivArenaLo() = 0x%08X\n", OS_GetSubPrivArenaLo()); +OS_TPrintf("OS_GetMainExArenaHi() = 0x%08X\n", OS_GetMainExArenaHi()); +OS_TPrintf("OS_GetMainExArenaLo() = 0x%08X\n", OS_GetMainExArenaLo()); +OS_TPrintf("OS_GetITCMArenaHi() = 0x%08X\n", OS_GetITCMArenaHi()); +OS_TPrintf("OS_GetITCMArenaLo() = 0x%08X\n", OS_GetITCMArenaLo()); +OS_TPrintf("OS_GetDTCMArenaHi() = 0x%08X\n", OS_GetDTCMArenaHi()); +OS_TPrintf("OS_GetDTCMArenaLo() = 0x%08X\n", OS_GetDTCMArenaLo()); +OS_TPrintf("OS_GetSharedArenaHi() = 0x%08X\n", OS_GetSharedArenaHi()); +OS_TPrintf("OS_GetSharedArenaLo() = 0x%08X\n", OS_GetSharedArenaLo()); +OS_TPrintf("OS_GetWramMainArenaHi() = 0x%08X\n", OS_GetWramMainArenaHi()); +OS_TPrintf("OS_GetWramMainArenaLo() = 0x%08X\n", OS_GetWramMainArenaLo()); +OS_TPrintf("OS_GetWramSubArenaHi() = 0x%08X\n", OS_GetWramSubArenaHi()); +OS_TPrintf("OS_GetWramSubArenaLo() = 0x%08X\n", OS_GetWramSubArenaLo()); +OS_TPrintf("OS_GetWramSubPrivArenaHi() = 0x%08X\n", OS_GetWramSubPrivArenaHi()); +OS_TPrintf("OS_GetWramSubPrivArenaLo() = 0x%08X\n", OS_GetWramSubPrivArenaLo()); + + /* FATFSライブラリ用にカレントヒープに設定 */ { OSHeapHandle hh; u8 *lo = (u8*)fatfs_arena; u8 *hi = (u8*)fatfs_arena + FATFS_HEAP_SIZE; +#if 0 OS_SetSubPrivArenaLo(lo); OS_SetSubPrivArenaHi(hi); OS_SetSubPrivArenaLo(lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1)); +#else + lo = OS_InitAlloc(OS_ARENA_MAIN_SUBPRIV, lo, hi, 1); +#endif hh = OS_CreateHeap(OS_ARENA_MAIN_SUBPRIV, lo + 32, hi - 32); OS_SetCurrentHeap(OS_ARENA_MAIN_SUBPRIV, hh); } OS_SetDebugLED(++step); - if ( FATFS_InitFIRM() ) + if ( FATFS_InitFIRM( &nandContext ) ) { +OS_TPrintf("FATFS_InitFIRM() was called\n"); OS_SetDebugLED(++step); if ( FATFS_MountDriveFirm( DRIVE_NO, BOOT_DEVICE, PARTITION_NO ) ) { BOOL result; +OS_TPrintf("FATFS_MountDriveFirm() was called\n"); OS_SetDebugLED(++step); #ifdef BOOT_SECURE_SRL @@ -119,6 +145,7 @@ void TwlSpMain( void ) OS_Terminate(); break; } +OS_TPrintf("FATFS_OpenSpecifiedMenu() was called\n"); #endif if ( result ) { diff --git a/build/nandfirm/nandfirm-loader/ARM9/main.c b/build/nandfirm/nandfirm-loader/ARM9/main.c index b3fba250..099a5ee3 100644 --- a/build/nandfirm/nandfirm-loader/ARM9/main.c +++ b/build/nandfirm/nandfirm-loader/ARM9/main.c @@ -34,16 +34,25 @@ int acPool[3]; void TwlMain( void ) { -// OS_TPrintf( "\nNAND Boot time is %d msec.\n", OS_TicksToMilliSecondsBROM32(OS_GetTick())); + /* FromBromで必要なものはここで待避 */ -#ifndef BOOT_SECURE_SRL -#define FIRM_SHARD HW_TWL_SECONDARY_ROM_HEADER_BUF -#define FIRM_SHARD_END HW_TWL_MAIN_MEM_END -#define FIRM_SHARD_SIZE (FIRM_SHARD_END-FIRM_SHARD) - MIi_CpuClearFast( 0, (void*)FIRM_SHARD, FIRM_SHARD_SIZE ); - DC_FlushRange( (void*)FIRM_SHARD, FIRM_SHARD_SIZE ); -// MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); +#ifdef BOOT_SECURE_SRL + /* 鍵はどこへ? */ #endif + MIi_CpuClearFast( 0, (void*)OSi_GetFromBromAddr(), sizeof(OSFromBromBuf) ); + +/* メインメモリのクリア領域 (TODO: Reset時に残す領域がある(ここでは無条件で残すようにする)) */ +#define FIRM_CLEAR_A (FIRM_CLEAR_A_END-FIRM_CLEAR_A_SIZE) +#define FIRM_CLEAR_A_END HW_TWL_MAIN_MEM_END +#define FIRM_CLEAR_A_SIZE 0x8000 +#define FIRM_CLEAR_B HW_TWL_MAIN_MEM +#define FIRM_CLEAR_B_END (FIRM_CLEAR_B + FIRM_CLEAR_B_SIZE) +#define FIRM_CLEAR_B_SIZE 0x10000 +// MIi_CpuClearFast( 0, (void*)FIRM_CLEAR_A, FIRM_CLEAR_A_SIZE ); + MIi_CpuClearFast( 0, (void*)FIRM_CLEAR_B, FIRM_CLEAR_B_SIZE ); + DC_FlushRange( (void*)FIRM_CLEAR_A, FIRM_CLEAR_A_SIZE ); + DC_FlushRange( (void*)FIRM_CLEAR_B, FIRM_CLEAR_B_SIZE ); + reg_GX_VRAMCNT_C = REG_GX_VRAMCNT_C_FIELD( TRUE, 0, 0x2); OS_InitFIRM(); diff --git a/include/firm/fatfs/ARM7/fatfs_firm.h b/include/firm/fatfs/ARM7/fatfs_firm.h index dd349cc8..f29c9f93 100644 --- a/include/firm/fatfs/ARM7/fatfs_firm.h +++ b/include/firm/fatfs/ARM7/fatfs_firm.h @@ -54,11 +54,11 @@ void FATFS_DisableAES( void ); Description: init file system - Arguments: None + Arguments: nandContext : nand context to omit initialization (if any) Returns: None *---------------------------------------------------------------------------*/ -BOOL FATFS_InitFIRM( void ); +BOOL FATFS_InitFIRM( void* nandContext ); /*---------------------------------------------------------------------------* Name: FATFS_MountDriveFirm diff --git a/include/firm/specfiles/ARM7-TS-FIRM.lcf.template b/include/firm/specfiles/ARM7-TS-FIRM.lcf.template index c183b409..335efa97 100644 --- a/include/firm/specfiles/ARM7-TS-FIRM.lcf.template +++ b/include/firm/specfiles/ARM7-TS-FIRM.lcf.template @@ -16,12 +16,12 @@ #--------------------------------------------------------------------------- MEMORY { - (RWX) : ORIGIN = , LENGTH = 0x0 > + (RWX) : ORIGIN = , LENGTH = 0x0 > - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> F (RW) : ORIGIN = 0, LENGTH = 0x0 > F (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -33,11 +33,11 @@ MEMORY check.WORKRAM (RWX) : ORIGIN = 0x037f8000, LENGTH = 0x18000 > workram.check check.MAINMEM (RWX) : ORIGIN = 0x02fe0000, LENGTH = 0x1c000 > mainmem.check - binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 >> + binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> L (RW) : ORIGIN = 0, LENGTH = 0x0 > L (RW) : ORIGIN = 0, LENGTH = 0x0 > diff --git a/include/firm/specfiles/ARM9-TS-FIRM.lcf.template b/include/firm/specfiles/ARM9-TS-FIRM.lcf.template index e8bbb8f0..10efd461 100644 --- a/include/firm/specfiles/ARM9-TS-FIRM.lcf.template +++ b/include/firm/specfiles/ARM9-TS-FIRM.lcf.template @@ -16,13 +16,13 @@ #--------------------------------------------------------------------------- MEMORY { - (RWX) : ORIGIN = , LENGTH = 0x0 > + (RWX) : ORIGIN = , LENGTH = 0x0 > - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> - binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.AUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.STATIC_FOOTER (RWX) : ORIGIN = 0, LENGTH = 0x0 >> F (RW) : ORIGIN = 0, LENGTH = 0x0 > F (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -39,11 +39,11 @@ MEMORY check.ITCM (RW) : ORIGIN = 0x0, LENGTH = 0x08000 > itcm.check check.DTCM (RW) : ORIGIN = 0x0, LENGTH = 0x04000 > dtcm.check - binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 >> + binary.LTDAUTOLOAD_TOP (RW) : ORIGIN = 0, LENGTH = 0x0 > - (RWX) : ORIGIN = , LENGTH = 0x0 >> + (RWX) : ORIGIN = , LENGTH = 0x0 >> - binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> + binary.LTDAUTOLOAD_INFO (RWX) : ORIGIN = 0, LENGTH = 0x0 >> L (RW) : ORIGIN = 0, LENGTH = 0x0 > L (RW) : ORIGIN = 0, LENGTH = 0x0 > @@ -89,10 +89,10 @@ SECTIONS SDK_STATIC_START =.; SDK_STATIC_TEXT_START =.; #:::::::::: text/rodata - crt0_firm.o (.text) - libsyscall.a (.text) OBJECT(_start,*) + crt0_firm.o (.text) crt0_firm.o (.rodata) + libsyscall.a (.text) # # .version セクションを追加しています。 # このセクションに含まれる情報はロットチェックの際に @@ -393,13 +393,13 @@ SECTIONS SDK_AUTOLOAD_LIST_END = SDK_AUTOLOAD_START + SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); SDK_AUTOLOAD_SIZE = SDK_AUTOLOAD_SIZE + SIZEOF(.binary.AUTOLOAD_INFO); -# ############################ STATIC_FOOTER ########################## -# .binary.STATIC_FOOTER: -# { -# WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE -# WRITEW _start_ModuleParams - ADDR(.); -# WRITEW 0; # NO DIGEST -# } > binary.STATIC_FOOTER + ############################ STATIC_FOOTER ########################## + .binary.STATIC_FOOTER: + { + WRITEW 0xdec00621; # LE(0x2106C0DE) = NITRO CODE + WRITEW _start_ModuleParams - ADDR(.); + WRITEW 0; # NO DIGEST + } > binary.STATIC_FOOTER ############################ OVERLAYS ############################### SDK_OVERLAY_NUMBER = ; @@ -966,10 +966,10 @@ SECTIONS # Module filelist .binary.MODULE_FILES: { - WRITES (""); + WRITES (""); WRITES (""); WRITES (""); - WRITES (""); + WRITES (""); WRITES (""); WRITES (""); diff --git a/include/firm/specfiles/ROM-TS.rsf b/include/firm/specfiles/ROM-TS.rsf new file mode 100644 index 00000000..6d3681cf --- /dev/null +++ b/include/firm/specfiles/ROM-TS.rsf @@ -0,0 +1,148 @@ +#---------------------------------------------------------------------------- +# Project: TwlSDK - include +# File: ROM-BB.rsf +# +# Copyright 2007 Nintendo. All rights reserved. +# +# These coded insructions, statements, and computer programs contain +# proprietary information of Nintendo of America Inc. and/or Nintendo +# Company Ltd., and are protected by Federal copyright law. They may +# not be disclosed to third parties or copied or duplicated in any form, +# in whole or in part, without the prior written consent of Nintendo. +# +# $Date:: $ +# $Rev$ +# $Author$ +#---------------------------------------------------------------------------- +# +# TWL ROM SPEC FILE +# + +Arm9 +{ + Static "$(MAKEROM_ARM9:r).FLX.TWL.sbin$(COMPSUFFIX9)" + OverlayDefs "$(MAKEROM_ARM9:r)_defs.FLX.TWL.sbin$(COMPSUFFIX9)" + OverlayTable "$(MAKEROM_ARM9:r)_table.FLX.TWL.sbin$(COMPSUFFIX9)" + Elf "$(MAKEROM_ARM9:r).tef" +} + +Arm7 +{ + Static "$(MAKEROM_ARM7_BASE:r).FLX.TWL.sbin$(COMPSUFFIX7)" + OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.FLX.TWL.sbin$(COMPSUFFIX7)" + OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.FLX.TWL.sbin$(COMPSUFFIX7)" + Elf "$(MAKEROM_ARM7_BASE:r).tef" +} + +Arm9.Ltd +{ + Static "$(MAKEROM_ARM9:r).LTD.TWL.sbin$(COMPSUFFIX9)" + OverlayDefs "$(MAKEROM_ARM9:r)_defs.LTD.TWL.sbin$(COMPSUFFIX9)" + OverlayTable "$(MAKEROM_ARM9:r)_table.LTD.TWL.sbin$(COMPSUFFIX9)" +} + +Arm7.Ltd +{ + Static "$(MAKEROM_ARM7_BASE:r).LTD.TWL.sbin$(COMPSUFFIX7)" + OverlayDefs "$(MAKEROM_ARM7_BASE:r)_defs.LTD.TWL.sbin$(COMPSUFFIX7)" + OverlayTable "$(MAKEROM_ARM7_BASE:r)_table.LTD.TWL.sbin$(COMPSUFFIX7)" +} + +Property +{ + ### + ### Settings for FinalROM + ### + #### BEGIN + # + # TITLE NAME: Your product name within 12bytes + # + TitleName "FIRM" + + # + # MAKER CODE: Your company ID# in 2 ascii words + # issued by NINTENDO + # + MakerCode "01" + + # + # REMASTER VERSION: Mastering version + # + #RomVersion 0 + + # + # ROM SPEED TYPE: [MROM/1TROM/UNDEFINED] + # + RomSpeedType $(MAKEROM_ROMSPEED) + + # + # ROM SIZE: in bit [64M/128M/256M/512M/1G/2G] + # + #RomSize 128M + #RomSize 256M + + # + # ROM PADDING: TRUE if finalrom + # + #RomFootPadding TRUE + + # + # ROM HEADER TEMPLATE: Provided to every product by NINTENDO + # + #RomHeaderTemplate ./etc/rom_header.template.sbin + + # + # BANNER FILE: generated from Banner Spec File + # + #BannerFile ./etc/myGameBanner.bnr + BannerFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr + + ### + ### Setting for TWL + ### + # + # BANNER FILE: + # + BannerTWLFile $(TWLSDK_ROOT)/include/twl/specfiles/default.bnr + + # + # Boot allowed Media: [GameCard/NAND/SDCard/DownloadPlay] + # possible to choose one or more. + # + BootMedia GameCard NAND SDCard DownloadPlay + + # + # Certification FILE: + # + Certificate $(TWLSDK_ROOT)/include/twl/specfiles/default_sgn.sbin + + # + # Digest parameters: + # + DigestParam 1024 32 + + # + # WRAM mapping: [MAP_BB_HYB/MAP_BB_LTD/MAP_TS_HYB/MAP_TS_LTD] + # don't have to edit + # + #WramMapping $(MAKEROM_WRAM_MAPPING) + WramMappingDirect wram_regs/wram_regs.rbin + + # + # Codec mode: + # don't have to edit + # + CodecMode $(MAKEROM_CODEC_MODE) + + ### + #### END +} + +RomSpec +{ + Offset 0x00000000 + Segment ALL + HostRoot $(MAKEROM_ROMROOT) + Root / + File $(MAKEROM_ROMFILES) +}