2 * Copyright (c) 2010 -2014 Espressif System.
4 * spi serial i/f driver
5 * - sdio device control routines
6 * - sync/async DMA/PIO read/write
11 #include <linux/module.h>
12 #include <net/mac80211.h>
13 #include <linux/time.h>
15 #include <linux/spi/spi.h>
16 #include <linux/interrupt.h>
17 #include <linux/kthread.h>
23 #include "esp_debug.h"
24 #include "slc_host_register.h"
25 #include "esp_version.h"
30 #endif /* USE_EXT_GPIO */
34 extern u8 *esp_get_lspi_buf(void);
35 extern void esp_put_lspi_buf(u8 **p);
38 #define SPI_BLOCK_SIZE (512)
40 #define MAX_BUF_SIZE (48*1024)
42 static unsigned char *buf_addr = NULL;
43 static unsigned char *tx_cmd;
44 static unsigned char *rx_cmd;
45 static unsigned char *check_buf = NULL;
46 static unsigned char *ff_buf = NULL;
48 unsigned int crc_ta_8[256]={
49 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
50 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
51 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
52 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
53 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
54 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
55 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
56 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
57 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
58 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
59 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
60 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
61 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
62 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
63 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
64 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
65 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
66 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
67 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
68 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
69 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
70 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
71 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
72 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
73 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
74 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
75 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
76 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
77 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
78 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
79 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
80 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
84 unsigned int crc_cal_by_byte(unsigned char* ptr, int len)
86 unsigned short crc = 0;
90 unsigned int high = (unsigned int)(crc >> 8);
92 crc ^= crc_ta_8[high^*ptr];
99 struct task_struct *sif_irq_thread;
101 #define ESP_DMA_IBUFSZ 2048
103 //unsigned int esp_msg_level = 0;
104 unsigned int esp_msg_level = ESP_DBG_ERROR | ESP_SHOW;
106 static struct semaphore esp_powerup_sem;
108 static enum esp_sdio_state sif_sdio_state;
109 struct esp_spi_ctrl *sif_sctrl = NULL;
110 static struct esp_spi_resp spi_resp;
112 #ifdef ESP_ANDROID_LOGGER
113 bool log_off = false;
114 #endif /* ESP_ANDROID_LOGGER */
116 #ifdef REQUEST_RTC_IRQ
117 extern int request_rtc_irq(void);
120 #include "spi_stub.c"
122 struct esp_spi_resp *sif_get_spi_resp(void)
127 void sif_lock_bus(struct esp_pub *epub)
129 EPUB_FUNC_CHECK(epub, _exit);
131 spi_bus_lock(EPUB_TO_FUNC(epub)->master);
136 void sif_unlock_bus(struct esp_pub *epub)
138 EPUB_FUNC_CHECK(epub, _exit);
140 spi_bus_unlock(EPUB_TO_FUNC(epub)->master);
145 int sif_spi_write_then_read(struct spi_device *spi, unsigned char* bufwrite, int sizesend, unsigned char* bufread, int sizeread)
149 error = spi_write_then_read(spi, bufwrite,sizesend, bufread, sizeread);
152 esp_dbg(ESP_DBG_ERROR, "%s: failed, error: %d\n",
160 int sif_spi_write_async_read(struct spi_device *spi, unsigned char* bufwrite,unsigned char* bufread,int size)
162 struct spi_transfer xfer = {
167 .speed_hz = SPI_FREQ,
169 struct spi_message msg;
172 spi_message_init(&msg);
173 spi_message_add_tail(&xfer, &msg);
175 error = spi_sync_locked(spi, &msg);
177 esp_dbg(ESP_DBG_ERROR, "spierr %s: failed, error: %d\n",
185 int sif_spi_write_raw(struct spi_device *spi, unsigned char* buf, int size)
188 struct spi_transfer xfer = {
192 .speed_hz = SPI_FREQ,
194 struct spi_message msg;
196 spi_message_init(&msg);
197 spi_message_add_tail(&xfer, &msg);
199 err = spi_sync_locked(spi, &msg);
202 esp_dbg(ESP_DBG_ERROR, "%s: failed, error: %d\n",
210 int sif_spi_read_raw(struct spi_device *spi, unsigned char* buf, int size)
212 memset(buf,0xff,size);
213 return sif_spi_write_async_read(spi,buf,buf,size);
216 int sif_spi_write_bytes(struct spi_device *spi, unsigned int addr, unsigned char *src,int count, int dummymode)
220 unsigned char *tx_data = (unsigned char*)src;
223 spi_resp.data_resp_size_w = ((((((count>>5)+1) *75)) +44)>>3) +1;
239 if( addr >= (1<<17) )
247 tx_cmd[1]=0x90|0x04|(addr>>15); //0x94;
252 tx_cmd[3]=( addr<<1|0x0 );
253 tx_cmd[4]= 0x00; //0x08;
257 tx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
258 tx_cmd[4]= count & 0xff; //0x08;
266 memset(tx_cmd+pos,0xff,CMD_RESP_SIZE);
267 pos =pos+ CMD_RESP_SIZE;
274 memcpy(tx_cmd+pos,tx_data,count);
278 memset(tx_cmd+pos,0xff,spi_resp.data_resp_size_w);
279 pos = pos+ spi_resp.data_resp_size_w ;
285 memset(tx_cmd+pos,0xff,len);
292 memset(tx_cmd+pos,0xff,len);
298 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
301 for(i=0;i<CMD_RESP_SIZE;i++)
303 if(tx_cmd[pos+i] == 0x00 && tx_cmd[pos+i-1] == 0xff)
305 if(tx_cmd[pos+i+1] == 0x00 && tx_cmd[pos+i+2] == 0xff)
310 if(i>spi_resp.max_cmd_resp_size)
312 spi_resp.max_cmd_resp_size = i;
317 esp_dbg(ESP_DBG_ERROR, "byte write cmd resp 0x00 no recv\n");
322 pos = pos+CMD_RESP_SIZE+count+1;
323 for(i=0;i<spi_resp.data_resp_size_w;i++)
325 if(tx_cmd[pos+i] == 0xE5)
327 //esp_dbg(ESP_DBG_ERROR, "0xE5 pos:%d",i);
328 for(i++;i<spi_resp.data_resp_size_w ;i++)
330 if( tx_cmd[pos+i] == 0xFF)
332 // esp_dbg(ESP_DBG_ERROR, "find ff pos = %d,i = %d\n",pos+i,i);
334 if(i>spi_resp.max_dataW_resp_size)
336 spi_resp.max_dataW_resp_size = i;
337 // printk(KERN_ERR "new data write MAX 0xFF pos:%d",spi_resp.max_dataW_resp_size);
340 //esp_dbg(ESP_DBG_ERROR, "0xFF pos:%d",i);
347 if(i>=spi_resp.data_resp_size_w)
350 esp_dbg(ESP_DBG, "normal byte write data no-busy wait byte 0xff no recv at the first time\n");
355 //memset(check_buf,0x00,256);
357 sif_spi_read_raw(spi, check_buf, 256);
358 } while( memcmp(check_buf,ff_buf,256) != 0 && timeout >0 ) ;
362 esp_dbg(ESP_DBG_ERROR, "spierr byte write data no-busy wait byte 0xff no recv \n");
372 int sif_spi_write_blocks(struct spi_device *spi, unsigned int addr,unsigned char *src, int count)
378 unsigned char *tx_data = (unsigned char*)src;
396 if( addr >= (1<<17) )
403 tx_cmd[1]=0x90|0x0C|(addr>>15);
408 tx_cmd[3]=( addr<<1|0x0 );
413 tx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
414 tx_cmd[4]= count & 0xff ;
421 memset(tx_cmd+pos,0xff,CMD_RESP_SIZE);
422 pos =pos+ CMD_RESP_SIZE;
431 memcpy(tx_cmd+pos,tx_data+j*SPI_BLOCK_SIZE, SPI_BLOCK_SIZE);
432 pos = pos+SPI_BLOCK_SIZE;
436 memset(tx_cmd+pos , 0xff , spi_resp.block_w_data_resp_size_final);
437 pos = pos+ spi_resp.block_w_data_resp_size_final;
440 memset(tx_cmd+pos , 0xff , BLOCK_W_DATA_RESP_SIZE_EACH);
441 pos = pos+ BLOCK_W_DATA_RESP_SIZE_EACH;
447 memset(tx_cmd+pos,0xff,len);
452 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
454 //Judge Write cmd resp, and 1st block data resp.
456 for(i=0;i<CMD_RESP_SIZE;i++)
458 if(tx_cmd[pos+i] == 0x00 && tx_cmd[pos+i-1] == 0xff)
460 if(tx_cmd[pos+i+1] == 0x00 && tx_cmd[pos+i+2] == 0xff)
466 if(i>spi_resp.max_cmd_resp_size)
468 spi_resp.max_cmd_resp_size = i;
473 esp_dbg(ESP_DBG_ERROR, "spierr 1st block write cmd resp 0x00 no recv, %d\n", count);
478 pos = pos+CMD_RESP_SIZE;
483 //Judge block data resp
485 pos = pos+SPI_BLOCK_SIZE;
488 n = spi_resp.block_w_data_resp_size_final;
490 n= BLOCK_W_DATA_RESP_SIZE_EACH;
494 if((tx_cmd[pos+i] & 0x0F) == 0x05)
503 if(memcmp(tx_cmd+pos+n-4,ff_buf,4) != 0)
506 esp_dbg(ESP_DBG, "block write sleep 1\n");
512 //memset(check_buf,0x00,256);
514 sif_spi_read_raw(spi, check_buf, 256);
515 } while( memcmp(check_buf,ff_buf,256) != 0 && timeout >0 ) ;
520 esp_dbg(ESP_DBG_ERROR, "spierr block write data no-busy wait byte 0xff no recv \n");
527 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data not-busy wait error, %d\n", __func__, j+1, count);
535 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data no data res error, %d\n", __func__, j+1, count);
551 memcpy(tx_cmd+pos,tx_data+j*SPI_BLOCK_SIZE, SPI_BLOCK_SIZE);
552 pos = pos+SPI_BLOCK_SIZE;
554 memset(tx_cmd+pos , 0xff , BLOCK_W_DATA_RESP_SIZE_EACH);
555 pos = pos+ BLOCK_W_DATA_RESP_SIZE_EACH;
561 memset(tx_cmd+pos,0xff,len);
566 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
568 //Judge Write cmd resp, and 1st block data resp.
570 for(i=0;i<CMD_RESP_SIZE;i++)
572 if(tx_cmd[pos+i] == 0x00 && tx_cmd[pos+i-1] == 0xff)
574 if(tx_cmd[pos+i+1] == 0x00 && tx_cmd[pos+i+2] == 0xff)
580 if(i>spi_resp.max_cmd_resp_size)
582 spi_resp.max_cmd_resp_size = i;
587 esp_dbg(ESP_DBG_ERROR, "spierr 1st block write cmd resp 0x00 no recv, %d\n", count);
592 pos = pos+CMD_RESP_SIZE;
597 //Judge block data resp
599 pos = pos+SPI_BLOCK_SIZE;
601 n = BLOCK_W_DATA_RESP_SIZE_EACH;
605 if((tx_cmd[pos+i] & 0x0F) == 0x05)
614 if(memcmp(tx_cmd+pos+n-4,ff_buf,4) != 0 )
616 esp_dbg(ESP_DBG, "block write data during sleep \n");
624 sif_spi_read_raw(spi, check_buf, 256);
625 } while( memcmp(check_buf,ff_buf,256) != 0 && timeout >0 ) ;
630 esp_dbg(ESP_DBG_ERROR, "spierr block write data no-busy wait byte 0xff no recv \n");
637 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data not-busy wait error, %d\n", __func__, j+1, count);
645 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data no data res error, %d\n", __func__, j+1, count);
660 memcpy(tx_cmd+pos,tx_data+j*SPI_BLOCK_SIZE, SPI_BLOCK_SIZE);
661 pos = pos+SPI_BLOCK_SIZE;
665 memset(tx_cmd+pos , 0xff ,spi_resp.block_w_data_resp_size_final);
666 pos = pos+spi_resp.block_w_data_resp_size_final;
669 memset(tx_cmd+pos , 0xff , BLOCK_W_DATA_RESP_SIZE_EACH);
670 pos = pos+ BLOCK_W_DATA_RESP_SIZE_EACH;
676 memset(tx_cmd+pos,0xff,len);
681 sif_spi_write_async_read(spi, tx_cmd,tx_cmd,pos+len);
687 //Judge block data resp
689 pos = pos+SPI_BLOCK_SIZE;
692 n = spi_resp.block_w_data_resp_size_final;
694 n= BLOCK_W_DATA_RESP_SIZE_EACH;
698 if((tx_cmd[pos+i] & 0x0F) == 0x05)
707 if(memcmp(tx_cmd+pos+n-4,ff_buf,4) != 0)
710 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data not-busy wait error, %d\n", __func__, j+1, count);
717 esp_dbg(ESP_DBG_ERROR, "spierr %s block%d write data no data res error, %d\n", __func__, j+1, count);
730 int sif_spi_write_mix_nosync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
736 blk_cnt = len/SPI_BLOCK_SIZE;
737 remain_len = len%SPI_BLOCK_SIZE;
740 err = sif_spi_write_blocks(spi, addr, buf, blk_cnt);
745 if (remain_len > 0) {
746 err = sif_spi_write_bytes(spi, addr, (buf + (blk_cnt*SPI_BLOCK_SIZE)), remain_len, dummymode);
755 int sif_spi_write_mix_sync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
759 spi_bus_lock(spi->master);
760 err = sif_spi_write_mix_nosync(spi, addr, buf, len, dummymode);
761 spi_bus_unlock(spi->master);
766 int sif_spi_epub_write_mix_nosync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
768 struct esp_spi_ctrl *sctrl = NULL;
769 struct spi_device *spi = NULL;
775 sctrl = (struct esp_spi_ctrl *)epub->sif;
782 return sif_spi_write_mix_nosync(spi, addr, buf, len, dummymode);
785 int sif_spi_epub_write_mix_sync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
787 struct esp_spi_ctrl *sctrl = NULL;
788 struct spi_device *spi = NULL;
794 sctrl = (struct esp_spi_ctrl *)epub->sif;
801 return sif_spi_write_mix_sync(spi, addr, buf, len, dummymode);
804 int sif_spi_read_bytes(struct spi_device *spi, unsigned int addr,unsigned char *dst, int count, int dummymode)
806 int pos,total_num,len;
808 unsigned char *rx_data = (unsigned char *)dst;
810 unsigned short crc = 0;
815 int find_start_token = 0;
816 spi_resp.data_resp_size_r = ((((((count>>2)+1) *25)>>5)*21+16)>>3) +1 ;
832 if( addr >= (1<<17) )
839 rx_cmd[1]=0x10|0x04|(addr>>15); //0x94;
844 rx_cmd[3]=( addr<<1|0x0 );
845 rx_cmd[4]= 0x00; //0x08;
849 rx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
850 rx_cmd[4]= count & 0xff; //0x08;
856 total_num = CMD_RESP_SIZE+spi_resp.data_resp_size_r+count+2;
857 memset(rx_cmd+6 , 0xFF ,total_num);
861 len =128 -6 -total_num;
862 memset(rx_cmd+6+total_num,0xff,len);
867 if( (6+total_num)%8 )
869 len = (8 - (6+total_num)%8);
870 memset(rx_cmd+6+total_num,0xff,len);
877 sif_spi_write_async_read(spi, rx_cmd,rx_cmd,6+total_num+len);
880 for(i=0;i<CMD_RESP_SIZE;i++)
882 if(rx_cmd[pos+i] == 0x00 && rx_cmd[pos+i-1] == 0xff)
884 if(rx_cmd[pos+i+1] == 0x00 && rx_cmd[pos+i+2] == 0xff)
889 if(i>spi_resp.max_cmd_resp_size)
891 spi_resp.max_cmd_resp_size = i;
892 //printk(KERN_ERR "new cmd write MAX 0xFF pos:%d",spi_resp.max_cmd_resp_size);
898 esp_dbg(ESP_DBG_ERROR, "spierr byte read cmd resp 0x00 no recv\n");
899 /***********error info************************/
902 while ( t < pos+32) {
903 printk(KERN_ERR "rx:[0x%02x] ", rx_cmd[t]);
906 printk(KERN_ERR "\n");
912 //esp_dbg(ESP_DBG_ERROR, "0x00 pos:%d",pos+i);
915 for(i=0;i<spi_resp.data_resp_size_r;i++)
917 if(rx_cmd[pos+i]==0xFE)
920 find_start_token = 1;
921 if(i>spi_resp.max_dataR_resp_size)
923 spi_resp.max_dataR_resp_size = i;
924 //printk(KERN_ERR "new data read MAX 0xFE pos:%d",spi_resp.max_dataR_resp_size);
928 else if(rx_cmd[pos+i] != 0xff)
932 esp_dbg(ESP_DBG, " 1 normal byte read not 0xFF or 0xFE at the first time,count = %d,addr =%x \n",count,addr);
936 if(find_start_token == 0)
939 esp_dbg(ESP_DBG, " normal byte read start token 0xFE not recv at the first time,count = %d,addr =%x \n",count,addr);
941 pos = pos +spi_resp.data_resp_size_r;
943 for(i=0;i< 6+total_num+len-pos;i++)
945 if(rx_cmd[pos+i]==0xFE)
947 sif_spi_read_raw(spi,rx_cmd,((count+4)>256)?(count+4):256);
948 // sif_spi_read_raw(spi, check_buf, 256);
949 find_start_token = 1;
953 else if(rx_cmd[pos+i] !=0xff)
957 esp_dbg(ESP_DBG, "2 normal byte read not 0xFF or 0xFE at the first time,count = %d,addr =%x \n",count,addr);
966 sif_spi_read_raw(spi, check_buf, 256);
969 if(check_buf[i] ==0xFE)
971 find_start_token = 1;
972 sif_spi_read_raw(spi,rx_cmd,((count+4)>256)?(count+4):256);
977 } while( find_start_token != 1 && timeout >0 ) ;
981 esp_dbg(ESP_DBG_ERROR, "spierr byte read start token 0xFE no recv ,count = %d,addr =%x \n",count,addr);
988 //esp_dbg(ESP_DBG_ERROR, "0xFE pos:%d",pos+i);
990 memcpy(rx_data,rx_cmd+pos,count);
992 crc = crc_cal_by_byte(rx_data,count);
994 test_crc[0] = crc & 0xff;
995 test_crc[1] = (crc >>8) &0xff ;
997 if(test_crc[1] != rx_cmd[pos+count] || test_crc[0] != rx_cmd[pos+count+1] )
999 esp_dbg(ESP_DBG, "crc test_crc0 %x\n",test_crc[0]);
1000 esp_dbg(ESP_DBG, "crc test_crc1 %x\n",test_crc[1]);
1001 esp_dbg(ESP_DBG, "crc rx_data-2 %x\n",rx_cmd[pos+count]);
1002 esp_dbg(ESP_DBG, "crc rx_data-1 %x\n",rx_cmd[pos+count+1] );
1004 esp_dbg(ESP_DBG, "crc err\n");
1006 esp_dbg(ESP_DBG_ERROR, "spierr crc count = %d,addr =%x \n",count,addr);
1018 int sif_spi_read_blocks(struct spi_device *spi, unsigned int addr, unsigned char *dst, int count)
1023 unsigned char *rx_data = (unsigned char *)dst;
1026 int find_start_token = 0;
1027 unsigned short crc = 0;
1043 if( addr >= (1<<17) )
1050 rx_cmd[1]=0x10|0x0C|(addr>>15);
1055 rx_cmd[3]=( addr<<1|0x0 );
1060 rx_cmd[3]=( addr<<1|(count>>8 & 0x01) );
1061 rx_cmd[4]= count & 0xff;
1065 total_num = CMD_RESP_SIZE+spi_resp.block_r_data_resp_size_final+SPI_BLOCK_SIZE+ 2 + (count-1)*(BLOCK_R_DATA_RESP_SIZE_EACH+SPI_BLOCK_SIZE+2);
1066 memset(rx_cmd+6, 0xFF ,total_num);
1068 if( (6+total_num)%8 )
1070 len = (8 - (6+total_num)%8);
1071 memset(rx_cmd+6+total_num,0xff,len);
1076 sif_spi_write_async_read(spi, rx_cmd,rx_cmd,6+total_num+len );
1079 for(i=0;i<CMD_RESP_SIZE;i++)
1081 if(rx_cmd[pos+i] == 0x00 && rx_cmd[pos+i-1] == 0xff)
1083 if(rx_cmd[pos+i+1] == 0x00 && rx_cmd[pos+i+2] == 0xff)
1088 if(i>spi_resp.max_cmd_resp_size)
1090 spi_resp.max_cmd_resp_size = i;
1091 //printk(KERN_ERR "new cmd write MAX 0xFF pos:%d",spi_resp.max_cmd_resp_size);
1094 if(i>=CMD_RESP_SIZE)
1096 esp_dbg(ESP_DBG_ERROR, "spierr block read cmd resp 0x00 no recv\n");
1104 for(i=0;i<spi_resp.block_r_data_resp_size_final;i++)
1106 if(rx_cmd[pos+i]==0xFE)
1108 //esp_dbg(ESP_DBG_ERROR, "0xFE pos:%d",i);
1109 find_start_token = 1;
1110 if(i>spi_resp.max_block_dataR_resp_size)
1112 spi_resp.max_block_dataR_resp_size = i;
1113 //printk(KERN_ERR "new block data read MAX 0xFE pos:%d\n",spi_resp.max_block_dataR_resp_size);
1120 if( find_start_token == 0)
1122 esp_dbg(ESP_DBG, "1st block read data resp 0xFE no recv,count = %d\n",count);
1123 pos = pos +spi_resp.block_r_data_resp_size_final;
1124 for(i=0;i< 6+total_num+len-pos;i++)
1126 if(rx_cmd[pos+i]==0xFE)
1128 sif_spi_read_raw(spi, check_buf, total_num+len);
1129 find_start_token = 1;
1137 esp_dbg(ESP_DBG_ERROR, "block read sleep ,count = %d\n",count);
1139 sif_spi_read_raw(spi, check_buf, 256);
1142 if(check_buf[i] ==0xFE)
1144 find_start_token= 1;
1145 sif_spi_read_raw(spi, rx_cmd, total_num+len);
1149 } while( find_start_token != 1 && timeout >0 ) ;
1153 esp_dbg(ESP_DBG_ERROR, "spierr block read start token 0xFE no recv\n");
1163 memcpy(rx_data,rx_cmd+pos,SPI_BLOCK_SIZE);
1165 crc = crc_cal_by_byte(rx_data,512);
1167 test_crc[0] = crc & 0xff;
1168 test_crc[1] = (crc >>8) &0xff ;
1170 if(test_crc[1] != rx_cmd[pos+SPI_BLOCK_SIZE] || test_crc[0] != rx_cmd[pos+SPI_BLOCK_SIZE+1] )
1172 esp_dbg(ESP_DBG, "crc test_crc0 %x\n",test_crc[0]);
1173 esp_dbg(ESP_DBG, "crc test_crc1 %x\n",test_crc[1]);
1174 esp_dbg(ESP_DBG, "crc rx_data-2 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE]);
1175 esp_dbg(ESP_DBG, "crc rx_data-1 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE+1] );
1177 esp_dbg(ESP_DBG_ERROR, "spierr crc err block = 1,count = %d\n",count);
1184 pos = pos +SPI_BLOCK_SIZE + 2;
1186 for(j=1;j<count;j++)
1189 for(i=0;i<BLOCK_R_DATA_RESP_SIZE_EACH;i++)
1191 if(rx_cmd[pos+i]==0xFE)
1193 //esp_dbg(ESP_DBG_ERROR, "0xFE pos:%d",i);
1194 if(i>spi_resp.max_block_dataR_resp_size)
1196 spi_resp.max_block_dataR_resp_size = i;
1197 //printk(KERN_ERR "new block data read MAX 0xFE pos:%d",spi_resp.max_block_dataR_resp_size);
1203 if(i>=BLOCK_R_DATA_RESP_SIZE_EACH)
1205 esp_dbg(ESP_DBG_ERROR, "spierr block%d read data token 0xFE no recv,total:%d\n",j+1,count);
1212 memcpy(rx_data+j*SPI_BLOCK_SIZE,rx_cmd+pos,SPI_BLOCK_SIZE);
1214 crc = crc_cal_by_byte(rx_data+j*SPI_BLOCK_SIZE ,512);
1216 test_crc[0] = crc & 0xff;
1217 test_crc[1] = (crc >>8) &0xff ;
1219 if(test_crc[1] != rx_cmd[pos+SPI_BLOCK_SIZE] || test_crc[0] != rx_cmd[pos+SPI_BLOCK_SIZE+1] )
1221 esp_dbg(ESP_DBG, "crc test_crc0 %x\n",test_crc[0]);
1222 esp_dbg(ESP_DBG, "crc test_crc1 %x\n",test_crc[1]);
1223 esp_dbg(ESP_DBG, "crc rx_data-2 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE]);
1224 esp_dbg(ESP_DBG, "crc rx_data-1 %x\n",rx_cmd[pos+SPI_BLOCK_SIZE+1] );
1226 esp_dbg(ESP_DBG_ERROR, "spierr crc err,count = %d,block =%d\n",count,j+1);
1232 pos = pos +SPI_BLOCK_SIZE + 2;
1240 int sif_spi_read_mix_nosync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
1248 blk_cnt = len/SPI_BLOCK_SIZE;
1249 remain_len = len%SPI_BLOCK_SIZE;
1258 check_buf[0] = 1<<2;
1259 err = sif_spi_read_blocks(spi, addr, buf, blk_cnt);
1262 sif_spi_write_bytes(spi,SLC_HOST_CONF_W4 + 2,check_buf,1,0);
1263 } else if(err == -4 ||err == -5 ||err == -6||err == -7 ||err == -8)
1265 struct esp_spi_ctrl *sctrl = spi_get_drvdata(spi);
1267 sif_ack_target_read_err(sctrl->epub);
1269 } else if(err == -3)
1277 }while(retry > 0 && err != 0);
1278 if(err != 0 && retry == 0)
1279 esp_dbg(ESP_DBG_ERROR, "spierr 20 times retry block read fail\n");
1285 if (remain_len > 0) {
1293 err = sif_spi_read_bytes(spi, addr, (buf + (blk_cnt*SPI_BLOCK_SIZE)), remain_len, dummymode);
1294 }while(retry >0 && err != 0);
1296 if(err != 0 && retry == 0)
1297 esp_dbg(ESP_DBG_ERROR, "spierr 20 times retry byte read fail\n");
1301 err = sif_spi_read_bytes(spi, addr, (buf + (blk_cnt*SPI_BLOCK_SIZE)), remain_len, dummymode);
1310 int sif_spi_read_mix_sync(struct spi_device *spi, unsigned int addr, unsigned char *buf, int len, int dummymode)
1314 spi_bus_lock(spi->master);
1315 err = sif_spi_read_mix_nosync(spi, addr, buf, len, dummymode);
1316 spi_bus_unlock(spi->master);
1321 int sif_spi_epub_read_mix_nosync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
1323 struct esp_spi_ctrl *sctrl = NULL;
1324 struct spi_device *spi = NULL;
1330 sctrl = (struct esp_spi_ctrl *)epub->sif;
1337 return sif_spi_read_mix_nosync(spi, addr, buf, len, dummymode);
1340 int sif_spi_epub_read_mix_sync(struct esp_pub *epub, unsigned int addr, unsigned char *buf,int len, int dummymode)
1342 struct esp_spi_ctrl *sctrl = NULL;
1343 struct spi_device *spi = NULL;
1349 sctrl = (struct esp_spi_ctrl *)epub->sif;
1356 return sif_spi_read_mix_sync(spi, addr, buf, len, dummymode);
1359 int sif_spi_read_sync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode)
1361 struct esp_spi_ctrl *sctrl = NULL;
1362 struct spi_device *spi = NULL;
1365 if (epub == NULL || buf == NULL) {
1369 sctrl = (struct esp_spi_ctrl *)epub->sif;
1376 switch(sctrl->target_id) {
1381 read_len = roundup(len, sctrl->slc_blk_sz);
1388 return sif_spi_read_mix_sync(spi, sctrl->slc_window_end_addr - 2 - (len), buf, read_len, dummymode);
1391 int sif_spi_write_sync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode)
1393 struct esp_spi_ctrl *sctrl = NULL;
1394 struct spi_device *spi = NULL;
1397 if (epub == NULL || buf == NULL) {
1401 sctrl = (struct esp_spi_ctrl *)epub->sif;
1408 switch(sctrl->target_id) {
1413 write_len = roundup(len, sctrl->slc_blk_sz);
1419 return sif_spi_write_mix_sync(spi, sctrl->slc_window_end_addr - (len), buf, write_len, dummymode);
1422 int sif_spi_read_nosync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode, bool noround)
1424 struct esp_spi_ctrl *sctrl = NULL;
1425 struct spi_device *spi = NULL;
1428 if (epub == NULL || buf == NULL) {
1432 sctrl = (struct esp_spi_ctrl *)epub->sif;
1439 switch(sctrl->target_id) {
1445 read_len = roundup(len, sctrl->slc_blk_sz);
1454 return sif_spi_read_mix_nosync(spi, sctrl->slc_window_end_addr - 2 - (len), buf, read_len, dummymode);
1457 int sif_spi_write_nosync(struct esp_pub *epub, unsigned char *buf, int len, int dummymode)
1459 struct esp_spi_ctrl *sctrl = NULL;
1460 struct spi_device *spi = NULL;
1463 if (epub == NULL || buf == NULL) {
1467 sctrl = (struct esp_spi_ctrl *)epub->sif;
1474 switch(sctrl->target_id) {
1479 write_len = roundup(len, sctrl->slc_blk_sz);
1485 return sif_spi_write_mix_nosync(spi, sctrl->slc_window_end_addr - (len), buf, write_len, dummymode);
1488 int sif_spi_protocol_init(struct spi_device *spi)
1490 unsigned char spi_proto_ini_status = 0;
1491 unsigned char rx_buf1[10];
1492 unsigned char tx_buf1[10];
1493 unsigned char dummy_tx_buf[10];
1494 memset(dummy_tx_buf,0xff,sizeof(dummy_tx_buf));
1497 if( spi_proto_ini_status == 0 )
1508 //printf("CMD0 \n");
1509 sif_spi_write_raw(spi, tx_buf1, 6);
1510 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1511 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1512 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1514 if(fail_count++ > 10)
1516 }while( rx_buf1[2] != 0x01 );
1519 else if( spi_proto_ini_status == 1 )
1523 tx_buf1[2]=0x20; //0x04;
1527 //spi_err("CMD 5 1st\n");
1528 sif_spi_write_raw(spi, tx_buf1, 6);
1529 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1530 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1531 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1533 else if( spi_proto_ini_status == 2 )
1541 //spi_err("CMD5 2nd\n");
1542 sif_spi_write_raw(spi, tx_buf1, 6);
1543 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1544 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1545 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1547 else if( spi_proto_ini_status == 3 ) //CMD 52 addr 0x2, data 0x02;
1555 //spi_err("CMD52 Write addr 02 \n");
1556 sif_spi_write_raw(spi, tx_buf1, 6);
1557 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1558 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1559 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1561 else if( spi_proto_ini_status == 4 )
1569 //spi_err("CMD52 Write addr 04 \n");
1570 sif_spi_write_raw(spi, tx_buf1, 6);
1571 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1572 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1573 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1575 else if( spi_proto_ini_status == 5 )
1583 //spi_err("CMD52 Read addr 0x2 \n");
1584 sif_spi_write_raw(spi, tx_buf1, 6);
1585 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1586 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1587 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1590 else if( spi_proto_ini_status == 6 )
1598 //spi_err("CMD52 Read addr 0x4 \n");
1599 sif_spi_write_raw(spi, tx_buf1, 6);
1600 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1601 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1602 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1604 else if (spi_proto_ini_status>6 && spi_proto_ini_status<15)
1609 tx_buf1[3]=0xF0+2*(spi_proto_ini_status-7);
1612 sif_spi_write_raw(spi, tx_buf1, 6);
1613 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1614 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1615 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1617 else if (spi_proto_ini_status==15)
1619 //spi_err("CMD52 Write Reg addr 0x110 \n");
1621 tx_buf1[1]=0x80; //func0 should be
1624 tx_buf1[4]=(unsigned char)(SPI_BLOCK_SIZE & 0xff); //0x02;
1626 sif_spi_write_raw(spi, tx_buf1, 6);
1627 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1628 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1629 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1631 //spi_err("CMD52 Write Reg addr 0x111 \n");
1636 tx_buf1[4]=(unsigned char)(SPI_BLOCK_SIZE>>8); //0x00;
1638 sif_spi_write_raw(spi, tx_buf1, 6);
1639 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1640 // esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1641 // ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1643 //spi_err("CMD52 Write Reg addr 0x111 \n"); /* set boot mode */
1648 tx_buf1[4]=0x01; //0x00;
1650 sif_spi_write_raw(spi, tx_buf1, 6);
1651 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1652 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1653 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1656 else if (spi_proto_ini_status==16)
1659 //printf("CMD52 Write Reg addr 0x40 \n");
1664 tx_buf1[4]=0x91; //0x02;
1666 sif_spi_write_raw(spi, tx_buf1, 6);
1667 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1668 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1669 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1671 //sif_spi_read_bytes( 0x0c,rx_buf1, 4);
1673 //printf("CMD52 Write Reg addr 0x3c \n");
1680 sif_spi_write_raw(spi, tx_buf1, 6);
1681 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1682 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1683 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1685 //printf("CMD52 Write Reg addr 0x3d \n");
1690 tx_buf1[4]=0x34; //0x02;
1692 sif_spi_write_raw(spi, tx_buf1, 6);
1693 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1694 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1695 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1697 // printf("CMD52 Write Reg addr 0x3e \n");
1702 tx_buf1[4]=0xfe; //0x02;
1704 sif_spi_write_raw(spi, tx_buf1, 6);
1705 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1706 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1707 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1709 //printf("CMD52 Write Reg addr 0x3f \n");
1714 tx_buf1[4]=0x00; //0x02;
1716 sif_spi_write_raw(spi, tx_buf1, 6);
1717 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1718 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1719 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1721 //printf("CMD52 Write Reg addr 0x40 \n");
1726 tx_buf1[4]=0xd1; //0x02;
1728 sif_spi_write_raw(spi, tx_buf1, 6);
1729 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1730 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1731 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1737 tx_buf1[4]=0x30; //0x02;
1739 sif_spi_write_raw(spi, tx_buf1, 6);
1740 sif_spi_write_async_read(spi,dummy_tx_buf, rx_buf1,10);
1741 esp_dbg(ESP_DBG_ERROR, "rx:[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x],[0x%02x]\n", rx_buf1[0],rx_buf1[1]
1742 ,rx_buf1[2],rx_buf1[3],rx_buf1[4],rx_buf1[5],rx_buf1[6],rx_buf1[7],rx_buf1[8],rx_buf1[9]);
1751 spi_proto_ini_status++;
1756 static int spi_irq_thread(void *data)
1758 struct spi_device *spi = (struct spi_device *)data;
1763 set_current_state(TASK_INTERRUPTIBLE);
1764 sif_platform_irq_mask(0);
1766 if (!kthread_should_stop())
1769 set_current_state(TASK_RUNNING);
1771 } while (!kthread_should_stop());
1775 int sif_setup_irq_thread(struct spi_device *spi)
1777 sif_irq_thread = kthread_run(spi_irq_thread, spi, "kspiirqd/eagle");
1778 if (IS_ERR(sif_irq_thread)) {
1779 esp_dbg(ESP_DBG_ERROR, "setup irq thread error!\n");
1785 static irqreturn_t sif_irq_handler(int irq, void *dev_id)
1787 sif_platform_irq_mask(1);
1789 if (sif_platform_is_irq_occur()) {
1790 wake_up_process(sif_irq_thread);
1792 sif_platform_irq_mask(0);
1799 void sif_enable_irq(struct esp_pub *epub)
1802 struct esp_spi_ctrl *sctrl = NULL;
1803 struct spi_device *spi = NULL;
1809 sctrl = (struct esp_spi_ctrl *)epub->sif;
1818 sif_platform_irq_init();
1819 err = sif_setup_irq_thread(spi);
1821 esp_dbg(ESP_DBG_ERROR, "%s setup sif irq failed\n", __func__);
1825 /******************compat with other device in some shared irq system ********************/
1827 #ifdef REQUEST_IRQ_SHARED
1828 #if defined(REQUEST_IRQ_RISING)
1829 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_RISING | IRQF_SHARED, "esp_spi_irq", spi);
1830 #elif defined(REQUEST_IRQ_FALLING)
1831 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_FALLING | IRQF_SHARED, "esp_spi_irq", spi);
1832 #elif defined(REQUEST_IRQ_LOWLEVEL)
1833 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_LOW | IRQF_SHARED, "esp_spi_irq", spi);
1834 #elif defined(REQUEST_IRQ_HIGHLEVEL)
1835 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_HIGH | IRQF_SHARED, "esp_spi_irq", spi);
1837 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_LOW | IRQF_SHARED, "esp_spi_irq", spi);
1838 #endif /* TRIGGER MODE */
1840 err = request_irq(sif_platform_get_irq_no(), sif_irq_handler, IRQF_TRIGGER_LOW, "esp_spi_irq", spi);
1841 #endif /* ESP_IRQ_SHARED */
1844 esp_dbg(ESP_DBG_ERROR, "sif %s failed\n", __func__);
1847 #ifdef IRQ_WAKE_HOST
1848 enable_irq_wake(sif_platform_get_irq_no());
1850 atomic_set(&sctrl->irq_installed, 1);
1853 void sif_disable_irq(struct esp_pub *epub)
1856 struct esp_spi_ctrl *sctrl = NULL;
1857 struct spi_device *spi = NULL;
1863 sctrl = (struct esp_spi_ctrl *)epub->sif;
1870 if (atomic_read(&sctrl->irq_installed) == 0)
1873 while (atomic_read(&sctrl->irq_handling)) {
1874 schedule_timeout(HZ / 100);
1876 esp_dbg(ESP_DBG_ERROR, "%s force to stop irq\n", __func__);
1881 free_irq(sif_platform_get_irq_no(), spi);
1882 kthread_stop(sif_irq_thread);
1884 sif_platform_irq_deinit();
1886 atomic_set(&sctrl->irq_installed, 0);
1890 int esp_setup_spi(struct spi_device *spi)
1892 #ifndef ESP_PREALLOC
1895 /**** alloc buffer for spi io */
1896 if (sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT) {
1898 if ((buf_addr = esp_get_lspi_buf()) == NULL)
1901 while ((buf_addr = (unsigned char *)kmalloc (MAX_BUF_SIZE, GFP_KERNEL)) == NULL) {
1906 if ((check_buf = (unsigned char *)kmalloc (256, GFP_KERNEL)) == NULL)
1907 goto _err_check_buf;
1909 if ((ff_buf = (unsigned char *)kmalloc (256, GFP_KERNEL)) == NULL)
1912 memset(ff_buf,0xff,256);
1917 spi_resp.max_dataW_resp_size = 0;
1918 spi_resp.max_dataR_resp_size = 0;
1919 spi_resp.max_block_dataW_resp_size = 0;
1920 spi_resp.max_block_dataR_resp_size = 0;
1921 spi_resp.max_cmd_resp_size = 0;
1922 if( sif_get_ate_config() != 5)
1924 spi_resp.data_resp_size_w = DATA_RESP_SIZE_W;
1925 spi_resp.data_resp_size_r = DATA_RESP_SIZE_R;
1926 spi_resp.block_w_data_resp_size_final = BLOCK_W_DATA_RESP_SIZE_FINAL;
1927 spi_resp.block_r_data_resp_size_final = BLOCK_R_DATA_RESP_SIZE_1ST;
1929 spi_resp.data_resp_size_w = 1000;
1930 spi_resp.data_resp_size_r = 1000;
1931 spi_resp.block_w_data_resp_size_final = 1000;
1932 spi_resp.block_r_data_resp_size_final = 1000;
1945 esp_put_lspi_buf(&buf_addr);
1956 static int esp_spi_probe(struct spi_device *spi);
1957 static int esp_spi_remove(struct spi_device *spi);
1959 static int esp_spi_probe(struct spi_device *spi)
1962 struct esp_pub *epub;
1963 struct esp_spi_ctrl *sctrl;
1965 esp_dbg(ESP_DBG_ERROR, "%s enter\n", __func__);
1967 err = esp_setup_spi(spi);
1969 esp_dbg(ESP_DBG_ERROR, "%s setup_spi error[%d]\n", __func__, err);
1970 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT)
1973 goto _err_second_init;
1975 esp_dbg(ESP_DBG_ERROR, "%s init_protocol\n", __func__);
1976 err = sif_spi_protocol_init(spi);
1978 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT)
1981 goto _err_second_init;
1984 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
1985 sctrl = kzalloc(sizeof(struct esp_spi_ctrl), GFP_KERNEL);
1987 if (sctrl == NULL) {
1992 /* temp buffer reserved for un-dma-able request */
1993 sctrl->dma_buffer = kzalloc(ESP_DMA_IBUFSZ, GFP_KERNEL);
1995 if (sctrl->dma_buffer == NULL) {
2000 sctrl->slc_blk_sz = SIF_SLC_BLOCK_SIZE;
2002 epub = esp_pub_alloc_mac80211(&spi->dev);
2005 esp_dbg(ESP_DBG_ERROR, "no mem for epub \n");
2009 epub->sif = (void *)sctrl;
2013 if (sif_get_ate_config() == 0) {
2014 err = ext_gpio_init(epub);
2016 esp_dbg(ESP_DBG_ERROR, "ext_irq_work_init failed %d\n", err);
2025 SET_IEEE80211_DEV(epub->hw, &spi->dev);
2026 epub->dev = &spi->dev;
2029 epub->sdio_state = sif_sdio_state;
2032 spi_set_drvdata(spi, sctrl);
2035 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT)
2038 goto _err_second_init;
2040 check_target_id(epub);
2042 err = esp_pub_init_all(epub);
2045 esp_dbg(ESP_DBG_ERROR, "esp_init_all failed: %d\n", err);
2046 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
2048 goto _err_first_init;
2050 if(sif_sdio_state == ESP_SDIO_STATE_SECOND_INIT)
2051 goto _err_second_init;
2054 esp_dbg(ESP_DBG_TRACE, " %s return %d\n", __func__, err);
2055 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
2056 esp_dbg(ESP_DBG_ERROR, "first normal exit\n");
2057 sif_sdio_state = ESP_SDIO_STATE_FIRST_NORMAL_EXIT;
2058 up(&esp_powerup_sem);
2064 if (sif_get_ate_config() == 0)
2068 esp_pub_dealloc_mac80211(epub);
2070 kfree(sctrl->dma_buffer);
2076 esp_put_lspi_buf(&buf_addr);
2094 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_INIT){
2095 esp_dbg(ESP_DBG_ERROR, "first error exit\n");
2096 sif_sdio_state = ESP_SDIO_STATE_FIRST_ERROR_EXIT;
2097 up(&esp_powerup_sem);
2101 sif_sdio_state = ESP_SDIO_STATE_SECOND_ERROR_EXIT;
2102 esp_spi_remove(spi);
2106 static int esp_spi_remove(struct spi_device *spi)
2108 struct esp_spi_ctrl *sctrl = NULL;
2110 esp_dbg(ESP_SHOW, "%s \n", __func__);
2112 sctrl = spi_get_drvdata(spi);
2114 if (sctrl == NULL) {
2115 esp_dbg(ESP_DBG_ERROR, "%s no sctrl\n", __func__);
2120 if (sctrl->epub == NULL) {
2121 esp_dbg(ESP_DBG_ERROR, "%s epub null\n", __func__);
2124 sctrl->epub->sdio_state = sif_sdio_state;
2125 if(sif_sdio_state != ESP_SDIO_STATE_FIRST_NORMAL_EXIT){
2126 if (sctrl->epub->sip) {
2127 sip_detach(sctrl->epub->sip);
2128 sctrl->epub->sip = NULL;
2129 esp_dbg(ESP_DBG_TRACE, "%s sip detached \n", __func__);
2132 if (sif_get_ate_config() == 0)
2136 //sif_disable_target_interrupt(sctrl->epub);
2137 atomic_set(&sctrl->epub->sip->state, SIP_STOP);
2138 sif_disable_irq(sctrl->epub);
2142 test_exit_netlink();
2143 #endif /* TEST_MODE */
2144 if(sif_sdio_state != ESP_SDIO_STATE_FIRST_NORMAL_EXIT){
2145 esp_pub_dealloc_mac80211(sctrl->epub);
2146 esp_dbg(ESP_DBG_TRACE, "%s dealloc mac80211 \n", __func__);
2148 if (sctrl->dma_buffer) {
2149 kfree(sctrl->dma_buffer);
2150 sctrl->dma_buffer = NULL;
2151 esp_dbg(ESP_DBG_TRACE, "%s free dma_buffer \n", __func__);
2158 esp_put_lspi_buf(&buf_addr);
2181 spi_set_drvdata(spi,NULL);
2183 esp_dbg(ESP_DBG_TRACE, "eagle spi remove complete\n");
2188 static int esp_spi_suspend(struct device *dev)
2190 struct spi_device *spi = to_spi_device(dev);
2191 struct esp_spi_ctrl *sctrl = spi_get_drvdata(spi);
2192 struct esp_pub *epub = sctrl->epub;
2194 printk("%s", __func__);
2196 sip_send_suspend_config(epub, 1);
2198 atomic_set(&epub->ps.state, ESP_PM_ON);
2202 static int esp_spi_resume(struct device *dev)
2204 esp_dbg(ESP_DBG_ERROR, "%s", __func__);
2209 static const struct dev_pm_ops esp_spi_pm_ops = {
2210 .suspend= esp_spi_suspend,
2211 .resume= esp_spi_resume,
2214 extern struct spi_device_id esp_spi_id[];
2216 struct spi_driver esp_spi_driver = {
2217 .id_table = esp_spi_id,
2220 .bus = &spi_bus_type,
2221 .owner = THIS_MODULE,
2222 .pm = &esp_spi_pm_ops,
2224 .probe = esp_spi_probe,
2225 .remove = esp_spi_remove,
2228 static int esp_spi_dummy_probe(struct spi_device *spi)
2230 esp_dbg(ESP_DBG_ERROR, "%s enter\n", __func__);
2232 up(&esp_powerup_sem);
2237 static int esp_spi_dummy_remove(struct spi_device *spi)
2242 struct spi_driver esp_spi_dummy_driver = {
2243 .id_table = esp_spi_id,
2245 .name = "eagle_dummy",
2246 .bus = &spi_bus_type,
2247 .owner = THIS_MODULE,
2249 .probe = esp_spi_dummy_probe,
2250 .remove = esp_spi_dummy_remove,
2253 int esp_spi_init(void)
2255 #define ESP_WAIT_UP_TIME_MS 11000
2258 bool powerup = false;
2260 esp_dbg(ESP_DBG_TRACE, "%s \n", __func__);
2262 #ifdef REGISTER_SPI_BOARD_INFO
2263 sif_platform_register_board_info();
2266 esp_wakelock_init();
2270 sema_init(&esp_powerup_sem, 0);
2272 sif_platform_target_poweron();
2274 err = spi_register_driver(&esp_spi_dummy_driver);
2276 esp_dbg(ESP_DBG_ERROR, "eagle spi driver registration failed, error code: %d\n", err);
2280 if (down_timeout(&esp_powerup_sem,
2281 msecs_to_jiffies(ESP_WAIT_UP_TIME_MS)) == 0)
2289 esp_dbg(ESP_SHOW, "%s ------ RETRY ------ \n", __func__);
2291 sif_record_retry_config();
2293 spi_unregister_driver(&esp_spi_dummy_driver);
2295 sif_platform_target_poweroff();
2300 esp_dbg(ESP_DBG_ERROR, "eagle spi can not power up!\n");
2306 esp_dbg(ESP_SHOW, "%s power up OK\n", __func__);
2308 spi_unregister_driver(&esp_spi_dummy_driver);
2310 sif_sdio_state = ESP_SDIO_STATE_FIRST_INIT;
2311 sema_init(&esp_powerup_sem, 0);
2313 spi_register_driver(&esp_spi_driver);
2315 if (down_timeout(&esp_powerup_sem,
2316 msecs_to_jiffies(ESP_WAIT_UP_TIME_MS)) == 0 && sif_get_ate_config() == 0) {
2317 if(sif_sdio_state == ESP_SDIO_STATE_FIRST_NORMAL_EXIT){
2318 spi_unregister_driver(&esp_spi_driver);
2322 sif_sdio_state = ESP_SDIO_STATE_SECOND_INIT;
2324 spi_register_driver(&esp_spi_driver);
2329 esp_register_early_suspend();
2331 #ifdef REQUEST_RTC_IRQ
2338 esp_wakelock_destroy();
2343 void esp_spi_exit(void)
2345 esp_dbg(ESP_SHOW, "%s \n", __func__);
2347 esp_unregister_early_suspend();
2349 spi_unregister_driver(&esp_spi_driver);
2352 sif_platform_target_poweroff();
2353 #endif /* !FPGA_DEBUG */
2355 esp_wakelock_destroy();
2358 MODULE_AUTHOR("Espressif System");
2359 MODULE_DESCRIPTION("Driver for SPI interconnected eagle low-power WLAN devices");
2360 MODULE_LICENSE("GPL");
2361 #endif /* ESP_USE_SPI */