不正ROMメーカ:2バイト/4バイト単位でビットをいじれるように変更。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlToolsRED@340 7061adef-622a-194b-ae81-725974e89856
This commit is contained in:
nishikawa_takeshi 2009-07-03 01:21:28 +00:00
parent 1733e94d09
commit 9ff748853d

View File

@ -60,7 +60,10 @@ typedef struct _SContext
// 引数 // 引数
u32 byteAddr; // 不正挿入バイトアドレス u32 byteAddr; // 不正挿入バイトアドレス
u32 bitAddr; // 不正挿入ビットアドレス(オプション) u32 bitAddr; // 不正挿入ビットアドレス(オプション)
u8 assignValue; // ã“ül(ƒIƒvƒVƒ‡ƒ“) u32 assignValue; // 代入値(オプション)
// 不正値を入れる箇所を何バイトとして扱うか
u32 targetSize;
} }
SContext; SContext;
@ -102,6 +105,8 @@ void usage()
printf( "-d bitAddr : desable the specific bit. [0-7]\n" ); printf( "-d bitAddr : desable the specific bit. [0-7]\n" );
printf( "-c : clear the byte.\n" ); printf( "-c : clear the byte.\n" );
printf( "-a value : assign the value into the byte. [00-FF]\n" ); printf( "-a value : assign the value into the byte. [00-FF]\n" );
printf( "-2 : treat the target as 2 byte.\n" );
printf( "-4 : treat the target as 4 byte.\n" );
printf( "-h : print help only.\n" ); printf( "-h : print help only.\n" );
printf( "-f : force to overwrite a output_file.\n" ); printf( "-f : force to overwrite a output_file.\n" );
printf( "-----------------------------------------------------------------------------\n" ); printf( "-----------------------------------------------------------------------------\n" );
@ -126,8 +131,11 @@ int main(int argc, char *argv[])
// context の初期化 // context の初期化
memset( &context, 0, sizeof(SContext) ); memset( &context, 0, sizeof(SContext) );
// デフォルトでは不正値を入れる箇所を1バイトとして扱う
context.targetSize = 1;
// オプション // オプション
while( (opt = getopt(argc, argv, "e:d:ca:hf")) >= 0 ) while( (opt = getopt(argc, argv, "e:d:ca:24hf")) >= 0 )
{ {
switch( opt ) switch( opt )
{ {
@ -150,6 +158,14 @@ int main(int argc, char *argv[])
context.assignValue = strtol(optarg, &errptr, 16); context.assignValue = strtol(optarg, &errptr, 16);
break; break;
case '2':
context.targetSize = 2;
break;
case '4':
context.targetSize = 4;
break;
case 'h': case 'h':
usage(); usage();
return 0; return 0;
@ -263,12 +279,12 @@ FINALIZE:
static BOOL iMain( SContext *pContext ) static BOOL iMain( SContext *pContext )
{ {
u8 byte; u32 target = 0; // 1,2,4バイトのいずれかを書き換えるので最大の4バイトにしておく
// 指定されたバイトをリード // 指定されたバイトをリード
printf("Byte Address : 0x%X\n", (unsigned int)pContext->byteAddr); printf("Byte Address : 0x%X\n", (unsigned int)pContext->byteAddr);
fseek( pContext->ifp, pContext->byteAddr, SEEK_SET ); fseek( pContext->ifp, pContext->byteAddr, SEEK_SET );
if( 1 != fread( &byte, 1, 1, pContext->ifp ) ) if( pContext->targetSize != fread( &target, 1, pContext->targetSize, pContext->ifp ) )
{ {
printf( "\n*** Error: Failed to read the byte from input_file. ***\n" ); printf( "\n*** Error: Failed to read the byte from input_file. ***\n" );
return FALSE; return FALSE;
@ -276,33 +292,33 @@ static BOOL iMain( SContext *pContext )
if( pContext->isBitEnable ) if( pContext->isBitEnable )
{ {
u8 mask = 1 << pContext->bitAddr; u32 mask = 1 << pContext->bitAddr;
u8 oldbyte = byte; u32 old = target;
byte |= mask; target |= mask;
printf("Enable bit %d : 0x%02X -> 0x%02X\n", (int)pContext->bitAddr, oldbyte, byte); printf("Enable bit %2d : 0x%08X -> 0x%08X\n", (int)pContext->bitAddr, (unsigned int)old, (unsigned int)target);
} }
if( pContext->isBitDisable ) if( pContext->isBitDisable )
{ {
u8 mask = 1 << pContext->bitAddr; u32 mask = 1 << pContext->bitAddr;
u8 oldbyte = byte; u32 old = target;
byte &= ~mask; target &= ~mask;
printf("Disable bit %d : 0x%02X -> 0x%02X\n", (int)pContext->bitAddr, oldbyte, byte); printf("Enable bit %2d : 0x%08X -> 0x%08X\n", (int)pContext->bitAddr, (unsigned int)old, (unsigned int)target);
} }
if( pContext->isByteClear ) if( pContext->isByteClear )
{ {
u8 oldbyte = byte; u32 old = target;
byte = 0; target = 0;
printf("Clear byte : 0x%02X -> 0x%02X\n", oldbyte, byte); printf("Clear byte : 0x%08X -> 0x%08X\n", (unsigned int)old, (unsigned int)target);
} }
if( pContext->isByteAssign ) if( pContext->isByteAssign )
{ {
printf("Assign : 0x%02X -> 0x%02X\n", byte, pContext->assignValue); printf("Assign : 0x%08X -> 0x%08X\n", (unsigned int)target, (unsigned int)pContext->assignValue);
byte = pContext->assignValue; target = pContext->assignValue;
} }
// 変更したバイトを出力ファイルに書き出す // 変更したバイトを出力ファイルに書き出す
fseek( pContext->ofp, pContext->byteAddr, SEEK_SET ); fseek( pContext->ofp, pContext->byteAddr, SEEK_SET );
if( 1 != fwrite( &byte, 1, 1, pContext->ofp ) ) if( pContext->targetSize != fwrite( &target, 1, pContext->targetSize, pContext->ofp ) )
{ {
printf( "\n*** Error: Failed to write the byte to output_fie. ***\n" ); printf( "\n*** Error: Failed to write the byte to output_fie. ***\n" );
return FALSE; return FALSE;