static void mcsdl_write_bits(UINT32 wordData, int nBits) { int i; MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_LOW(); for (i = 0; i < nBits; i++) { if (wordData & 0x80000000) { MCSDL_GPIO_SDA_SET_HIGH(); } else { MCSDL_GPIO_SDA_SET_LOW(); } /* LGE_CHANGE_S: E0 [email protected] [2011-11-09] */ 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); wordData <<= 1; } }
static void mcsdl_read_32bits( UINT8 *pData ) { int i, j; MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SDA_SET_INPUT(); for (i=3; i>=0; i--){ pData[i] = 0; for (j=0; j<8; j++){ pData[i] <<= 1; MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_1US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_1US); if (MCSDL_GPIO_SDA_IS_HIGH()) pData[i] |= 0x01; } } MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SDA_SET_OUTPUT(0); }
static void mcsdl_write_bits(UINT32 wordData, int nBits) { int i; MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SDA_SET_OUTPUT(); for (i = 0; i < nBits; i++) { if (wordData & 0x80000000) { MCSDL_GPIO_SDA_SET_HIGH(); } else { MCSDL_GPIO_SDA_SET_LOW(); } mcsdl_delay(MCSDL_DELAY_20US); // lcs_test MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_7US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US); wordData <<= 1; } }
static void mcsdl_read_32bits( UINT8 *pData ) { int i, j; MCSDL_GPIO_SDA_SET_INPUT(); #ifdef ENABLE_LITTLE_ENDIAN for (i=0; i<=3; i++){ #else // BIG_ENDIAN for (i=3; i>=0; i--){ #endif pData[i] = 0; for (j=0; j<8; j++){ pData[i] <<= 1; MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_mcs7000_delay(MCSDL_DELAY_5US); if ( MCSDL_GPIO_SDA_IS_HIGH()) pData[i] |= 0x01; MCSDL_GPIO_SCL_SET_LOW(); mcsdl_mcs7000_delay(MCSDL_DELAY_5US); } } } static void mcsdl_write_bits(UINT32 wordData, int nBits) { int i; MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SDA_SET_OUTPUT(); for (i=0; i<nBits; i++){ if ( wordData & 0x80000000 ) { MCSDL_GPIO_SDA_SET_HIGH(); } else { MCSDL_GPIO_SDA_SET_LOW(); } mcsdl_mcs7000_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_mcs7000_delay(MCSDL_DELAY_3US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_mcs7000_delay(MCSDL_DELAY_3US); wordData <<= 1; } }
static void mcsdl_set_ready(void) { //-------------------------------------------- // Tkey module reset //-------------------------------------------- MCSDL_VDD_SET_LOW(); // power //MCSDL_CE_SET_LOW(); //MCSDL_CE_SET_OUTPUT(); //MCSDL_SET_GPIO_I2C(); MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SDA_SET_OUTPUT(0); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SCL_SET_OUTPUT(0); MCSDL_RESETB_SET_LOW(); MCSDL_RESETB_SET_OUTPUT(0); mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD MCSDL_VDD_SET_HIGH(); //MCSDL_CE_SET_HIGH(); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_40MS); // Delay '30 msec' }
int mcsdl_download_binary_data(struct melfas_tsi_platform_data *data) { int nRet; /* code for samsung */ melfas_i2c_gpio_scl(); melfas_i2c_gpio_sda(); MCSDL_RESETB_SET_OUTPUT(0); MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_RESETB_SET_LOW(); /* code for samsung */ #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD melfas_send_download_enable_command(); mcsdl_delay(MCSDL_DELAY_100US); #endif MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR. MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer //------------------------ // Run Download //------------------------ nRet = mcsdl_download((const UINT8*) MELFAS_binary, (const UINT16)MELFAS_binary_nLength , 0, data); #if MELFAS_2CHIP_DOWNLOAD_ENABLE nRet = mcsdl_download((const UINT8*) MELFAS_binary_2, (const UINT16)MELFAS_binary_nLength_2, 1, data); // Slave Binary data download #endif MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR. MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer return (nRet == MCSDL_RET_SUCCESS); }
static int mcsdl_download(const UINT8 *pBianry, const UINT16 unLength, INT8 IdxNum, struct melfas_tsi_platform_data *data) { int i; int nRet; UINT8 Check_IC = 0xFF; // d.model UINT8 readBuffer[32]; UINT8 writeBuffer[4]; UINT32 wordData; //--------------------------------- // Check Binary Size //--------------------------------- if (unLength >= MELFAS_FIRMWARE_MAX_SIZE) { nRet = MCSDL_RET_PROGRAM_SIZE_IS_WRONG; goto MCSDL_DOWNLOAD_FINISH; } #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk(" - Starting download...\n"); #endif //--------------------------------- // Make it ready //--------------------------------- #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk(" > Ready\n"); #endif mcsdl_set_ready(data); mcsdl_delay(MCSDL_DELAY_1MS); //-------------------------------------------------------------- // IC Information read from Flash //-------------------------------------------------------------- #if 1 if (IdxNum == 0) { mcsdl_select_isp_mode(ISP_MODE_SERIAL_READ); wordData = ((0x1F00 & 0x1FFF) << 1) | 0x0; wordData <<= 14; mcsdl_write_bits(wordData, 18); mcsdl_read_flash(readBuffer); MCSDL_GPIO_SDA_SET_LOW(); /* code for samsung */ //MCSDL_GPIO_SDA_SET_OUTPUT(0); /* code for samsung */ mcsdl_unselect_isp_mode(); //if (readBuffer[3] != 0xFF) Check_IC = readBuffer[3]; #if MELFAS_ENABLE_DBG_PROGRESS_PRINT printk("\IC Information :0x%02X, 0x%02X\n", readBuffer[3], Check_IC); #endif mcsdl_delay(MCSDL_DELAY_1MS); }
static void mcsdl_set_ready(void) { //-------------------------------------------- // Tkey module reset //-------------------------------------------- MCSDL_VDD_SET_LOW(); // power //MCSDL_CE_SET_LOW(); // MCSDL_CE_SET_OUTPUT(); MCSDL_SET_GPIO_I2C(); MCSDL_GPIO_SDA_SET_OUTPUT(); MCSDL_GPIO_SDA_SET_LOW(); // MCSDL_GPIO_SDA_SET_OUTPUT(); MCSDL_GPIO_SCL_SET_OUTPUT(); MCSDL_GPIO_SCL_SET_LOW(); // MCSDL_GPIO_SCL_SET_OUTPUT(); MCSDL_RESETB_SET_OUTPUT(); MCSDL_RESETB_SET_LOW(); // MCSDL_RESETB_SET_OUTPUT(); mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD MCSDL_VDD_SET_HIGH(); // MCSDL_CE_SET_HIGH(); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_HIGH(); mcsdl_delay(50000);//MCSDL_DELAY_25MS); // Delay '30 msec' //joohyung.lee too long delay 25000us -> 12000us }
static void mcsdl_write_bits(UINT32 wordData, int nBits) { int i; MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_LOW(); for (i = 0; i < nBits; i++) { if (wordData & 0x80000000) MCSDL_GPIO_SDA_SET_HIGH(); else MCSDL_GPIO_SDA_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); wordData <<= 1; } }
static void mcsdl_read_flash( UINT8 *pBuffer) { int i; MCSDL_GPIO_SDA_SET_LOW(); mcsdl_delay(MCSDL_DELAY_40US); for (i=0; i< 5; i++){ MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10US); MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_10US); } mcsdl_read_32bits( pBuffer ); }
void mcsdl_set_ready(void) { //-------------------------------------------- // Tkey module reset //-------------------------------------------- MCSDL_VDD_SET_LOW(); // power //MCSDL_CE_SET_LOW(); //MCSDL_CE_SET_OUTPUT(); //MCSDL_SET_GPIO_I2C(); mcsdl_set_gpio_i2c(); if (gpio_request(GPIO_TOUCH_I2C_SDA,"I2C3_SDA") != 0) { printk("TSP firm download, Could not request GPIO %d", GPIO_TOUCH_I2C_SDA); return -EIO; } if (gpio_request(GPIO_TOUCH_I2C_SCL,"I2C3_SCL") != 0) { printk("TSP firm download, Could not request GPIO %d", GPIO_TOUCH_I2C_SCL); return -EIO; } MCSDL_GPIO_SDA_SET_LOW(); MCSDL_GPIO_SDA_SET_OUTPUT(); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SCL_SET_OUTPUT(); MCSDL_RESETB_SET_LOW(); MCSDL_RESETB_SET_OUTPUT(); mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD MCSDL_VDD_SET_HIGH(); //MCSDL_CE_SET_HIGH(); MCSDL_GPIO_SDA_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10MS); //mcsdl_delay(MCSDL_DELAY_40MS); // Delay '30 msec' }
static void mcsdl_set_ready(void) { //-------------------------------------------- // Tkey module reset //-------------------------------------------- MCSDL_VDD_SET_LOW(); // power //MCSDL_CE_SET_LOW(); MCSDL_CE_SET_OUTPUT(); MCSDL_SET_GPIO_I2C(); //MCSDL_GPIO_SDA_SET_LOW(); //bomi MCSDL_GPIO_SDA_SET_OUTPUT(); MCSDL_GPIO_SDA_SET_LOW(); //MCSDL_GPIO_SCL_SET_LOW(); //bomi MCSDL_GPIO_SCL_SET_OUTPUT(); MCSDL_GPIO_SCL_SET_LOW(); //MCSDL_RESETB_SET_LOW(); //bomi MCSDL_RESETB_SET_OUTPUT(); MCSDL_RESETB_SET_LOW(); /* LGE_CHANGE_S: E0 [email protected] [2011-11-09] : TD1416085584 : After sleeping on and off while sensing a touchscreen, Touchscreen doesn't work*/ mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD MCSDL_VDD_SET_HIGH(); MCSDL_CE_SET_HIGH(); MCSDL_GPIO_SCL_SET_LOW(); MCSDL_GPIO_SDA_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_40MS); // Delay '30 msec' }
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; //------------------------------------ // 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; 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(); }
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_LOW(); MCSDL_GPIO_SDA_SET_OUTPUT(0); // mcsdl_delay(MCSDL_DELAY_1MS); //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; 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 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; }