/* ---------------------------------------------------------------------------
 * diskio.h                                                     (C)ChaN, 2007
 * ---------------------------------------------------------------------------
 * Micro-key bv
 * Industrieweg 28, 9804 TG Noordhorn
 * Postbus 92, 9800 AB Zuidhorn
 * The Netherlands
 * Tel: +31 594 503020
 * Fax: +31 594 505825
 * Email: support@microkey.nl  
 * Web: www.microkey.nl
 * ---------------------------------------------------------------------------
 * Description: Low level disk interface modlue include file  R0.06
 * ---------------------------------------------------------------------------
 * Version(s):  0.2, Aug 11, 2008, MMi
 *                  Edited to fit into LAN_2636 Project
 *                  Change disk_write and disk_read functions to work with MMC
 *  
 *              0.1, 2007 ChanN
 *                  Creation
 * ---------------------------------------------------------------------------
 */
#ifndef DISKIO_H_
#define DISKIO_H_    
/* ---------------------------------------------------------------------------
 * System include files.
 * ---------------------------------------------------------------------------
 */
#include "LPC23xx.h"
#include "types.h"
/* ---------------------------------------------------------------------------
 * Application include files.
 * ---------------------------------------------------------------------------
 */

/* ---------------------------------------------------------------------------
 * Constant and macro definitions.
 * ---------------------------------------------------------------------------
 */
#define _READONLY           0           /* 1: Read-only mode                */
#define _USE_IOCTL	        1

/* Disk Status Bits (DSTATUS) */
#define STA_NOINIT		    0x01	    /* Drive not initialized            */
#define STA_NODISK		    0x02	    /* No medium in the drive           */
#define STA_PROTECT	        0x04	    /* Write protected                  */

/* Generic command */
#define CTRL_SYNC           0           /* Mandatory for read/write         */
#define GET_SECTOR_COUNT    1           /* Mandatory for only f_mkfs()      */
#define GET_SECTOR_SIZE     2
#define GET_BLOCK_SIZE      3           /* Mandatory for only f_mkfs()      */
#define CTRL_POWER          4
#define CTRL_LOCK           5
#define CTRL_EJECT          6
/* MMC/SDC command */
#define MMC_GET_TYPE        10
#define MMC_GET_CSD         11
#define MMC_GET_CID         12
#define MMC_GET_OCR         13
#define MMC_GET_SDSTAT      14
/* ATA/CF command */
#define ATA_GET_REV         20
#define ATA_GET_MODEL       21
#define ATA_GET_SN          22
/* ---------------------------------------------------------------------------
 * Type definitions.
 * ---------------------------------------------------------------------------
 */
/* Status of Disk Functions */
typedef UINT8 DSTATUS;

/* Results of Disk Functions */
typedef enum
    {
    RES_OK = 0,                         /* 0: Successful                    */
    RES_ERROR,                          /* 1: R/W Error                     */
    RES_WRPRT,                          /* 2: Write Protected               */
    RES_NOTRDY,                         /* 3: Not Ready                     */
    RES_PARERR                          /* 4: Invalid Parameter             */
    } DRESULT;
/* ---------------------------------------------------------------------------
 * Variable declarations.
 * ---------------------------------------------------------------------------
 */

/* ---------------------------------------------------------------------------
 * Function declarations.
 * ---------------------------------------------------------------------------
 */

/* ---------------------------------------------------------------------------
 * Function: disk_initialize
 * 
 * Function to call initialisations for different devices. This function is
 * needed by the filesystem but is deactivated because for this project, no
 * multible devices are used. Function always returns "Operation suceeded"
 * 
 * Parameters: UINT8 drive - Device number
 * 
 * Return : DSTATUS - Initialisation status of desired device
 * ---------------------------------------------------------------------------
 */
    DSTATUS disk_initialize(UINT8 drive);


/* ---------------------------------------------------------------------------
 * Function: disk_status
 * 
 * Function to call status calls for different devices. This function is
 * needed by the filesystem but is deactivated because for this project, no
 * multible devices are used. Function always returns "Operation suceeded"
 * 
 * Parameters: UINT8 drive - Device number
 * 
 * Return : DSTATUS - Status of desired device
 * ---------------------------------------------------------------------------
 */
DSTATUS disk_status(UINT8 drive);


/* ---------------------------------------------------------------------------
 * Function: disk_ioctrl
 * 
 * Function to call controllings for different devices. This function is
 * needed by the filesystem but is deactivated because for this project, no
 * multible devices are used. Function always returns "Operation suceeded"
 * 
 * Parameters:  UINT8 drive - Device number
 *              UINT8 ctrl  - A certain command
 *              void *buff  - A function pointer
 * 
 * Return : DRESULT - Initialisation status of desired device
 * ---------------------------------------------------------------------------
 */
DRESULT disk_ioctl(UINT8 drive, UINT8 ctrl, void *buff);


/* ---------------------------------------------------------------------------
 * Function: disk_read
 * 
 * Function to read from the memory card. 
 * 
 * Parameters:  UINT8 drive   - Device number
 *              pUINT8 buffer - Pointer to position to storage read data
 *              UINT32 sector - Sector an that reading should be started
 *              UINT8 count   - Number of following sectors to read
 * 
 * Return : DSTATUS - Initialisation status of desired device
 * ---------------------------------------------------------------------------
 */
DRESULT disk_read(UINT8 drive, pUINT8 buffer, UINT32 sector, UINT8 count);


/* ---------------------------------------------------------------------------
 * Function: disk_write
 * 
 * Function to write to the memory card. 
 * 
 * Parameters:  UINT8 drive   - Device number
 *              pUINT8 buffer - Pointer to position where data is stored
 *              UINT32 sector - Sector an that writing should be started
 *              UINT8 count   - Number of following sectors to write on
 * 
 * Return : DSTATUS - Initialisation status of desired device
 * ---------------------------------------------------------------------------
 */
#if	_READONLY == 0
DRESULT disk_write(UINT8 drive, pUINT8 buffer, UINT32 sector, UINT8 count);
#endif

#endif /*FAT_TIME_H_*/
