static int mcsdl_program_flash( UINT8 *pDataOriginal, UINT16 unLength ) { int i; UINT8 *pData; UINT8 ucLength; UINT16 addr; UINT32 header; addr = 0; pData = pDataOriginal; //-------------------------------------- // Select ISP Mode [In System Programming Mode] //-------------------------------------- mcsdl_select_isp_mode( ISP_MODE_SERIAL_WRITE ); //--------------------------------------------- // Header // Length[13ibts] <<17 ) | Address[13ibts]<<2 //--------------------------------------------- header = ( ((unLength/4+1)&0x1FFF) << 17 ) | ( (0x0000&0x1FFF) << 2 ); // Write 32bits mcsdl_write_bits( header, 32 ); //--------------------------------- // Repeat Writing //--------------------------------- ucLength = MELFAS_TRANSFER_LENGTH; for( i = 0; i< (int)unLength; i+=(int)ucLength ){ addr = (UINT16)i; #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("#"); #endif if( ( unLength - addr ) < MELFAS_TRANSFER_LENGTH ){ ucLength = (UINT8)(unLength - addr); } mcsdl_program_flash_part( pData, ucLength ); pData += ucLength; } #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("\n"); #endif mcsdl_unselect_isp_mode(); return MCSDL_RET_SUCCESS; }
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); } MCSDL_GPIO_SDA_SET_LOW(); mcsdl_unselect_isp_mode(); //start ADD DELAY mcsdl_delay(MCSDL_DELAY_300US); //end ADD DELAY } return MCSDL_RET_SUCCESS; }