/* USER CODE BEGIN Header */
/**
 ******************************************************************************
  * @file    user_diskio.c
  * @brief   This file includes a diskio driver skeleton to be completed by the user.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under Ultimate Liberty license
  * SLA0044, the "License"; You may not use this file except in compliance with
  * the License. You may obtain a copy of the License at:
  *                             www.st.com/SLA0044
  *
  ******************************************************************************
  */
 /* USER CODE END Header */

#ifdef USE_OBSOLETE_W25Q_CODE_SECTION_0
/*
 * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0)
 * To be suppressed in the future.
 * Kept to ensure backward compatibility with previous CubeMx versions when
 * migrating projects.
 * User code previously added there should be copied in the new user sections before
 * the section contents can be deleted.
 */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
#endif

/* USER CODE BEGIN DECL */

/* Includes ------------------------------------------------------------------*/
#include <string.h>
#include "ff_gen_drv.h"
#include "obj_spi_sd_stm32.h"
#include "obj_spi_w25qxx.h"
#include "obj_hal_w25qxx.h"
#include "obj_soft_w25qxx.h"
#include "func_spi_w25qxx.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

#define SD_CARD	 	0  		//SD卡,卷标为0
#define EX_FLASH 	1			//外部spi flash,卷标为1
#define EX_NAND  	2			//外部nand flash,卷标为2

//对于W25Q128
//#define FLASH_SECTOR_SIZE 	512	
//#define FLASH_SECTOR_COUNT 	1024*16*2	//W25Q256,前25M字节给FATFS占用	
//#define FLASH_BLOCK_SIZE   	8     		//每个BLOCK有8个扇区		
/* Private variables ---------------------------------------------------------*/
/* Disk status */
static volatile DSTATUS Stat = STA_NOINIT;

/* USER CODE END DECL */

/* Private function prototypes -----------------------------------------------*/
DSTATUS W25Q_initialize (BYTE pdrv);
DSTATUS W25Q_status (BYTE pdrv);
DRESULT W25Q_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count);
#if _USE_WRITE == 1
  DRESULT W25Q_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count);
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
  DRESULT W25Q_ioctl (BYTE pdrv, BYTE cmd, void *buff);
#endif /* _USE_IOCTL == 1 */

Diskio_drvTypeDef  W25Q_Driver =
{
  W25Q_initialize,
  W25Q_status,
  W25Q_read,
#if  _USE_WRITE
  W25Q_write,
#endif  /* _USE_WRITE == 1 */
#if  _USE_IOCTL == 1
  W25Q_ioctl,
#endif /* _USE_IOCTL == 1 */
};

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Initializes a Drive
  * @param  pdrv: Physical drive number (0..)
  * @retval DSTATUS: Operation status
  */
DSTATUS W25Q_initialize (
	BYTE pdrv           /* Physical drive nmuber to identify the drive */
)
{
  /* USER CODE BEGIN INIT */
	uint8_t res=0;	 

	func_w25q_init();  //W25QXX初始化	
	
	if(res)
	{
		return  STA_NOINIT;
	}
	else 
	{
		return 0; //初始化成功 
	}
	
  /* USER CODE END INIT */
}

/**
  * @brief  Gets Disk Status
  * @param  pdrv: Physical drive number (0..)
  * @retval DSTATUS: Operation status
  */
DSTATUS W25Q_status (
	BYTE pdrv       /* Physical drive number to identify the drive */
)
{
  /* USER CODE BEGIN STATUS */

	uint8_t res=0;	    

	if(res)
	{
		return  STA_NOINIT;
	}
	else 
	{
		return 0; 
	}

  /* USER CODE END STATUS */
}
//uint8_t data_buf[3][0x1000]  = {0};
/**
  * @brief  Reads Sector(s)
  * @param  pdrv: Physical drive number (0..)
  * @param  *buff: Data buffer to store read data
  * @param  sector: Sector address (LBA)
  * @param  count: Number of sectors to read (1..128)
  * @retval DRESULT: Operation result
  */
DRESULT W25Q_read (
	BYTE pdrv,      /* Physical drive nmuber to identify the drive */
	BYTE *buff,     /* Data buffer to store read data */
	DWORD sector,   /* Sector address in LBA */
	UINT count      /* Number of sectors to read */
)
{

		uint8_t res=0; 
    if (!count)return RES_PARERR;//count不能等于0，否则返回参数错误		 	 

		W25QXX_Read(buff, sector * SPI_FLASH_SECTOR_SIZE,  count * SPI_FLASH_SECTOR_SIZE);

   //处理返回值，将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res==0x00)return RES_OK;	 
    else return RES_ERROR;	 

}


/**
  * @brief  Writes Sector(s)
  * @param  pdrv: Physical drive number (0..)
  * @param  *buff: Data to be written
  * @param  sector: Sector address (LBA)
  * @param  count: Number of sectors to write (1..128)
  * @retval DRESULT: Operation result
  */
#if _USE_WRITE == 1
DRESULT W25Q_write (
	BYTE pdrv,          /* Physical drive nmuber to identify the drive */
	const BYTE *buff,   /* Data to be written */
	DWORD sector,       /* Sector address in LBA */
	UINT count          /* Number of sectors to write */
)
{
  /* USER CODE BEGIN WRITE */
  /* USER CODE HERE */

	uint8_t res=0;  
	
  if (!count)return RES_PARERR;//count不能等于0，否则返回参数错误		 	
	
	W25QXX_Write((uint8_t*)buff, sector * SPI_FLASH_SECTOR_SIZE,  count * SPI_FLASH_SECTOR_SIZE);

	//处理返回值，将SPI_SD_driver.c的返回值转成ff.c的返回值
	if(res == 0x00)
	{
		return RES_OK;	
	} 
	else 
	{
		return RES_ERROR;
	}	

  /* USER CODE END WRITE */
}
#endif /* _USE_WRITE == 1 */

/**
  * @brief  I/O control operation
  * @param  pdrv: Physical drive number (0..)
  * @param  cmd: Control code
  * @param  *buff: Buffer to send/receive control data
  * @retval DRESULT: Operation result
  */
#if _USE_IOCTL == 1
DRESULT W25Q_ioctl (
	BYTE pdrv,      /* Physical drive nmuber (0..) */
	BYTE cmd,       /* Control code */
	void *buff      /* Buffer to send/receive control data */
)
{
  /* USER CODE BEGIN IOCTL */
	uint8_t res=RES_OK;  		

	res = func_w25q_disk_ioctl(pdrv, cmd, buff);

	//处理返回值，将SPI_SD_driver.c的返回值转成ff.c的返回值
	if(res == 0x00)
	{
		return RES_OK;	
	} 
	else 
	{
		return RES_ERROR;
	}	
		
  /* USER CODE END IOCTL */
}

#endif /* _USE_IOCTL == 1 */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
