Index: libyc_qspi.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: yc_7816/libyc_7816.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: yc_7816/libyc_7816.a
___________________________________________________________________
Deleted: svn:mime-type
## -1 +0,0 ##
-application/octet-stream
\ No newline at end of property
Index: yc_7816/yc_7816.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: yc_7816/yc_7816.lib
___________________________________________________________________
Deleted: svn:mime-type
## -1 +0,0 ##
-application/octet-stream
\ No newline at end of property
Index: yc_qspi.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.h	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_qspi.h	(working copy)
@@ -5,7 +5,7 @@
 Date         : 2019/08/24
 Description  : QSPI operation.
 */
- 
+
 #ifndef __QSPI_H__
 #define __QSPI_H__
 
@@ -13,7 +13,12 @@
 #include "yc_otp.h"
 #include "misc.h"
 
-
+typedef enum {
+  YC_QFLASH_SIZE_UNKNOW = 0,
+  YC_QFLASH_SIZE_512KB = 1,
+  YC_QFLASH_SIZE_1MB = 2,
+  YC_QFLASH_SIZE_4MB = 3,
+} yc_qspi_flash_size_enum;
 
 /**
   * @brief  qspi flash sectorerase(4k)
@@ -31,14 +36,14 @@
 
 /**
   * @brief  qspi flash write
-  * @param  flash_addr, tx buf, len  
+  * @param  flash_addr, tx buf, len
   * @return none
   */
 uint8_t qspi_flash_write(uint32_t flash_addr, uint8_t *buf, uint32_t len);
 
 /**
   * @brief  qspi flash read
-  * @param  flash_addr, rx buf, len  
+  * @param  flash_addr, rx buf, len
   * @return none
   */
 uint8_t qspi_flash_read(uint32_t flash_addr, uint8_t *buf,uint32_t len);
@@ -46,7 +51,7 @@
 
 /**
   * @brief  enc erase flash 32yte
-  * @param  flash_addr   
+  * @param  flash_addr
   * @return none
   */
 void enc_erase_flash_32byte(uint32_t flash_addr);
@@ -54,22 +59,22 @@
 
 /**
   * @brief  enc erase flash 32k
-  * @param  flash_addr   
+  * @param  flash_addr
   * @return none
   */
 void enc_erase_flash_32k(uint32_t flash_addr);
 
 /**
   * @brief  enc erase flash app area
-  * @param  addr:MCU every 32k start addr  
-  * @param  len:erase len	
+  * @param  addr:MCU every 32k start addr
+  * @param  len:erase len
   * @return none
   */
 uint8_t enc_earse_flash_app_area(uint32_t addr,uint32_t len);
 
 /**
   * @brief  enc write flash
-  * @param  flash_addr, tx buf, len  
+  * @param  flash_addr, tx buf, len
   * @return none
   */
 void enc_write_flash(uint32_t flash_addr,uint8_t *buf, uint32_t len);
@@ -77,14 +82,14 @@
 
 /**
   * @brief  enc read flash
-  * @param  flash_addr, rx buf, len  
+  * @param  flash_addr, rx buf, len
   * @return none
   */
 void enc_read_flash(uint32_t flash_addr, uint8_t *buf, uint32_t len);
 
 /**
   * @brief  检测地址区域是否为空
-  * @param  startaddr, len  
+  * @param  startaddr, len
   * @return none
   */
 Boolean flash_blank_check(uint32_t startaddr,uint32_t len);
@@ -92,7 +97,7 @@
 
 /**
   * @brief  prefetch
-  * @param  start_addr, end_addr  
+  * @param  start_addr, end_addr
   * @return none
   */
 void prefetch(void *start_addr, void *end_addr);
@@ -123,4 +128,11 @@
   */
 uint32_t qspi_GetVersion(void);
 
+/**
+  * @brief  get qspi flash size
+  * @param  none
+  * @return yc_qspi_flash_size_enum
+  */
+yc_qspi_flash_size_enum read_flash_size(void);
+
 #endif
Index: yc_qspi.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.c	(revision 659)
+++ /YC3121_SDK/fw/sdk/yc_qspi.c	(working copy)
@@ -11,7 +11,7 @@
 	{
 			QSPI_CTRL  &=  (~0x80);
 	}
-	
+
 	SYSCTRL_HCLK_CON = (SYSCTRL_HCLK_CON & (~0xf)) | (div_clk & 0xf);
 }
 
@@ -20,17 +20,17 @@
 	uint8_t ret = 0;
 	uint8_t halfclk = 0;
 	uint8_t clk_div = 0;
-	
+
 	halfclk =  (QSPI_CTRL & 0x80);
 	clk_div =  (SYSCTRL_HCLK_CON & 0xf);
-	
+
 	if(halfclk)
 	{
 		ret |= 0x80;
 	}
-	
+
 	ret |= clk_div;
-	
+
 	prefetch(setqspi,setqspi+64);
 	setqspi(0,clk_div?clk_div:2);
 	return ret;
@@ -50,7 +50,6 @@
 	end_qspi(tmp);
 	if(!primask)	__asm("CPSIE i");
 	return result;
-	
 }
 
 
@@ -80,7 +79,9 @@
 {
 	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);
+	end_qspi(tmp);
 	if(!primask)	__asm("CPSIE i");
 	return result;
 }
@@ -136,6 +137,7 @@
 		else
 		{
 			memset(buf+i,0xff,n);
+			i +=n;
 		}
 		flash_addr +=n;
 		len -=n;
@@ -168,7 +170,7 @@
 	uint8_t rbuf[4096] ={0};
 	uint8_t times = 0;
 	uint8_t fill_data_nums = 36;
-	
+
 //	uint8_t tmpbuf[4096]={0};
 	page_addr = (real_addr & 0xfffff000);
 	rem_addr = real_addr & 0xfff;
@@ -187,11 +189,11 @@
 		for(int i=0; i < fill_data_nums; i++)
 		{
 			rbuf[rem_addr + i] = 0xff;
-		} 
+		}
 		//step4:sector write
 		//qspi_flash_write(page_addr, rbuf, 4096);
 		((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_WRITE_ADDR)(page_addr, 4096, rbuf);
-		page_addr += 4096; 
+		page_addr += 4096;
 		rem_addr = 0;
 		fill_data_nums = 36 - fill_data_nums;
 	}
@@ -202,7 +204,7 @@
 	uint32_t primask=get_primask();
 	if(!primask)	__asm("CPSID i");
 	uint32_t real_addr = 0;
-	
+
 	init_otp();
 	((uint8_t(*)(uint32_t flash_addr, uint8_t *buf, uint32_t len, uint8_t type, uint8_t use_pr_flash))FUNC_ENC_WRITE_FLASH_ADDR)(flash_addr, (uint8_t*)&real_addr, 0, 0, 0);
 	deinit_otp();
@@ -230,13 +232,13 @@
 
  num = (flash_addr - 0x1000000) / 0x8000;
  log_addr = num * 0x9000;
- 
+
  log_addr = log_addr + 0x1000000;
 
  qspi_flash_read(log_addr, back_buf, 0x10);
  qspi_flash_sectorerase(log_addr);
  qspi_flash_write(log_addr, back_buf, 0x10);
- 
+
  for (i = (log_addr+0x1000); i < log_addr + 0x9000; i += 0x1000)
  {
   qspi_flash_sectorerase(i);
@@ -254,22 +256,22 @@
 	uint32_t earse_start_addr;
 	uint32_t earse_end_addr;
 	int i;
-	
+
 	if(len<=0)
 	{
 		return ERROR;
 	}
-	
+
 	earse_start_addr=(addr&0xffffff);
 	earse_end_addr=earse_start_addr+len;
-	
+
 	earse_start_addr=((earse_start_addr/0x8000)*0x9000);//cpu地址转物理地址(cpu地址32k对齐)
 	earse_end_addr=((((earse_end_addr+(0x8000-1))/0x8000)*0x9000)+0x10);
 	earse_end_addr=((earse_end_addr+(0x1000-1))/0x1000)*0x1000;//最小擦除单元4k对齐
-	
+
 	earse_start_addr|=0x1000000;
 	earse_end_addr|=0x1000000;
-	
+
 	//earse first sector(4k)
 	qspi_flash_read(earse_start_addr,temp_backup,0x10);//cpu 32k head backup(16byte)
 	if(qspi_flash_sectorerase(earse_start_addr)!=SUCCESS)
@@ -281,14 +283,14 @@
 		return ERROR;
 	}
 	earse_start_addr+=0x1000;
-	
+
 	//backup end
 	qspi_flash_read(earse_end_addr-0x1000,temp_backup,0x1000);//32k end page backup(0x1000)
 	for(int i=0;i<0x10;i++)//clear end_backup first 16 bytes
 	{
 		temp_backup[i]=0xff;
 	}
-	
+
 	//earse head sector(4k)
 	for(;((earse_start_addr%0x8000)!=0);earse_start_addr+=0x1000)
 	{
@@ -297,7 +299,7 @@
 			return ERROR;
 		}
 	}
-	
+
 	//earse block(32k)
 	for(;(earse_start_addr+0x8000)<=earse_end_addr;earse_start_addr+=0x8000)
 	{
@@ -306,7 +308,7 @@
 			return ERROR;
 		}
 	}
-	
+
 	//earse end sector(4k)
 	for(;earse_start_addr<earse_end_addr;earse_start_addr+=0x1000)
 	{
@@ -343,8 +345,64 @@
 	enc_write_flash(APP_INFO_ADDR,app_info_buf,sizeof(app_info_buf));
 }
 
-#define QSPI_LIB_VERSION 0x00010001
+#define QSPI_LIB_VERSION 0x00010005
 uint32_t qspi_GetVersion(void)
 {
     return QSPI_LIB_VERSION;
 }
+
+static uint8_t qspi_read_id(uint8_t *rbuf)
+{
+	uint32_t primask=get_primask();
+	if(!primask)	__asm("CPSID i");
+	uint8_t tmp = pre_qspi();
+	uint8_t result = ((uint8_t(*)(uint8_t *rbuf))(FUNC_READ_FLASH_ID))(rbuf);
+	end_qspi(tmp);
+	if(!primask)	__asm("CPSIE i");
+	return result;
+}
+
+yc_qspi_flash_size_enum read_flash_size(void)
+{
+	yc_qspi_flash_size_enum ret = YC_QFLASH_SIZE_UNKNOW;
+	uint8_t rbuf[3]={0};
+	qspi_read_id(rbuf);
+
+	if(0x85 == rbuf[0] && 0x60 == rbuf[1])
+	{
+		switch(rbuf[2])
+		{
+			case 0x13:
+				ret = YC_QFLASH_SIZE_512KB;
+				break;
+			case 0x14:
+				ret = YC_QFLASH_SIZE_1MB;
+				break;
+			case 0x16:
+				ret = YC_QFLASH_SIZE_4MB;
+				break;
+			default:
+				ret = YC_QFLASH_SIZE_UNKNOW;
+				break;
+		}
+	}
+	else if(0x5E == rbuf[0] && 0x20 == rbuf[1])
+	{
+		switch(rbuf[2])
+		{
+			case 0x13:
+				ret = YC_QFLASH_SIZE_512KB;
+				break;
+			case 0x14:
+				ret = YC_QFLASH_SIZE_1MB;
+				break;
+			case 0x16:
+				ret = YC_QFLASH_SIZE_4MB;
+				break;
+			default:
+				ret = YC_QFLASH_SIZE_UNKNOW;
+				break;
+		}
+	}
+	return  ret;
+}
Index: yc_qspi.lib
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
