Index: yc_qspi.h
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.h	(revision 579)
+++ /YC3121_SDK/fw/sdk/yc_qspi.h	(working copy)
@@ -20,6 +20,13 @@
 void enc_write_flash(uint32_t flash_addr,uint8_t *buf, uint32_t len);
 
 /**
+  * @brief  get falsh physical address
+  * @param  flash_addr flash for cpu addr 
+  * @return physical addr
+  */
+uint32_t get_enc_addr(uint32_t flash_addr);
+
+/**
   * @brief  enc read flash
   * @param  flash_addr, rx buf, len  
   * @return none
@@ -27,12 +34,19 @@
 void enc_read_flash(uint32_t flash_addr, uint8_t *buf, uint32_t len);
 
 /**
-  * @brief  qspi flash sectorerase
+  * @brief  qspi flash sectorerase(4k)
   * @param  flash_addr
   * @return none
   */
 uint8_t qspi_flash_sectorerase(uint32_t flash_addr);
 
+/*
+ * @brief:block erase  32K
+ * @param:flash addr
+ * @return: ERROR ,SUCCESS
+ */
+uint8_t qspi_flash_blockerase32k(uint32_t flash_addr);
+
 /**
   * @brief  qspi flash write
   * @param  flash_addr, tx buf, len  
@@ -50,10 +64,18 @@
 /**
   * @brief  检测地址区域是否为空
   * @param  startaddr, len  
-  * @return none
+  * @return result ：空则返回true，非空是false
   */
 Boolean flash_blank_check(uint32_t startaddr,uint32_t len);
 
+
+/**
+  * @brief  clear app disable download flag
+  * @param  none
+  * @return none
+  */
+void app_enable_download();
+
 /**
   * @brief  prefetch
   * @param  start_addr, end_addr  

Index: yc_qspi.c
===================================================================
--- /YC3121_SDK/fw/sdk/yc_qspi.c	(revision 579)
+++ /YC3121_SDK/fw/sdk/yc_qspi.c	(working copy)
@@ -3,38 +3,88 @@
 
 void enc_write_flash(uint32_t flash_addr, uint8_t *buf, uint32_t len)
 {
+	__asm("CPSID i");
 	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,buf,len, 1, 0);
 	deinit_otp();
+	__asm("CPSIE i");
+}
+
+uint32_t get_enc_addr(uint32_t flash_addr)
+{
+	uint8_t addr_buf[4]={0};
+	uint32_t addr=0;
+	__asm("CPSID i");
+	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,addr_buf,4, 0, 0);
+	deinit_otp();
+	addr |=addr_buf[3];
+	addr |=addr_buf[2]<<8;
+	addr |=addr_buf[1]<<16;
+	addr |=addr_buf[0]<<24;
+	__asm("CPSIE i");
+	return addr;
 }
 
 void enc_read_flash(uint32_t flash_addr,uint8_t *buf,uint32_t len)
 {
 	uint32_t i = 0;
-	for(i=0;i<len;i++)
+	if(flash_blank_check(flash_addr,len)==FALSE)
 	{
-		buf[i] = *(uint8_t *)(flash_addr+i);
+		__asm("CPSID i");
+		prefetch((uint8_t*)flash_addr,(uint8_t*)(flash_addr+len));
+		for(i=0;i<len;i++)
+		{
+			buf[i] = *(uint8_t *)(flash_addr+i);
+		}
+		__asm("CPSIE i");
+	}
+	else
+	{
+		memset(buf,0,len);
 	}
 }
 
 uint8_t qspi_flash_sectorerase(uint32_t flash_addr)
 {
-	return ((uint8_t(*)(uint32_t flash_addr))FUNC_QSPI_FLASH_SECTORERASE_ADDR)(flash_addr); 
+	__asm("CPSID i");
+	uint8_t result=((uint8_t(*)(uint32_t flash_addr))FUNC_QSPI_FLASH_SECTORERASE_ADDR)(flash_addr); 
+	__asm("CPSIE i");
+	return result;
+}
+
+uint8_t qspi_flash_blockerase32k(uint32_t flash_addr)
+{
+    __asm("CPSID i");
+	uint8_t result=((uint8_t(*)(uint32_t flash_addr))FUNC_QSPI_FLASH_BLOCKERASE_ADDR)(flash_addr); 
+	__asm("CPSIE i");
+	return result;
 }
 
 uint8_t qspi_flash_write(uint32_t flash_addr, uint8_t *buf, uint32_t len)
 {
-	return ((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_WRITE_ADDR)(flash_addr, len, buf);
+	__asm("CPSID i");
+	uint8_t result=((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_WRITE_ADDR)(flash_addr, len, buf);
+	__asm("CPSIE i");
+	return result;
 }
 
 uint8_t qspi_flash_read(uint32_t flash_addr, uint8_t *buf,uint32_t len)
 {
-	return ((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_READ_ADDR)(flash_addr, len, buf);
+	__asm("CPSID i");
+	uint8_t result=((uint8_t(*)(uint32_t flash_addr, uint32_t len, uint8_t *tbuf))FUNC_QSPI_FLASH_READ_ADDR)(flash_addr, len, buf);
+	__asm("CPSIE i");
+	return result;
 }
 
 Boolean flash_blank_check(uint32_t startaddr, uint32_t len)
 {
-	return ((Boolean(*)(uint32_t startaddr, uint32_t len))FUNC_FLASH_BLANK_CHECK)(startaddr, len);
+	__asm("CPSID i");
+	init_otp();
+	uint8_t result=((Boolean(*)(uint32_t startaddr, uint32_t len))FUNC_FLASH_BLANK_CHECK)(((startaddr/32)*32), startaddr+len);
+	deinit_otp();
+	__asm("CPSIE i");
+	return result;
 }
 
 void prefetch(void *start_addr, void *end_addr)
@@ -80,10 +130,11 @@
 
 void enc_erase_flash_32byte(uint32_t flash_addr)
 {
+	__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, &real_addr, 0, 0, 0);
+	((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();
 
 	real_addr = ((real_addr >> 0) & 0xff) << 24 |
@@ -92,6 +143,7 @@
 	            ((real_addr >> 24) & 0xff) << 0;
 	
 	replace_w_data(real_addr);
+	__asm("CPSIE i");
 }
 
 void enc_erase_flash_32k(uint32_t flash_addr)
@@ -122,3 +174,20 @@
  memset(src_r2,0xff,16);
  qspi_flash_write(log_addr+0x9000, src_r2, 4096);
 }
+
+#define APP_DOWNLOAD_FLAG_ADDR	0x1008000
+void app_enable_download()
+{
+	uint8_t buf32[32]={0};
+	
+	uint32_t enc_unit_head_addr=(APP_DOWNLOAD_FLAG_ADDR/32)*32;
+	if(flash_blank_check(enc_unit_head_addr,32)==FALSE)
+	{
+		enc_read_flash(enc_unit_head_addr,buf32,32);
+		
+		enc_erase_flash_32byte(enc_unit_head_addr);
+		
+		buf32[APP_DOWNLOAD_FLAG_ADDR%32]=0xff;
+		enc_write_flash(enc_unit_head_addr,buf32,32);
+	}
+}
