void mcsdl_delay_test(INT32 nCount) { INT16 i; MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR. MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer //-------------------------------- // Repeating 'nCount' times //-------------------------------- MCSDL_SET_GPIO_I2C(); MCSDL_GPIO_SCL_SET_OUTPUT(); MCSDL_GPIO_SDA_SET_OUTPUT(); MCSDL_RESETB_SET_OUTPUT(); MCSDL_GPIO_SCL_SET_HIGH(); for (i = 0; i < nCount; i++) { #if 1 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_20US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_100US); #elif 0 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_500US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_1MS); #else MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_25MS); TKEY_INTR_SET_LOW(); mcsdl_delay(MCSDL_DELAY_45MS); TKEY_INTR_SET_HIGH(); #endif } MCSDL_GPIO_SCL_SET_HIGH(); MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR. MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer }
static void mcsdl_select_isp_mode(UINT8 ucMode) { int i; UINT8 enteringCodeMassErase[3] = { 1, 1, 1 }; UINT8 enteringCodeSerialWrite[3] = { 0, 0, 1 }; UINT8 enteringCodeSerialRead[3] = { 0, 1, 0 }; UINT8 *pCode; //------------------------------------ // Entering ISP mode : Part 1 //------------------------------------ for(i=0; i<4; i++){ MCSDL_RESETB_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_RESETB_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); } MCSDL_RESETB_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); //------------------------------------ // Entering ISP mode : Part 2 //------------------------------------ if( ucMode == ISP_MODE_ERASE_FLASH ) pCode = enteringCodeMassErase; else if( ucMode == ISP_MODE_SERIAL_WRITE ) pCode = enteringCodeSerialWrite; else if( ucMode == ISP_MODE_SERIAL_READ ) pCode = enteringCodeSerialRead; for(i=0; i<3; i++){ if( pCode[i] == 1 ) MCSDL_RESETB_SET_HIGH(); else MCSDL_RESETB_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); } MCSDL_RESETB_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); // High //--------------------------------------------------- // Entering ISP mode : Part 3 - Only Mass Erase //--------------------------------------------------- if( ucMode == ISP_MODE_ERASE_FLASH ){ for(i=0; i<6; i++){ if( i==3 ) mcsdl_delay(MCSDL_DELAY_25MS); else if( i==4 ) mcsdl_delay(MCSDL_DELAY_150US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_5US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_5US); } } }
static int mcsdl_program_flash( UINT8 *pDataOriginal, UINT16 unLength, INT8 IdxNum ) { int i; UINT8 *pData; UINT8 ucLength; UINT16 addr; UINT32 header; addr = 0; pData = pDataOriginal; ucLength = MELFAS_TRANSFER_LENGTH; //kang while( (addr*4) < (int)unLength){ if( ( unLength - (addr*4) ) < MELFAS_TRANSFER_LENGTH ){ ucLength = (UINT8)(unLength - (addr*4) ); } //-------------------------------------- // Select ISP Mode //-------------------------------------- // start ADD DELAY mcsdl_delay(MCSDL_DELAY_40US); //end ADD DELAY if(IdxNum > 0) { mcsdl_select_isp_mode(ISP_MODE_NEXT_CHIP_BYPASS); mcsdl_delay(MCSDL_DELAY_3US); } mcsdl_select_isp_mode( ISP_MODE_SERIAL_WRITE ); //--------------------------------------------- // Header // Address[13ibts] <<1 //--------------------------------------------- header = ((addr&0x1FFF) << 1) | 0x0 ; header = header << 14; //Write 18bits mcsdl_write_bits( header, 18 ); //start ADD DELAY //mcsdl_delay(MCSDL_DELAY_5MS); //end ADD DELAY //--------------------------------- // Writing //--------------------------------- // addr += (UINT16)ucLength; addr +=1; #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("#"); #endif mcsdl_program_flash_part(pData); pData += ucLength; //--------------------------------------------- // Tail //--------------------------------------------- MCSDL_GPIO_SDA_SET_HIGH(); //kang mcsdl_delay(MCSDL_DELAY_40US); for(i=0; i<6; i++){ if( i==2 ) mcsdl_delay(MCSDL_DELAY_20US); else if( i==3 ) mcsdl_delay(MCSDL_DELAY_40US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_10US); } //kang #if MELFAS_ENABLE_DBG_PROGRESS_PRINT //printk("\n"); #endif mcsdl_unselect_isp_mode(); //start ADD DELAY mcsdl_delay(MCSDL_DELAY_300US); //end ADD DELAY } return MCSDL_RET_SUCCESS; }
static int mcsdl_verify_flash( UINT8 *pDataOriginal, UINT16 unLength, INT8 IdxNum ) { int i, j; int nRet; UINT8 *pData; UINT8 ucLength; UINT16 addr; UINT32 wordData; addr = 0; pData = (UINT8 *) pDataOriginal; ucLength = MELFAS_TRANSFER_LENGTH; while( (addr*4) < (int)unLength){ if( ( unLength - (addr*4) ) < MELFAS_TRANSFER_LENGTH ){ ucLength = (UINT8)(unLength - (addr*4) ); } // start ADD DELAY mcsdl_delay(MCSDL_DELAY_40US); //-------------------------------------- // Select ISP Mode //-------------------------------------- if(IdxNum > 0) { mcsdl_select_isp_mode(ISP_MODE_NEXT_CHIP_BYPASS); mcsdl_delay(MCSDL_DELAY_3US); } mcsdl_select_isp_mode(ISP_MODE_SERIAL_READ); //--------------------------------------------- // Header // Address[13ibts] <<1 //--------------------------------------------- wordData = ( (addr&0x1FFF) << 1 ) | 0x0; wordData <<= 14; mcsdl_write_bits( wordData, 18 ); addr+=1; #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("#"); #endif //-------------------- // Read flash //-------------------- mcsdl_read_flash( ucVerifyBuffer); //kang MCSDL_GPIO_SDA_SET_HIGH(); // mcsdl_delay(MCSDL_DELAY_1MS); for(i=0; i<6; i++){ if( i==2 ) mcsdl_delay(MCSDL_DELAY_3US); else if( i==3 ) mcsdl_delay(MCSDL_DELAY_40US);//(MCSDL_DELAY_1MS); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_10US); } //kang //-------------------- // Comparing //-------------------- if(IdxNum == 0) { for(j=0; j<(int)ucLength; j++){ #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk(" %02X", ucVerifyBuffer[j] ); #endif if( ucVerifyBuffer[j] != pData[j] ){ #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("\n [Error] Address : 0x%04X : 0x%02X - 0x%02X\n", addr, pData[j], ucVerifyBuffer[j] ); #endif nRet = MCSDL_RET_PROGRAM_VERIFY_FAILED; goto MCSDL_VERIFY_FLASH_FINISH; } } } else // slave { for(j=0; j<(int)ucLength; j++){ #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk(" %02X", ucVerifyBuffer[j] ); #endif if( (0xff-ucVerifyBuffer[j]) != pData[j] ){ #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("\n [Error] Address : 0x%04X : 0x%02X - 0x%02X\n", addr, pData[j], ucVerifyBuffer[j] ); #endif nRet = MCSDL_RET_PROGRAM_VERIFY_FAILED; goto MCSDL_VERIFY_FLASH_FINISH; } } } pData += ucLength; #if MELFAS_ENABLE_DBG_PROGRESS_PRINT //printk("\n"); #endif mcsdl_unselect_isp_mode(); } nRet = MCSDL_RET_SUCCESS; MCSDL_VERIFY_FLASH_FINISH: #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("\n"); #endif mcsdl_unselect_isp_mode(); return nRet; }
static void mcsdl_select_isp_mode(UINT8 ucMode) { int i; UINT8 enteringCodeMassErase[16] = { 0,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1 }; UINT8 enteringCodeSerialWrite[16] = { 0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1 }; UINT8 enteringCodeSerialRead[16] = { 0,1,1,0,1,0,1,0,1,1,0,0,1,0,0,1 }; UINT8 enteringCodeNextChipBypass[16] = { 1,1,0,1,1,0,0,1,0,0,1,0,1,1,0,1 }; UINT8 *pCode = 0; //------------------------------------ // Entering ISP mode : Part 1 //------------------------------------ if (ucMode == ISP_MODE_ERASE_FLASH) pCode = enteringCodeMassErase; else if (ucMode == ISP_MODE_SERIAL_WRITE) pCode = enteringCodeSerialWrite; else if (ucMode == ISP_MODE_SERIAL_READ) pCode = enteringCodeSerialRead; else if (ucMode == ISP_MODE_NEXT_CHIP_BYPASS) pCode = enteringCodeNextChipBypass; //----------------------------------------------------- // //printk("%d \n", ucMode); MCSDL_RESETB_SET_LOW(); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_HIGH(); for (i = 0; i < 16; i++) { if (pCode[i] == 1) MCSDL_RESETB_SET_HIGH(); else MCSDL_RESETB_SET_LOW(); //start add delay for INT mcsdl_delay(MCSDL_DELAY_3US); //end delay for INT MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); } MCSDL_RESETB_SET_LOW(); //--------------------------------------------------- // Entering ISP mode : Part 2 - Only Mass Erase //--------------------------------------------------- mcsdl_delay(MCSDL_DELAY_7US); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_HIGH(); if( ucMode == ISP_MODE_ERASE_FLASH ){ mcsdl_delay(MCSDL_DELAY_7US); for(i=0; i<4; i++){ if( i==2 ) mcsdl_delay(MCSDL_DELAY_25MS); else if( i==3 ) mcsdl_delay(MCSDL_DELAY_150US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_7US); } } MCSDL_GPIO_SDA_SET_LOW(); }