マイコンファーム書き込みルーチンの修正

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1626 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
yutaka 2008-06-13 11:33:14 +00:00
parent 49e2d81ade
commit dd9de09a42

View File

@ -19,16 +19,16 @@
#include <twl/i2c/ARM7/i2c.h> #include <twl/i2c/ARM7/i2c.h>
#include "mcu_firm.h" #include "mcu_firm.h"
#define PRINT_DEBUG //#define PRINT_DEBUG
//#define PRINT_DEBUG_MINI // rough version //#define PRINT_DEBUG_MINI // rough version
#ifdef PRINT_DEBUG #ifdef PRINT_DEBUG
#include <nitro/os/common/printf.h> #include <nitro/os/common/printf.h>
#define DBG_PRINTF OS_TPrintf #define DBG_PRINTF OS_TPrintf
#undef PRINT_DEBUG_MINI // because of the alternative option #undef PRINT_DEBUG_MINI // because of the alternative option
#define DBG_PRINT_PROFILE_INIT OSTick debug #define DBG_PRINT_PROFILE_INIT OSTick debug, d
#define DBG_PRINT_PROFILE_BEGIN() (debug = OS_GetTick()) #define DBG_PRINT_PROFILE_BEGIN() (debug = OS_GetTick())
#define DBG_PRINT_PROFILE_END() OS_TPrintf("(%d msec)\n", (int)OS_TicksToMilliSeconds(OS_GetTick()-debug)) #define DBG_PRINT_PROFILE_END() (d=(int)OS_TicksToMilliSeconds(OS_GetTick()-debug), (d ? OS_TPrintf("(%d msec)\n", d) : (void)0))
#else #else
#define DBG_PRINTF( ... ) ((void)0) #define DBG_PRINTF( ... ) ((void)0)
#define DBG_PRINT_PROFILE_INIT #define DBG_PRINT_PROFILE_INIT
@ -105,8 +105,11 @@ static inline void I2Ci_StopPhase2( void )
static inline void I2Ci_WaitEx( void ) // support slowRate static inline void I2Ci_WaitEx( void ) // support slowRate
{ {
DBG_PRINT_PROFILE_INIT;
I2Ci_Wait(); I2Ci_Wait();
DBG_PRINT_PROFILE_BEGIN();
SVC_WaitByLoop(slowRate); SVC_WaitByLoop(slowRate);
DBG_PRINT_PROFILE_END();
} }
static inline void I2Ci_StopEx( I2CReadWrite rw ) // support slowRate static inline void I2Ci_StopEx( I2CReadWrite rw ) // support slowRate
@ -162,25 +165,26 @@ static inline BOOL I2Ci_SendLast( u8 data )
return I2Ci_GetResult(); return I2Ci_GetResult();
} }
#define SLOW_RATE_DEFAULT 0x90 #define SLOW_RATE_DEFAULT 0x50
#define SLOW_RATE_LONG HW_CPU_CLOCK_ARM7 // 4 sec #define SLOW_RATE_SHORT 0x0
#define SLOW_RATE_ENTER (HW_CPU_CLOCK_ARM7 / 400) // 10msec #define SLOW_RATE_LONG (HW_CPU_CLOCK_ARM7 / 13) // 300msec
#define SLOW_RATE_ENTER (HW_CPU_CLOCK_ARM7 / 180) // 22msec
BOOL MCU_WriteFirm(const unsigned char* hex) BOOL MCU_WriteFirm(const unsigned char* hex)
{ {
BOOL result = TRUE; BOOL result = TRUE;
DBG_PRINT_PROFILE_INIT; BOOL temp;
I2C_Lock(); I2C_Lock();
// start phase
slowRate = SLOW_RATE_DEFAULT; slowRate = SLOW_RATE_DEFAULT;
// start phase
result &= I2Ci_SendStart( I2C_SLAVE_MICRO_CONTROLLER ); result &= I2Ci_SendStart( I2C_SLAVE_MICRO_CONTROLLER );
result &= I2Ci_SendMiddle( 0x77 ); // free register 7 result &= I2Ci_SendMiddle( 0x77 ); // free register 7
slowRate = SLOW_RATE_LONG;
DBG_PRINT_PROFILE_BEGIN();
result &= I2Ci_SendMiddle( 0x4A ); // goto firm writing mode result &= I2Ci_SendMiddle( 0x4A ); // goto firm writing mode
DBG_PRINT_PROFILE_END();
slowRate = SLOW_RATE_LONG;
// main phase // main phase
while ( hex[0] == ':' && hex[3] < '3' ) // フォーマットが正しく0x3000以前のアドレスである場合に処理する while ( hex[0] == ':' && hex[3] < '3' ) // フォーマットが正しく0x3000以前のアドレスである場合に処理する
@ -199,24 +203,25 @@ BOOL MCU_WriteFirm(const unsigned char* hex)
} }
continue; continue;
} }
// 通常出力 // 最初の1文字 (':'のはず)
slowRate = SLOW_RATE_DEFAULT;
while ( *hex != '\n' )
{
result &= I2Ci_SendMiddle( *hex++ );
}
// 最後の1文字(\n固定)
slowRate = SLOW_RATE_ENTER;
DBG_PRINT_PROFILE_BEGIN();
result &= I2Ci_SendMiddle( *hex++ ); result &= I2Ci_SendMiddle( *hex++ );
DBG_PRINT_PROFILE_END();
slowRate = SLOW_RATE_SHORT;
// 通常出力
temp = TRUE; /* 1回遅延させることで'\n'の結果を無視する */
do
{
result &= temp;
temp = I2Ci_SendMiddle( *hex );
}
while ( *hex++ != '\n' );
slowRate = SLOW_RATE_ENTER;
} }
// stop phase // stop phase (only 2nd call)
I2Ci_Wait(); I2Ci_WaitEx();
DBG_PRINT_PROFILE_BEGIN();
SVC_WaitByLoop(slowRate);
DBG_PRINT_PROFILE_END();
I2Ci_StopPhase2(); I2Ci_StopPhase2();
I2C_Unlock(); I2C_Unlock();