1 //--------------------------------------------------------
\r
4 // Melfas MCS8000 Series Download base v1.0 2010.04.05
\r
6 #include <linux/kernel.h>
\r
7 #include <linux/module.h>
\r
8 #include <linux/interrupt.h>
\r
9 #include <linux/gpio.h>
\r
10 #include <linux/delay.h>
\r
11 #include <linux/irq.h>
\r
12 #include <linux/preempt.h>
\r
14 #include <asm/gpio.h>
\r
17 #include "mcs8000_download.h"
\r
20 //============================================================
\r
22 // Include MELFAS Binary code File ( ex> MELFAS_FIRM_bin.c)
\r
25 // Please, don't add binary.c file into project
\r
26 // Just #include here !!
\r
28 //============================================================
\r
30 #include "master_bin.c"
\r
33 UINT8 ucVerifyBuffer[MELFAS_TRANSFER_LENGTH]; // You may melloc *ucVerifyBuffer instead of this
\r
36 //---------------------------------
\r
37 // Downloading functions
\r
38 //---------------------------------
\r
39 static int mcsdl_download(const UINT8 *pData, const UINT16 nLength, INT8 IdxNum);
\r
40 static void mcsdl_set_ready(void);
\r
41 static void mcsdl_reboot_mcs(void);
\r
42 static int mcsdl_erase_flash(INT8 IdxNum);
\r
43 static int mcsdl_program_flash(UINT8 *pDataOriginal, UINT16 unLength, INT8 IdxNum);
\r
44 static void mcsdl_program_flash_part(UINT8 *pData);
\r
45 static int mcsdl_verify_flash(UINT8 *pData, UINT16 nLength, INT8 IdxNum);
\r
46 static void mcsdl_read_flash(UINT8 *pBuffer);
\r
47 static int mcsdl_read_flash_from(UINT8 *pBuffer, UINT16 unStart_addr, UINT16 unLength, INT8 IdxNum);
\r
48 static void mcsdl_select_isp_mode(UINT8 ucMode);
\r
49 static void mcsdl_unselect_isp_mode(void);
\r
50 static void mcsdl_read_32bits(UINT8 *pData);
\r
51 static void mcsdl_write_bits(UINT32 wordData, int nBits);
\r
52 static void mcsdl_scl_toggle_twice(void);
\r
53 //---------------------------------
\r
55 //---------------------------------
\r
56 static void mcsdl_delay(UINT32 nCount);
\r
57 //---------------------------------
\r
58 // For debugging display
\r
59 //---------------------------------
\r
60 #if MELFAS_ENABLE_DBG_PRINT
\r
61 static void mcsdl_print_result(int nRet);
\r
63 //----------------------------------
\r
64 // Download enable command
\r
65 //----------------------------------
\r
66 #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD
\r
67 void melfas_send_download_enable_command(void)
\r
69 // TO DO : Fill this up
\r
74 //============================================================
\r
76 // Main Download furnction
\r
78 // 1. Run mcsdl_download( pBinary[IdxNum], nBinary_length[IdxNum], IdxNum);
\r
79 // IdxNum : 0 (Master Chip Download)
\r
80 // IdxNum : 1 (2Chip Download)
\r
83 //============================================================
\r
85 int mcsdl_download_binary_data(void)
\r
89 /* code for samsung */
\r
90 MCSDL_RESETB_SET_OUTPUT(0);
\r
91 MCSDL_GPIO_SDA_SET_LOW();
\r
92 MCSDL_GPIO_SCL_SET_LOW();
\r
93 MCSDL_RESETB_SET_LOW();
\r
95 #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD
\r
96 melfas_send_download_enable_command();
\r
97 mcsdl_delay(MCSDL_DELAY_100US);
\r
100 MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR.
\r
101 MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer
\r
103 //------------------------
\r
105 //------------------------
\r
106 nRet = mcsdl_download((const UINT8*) MELFAS_binary, (const UINT16)MELFAS_binary_nLength , 0);
\r
107 #if MELFAS_2CHIP_DOWNLOAD_ENABLE
\r
108 nRet = mcsdl_download((const UINT8*) MELFAS_binary_2, (const UINT16)MELFAS_binary_nLength_2, 1); // Slave Binary data download
\r
110 MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR.
\r
111 MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer
\r
113 return (nRet == MCSDL_RET_SUCCESS);
\r
118 int mcsdl_download_binary_file(void)
\r
123 UINT8 *pBinary[2] = {NULL, NULL};
\r
124 UINT16 nBinary_length[2] = {0, 0};
\r
125 UINT8 IdxNum = MELFAS_2CHIP_DOWNLOAD_ENABLE;
\r
126 //==================================================
\r
128 // 1. Read '.bin file'
\r
129 // 2. *pBinary[0] : Binary data(Master)
\r
130 // *pBinary[1] : Binary data(Slave)
\r
131 // nBinary_length[0] : Firmware size(Master)
\r
132 // nBinary_length[1] : Firmware size(Slave)
\r
133 // 3. Run mcsdl_download( pBinary[IdxNum], nBinary_length[IdxNum], IdxNum);
\r
134 // IdxNum : 0 (Master Chip Download)
\r
135 // IdxNum : 1 (2Chip Download)
\r
137 //==================================================
\r
141 // TO DO : File Process & Get file Size(== Binary size)
\r
142 // This is just a simple sample
\r
147 //------------------------------
\r
149 //------------------------------
\r
151 if (fopen(fp, "MELFAS_FIRMWARE.bin", "rb") == NULL)
\r
153 return MCSDL_RET_FILE_ACCESS_FAILED;
\r
156 //------------------------------
\r
158 //------------------------------
\r
160 fseek(fp, 0, SEEK_END);
\r
162 nBinary_length = (UINT16)ftell(fp);
\r
164 //------------------------------
\r
165 // Memory allocation
\r
166 //------------------------------
\r
168 pBinary = (UINT8*)malloc((INT)nBinary_length);
\r
170 if (pBinary == NULL)
\r
173 return MCSDL_RET_FILE_ACCESS_FAILED;
\r
176 //------------------------------
\r
177 // Read binary file
\r
178 //------------------------------
\r
180 fseek(fp, 0, SEEK_SET);
\r
182 nRead = fread(pBinary, 1, (INT)nBinary_length, fp); // Read binary file
\r
184 if (nRead != (INT)nBinary_length)
\r
187 fclose(fp); // Close file
\r
189 if (pBinary != NULL) // free memory alloced.
\r
192 return MCSDL_RET_FILE_ACCESS_FAILED;
\r
195 //------------------------------
\r
197 //------------------------------
\r
203 #if MELFAS_USE_PROTOCOL_COMMAND_FOR_DOWNLOAD
\r
204 melfas_send_download_enable_command();
\r
205 mcsdl_delay(MCSDL_DELAY_100US);
\r
208 MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR.
\r
209 MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer
\r
211 for (i = 0;i <= IdxNum;i++)
\r
213 if (pBinary[i] != NULL && nBinary_length[i] > 0 && nBinary_length[i] < 32*1024)
\r
215 //------------------------
\r
217 //------------------------
\r
218 nRet = mcsdl_download((const UINT8 *)pBinary[i], (const UINT16)nBinary_length[i], i);
\r
222 nRet = MCSDL_RET_WRONG_BINARY;
\r
226 MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR.
\r
227 MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer
\r
229 #if MELFAS_ENABLE_DBG_PRINT
\r
230 mcsdl_print_result(nRet);
\r
233 return (nRet == MCSDL_RET_SUCCESS);
\r
236 //------------------------------------------------------------------
\r
238 // Download function
\r
240 //------------------------------------------------------------------
\r
242 static int mcsdl_download(const UINT8 *pBianry, const UINT16 unLength, INT8 IdxNum)
\r
247 UINT8 Check_IC = 0xFF; // d.model
\r
248 UINT8 readBuffer[32];
\r
249 UINT8 writeBuffer[4];
\r
252 //---------------------------------
\r
253 // Check Binary Size
\r
254 //---------------------------------
\r
255 if (unLength >= MELFAS_FIRMWARE_MAX_SIZE)
\r
257 nRet = MCSDL_RET_PROGRAM_SIZE_IS_WRONG;
\r
258 goto MCSDL_DOWNLOAD_FINISH;
\r
262 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
263 printk(" - Starting download...\n");
\r
266 //---------------------------------
\r
268 //---------------------------------
\r
269 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
270 printk(" > Ready\n");
\r
274 mcsdl_delay(MCSDL_DELAY_1MS);
\r
275 //--------------------------------------------------------------
\r
276 // IC Information read from Flash
\r
277 //--------------------------------------------------------------
\r
281 mcsdl_select_isp_mode(ISP_MODE_SERIAL_READ);
\r
283 wordData = ((0x1F00 & 0x1FFF) << 1) | 0x0;
\r
285 mcsdl_write_bits(wordData, 18);
\r
287 mcsdl_read_flash(readBuffer);
\r
288 MCSDL_GPIO_SDA_SET_LOW();
\r
289 MCSDL_GPIO_SDA_SET_OUTPUT(0);
\r
291 mcsdl_unselect_isp_mode();
\r
293 //if (readBuffer[3] != 0xFF)
\r
294 Check_IC = readBuffer[3];
\r
295 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
296 printk("\IC Information :0x%02X, 0x%02X\n", readBuffer[3], Check_IC);
\r
298 mcsdl_delay(MCSDL_DELAY_1MS);
\r
302 //---------------------------------
\r
304 //---------------------------------
\r
305 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
306 printk(" > Erase\n");
\r
310 nRet = mcsdl_erase_flash(IdxNum);
\r
313 if (nRet != MCSDL_RET_SUCCESS)
\r
314 goto MCSDL_DOWNLOAD_FINISH;
\r
317 mcsdl_delay(MCSDL_DELAY_1MS);
\r
318 //--------------------------------------------------------------
\r
319 // IC Information write
\r
320 //--------------------------------------------------------------
\r
323 mcsdl_select_isp_mode(ISP_MODE_SERIAL_WRITE);
\r
325 wordData = ((0x1F00 & 0x1FFF) << 1) | 0x0 ;
\r
326 wordData = wordData << 14;
\r
327 mcsdl_write_bits(wordData, 18);
\r
329 writeBuffer[0] = Check_IC;
\r
330 writeBuffer[1] = 0xFF;
\r
331 writeBuffer[2] = 0xFF;
\r
332 writeBuffer[3] = 0xFF;
\r
333 mcsdl_program_flash_part(writeBuffer);
\r
334 //---------------------------------------------
\r
336 //---------------------------------------------
\r
337 MCSDL_GPIO_SDA_SET_HIGH();
\r
338 mcsdl_delay(MCSDL_DELAY_40US);
\r
340 for (i = 0; i < 6; i++)
\r
344 mcsdl_delay(MCSDL_DELAY_20US);
\r
348 mcsdl_delay(MCSDL_DELAY_40US);
\r
351 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10US);
\r
352 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_10US);
\r
354 MCSDL_GPIO_SDA_SET_LOW();
\r
356 mcsdl_unselect_isp_mode();
\r
357 mcsdl_delay(MCSDL_DELAY_1MS);
\r
361 //---------------------------------
\r
363 //---------------------------------
\r
364 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
365 printk(" > Program ");
\r
369 nRet = mcsdl_program_flash((UINT8*)pBianry, (UINT16)unLength, IdxNum);
\r
372 if (nRet != MCSDL_RET_SUCCESS)
\r
373 goto MCSDL_DOWNLOAD_FINISH;
\r
375 mcsdl_delay(MCSDL_DELAY_1MS);
\r
376 //---------------------------------
\r
378 //---------------------------------
\r
379 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
380 printk(" > Verify ");
\r
384 nRet = mcsdl_verify_flash((UINT8*)pBianry, (UINT16)unLength, IdxNum);
\r
387 if (nRet != MCSDL_RET_SUCCESS)
\r
388 goto MCSDL_DOWNLOAD_FINISH;
\r
391 mcsdl_delay(MCSDL_DELAY_1MS);
\r
392 nRet = MCSDL_RET_SUCCESS;
\r
395 MCSDL_DOWNLOAD_FINISH :
\r
397 #if MELFAS_ENABLE_DBG_PRINT
\r
398 mcsdl_print_result(nRet); // Show result
\r
400 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
401 printk(" > Rebooting\n");
\r
402 printk(" - Fin.\n\n");
\r
404 mcsdl_reboot_mcs();
\r
411 //------------------------------------------------------------------
\r
415 //------------------------------------------------------------------
\r
416 static int mcsdl_erase_flash(INT8 IdxNum)
\r
419 UINT8 readBuffer[32];
\r
420 int eraseCompareValue = 0xFF;
\r
421 //----------------------------------------
\r
423 //----------------------------------------
\r
426 mcsdl_select_isp_mode(ISP_MODE_NEXT_CHIP_BYPASS);
\r
427 mcsdl_delay(MCSDL_DELAY_3US);
\r
429 mcsdl_select_isp_mode(ISP_MODE_ERASE_FLASH);
\r
430 mcsdl_unselect_isp_mode();
\r
433 //----------------------------------------
\r
434 // Check 'erased well'
\r
435 //----------------------------------------
\r
437 mcsdl_read_flash_from(readBuffer, 0x0000, 16, IdxNum);
\r
438 mcsdl_read_flash_from(&readBuffer[16], 0x7FF0, 16, IdxNum);
\r
440 // Compare with '0xFF'
\r
443 eraseCompareValue = 0x00;
\r
445 for (i = 0; i < 32; i++)
\r
447 if (readBuffer[i] != eraseCompareValue)
\r
448 return MCSDL_RET_ERASE_FLASH_VERIFY_FAILED;
\r
452 return MCSDL_RET_SUCCESS;
\r
456 static int mcsdl_program_flash(UINT8 *pDataOriginal, UINT16 unLength, INT8 IdxNum)
\r
467 pData = pDataOriginal;
\r
468 ucLength = MELFAS_TRANSFER_LENGTH;
\r
470 while ((addr*4) < (int)unLength)
\r
472 if ((unLength - (addr*4)) < MELFAS_TRANSFER_LENGTH)
\r
474 ucLength = (UINT8)(unLength - (addr * 4));
\r
477 //--------------------------------------
\r
479 //--------------------------------------
\r
480 mcsdl_delay(MCSDL_DELAY_40US);
\r
483 mcsdl_select_isp_mode(ISP_MODE_NEXT_CHIP_BYPASS);
\r
484 mcsdl_delay(MCSDL_DELAY_3US);
\r
486 mcsdl_select_isp_mode(ISP_MODE_SERIAL_WRITE);
\r
488 //---------------------------------------------
\r
490 // Address[13ibts] <<1
\r
491 //---------------------------------------------
\r
492 header = ((addr & 0x1FFF) << 1) | 0x0 ;
\r
493 header = header << 14;
\r
494 mcsdl_write_bits(header, 18); //Write 18bits
\r
496 //---------------------------------
\r
498 //---------------------------------
\r
499 //addr += (UINT16)ucLength;
\r
502 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
505 mcsdl_program_flash_part(pData);
\r
508 //---------------------------------------------
\r
510 //---------------------------------------------
\r
511 MCSDL_GPIO_SDA_SET_HIGH();
\r
512 mcsdl_delay(MCSDL_DELAY_40US);
\r
514 for (i = 0; i < 6; i++)
\r
518 mcsdl_delay(MCSDL_DELAY_20US);
\r
522 mcsdl_delay(MCSDL_DELAY_40US);
\r
525 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10US);
\r
526 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_10US);
\r
528 MCSDL_GPIO_SDA_SET_LOW();
\r
530 mcsdl_unselect_isp_mode();
\r
531 mcsdl_delay(MCSDL_DELAY_300US);
\r
534 return MCSDL_RET_SUCCESS;
\r
537 static void mcsdl_program_flash_part(UINT8 *pData)
\r
543 //---------------------------------
\r
545 //---------------------------------
\r
546 data = (UINT32)pData[0] << 0;
\r
547 data |= (UINT32)pData[1] << 8;
\r
548 data |= (UINT32)pData[2] << 16;
\r
549 data |= (UINT32)pData[3] << 24;
\r
550 mcsdl_write_bits(data, 32);
\r
553 static int mcsdl_verify_flash(UINT8 *pDataOriginal, UINT16 unLength, INT8 IdxNum)
\r
565 pData = (UINT8 *) pDataOriginal;
\r
566 ucLength = MELFAS_TRANSFER_LENGTH;
\r
568 while ((addr*4) < (int)unLength)
\r
570 if ((unLength - (addr*4)) < MELFAS_TRANSFER_LENGTH)
\r
572 ucLength = (UINT8)(unLength - (addr * 4));
\r
575 mcsdl_delay(MCSDL_DELAY_40US);
\r
577 //--------------------------------------
\r
579 //--------------------------------------
\r
582 mcsdl_select_isp_mode(ISP_MODE_NEXT_CHIP_BYPASS);
\r
583 mcsdl_delay(MCSDL_DELAY_3US);
\r
585 mcsdl_select_isp_mode(ISP_MODE_SERIAL_READ);
\r
588 //---------------------------------------------
\r
590 // Address[13ibts] <<1
\r
591 //---------------------------------------------
\r
592 wordData = ((addr & 0x1FFF) << 1) | 0x0;
\r
594 mcsdl_write_bits(wordData, 18);
\r
597 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
601 //--------------------
\r
603 //--------------------
\r
604 mcsdl_read_flash(ucVerifyBuffer);
\r
606 MCSDL_GPIO_SDA_SET_LOW();
\r
607 MCSDL_GPIO_SDA_SET_OUTPUT(0);
\r
609 //--------------------
\r
611 //--------------------
\r
614 for (j = 0; j < (int)ucLength; j++)
\r
616 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
617 printk(" %02X", ucVerifyBuffer[j]);
\r
619 if (ucVerifyBuffer[j] != pData[j])
\r
621 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
622 printk("\n [Error] Address : 0x%04X : 0x%02X - 0x%02X\n", addr, pData[j], ucVerifyBuffer[j]);
\r
624 nRet = MCSDL_RET_PROGRAM_VERIFY_FAILED;
\r
625 goto MCSDL_VERIFY_FLASH_FINISH;
\r
631 for (j = 0; j < (int)ucLength; j++)
\r
633 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
634 printk(" %02X", ucVerifyBuffer[j]);
\r
636 if ((0xff - ucVerifyBuffer[j]) != pData[j])
\r
638 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
639 printk("\n [Error] Address : 0x%04X : 0x%02X - 0x%02X\n", addr, pData[j], ucVerifyBuffer[j]);
\r
641 nRet = MCSDL_RET_PROGRAM_VERIFY_FAILED;
\r
642 goto MCSDL_VERIFY_FLASH_FINISH;
\r
647 mcsdl_unselect_isp_mode();
\r
650 nRet = MCSDL_RET_SUCCESS;
\r
652 MCSDL_VERIFY_FLASH_FINISH:
\r
654 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
658 mcsdl_unselect_isp_mode();
\r
663 static void mcsdl_read_flash(UINT8 *pBuffer)
\r
667 MCSDL_GPIO_SCL_SET_LOW();
\r
668 MCSDL_GPIO_SDA_SET_LOW();
\r
669 mcsdl_delay(MCSDL_DELAY_40US);
\r
671 for (i = 0; i < 6; i++)
\r
673 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_10US);
\r
674 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_10US);
\r
677 mcsdl_read_32bits(pBuffer);
\r
680 static int mcsdl_read_flash_from(UINT8 *pBuffer, UINT16 unStart_addr, UINT16 unLength, INT8 IdxNum)
\r
690 if (unLength >= MELFAS_FIRMWARE_MAX_SIZE)
\r
692 return MCSDL_RET_PROGRAM_SIZE_IS_WRONG;
\r
696 ucLength = MELFAS_TRANSFER_LENGTH;
\r
698 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
699 printk(" %04X : ", unStart_addr);
\r
703 for (i = 0; i < (int)unLength; i += (int)ucLength)
\r
709 mcsdl_select_isp_mode(ISP_MODE_NEXT_CHIP_BYPASS);
\r
710 mcsdl_delay(MCSDL_DELAY_3US);
\r
713 mcsdl_select_isp_mode(ISP_MODE_SERIAL_READ);
\r
714 wordData = (((unStart_addr + addr) & 0x1FFF) << 1) | 0x0;
\r
717 mcsdl_write_bits(wordData, 18);
\r
718 if ((unLength - addr) < MELFAS_TRANSFER_LENGTH)
\r
720 ucLength = (UINT8)(unLength - addr);
\r
723 //--------------------
\r
725 //--------------------
\r
726 mcsdl_read_flash(&pBuffer[addr]);
\r
728 #if MELFAS_ENABLE_DBG_PROGRESS_PRINT
\r
729 for (j = 0; j < (int)ucLength; j++)
\r
731 printk("%02X ", pBuffer[j]);
\r
735 mcsdl_unselect_isp_mode();
\r
738 return MCSDL_RET_SUCCESS;
\r
742 static void mcsdl_set_ready(void)
\r
744 //--------------------------------------------
\r
745 // Tkey module reset
\r
746 //--------------------------------------------
\r
748 MCSDL_VDD_SET_LOW(); // power
\r
749 //MCSDL_CE_SET_LOW();
\r
750 //MCSDL_CE_SET_OUTPUT();
\r
752 MCSDL_GPIO_SDA_SET_LOW();
\r
753 MCSDL_GPIO_SDA_SET_OUTPUT(0);
\r
755 MCSDL_GPIO_SCL_SET_LOW();
\r
756 MCSDL_GPIO_SCL_SET_OUTPUT(0);
\r
758 MCSDL_RESETB_SET_LOW();
\r
759 MCSDL_RESETB_SET_OUTPUT(0);
\r
761 mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD
\r
763 MCSDL_VDD_SET_HIGH();
\r
764 //MCSDL_CE_SET_HIGH();
\r
766 MCSDL_GPIO_SCL_SET_LOW();
\r
767 MCSDL_GPIO_SDA_SET_HIGH();
\r
768 mcsdl_delay(MCSDL_DELAY_40MS); // Delay '30 msec'
\r
772 static void mcsdl_reboot_mcs(void)
\r
774 MCSDL_VDD_SET_LOW();
\r
775 //MCSDL_CE_SET_LOW();
\r
776 //MCSDL_CE_SET_OUTPUT();
\r
778 MCSDL_GPIO_SDA_SET_HIGH();
\r
779 MCSDL_GPIO_SDA_SET_OUTPUT(1);
\r
781 MCSDL_GPIO_SCL_SET_HIGH();
\r
782 MCSDL_GPIO_SCL_SET_OUTPUT(1);
\r
784 MCSDL_RESETB_SET_LOW();
\r
785 MCSDL_RESETB_SET_OUTPUT(0);
\r
787 mcsdl_delay(MCSDL_DELAY_25MS); // Delay for Stable VDD
\r
789 MCSDL_VDD_SET_HIGH();
\r
790 //MCSDL_CE_SET_HIGH();
\r
792 MCSDL_RESETB_SET_HIGH();
\r
793 MCSDL_RESETB_SET_INPUT();
\r
794 MCSDL_GPIO_SCL_SET_INPUT();
\r
795 MCSDL_GPIO_SDA_SET_INPUT();
\r
797 mcsdl_delay(MCSDL_DELAY_30MS); // Delay '25 msec'
\r
801 //--------------------------------------------
\r
803 // Write ISP Mode entering signal
\r
805 //--------------------------------------------
\r
806 static void mcsdl_select_isp_mode(UINT8 ucMode)
\r
810 UINT8 enteringCodeMassErase[16] = { 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1 };
\r
811 UINT8 enteringCodeSerialWrite[16] = { 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1 };
\r
812 UINT8 enteringCodeSerialRead[16] = { 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1 };
\r
813 UINT8 enteringCodeNextChipBypass[16] = { 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 };
\r
818 //------------------------------------
\r
819 // Entering ISP mode : Part 1
\r
820 //------------------------------------
\r
821 if (ucMode == ISP_MODE_ERASE_FLASH) pCode = enteringCodeMassErase;
\r
822 else if (ucMode == ISP_MODE_SERIAL_WRITE) pCode = enteringCodeSerialWrite;
\r
823 else if (ucMode == ISP_MODE_SERIAL_READ) pCode = enteringCodeSerialRead;
\r
824 else if (ucMode == ISP_MODE_NEXT_CHIP_BYPASS) pCode = enteringCodeNextChipBypass;
\r
826 MCSDL_RESETB_SET_LOW();
\r
827 MCSDL_GPIO_SCL_SET_LOW();
\r
828 MCSDL_GPIO_SDA_SET_HIGH();
\r
830 for (i = 0; i < 16; i++)
\r
833 MCSDL_RESETB_SET_HIGH();
\r
835 MCSDL_RESETB_SET_LOW();
\r
837 mcsdl_delay(MCSDL_DELAY_3US);
\r
838 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US);
\r
839 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US);
\r
842 MCSDL_RESETB_SET_LOW();
\r
844 //---------------------------------------------------
\r
845 // Entering ISP mode : Part 2 - Only Mass Erase
\r
846 //---------------------------------------------------
\r
847 mcsdl_delay(MCSDL_DELAY_7US);
\r
849 MCSDL_GPIO_SCL_SET_LOW();
\r
850 MCSDL_GPIO_SDA_SET_HIGH();
\r
851 if (ucMode == ISP_MODE_ERASE_FLASH)
\r
853 mcsdl_delay(MCSDL_DELAY_7US);
\r
854 for (i = 0; i < 4; i++)
\r
856 if (i == 2) mcsdl_delay(MCSDL_DELAY_25MS);
\r
857 else if (i == 3) mcsdl_delay(MCSDL_DELAY_150US);
\r
859 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US);
\r
860 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_7US);
\r
863 MCSDL_GPIO_SDA_SET_LOW();
\r
867 static void mcsdl_unselect_isp_mode(void)
\r
871 MCSDL_RESETB_SET_LOW();
\r
872 mcsdl_delay(MCSDL_DELAY_3US);
\r
874 for (i = 0; i < 10; i++)
\r
876 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US);
\r
877 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US);
\r
883 static void mcsdl_read_32bits(UINT8 *pData)
\r
887 MCSDL_GPIO_SCL_SET_LOW();
\r
888 MCSDL_GPIO_SDA_SET_LOW();
\r
890 MCSDL_GPIO_SDA_SET_INPUT();
\r
892 for (i = 3; i >= 0; i--)
\r
895 for (j = 0; j < 8; j++)
\r
899 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_1US);
\r
900 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_1US);
\r
902 if (MCSDL_GPIO_SDA_IS_HIGH())
\r
907 MCSDL_GPIO_SDA_SET_LOW();
\r
908 MCSDL_GPIO_SDA_SET_OUTPUT(0);
\r
913 static void mcsdl_write_bits(UINT32 wordData, int nBits)
\r
917 MCSDL_GPIO_SCL_SET_LOW();
\r
918 MCSDL_GPIO_SDA_SET_LOW();
\r
920 for (i = 0; i < nBits; i++)
\r
922 if (wordData & 0x80000000) {MCSDL_GPIO_SDA_SET_HIGH();}
\r
923 else {MCSDL_GPIO_SDA_SET_LOW();}
\r
925 mcsdl_delay(MCSDL_DELAY_3US);
\r
926 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_3US);
\r
927 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_3US);
\r
934 static void mcsdl_scl_toggle_twice(void)
\r
936 MCSDL_GPIO_SDA_SET_HIGH();
\r
937 MCSDL_GPIO_SDA_SET_OUTPUT(1);
\r
939 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_20US);
\r
940 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_20US);
\r
942 MCSDL_GPIO_SCL_SET_HIGH(); mcsdl_delay(MCSDL_DELAY_20US);
\r
943 MCSDL_GPIO_SCL_SET_LOW(); mcsdl_delay(MCSDL_DELAY_20US);
\r
947 //============================================================
\r
951 //============================================================
\r
952 static void mcsdl_delay(UINT32 nCount)
\r
957 case MCSDL_DELAY_1US : {udelay(1); break;}
\r
958 case MCSDL_DELAY_2US : {udelay(2); break;}
\r
959 case MCSDL_DELAY_3US : {udelay(3); break;}
\r
960 case MCSDL_DELAY_5US : {udelay(5); break;}
\r
961 case MCSDL_DELAY_7US : {udelay(7); break;}
\r
962 case MCSDL_DELAY_10US : {udelay(10); break;}
\r
963 case MCSDL_DELAY_15US : {udelay(15); break;}
\r
964 case MCSDL_DELAY_20US : {udelay(20); break;}
\r
965 case MCSDL_DELAY_40US : {udelay(40); break;}
\r
966 case MCSDL_DELAY_100US : {udelay(100); break;}
\r
967 case MCSDL_DELAY_150US : {udelay(150); break;}
\r
968 case MCSDL_DELAY_300US : {udelay(300); break;}
\r
969 case MCSDL_DELAY_500US : {udelay(500); break;}
\r
970 case MCSDL_DELAY_800US : {udelay(800); break;}
\r
971 case MCSDL_DELAY_1MS : {mdelay(1); break;}
\r
972 case MCSDL_DELAY_5MS : {mdelay(5); break;}
\r
973 case MCSDL_DELAY_10MS : {mdelay(10); break;}
\r
974 case MCSDL_DELAY_25MS : {mdelay(25); break;}
\r
975 case MCSDL_DELAY_30MS : {mdelay(30); break;}
\r
976 case MCSDL_DELAY_40MS : {mdelay(40); break;}
\r
977 case MCSDL_DELAY_45MS : {mdelay(45); break;}
\r
978 case MCSDL_DELAY_60MS : {mdelay(60); break;}
\r
980 }// Please, Use your delay function
\r
985 //============================================================
\r
987 // Debugging print functions.
\r
989 //============================================================
\r
991 #ifdef MELFAS_ENABLE_DBG_PRINT
\r
992 static void mcsdl_print_result(int nRet)
\r
994 if (nRet == MCSDL_RET_SUCCESS)
\r
996 printk(" > MELFAS Firmware downloading SUCCESS.\n");
\r
1000 printk(" > MELFAS Firmware downloading FAILED : ");
\r
1003 case MCSDL_RET_SUCCESS : printk("MCSDL_RET_SUCCESS\n"); break;
\r
1004 case MCSDL_RET_ERASE_FLASH_VERIFY_FAILED : printk("MCSDL_RET_ERASE_FLASH_VERIFY_FAILED\n"); break;
\r
1005 case MCSDL_RET_PROGRAM_VERIFY_FAILED : printk("MCSDL_RET_PROGRAM_VERIFY_FAILED\n"); break;
\r
1007 case MCSDL_RET_PROGRAM_SIZE_IS_WRONG : printk("MCSDL_RET_PROGRAM_SIZE_IS_WRONG\n"); break;
\r
1008 case MCSDL_RET_VERIFY_SIZE_IS_WRONG : printk("MCSDL_RET_VERIFY_SIZE_IS_WRONG\n"); break;
\r
1009 case MCSDL_RET_WRONG_BINARY : printk("MCSDL_RET_WRONG_BINARY\n"); break;
\r
1011 case MCSDL_RET_READING_HEXFILE_FAILED : printk("MCSDL_RET_READING_HEXFILE_FAILED\n"); break;
\r
1012 case MCSDL_RET_FILE_ACCESS_FAILED : printk("MCSDL_RET_FILE_ACCESS_FAILED\n"); break;
\r
1013 case MCSDL_RET_MELLOC_FAILED : printk("MCSDL_RET_MELLOC_FAILED\n"); break;
\r
1015 case MCSDL_RET_WRONG_MODULE_REVISION : printk("MCSDL_RET_WRONG_MODULE_REVISION\n"); break;
\r
1017 default : printk("UNKNOWN ERROR. [0x%02X].\n", nRet); break;
\r
1027 #if MELFAS_ENABLE_DELAY_TEST
\r
1029 //============================================================
\r
1031 // For initial testing of delay and gpio control
\r
1033 // You can confirm GPIO control and delay time by calling this function.
\r
1035 //============================================================
\r
1037 void mcsdl_delay_test(INT32 nCount)
\r
1041 MELFAS_DISABLE_BASEBAND_ISR(); // Disable Baseband touch interrupt ISR.
\r
1042 MELFAS_DISABLE_WATCHDOG_TIMER_RESET(); // Disable Baseband watchdog timer
\r
1044 //--------------------------------
\r
1045 // Repeating 'nCount' times
\r
1046 //--------------------------------
\r
1048 //MCSDL_SET_GPIO_I2C();
\r
1049 MCSDL_GPIO_SCL_SET_OUTPUT(0);
\r
1050 MCSDL_GPIO_SDA_SET_OUTPUT(0);
\r
1051 MCSDL_RESETB_SET_OUTPUT(0);
\r
1053 MCSDL_GPIO_SCL_SET_HIGH();
\r
1055 for (i = 0; i < nCount; i++)
\r
1060 MCSDL_GPIO_SCL_SET_LOW();
\r
1062 mcsdl_delay(MCSDL_DELAY_20US);
\r
1064 MCSDL_GPIO_SCL_SET_HIGH();
\r
1066 mcsdl_delay(MCSDL_DELAY_100US);
\r
1069 MCSDL_GPIO_SCL_SET_LOW();
\r
1071 mcsdl_delay(MCSDL_DELAY_500US);
\r
1073 MCSDL_GPIO_SCL_SET_HIGH();
\r
1075 mcsdl_delay(MCSDL_DELAY_1MS);
\r
1078 MCSDL_GPIO_SCL_SET_LOW();
\r
1080 mcsdl_delay(MCSDL_DELAY_25MS);
\r
1082 TKEY_INTR_SET_LOW();
\r
1084 mcsdl_delay(MCSDL_DELAY_45MS);
\r
1086 TKEY_INTR_SET_HIGH();
\r
1090 MCSDL_GPIO_SCL_SET_HIGH();
\r
1092 MELFAS_ROLLBACK_BASEBAND_ISR(); // Roll-back Baseband touch interrupt ISR.
\r
1093 MELFAS_ROLLBACK_WATCHDOG_TIMER_RESET(); // Roll-back Baseband watchdog timer
\r