Index: fw/sdk/libyc_qspi.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: fw/sdk/yc_qspi.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.c	(revision 746)
+++ /YC3121_SDK/fw/sdk/yc_qspi.c	(working copy)
@@ -64,23 +64,116 @@
 	return result;
 }
 
+#define BLOCK_UNIT  (256)
+uint8_t noinline _qspi_flash_write(uint32_t flash_addr,uint32_t len,uint8_t *tbuf)
+{
+    uint8_t buf[BLOCK_UNIT+4] = {0};
+    uint32_t packnum = (len+BLOCK_UNIT-1)/BLOCK_UNIT;
+    uint32_t packlen = 0;
+
+    for(uint32_t i=0; i<packnum;i++)
+    {   
+        packlen = len > BLOCK_UNIT?BLOCK_UNIT:len;
+
+        ((void(*)(uint8_t *buf,uint8_t cmd,uint32_t addr))0x47e5)(buf,W25X_PAGE_PROGRAM,flash_addr+i*BLOCK_UNIT);
+        
+        for(uint32_t j = 0;j<packlen;j++)
+        {
+            buf[4+j] =  tbuf[j+i*BLOCK_UNIT];
+        }
+        if(ERROR == ((uint8_t(*)(void))0x47d1)())
+                return ERROR;
+				
+        if(ERROR == ((uint8_t(*)(uint8_t *tbuf,uint32_t len))0x468d)(buf,packlen+4))
+            return ERROR;
+        
+        if(ERROR == ((uint8_t(*)(void))0x4741)())
+            return ERROR;
+
+        len -= packlen;
+    }
+
+    return SUCCESS;
+}
+
 uint8_t qspi_flash_write(uint32_t flash_addr, uint8_t *buf, uint32_t len)
 {
 	uint32_t primask=get_primask();
 	if(!primask)	__asm("CPSID i");
 	uint8_t tmp = pre_qspi();
-	uint8_t result=((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_WRITE_ADDR)(flash_addr, len, buf);
+	//uint8_t result=((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_WRITE_ADDR)(flash_addr, len, buf);
+	uint8_t result=_qspi_flash_write(flash_addr, len, buf);
 	end_qspi(tmp);
 	if(!primask)	__asm("CPSIE i");
 	return result;
 }
 
+uint8_t noinline _qspi_flash_read( uint32_t flash_addr,uint32_t rlen,uint8_t *rbuf)
+{
+    uint8_t ret = 1;
+    uint8_t tbuf[5] = {0};
+    uint32_t tlen = 5;
+    uint8_t mode;
+    volatile uint32_t ctrl = QSPI_CTRL;
+
+    mode=((ctrl>>16)&0xff);
+    
+    tbuf[0] = mode;
+	tbuf[1] = flash_addr >> 16;
+	tbuf[2] = flash_addr >> 8;
+	tbuf[3] = flash_addr;
+	tbuf[4] = 0;
+
+   switch(mode) {
+		case W25X_FASTREAD_DUAL1 : 
+			tlen = 4;
+			break;
+		case W25X_FASTREAD_DUAL2 : 
+			break;
+		case W25X_FASTREAD_QUAD1 : 
+			tlen = 4;
+			break;
+		case W25X_FASTREAD_QUAD2 : 
+			break;
+		case W25X_FASTREAD_QUAD3 : 
+			break;
+		default :
+            tlen = 4; 
+            break;
+	}
+    QSPI_CTRL =ctrl&(~(QSPICFG_DECEN | QSPICFG_XIPEN|QSPICFG_RETRY));
+    //qspi_dma_start(DMACH_QSPI, tbuf, tlen, rbuf, rlen);
+	DMA_SRC_ADDR(DMACH_QSPI) = (int)tbuf;
+	DMA_DEST_ADDR(DMACH_QSPI) = (int)rbuf;
+	DMA_LEN(DMACH_QSPI) = tlen << 16 | rlen;
+    DMA_CONFIG(DMACH_QSPI) = 0;
+	DMA_START(DMACH_QSPI) = (1<<DMA_RESET_BIT);
+	DMA_START(DMACH_QSPI) &= ~(1<<DMA_RESET_BIT); 
+	DMA_START(DMACH_QSPI) = (1<<DMA_START_BIT);
+
+	//ret = qspi_dma_wait(DMACH_QSPI);
+	int timeout = 0;
+	while(!(DMA_STATUS(DMACH_QSPI) & 1))
+	{
+		timeout ++;
+		if(timeout>0x10000)
+		{
+			ret= ERROR;
+			break;
+		}
+	}
+
+    QSPI_CTRL = ctrl;
+    return ret;
+}
+
 uint8_t qspi_flash_read(uint32_t flash_addr, uint8_t *buf,uint32_t len)
 {
 	uint32_t primask=get_primask();
 	if(!primask)	__asm("CPSID i");
 	uint8_t tmp = pre_qspi();
-	uint8_t result=((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_READ_ADDR)(flash_addr, len, buf);
+	prefetch(_qspi_flash_read,_qspi_flash_read+100);
+	uint8_t result=_qspi_flash_read(flash_addr, len, buf);
 	end_qspi(tmp);
 	if(!primask)	__asm("CPSIE i");
 	return result;
@@ -122,7 +215,7 @@
 	uint32_t i,j,n;
 	uint32_t primask=get_primask();
 	if(!primask)	__asm("CPSID i");
-	n=(32-(flash_addr&0x20))>len?len:(32-(flash_addr&0x20));
+	n=(32-(flash_addr&0x1f))>len?len:(32-(flash_addr&0x1f));
 	i=0;
 	while(len>0)
 	{
@@ -345,7 +438,7 @@
 	enc_write_flash(APP_INFO_ADDR,app_info_buf,sizeof(app_info_buf));
 }
 
-#define QSPI_LIB_VERSION 0x00010005
+#define QSPI_LIB_VERSION 0x00010006
 uint32_t qspi_GetVersion(void)
 {
     return QSPI_LIB_VERSION;
Index: fw/sdk/yc_qspi.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
