1 //------------------------------------------------------------------
3 // MELFAS Firmware download base code v6 For MCS5080 2008/11/04
5 //------------------------------------------------------------------
6 #include "melfas_download.h"
8 //============================================================
10 // Static variables & functions
12 //============================================================
14 //---------------------------------
15 // Downloading functions
16 //---------------------------------
17 static int mcsdl_download(const UINT8 *pData, const UINT16 nLength);
18 static int mcsdl_enter_download_mode(void);
19 static void mcsdl_write_download_mode_signal(void);
20 static int mcsdl_i2c_erase_flash(void);
21 static int mcsdl_i2c_prepare_erase_flash(void);
22 static int mcsdl_i2c_read_flash( UINT8 *pBuffer, UINT16 nAddr_start, UINT8 cLength);
23 static int mcsdl_i2c_prepare_program(void);
24 static int mcsdl_i2c_program_flash( UINT8 *pData, UINT16 nAddr_start, UINT8 cLength );
26 //-----------------------------------------
27 // Download enable command on Protocol
28 //-----------------------------------------
29 #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD
30 void melfas_send_download_enable_command(void);
33 //---------------------------------
35 //---------------------------------
36 BOOLEAN _i2c_read_( UINT8 slave_addr, UINT8 *pData, UINT8 cLength);
37 BOOLEAN _i2c_write_(UINT8 slave_addr, UINT8 *pData, UINT8 cLength);
39 //---------------------------------
41 //---------------------------------
42 static void mcsdl_delay(UINT32 nCount);
44 //---------------------------------
45 // For debugging display
46 //---------------------------------
47 #if MELFAS_ENABLE_DBG_PRINT
48 static void mcsdl_print_result(int nRet);
52 //----------------------------------
53 // Download enable command
54 //----------------------------------
55 #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD
57 void melfas_send_download_enable_command(void)
59 // TO DO : Fill this up
65 //---------------------------------
66 // Additional necessary things
67 //---------------------------------
68 #define uart_printf printk
70 struct i2c_client *mcs_c;
72 int mcsdl_set_i2c_client(struct i2c_client *c)
81 static int mcs_i2c_fw_write(u8 slave_addr, u8 *val)
85 mcs_c->addr = slave_addr;
87 ret = i2c_master_send(mcs_c, val, 1);
89 dev_err(&mcs_c->dev, "%s: failed\n", __func__);
94 static int mcs_i2c_fw_read(u8 slave_addr, u8 *val)
98 mcs_c->addr = slave_addr;
100 ret = i2c_master_recv(mcs_c, val, 1);
102 dev_err(&mcs_c->dev, "%s: failed\n", __func__);
108 //============================================================
110 // Include MELFAS Binary source code File ( ex> MELFAS_FIRM_bin.c)
113 // .c file included at next must not be inserted to Souce project.
114 // Just #include One file. !!
116 //============================================================
117 //#include "MCS5080_SAMPLE_FIRMWARE_R01_V00_bin.c"
118 //#include "MCS5080_SAMPLE_FIRMWARE_R01_V01_bin.c"
119 #include "MTH_KESSLER_R01_V02_bin.c"
122 //============================================================
124 // main Download furnction
126 //============================================================
128 int mcsdl_download_binary_data(void)
132 #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD
134 melfas_send_download_enable_command();
136 mcsdl_delay(MCSDL_DELAY_100US);
140 MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR.
141 MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer
143 //------------------------
145 //------------------------
146 ret = mcsdl_download( (const UINT8*) MELFAS_binary, (const UINT16)MELFAS_binary_nLength );
148 MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR.
149 MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer
151 #if MELFAS_ENABLE_DBG_PRINT
153 //------------------------
155 //------------------------
157 mcsdl_print_result( ret );
161 return ( ret == MCSDL_RET_SUCCESS );
166 int mcsdl_download_binary_file(void)
171 UINT16 nBinary_length =0;
173 //==================================================
175 // Porting section 7. File process
177 // 1. Read '.bin file'
178 // 2. Run mcsdl_download_binary_data();
180 //==================================================
184 // TO DO : File Process & Get file Size(== Binary size)
185 // This is just a simple sample
190 //------------------------------
192 //------------------------------
194 if( fopen( fp, "MELFAS_FIRM.bin", "rb" ) == NULL ){
195 return MCSDL_RET_FILE_ACCESS_FAILED;
198 //------------------------------
200 //------------------------------
202 fseek( fp, 0, SEEK_END );
204 nBinary_length = (UINT16)ftell(fp);
206 //------------------------------
208 //------------------------------
210 pData = (UINT8*)malloc( (INT)nBinary_length );
214 return MCSDL_RET_FILE_ACCESS_FAILED;
217 //------------------------------
219 //------------------------------
221 fseek( fp, 0, SEEK_SET );
223 nRead = fread( pData, 1, (INT)nBinary_length, fp ); // Read binary file
225 if( nRead != (INT)nBinary_length ){
227 fclose(fp); // Close file
229 if( pData != NULL ) // free memory alloced.
232 return MCSDL_RET_FILE_ACCESS_FAILED;
235 //------------------------------
237 //------------------------------
243 if( pData != NULL && nBinary_length > 0 && nBinary_length < 14*1024 ){
245 MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR.
246 MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer
248 ret = mcsdl_download( (const UINT8 *)pData, (const UINT16)nBinary_length );
250 MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR.
251 MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer
255 ret = MCSDL_RET_WRONG_PARAMETER;
258 #if MELFAS_ENABLE_DBG_PRINT
260 mcsdl_print_result( ret );
265 if( pData != NULL ) // free memory alloced.
269 return ( ret == MCSDL_RET_SUCCESS );
273 //------------------------------------------------------------------
277 //------------------------------------------------------------------
279 static int mcsdl_download(const UINT8 *pData, const UINT16 nLength )
285 UINT16 nStart_address=0;
287 UINT8 buffer[MELFAS_TRANSFER_LENGTH];
288 UINT8 *pOriginal_data;
291 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
292 uart_printf("Starting download...\n");
295 //--------------------------------------------------------------
297 // Enter Download mode
299 //--------------------------------------------------------------
300 nRet = mcsdl_enter_download_mode();
302 if( nRet != MCSDL_RET_SUCCESS )
303 goto MCSDL_DOWNLOAD_FINISH;
305 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
307 //--------------------------------------------------------------
309 // Check H/W Revision
311 // Don't download firmware, if Module H/W revision does not match.
313 //--------------------------------------------------------------
314 #if MELFAS_DISABLE_DOWNLOAD_IF_MODULE_VERSION_DOES_NOT_MATCH
316 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
317 uart_printf("Checking module revision...\n");
320 pOriginal_data = (UINT8 *)pData;
322 nRet = mcsdl_i2c_read_flash( buffer, MCSDL_ADDR_MODULE_REVISION, 4 );
324 if( nRet != MCSDL_RET_SUCCESS )
325 goto MCSDL_DOWNLOAD_FINISH;
327 if( (pOriginal_data[MCSDL_ADDR_MODULE_REVISION+1] != buffer[1])
328 || (pOriginal_data[MCSDL_ADDR_MODULE_REVISION+2] != buffer[2]) ){
330 nRet = MCSDL_RET_WRONG_MODULE_REVISION;
331 goto MCSDL_DOWNLOAD_FINISH;
334 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
338 //--------------------------------------------------------------
342 //--------------------------------------------------------------
344 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
345 uart_printf("Erasing...\n");
348 nRet = mcsdl_i2c_prepare_erase_flash();
350 if( nRet != MCSDL_RET_SUCCESS ){
351 goto MCSDL_DOWNLOAD_FINISH;
354 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
356 nRet = mcsdl_i2c_erase_flash();
358 if( nRet != MCSDL_RET_SUCCESS ){
359 goto MCSDL_DOWNLOAD_FINISH;
362 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
365 //--------------------------------------------------------------
369 //--------------------------------------------------------------
370 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
371 uart_printf("Verify Erasing...\n");
374 nRet = mcsdl_i2c_read_flash( buffer, 0x00, 16 );
376 if( nRet != MCSDL_RET_SUCCESS )
377 goto MCSDL_DOWNLOAD_FINISH;
382 if( buffer[i] != 0xFF ){
384 nRet = MCSDL_RET_ERASE_VERIFY_FAILED;
385 goto MCSDL_DOWNLOAD_FINISH;
389 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
392 //--------------------------------------------------------------
394 // Prepare for Program flash.
396 //--------------------------------------------------------------
397 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
398 uart_printf("Program information...\n");
401 nRet = mcsdl_i2c_prepare_program();
403 if( nRet != MCSDL_RET_SUCCESS )
404 goto MCSDL_DOWNLOAD_FINISH;
407 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
410 //--------------------------------------------------------------
414 //--------------------------------------------------------------
416 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
417 uart_printf("Program flash... ");
420 pOriginal_data = (UINT8 *)pData;
423 cLength = MELFAS_TRANSFER_LENGTH;
425 for( nStart_address = 0; nStart_address < nLength; nStart_address+=cLength ){
427 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
431 if( ( nLength - nStart_address ) < MELFAS_TRANSFER_LENGTH ){
432 cLength = (UINT8)(nLength - nStart_address);
434 cLength += (cLength%2); // For odd length.
437 nRet = mcsdl_i2c_program_flash( pOriginal_data, nStart_address, cLength );
439 if( nRet != MCSDL_RET_SUCCESS ){
441 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
442 uart_printf("Program flash failed position : 0x%x / nRet : 0x%x ", nStart_address, nRet);
445 goto MCSDL_DOWNLOAD_FINISH;
448 pOriginal_data += cLength;
450 mcsdl_delay(MCSDL_DELAY_500US); // Delay '500 usec'
455 //--------------------------------------------------------------
459 //--------------------------------------------------------------
461 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
463 uart_printf("Verify flash... ");
466 pOriginal_data = (UINT8 *) pData;
470 cLength = MELFAS_TRANSFER_LENGTH;
472 for( nStart_address = 0; nStart_address < nLength; nStart_address+=cLength ){
474 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
478 if( ( nLength - nStart_address ) < MELFAS_TRANSFER_LENGTH ){
479 cLength = (UINT8)(nLength - nStart_address);
481 cLength += (cLength%2); // For odd length.
484 //--------------------
486 //--------------------
487 nRet = mcsdl_i2c_read_flash( buffer, nStart_address, cLength );
489 //--------------------
491 //--------------------
493 for(i=0; i<(int)cLength; i++){
496 if( buffer[i] != pOriginal_data[i] ){
498 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
499 uart_printf("0x%04X : 0x%02X - 0x%02X\n", nStart_address, pOriginal_data[i], buffer[i] );
502 nRet = MCSDL_RET_PROGRAM_VERIFY_FAILED;
503 goto MCSDL_DOWNLOAD_FINISH;
508 pOriginal_data += cLength;
511 mcsdl_delay(MCSDL_DELAY_500US); // Delay '500 usec'
516 nRet = MCSDL_RET_SUCCESS;
519 MCSDL_DOWNLOAD_FINISH :
521 mcsdl_delay(MCSDL_DELAY_1MS); // Delay '1 msec'
523 //---------------------------
525 //---------------------------
526 buffer[0] = MCSDL_ISP_CMD_RESET;
528 _i2c_write_( MCSDL_I2C_SLAVE_ADDR_ORG, buffer, 1 );
530 TKEY_INTR_SET_INPUT();
532 mcsdl_delay(MCSDL_DELAY_45MS);
538 //------------------------------------------------------------------
540 // Enter Download mode ( MDS ISP or I2C ISP )
542 //------------------------------------------------------------------
543 static int mcsdl_enter_download_mode(void)
546 int nRet = MCSDL_RET_ENTER_DOWNLOAD_MODE_FAILED;
550 //--------------------------------------------
552 //--------------------------------------------
557 TKEY_CE_SET_OUTPUT();
562 TKEY_INTR_SET_OUTPUT();
564 TKEY_RESETB_SET_LOW();
565 TKEY_RESETB_SET_OUTPUT();
567 mcsdl_delay(MCSDL_DELAY_45MS); // Delay for VDD LOW Stable
568 mcsdl_delay(MCSDL_DELAY_45MS);
572 TKEY_I2C_SDA_SET_HIGH();
574 mcsdl_delay(MCSDL_DELAY_45MS); // Delay '45 msec'
576 //-------------------------------
578 //-------------------------------
579 mcsdl_write_download_mode_signal();
581 mcsdl_delay(MCSDL_DELAY_25MS); // Delay '25 msec'
583 //-------------------------------
585 //-------------------------------
587 bRet = _i2c_read_( MCSDL_I2C_SLAVE_ADDR_ORG, &cData, 1 );
589 if( bRet != TRUE || cData != MCSDL_I2C_SLAVE_READY_STATUS ){
591 uart_printf("mcsdl_enter_download_mode() returns - ret : 0x%x & cData : 0x%x\n", nRet, cData);
592 goto MCSDL_ENTER_DOWNLOAD_MODE_FINISH;
595 nRet = MCSDL_RET_SUCCESS;
597 //-----------------------------------
598 // Entering MDS ISP mode finished.
599 //-----------------------------------
601 MCSDL_ENTER_DOWNLOAD_MODE_FINISH:
606 //--------------------------------------------
608 // Write ISP Mode entering signal
610 //--------------------------------------------
611 static void mcsdl_write_download_mode_signal(void)
615 UINT8 enter_code[14] = { 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1 };
617 //---------------------------
619 //---------------------------
623 if( enter_code[i] ) {
625 TKEY_RESETB_SET_HIGH();
626 TKEY_INTR_SET_HIGH();
630 TKEY_RESETB_SET_LOW();
634 TKEY_I2C_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_15US);
635 TKEY_I2C_SCL_SET_LOW();
637 TKEY_RESETB_SET_LOW();
640 mcsdl_delay(MCSDL_DELAY_100US);
644 TKEY_I2C_SCL_SET_HIGH();
646 mcsdl_delay(MCSDL_DELAY_100US);
648 TKEY_INTR_SET_HIGH();
649 TKEY_RESETB_SET_HIGH();
653 //--------------------------------------------
655 // Prepare Erase flash
657 //--------------------------------------------
658 static int mcsdl_i2c_prepare_erase_flash(void)
660 int nRet = MCSDL_RET_PREPARE_ERASE_FLASH_FAILED;
665 UINT8 i2c_buffer[4] = { MCSDL_ISP_CMD_ERASE_TIMING,
666 MCSDL_ISP_ERASE_TIMING_VALUE_0,
667 MCSDL_ISP_ERASE_TIMING_VALUE_1,
668 MCSDL_ISP_ERASE_TIMING_VALUE_2 };
671 //-----------------------------
672 // Send Erase Setting code
673 //-----------------------------
677 bRet = _i2c_write_(MCSDL_I2C_SLAVE_ADDR_ORG, &i2c_buffer[i], 1 );
680 goto MCSDL_I2C_PREPARE_ERASE_FLASH_FINISH;
682 mcsdl_delay(MCSDL_DELAY_15US);
685 //-----------------------------
687 //-----------------------------
689 mcsdl_delay(MCSDL_DELAY_500US); // Delay 500usec
691 bRet = _i2c_read_(MCSDL_I2C_SLAVE_ADDR_ORG, &ucTemp, 1 );
693 if( bRet && ucTemp == MCSDL_ISP_ACK_PREPARE_ERASE_DONE ){
695 nRet = MCSDL_RET_SUCCESS;
700 MCSDL_I2C_PREPARE_ERASE_FLASH_FINISH :
707 //--------------------------------------------
711 //--------------------------------------------
712 static int mcsdl_i2c_erase_flash(void)
714 int nRet = MCSDL_RET_ERASE_FLASH_FAILED;
719 UINT8 i2c_buffer[1] = { MCSDL_ISP_CMD_ERASE};
722 //-----------------------------
724 //-----------------------------
728 bRet = _i2c_write_(MCSDL_I2C_SLAVE_ADDR_ORG, &i2c_buffer[i], 1 );
731 goto MCSDL_I2C_ERASE_FLASH_FINISH;
733 mcsdl_delay(MCSDL_DELAY_15US);
736 //-----------------------------
738 //-----------------------------
740 mcsdl_delay(MCSDL_DELAY_45MS); // Delay 45ms
743 bRet = _i2c_read_(MCSDL_I2C_SLAVE_ADDR_ORG, &ucTemp, 1 );
745 if( bRet && ucTemp == MCSDL_ISP_ACK_ERASE_DONE ){
747 nRet = MCSDL_RET_SUCCESS;
752 MCSDL_I2C_ERASE_FLASH_FINISH :
758 //--------------------------------------------
762 //--------------------------------------------
763 static int mcsdl_i2c_read_flash( UINT8 *pBuffer, UINT16 nAddr_start, UINT8 cLength)
765 int nRet = MCSDL_RET_READ_FLASH_FAILED;
772 //-----------------------------------------------------------------------------
773 // Send Read Flash command [ Read code - address high - address low - size ]
774 //-----------------------------------------------------------------------------
776 cmd[0] = MCSDL_ISP_CMD_READ_FLASH;
777 cmd[1] = (UINT8)((nAddr_start >> 8 ) & 0xFF);
778 cmd[2] = (UINT8)((nAddr_start ) & 0xFF);
783 bRet = _i2c_write_( MCSDL_I2C_SLAVE_ADDR_ORG, &cmd[i], 1 );
785 mcsdl_delay(MCSDL_DELAY_15US);
788 goto MCSDL_I2C_READ_FLASH_FINISH;
792 //----------------------------------
793 // Read 'Result of command'
794 //----------------------------------
795 bRet = _i2c_read_( MCSDL_I2C_SLAVE_ADDR_ORG, &ucTemp, 1 );
797 if( !bRet || ucTemp != MCSDL_MDS_ACK_READ_FLASH){
799 goto MCSDL_I2C_READ_FLASH_FINISH;
802 //----------------------------------
803 // Read Data [ pCmd[3] == Size ]
804 //----------------------------------
805 for(i=0; i<(int)cmd[3]; i++){
807 mcsdl_delay(MCSDL_DELAY_100US); // Delay about 100us
809 bRet = _i2c_read_( MCSDL_I2C_SLAVE_ADDR_ORG, pBuffer++, 1 );
811 if( bRet == FALSE && i!=(int)(cmd[3]-1) )
812 goto MCSDL_I2C_READ_FLASH_FINISH;
815 nRet = MCSDL_RET_SUCCESS;
818 MCSDL_I2C_READ_FLASH_FINISH :
824 //--------------------------------------------
828 //--------------------------------------------
829 static int mcsdl_i2c_prepare_program(void)
832 int nRet = MCSDL_RET_PREPARE_PROGRAM_FAILED;
837 UINT8 i2c_buffer[4] = { MCSDL_ISP_CMD_PROGRAM_TIMING,
838 MCSDL_ISP_PROGRAM_TIMING_VALUE_0,
839 MCSDL_ISP_PROGRAM_TIMING_VALUE_1,
840 MCSDL_ISP_PROGRAM_TIMING_VALUE_2};
842 //------------------------------------------------------
843 // Write Program timing information
844 //------------------------------------------------------
847 bRet = _i2c_write_( MCSDL_I2C_SLAVE_ADDR_ORG, &i2c_buffer[i], 1 );
850 goto MCSDL_I2C_PREPARE_PROGRAM_FINISH;
852 mcsdl_delay(MCSDL_DELAY_15US);
855 mcsdl_delay(MCSDL_DELAY_500US); // delay about 500us
857 //------------------------------------------------------
858 // Read command's result
859 //------------------------------------------------------
860 bRet = _i2c_read_( MCSDL_I2C_SLAVE_ADDR_ORG, &i2c_buffer[4], 1 );
862 if( bRet == FALSE || i2c_buffer[4] != MCSDL_I2C_ACK_PREPARE_PROGRAM)
863 goto MCSDL_I2C_PREPARE_PROGRAM_FINISH;
865 mcsdl_delay(MCSDL_DELAY_100US); // delay about 100us
867 nRet = MCSDL_RET_SUCCESS;
869 MCSDL_I2C_PREPARE_PROGRAM_FINISH :
875 //--------------------------------------------
879 //--------------------------------------------
881 static int mcsdl_i2c_program_flash( UINT8 *pData, UINT16 nAddr_start, UINT8 cLength )
883 int nRet = MCSDL_RET_PROGRAM_FLASH_FAILED;
892 //-----------------------------
894 //-----------------------------
896 cmd[0] = MCSDL_ISP_CMD_PROGRAM_FLASH;
897 cmd[1] = (UINT8)((nAddr_start >> 8 ) & 0xFF);
898 cmd[2] = (UINT8)((nAddr_start ) & 0xFF);
903 bRet = _i2c_write_(MCSDL_I2C_SLAVE_ADDR_ORG, &cmd[i], 1 );
905 mcsdl_delay(MCSDL_DELAY_15US);
908 goto MCSDL_I2C_PROGRAM_FLASH_FINISH;
911 //-----------------------------
912 // Check command result
913 //-----------------------------
915 bRet = _i2c_read_( MCSDL_I2C_SLAVE_ADDR_ORG, &cData, 1 );
917 if( bRet == FALSE || cData != MCSDL_MDS_ACK_PROGRAM_FLASH ){
919 goto MCSDL_I2C_PROGRAM_FLASH_FINISH;
923 //-----------------------------
925 //-----------------------------
927 mcsdl_delay(MCSDL_DELAY_150US); // Delay about 150us
929 for(i=0; i<(int)cmd[3]; i+=2){
932 bRet = _i2c_write_( MCSDL_I2C_SLAVE_ADDR_ORG, &pData[i+1], 1 );
934 mcsdl_delay(MCSDL_DELAY_150US); // Delay about 150us
937 goto MCSDL_I2C_PROGRAM_FLASH_FINISH;
940 bRet = _i2c_write_( MCSDL_I2C_SLAVE_ADDR_ORG, &pData[i], 1 );
942 mcsdl_delay(MCSDL_DELAY_150US); // Delay about 150us
945 goto MCSDL_I2C_PROGRAM_FLASH_FINISH;
950 nRet = MCSDL_RET_SUCCESS;
952 MCSDL_I2C_PROGRAM_FLASH_FINISH :
958 //============================================================
962 //============================================================
963 static void mcsdl_delay(UINT32 nCount)
968 // base_band_delay_function(nCount); // Baseband delay function
978 for(i=0;i<nCount;i++){
986 //============================================================
988 // Porting section 6. I2C function calling
990 // Connect baseband i2c function
992 // Warning 1. !!!! Burst mode is not supported. Transfer 1 byte Only.
994 // Every i2c packet has to
995 // " START > Slave address > One byte > STOP " at download mode.
997 // Warning 2. !!!! Check return value of i2c function.
999 // _i2c_read_(), _i2c_write_() must return
1000 // TRUE (1) if success,
1001 // FALSE(0) if failed.
1003 // If baseband i2c function returns different value, convert return value.
1004 // ex> baseband_return = baseband_i2c_read( slave_addr, pData, cLength );
1005 // return ( baseband_return == BASEBAND_RETURN_VALUE_SUCCESS );
1008 // Warning 3. !!!! Check Slave address
1010 // Slave address is '0x7F' at download mode. ( Diffrent with Normal touch working mode )
1011 // '0x7F' is original address,
1012 // If shift << 1 bit, It becomes '0xFE'
1014 //============================================================
1016 BOOLEAN _i2c_read_( UINT8 slave_addr, UINT8 *pData, UINT8 cLength)
1020 #if USE_BASEBAND_I2C_FUNCTION
1022 //bRet = baseband_i2c_read( slave_addr<<1, pData, cLength );
1023 //bRet = baseband_i2c_read( slave_addr, pData, cLength );
1024 bRet = mcs_i2c_fw_read(slave_addr, pData);
1032 return ( bRet == TRUE );
1035 BOOLEAN _i2c_write_(UINT8 slave_addr, UINT8 *pData, UINT8 cLength)
1039 #if USE_BASEBAND_I2C_FUNCTION
1041 //bRet = baseband_i2c_write( slave_addr<<1, pData, cLength );
1042 //bRet = baseband_i2c_write( slave_addr, pData, cLength );
1043 bRet = mcs_i2c_fw_write(slave_addr, pData);
1051 return ( bRet == TRUE );
1057 //============================================================
1059 // Debugging print functions.
1061 // Change uart_printf() to Baseband printing function
1063 //============================================================
1065 #if MELFAS_ENABLE_DBG_PRINT
1067 static void mcsdl_print_result(int nRet)
1069 if( nRet == MCSDL_RET_SUCCESS ){
1071 uart_printf(" MELFAS Firmware downloading SUCCESS.\n");
1075 uart_printf(" MELFAS Firmware downloading FAILED : ");
1079 case MCSDL_RET_SUCCESS : uart_printf("MCSDL_RET_SUCCESS\n" ); break;
1080 case MCSDL_RET_ENTER_DOWNLOAD_MODE_FAILED : uart_printf("MCSDL_RET_ENTER_ISP_MODE_FAILED\n" ); break;
1081 case MCSDL_RET_ERASE_FLASH_FAILED : uart_printf("MCSDL_RET_ERASE_FLASH_FAILED\n" ); break;
1082 case MCSDL_RET_READ_FLASH_FAILED : uart_printf("MCSDL_RET_READ_FLASH_FAILED\n" ); break;
1083 case MCSDL_RET_READ_EEPROM_FAILED : uart_printf("MCSDL_RET_READ_EEPROM_FAILED\n" ); break;
1084 case MCSDL_RET_READ_INFORMAION_FAILED : uart_printf("MCSDL_RET_READ_INFORMAION_FAILED\n" ); break;
1085 case MCSDL_RET_PROGRAM_FLASH_FAILED : uart_printf("MCSDL_RET_PROGRAM_FLASH_FAILED\n" ); break;
1086 case MCSDL_RET_PROGRAM_EEPROM_FAILED : uart_printf("MCSDL_RET_PROGRAM_EEPROM_FAILED\n" ); break;
1087 case MCSDL_RET_PREPARE_PROGRAM_FAILED : uart_printf("MCSDL_RET_PROGRAM_INFORMAION_FAILED\n" ); break;
1088 case MCSDL_RET_PROGRAM_VERIFY_FAILED : uart_printf("MCSDL_RET_PROGRAM_VERIFY_FAILED\n" ); break;
1090 case MCSDL_RET_WRONG_MODE_ERROR : uart_printf("MCSDL_RET_WRONG_MODE_ERROR\n" ); break;
1091 case MCSDL_RET_WRONG_SLAVE_SELECTION_ERROR : uart_printf("MCSDL_RET_WRONG_SLAVE_SELECTION_ERROR\n" ); break;
1092 case MCSDL_RET_COMMUNICATION_FAILED : uart_printf("MCSDL_RET_COMMUNICATION_FAILED\n" ); break;
1093 case MCSDL_RET_READING_HEXFILE_FAILED : uart_printf("MCSDL_RET_READING_HEXFILE_FAILED\n" ); break;
1094 case MCSDL_RET_WRONG_PARAMETER : uart_printf("MCSDL_RET_WRONG_PARAMETER\n" ); break;
1095 case MCSDL_RET_FILE_ACCESS_FAILED : uart_printf("MCSDL_RET_FILE_ACCESS_FAILED\n" ); break;
1096 case MCSDL_RET_MELLOC_FAILED : uart_printf("MCSDL_RET_MELLOC_FAILED\n" ); break;
1097 case MCSDL_RET_WRONG_MODULE_REVISION : uart_printf("MCSDL_RET_WRONG_MODULE_REVISION\n" ); break;
1099 default : uart_printf("UNKNOWN ERROR. [0x%02X].\n", nRet ); break;
1109 //============================================================
1111 // Porting section 4-1. Delay function
1113 // For initial testing of delay and gpio control
1115 // You can confirm GPIO control and delay time by calling this function.
1117 //============================================================
1119 #if MELFAS_ENABLE_DELAY_TEST
1122 void mcsdl_delay_test(INT32 nCount)
1126 MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR.
1127 MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer
1129 TKEY_I2C_SET_OUTPUT();
1130 TKEY_CE_SET_OUTPUT();
1131 TKEY_INTR_SET_OUTPUT();
1132 TKEY_RESETB_SET_OUTPUT();
1134 //--------------------------------
1135 // Repeating 'nCount' times
1136 //--------------------------------
1139 for( i=0; i<nCount; i++ ){
1141 TKEY_I2C_SET_HIGH(); // NORMAL
1142 TKEY_VDD_SET_HIGH();
1144 TKEY_RESETB_SET_HIGH();
1146 mcsdl_delay(MCSDL_DELAY_15US);
1148 TKEY_VDD_SET_LOW(); // VDD & CE LOW
1150 TKEY_I2C_SCL_SET_LOW(); // SCL LOW
1152 mcsdl_delay(MCSDL_DELAY_100US)
1154 TKEY_VDD_SET_HIGH(); // VDD & CE HIGH
1156 TKEY_I2C_SCL_SET_HIGH(); // SCL HIGH
1159 TKEY_INTR_SET_LOW(); // INTR & RESETB LOW
1160 TKEY_RESETB_SET_LOW();
1161 TKEY_I2C_SCL_SET_LOW(); // SCL LOW
1163 mcsdl_delay(MCSDL_DELAY_500US);
1165 TKEY_INTR_SET_HIGH(); // INTR & RESETB HIGH
1166 TKEY_RESETB_SET_HIGH();
1167 TKEY_I2C_SCL_SET_HIGH(); // SCL HIGH
1169 TKEY_I2C_SCL_SET_LOW(); // SCL LOW
1171 mcsdl_delay(MCSDL_DELAY_1MS);
1173 TKEY_I2C_SCL_SET_HIGH(); // SCL HIGH
1175 TKEY_I2C_SDA_SET_LOW(); // SDA LOW
1177 mcsdl_delay(MCSDL_DELAY_25MS);
1179 TKEY_I2C_SDA_SET_HIGH(); // SDA HIGH
1180 TKEY_I2C_SCL_SET_LOW(); // SCL LOW
1182 mcsdl_delay(MCSDL_DELAY_45MS);
1184 TKEY_I2C_SCL_SET_HIGH(); // SCL HIGH
1188 TKEY_INTR_SET_INPUT();
1190 MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR.
1191 MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer