#include "sr_sunrise.h"

#define FLASH_TEST_ADDR_OFFSET   0x001B2000

//cmd: flash_exmp <offset> 
static int _FlashExample(int argc, char *argv[])
{
	int ret = 0,i;	
	srSize_t offset = FLASH_TEST_ADDR_OFFSET;
	if(argc >= 2)  offset = atoi(argv[1]);

	uint8_t buf[512]={0};

	SR_LOG(INFO,"[FLH] Addr offset: %lu ",offset);
	//擦除
	ret = SR_HAlFlashErase(offset,1);
	SR_LOG(INFO,"[FLH] erase ,ret=%d",ret);

	//写
	for(i=0;i<512;i=i+2) 
	{
		buf[i] = 0x5A;
		buf[i+1] = 0xA5;
	}	
	ret = SR_HalFlashWrite(offset,buf,512);
	SR_LOG(INFO,"[FLH] write ,ret=%d",ret);
	
	//读
	memset(buf,0,sizeof(buf));
	ret = SR_HalFlashRead(offset,buf,512);
	SR_LOG(INFO,"[FLH] read ,ret=%d",ret);
		
_END:
	return ret;
}
SR_SHELL_CMD_EXPORT(flash_exmp, _FlashExample);



//cmd: flash_write <offset> <buf>
static int _FlashWrite(int argc, char *argv[])
{
	int ret = 0;	
	if(argc <3) return -1;
	
	char buf[64]={0};
	srSize_t offset = atoi(argv[1]);
	strcpy(buf,argv[2]);

	ret = SR_HalFlashWrite(offset,buf,strlen(argv[2]));
	SR_LOG(INFO,"flash write,ret(%d)",ret);
	
_END:
	return ret;
}
SR_SHELL_CMD_EXPORT(flash_write, _FlashWrite);


//cmd: flash_read <offset> <size>
static int _FlashRead(int argc, char *argv[])
{
	int ret = 0;	
	if(argc <3) return -1;
	
	uint8_t buf[4096]={0};
	srSize_t offset = atoi(argv[1]);
	uint16_t size = atoi(argv[2]);

	ret = SR_HalFlashRead(offset,buf,size);
	
    if(ret >0) ShellShowData(buf,size,offset);
	
_END:
	return ret;
}
SR_SHELL_CMD_EXPORT(flash_read, _FlashRead);




//flash_erase <offset> <num>
static int _FlashErase(int argc, char *argv[])
{
	int ret = 0;	
	if(argc <3) return -1;
	
	srSize_t offset = atoi(argv[1]);
	uint16_t num = atoi(argv[2]);

	ret = SR_HAlFlashErase(offset,num);
	if(ret!=0) SR_LOG(INFO,"erase fail,offset(%lu) num(%d)",offset,num);
	
_END:
	return ret;

}
SR_SHELL_CMD_EXPORT(flash_erase, _FlashErase);

#include "mem_map_716s.h"
//flash_layout
static int _FlashLayout(int argc, char *argv[])
{
#ifdef BSP_FLASH_USER_START
	SR_LOG(INFO,"BSP_FLASH_USER_START=0x%X",BSP_FLASH_USER_START);
#endif


	SR_LOG(INFO,"AP_FLASH_XIP_ADDR=0x%X",AP_FLASH_XIP_ADDR);

	SR_LOG(INFO,"BOOTLOADER_FLASH_LOAD_ADDR=0x%X  BOOTLOADER_FLASH_LOAD_SIZE=%u",BOOTLOADER_FLASH_LOAD_ADDR,BOOTLOADER_FLASH_LOAD_SIZE);
	
	SR_LOG(INFO,"AP_FLASH_LOAD_ADDR=0x%X  AP_FLASH_LOAD_SIZE=%u",AP_FLASH_LOAD_ADDR,AP_FLASH_LOAD_SIZE);
	
	SR_LOG(INFO,"FLASH_FS_REGION_START=0x%X  FLASH_FS_REGION_END=0x%X FLASH_FS_REGION_SIZE=%u",FLASH_FS_REGION_START,FLASH_FS_REGION_END,FLASH_FS_REGION_SIZE);


	SR_LOG(INFO,"FLASH_FOTA_REGION_START=0x%X  FLASH_FOTA_REGION_END=0x%X FLASH_FOTA_REGION_LEN=%u",FLASH_FOTA_REGION_START,FLASH_FOTA_REGION_END,FLASH_FOTA_REGION_LEN);


	SR_LOG(INFO,"NVRAM_PHYSICAL_BASE=0x%X  NVRAM_PHYSICAL_SIZE=%u",NVRAM_PHYSICAL_BASE,NVRAM_PHYSICAL_SIZE);


	SR_LOG(INFO,"FLASH_MEM_PLAT_INFO_NONXIP_ADDR=0x%X  FLASH_MEM_PLAT_INFO_SIZE=%u",FLASH_MEM_PLAT_INFO_NONXIP_ADDR,FLASH_MEM_PLAT_INFO_SIZE);


 
	return 0;

}
SR_SHELL_CMD_EXPORT(flash_layout, _FlashLayout);

