/* Cypress West Bridge API header file (cyasstorage.h)
## ===========================
## Copyright (C) 2010  Cypress Semiconductor
##
## This program is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License
## as published by the Free Software Foundation; either version 2
## of the License, or (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street
## Fifth Floor, Boston, MA  02110-1301, USA.
## ===========================
*/

#ifndef _INCLUDED_CYASSTORAGE_H_
#define _INCLUDED_CYASSTORAGE_H_

#include "cyasmedia.h"
#include "cyasmisc.h"
#include "cyas_cplus_start.h"


/*@@Storage APIs
  Summary
  This section documents the storage APIs supported by the
  West Bridge API.

  Description
  The storage API is based on some specific concepts which
  are referenced here.
  * <LINK Storage API Overview>
  * Addressing
  * Ownership
  * <LINK Asynchronous Versus Synchronous Operation>
*/

/*@@Storage API Overview
  Summary
  Storage devices are identified by media type. Each media
  type is considered a  single logical device.

  Description
  Each media type has a consistent block size and consists
  of a set of logical blocks numbered from 0 to N - 1 where
  N is the size of the
  media type in blocks. The mass storage APIs defined below
  provide the
  capability to query for devices that are present, and
  read/write data to/from
  these devices.
*/

/*@@Addressing
  Summary
  Blocks within a storage device are address by a hierarchal
  block address.  This
  address consists of the bus number, physical device,
   logical unit, and finally
  block address.

  Description
  While currently only a single device of each media type
  is supported, the address
  space reserves space in the future for multiple devices
  of each type.  Therefore
  the second element of the address is the specific device
  being addressed within
  a given device type.  For this release of the software,
  this value will always be
  zero to address the first device.

  The third element of the address is the logical unit.
  A device being managed
  by West Bridge can be partitioned into multiple logical
  units.  This partition
  information is stored on each device itself.  Currently,
  one of the storage devices
  managed by West Bridge can be partitioned into two
  logical units.

  Finally a logical block address is given within the
  logical unit to address an
  individual block.
*/

/*@@Ownership
  Summary
  While West Bridge supports concurrent block level
  operations from both the USB port and
  the processor port, this is not desirable in most
  situations as the file system
  contained on the storage media cannot be accessed
  concurrently.  To insure access
  by only one of USB and the processor, the West Bridge
  API provides for ownership of storage
  devices based on media type.

  Description
  The processor requests ownership of a given media type
  by calling CyAsStorageClaim().
  The firmware in West Bridge releases control of the
  media and signals the processor through
  the event callback registered with
  CyAsStorageRegisterCallback().  The specific event is
  the CyAsStorageProcessor. The processor can later
  release the media via a call to
  CyAsStorageRelease().  This call is immediate and
  no callback is required.

  If the processor has claimed storage and the USB port
  is connected, West Bridge will need to
  claim the storage to manage the mass storage device.
  West Bridge requests the storage through
  the event callback registered with
  CyAsStorageRegisterCallback().  The specific event is
  CyAsStorageAntioch and is named as such to reflect
  the USB view of storage.  This callback
  is a request for the processor to release storage.
  The storage is not actually released
  until the processor calls CyAsStorageRelease().

  Note that the CyAsStorageAntioch is only sent when the
  USB storage device is enumerated and
  NOT at every USB operation.  The ownership of a given
  storage media type is assumed to belong
  to the processor until the USB connection is established.
  At that point, the storage ownership
  is transferred to West Bridge.  After the USB connection
  is broken, ownership can be transferred
  back to the processor.
*/

/*@@Asynchronous Versus Synchronous Operation
  Summary
  When read or write operations are performed to the
  storage devices, these operations may be
  synchronous or asynchronous.  A synchronous operation
  is an operation where the read or write
  operation is requested and the function does not return
  until the operation is complete.  This
  type of function is the easiest to use but does not
  provide for optimal usage of the P port processor time.

  Description
  An asynchronous operation is one where the function returns
  as soon as the request is started.
  The specific read and write request will complete at some
  time in the future and the P port
  processor will be notified via a callback function.  While
  asynchronous functions provide for
  much better usage of the CPU, these function have more
  stringent requirements for use.  First,
  any buffer use for data transfer must be valid from the
  function call to request the operation
  through when the callback function is called.  This basically
  implies that stack based buffers
  are not acceptable for asynchronous calls.  Second, error
  handling must be deferred until the
  callback function is called indicating any kind of error
  that may have occurred.
*/

/*@@Partitioning
  Summary
  West Bridge API and firmware support the creation of up to
  two logical partitions on one
  of the storage devices that are managed by West Bridge.  The
  partitions are managed through
  the CyAsStorageCreatePPartition and CyAsStorageRemovePPartition
  APIs.

  Description
  The CyAsStorageCreatePPartition API is used to divide the total
  storage on a storage
  device into two logical units or partitions.  Since the partition
  information is stored
  on the storage device in a custom format, partitions should
  only be created on fixed
  storage devices (i.e., no removable SD/MMC cards).  Any data
  stored on the device
  before the creation of the partition, is liable to be lost when
  a partition is created.

  The CyAsStorageRemovePPartition API is used to remove the
  stored partition information,
  so that all of the device's capacity is treated as a single
  partition again.

  When a storage device with two partitions (units) is being
  enumerated as a mass storage
  device through the West Bridge, it is possible to select the
  partitions to be made
  visible to the USB host.  This is done through the
  CyAsUsbSelectMSPartitions API.
*/

/*********************************
 * West Bridge Constants
 **********************************/

/* Summary
   This constants indicates a raw device access to the read/write
   functions

   Description
   When performing reading and writing operations on the
   storage devices attached
   to West Bridge, there are cases where writes need to
   happen to raw devices, versus
   the units contained within a device.  This is
   specifically required to manage
   the partitions within physical devices.  This constant
   is used in calls to
   CyAsStorageRead(), CyAsStorageReadAsync(),
   CyAsStorageWrite() and
   CyAsStorageWriteAsync(), to indicate that the raw
   physical device is being
   accessed and not any specific unit on the device.

   See Also
   * CyAsStorageRead
   * CyAsStorageReadAsync
   * CyAsStorageWrite
   * CyAsStorageWriteAsync
*/
#define CY_AS_LUN_PHYSICAL_DEVICE (0xffffffff)

/* Summary
   This constant represents the maximum DMA burst length
   supported on a storage endpoint

   Description
   West Bridge reserves separate endpoints for accessing
   storage media through the
   CyAsStorageRead() and CyAsStorageWrite() calls. The
   maximum size of these
   endpoints is always 512 bytes, regardless of status
   and speed of the USB
   connection.
*/
#define CY_AS_STORAGE_EP_SIZE (512)

/********************************
 * West Bridge Types
 *******************************/

/* Summary
   This type indicates the type of event in an event
   callback from West Bridge

   Description
   At times West Bridge needs to inform the P port
   processor of events that have
   occurred.  These events are asynchronous to the
   thread of control on the P
   port processor and as such are generally delivered
   via a callback function that
   is called as part of an interrupt handler.  This
   type indicates the resonse for
   the call to the callback function.

   See Also
   * CyAsStorageEventCallback
   * CyAsStorageRegisterCallback
*/
typedef enum cy_as_storage_event {
	/*  This event occurs when the West Bridge device has
	detected a USB connect and has enumerated the
	storage controlled by west bridge to the USB port.
	this event is the signal that the processor
	needs to release the storage media. west bridge will
	not have control of the storage media until the
	processor calls cy_as_release_storage() to release
	the specific media. */
	cy_as_storage_antioch,

	/*  This event occurs when the processor has requested
	ownership of a given media type and west bridge has
	released the media.  this event is an indicator
	that the transfer of ownership is complete and the
	processor now owns the given media type. */
	cy_as_storage_processor,

	/*  This event occurs when a removable media type has
	been removed. */
	cy_as_storage_removed,

	/*  This event occurs when a removable media type has
		been inserted. */
	cy_as_storage_inserted,

	/* This event occurs when the West Bridge device
	 * percieves an interrrupt from an SDIO card */
	cy_as_sdio_interrupt

} cy_as_storage_event;

/* Summary
   This type gives the type of the operation in a storage
   operation callback

   Description
   This type is used in the callback function for asynchronous
   operation.  This type indicates whether it is a
   CyAsStorageRead() or CyAsStorageWrite() operation that
   has completed.

   See Also
   * <LINK Asynchronous Versus Synchronous Operation>
   * CyAsStorageRead
   * CyAsStorageWrite
*/
typedef enum cy_as_oper_type {
	/* A data read operation */
	cy_as_op_read,
	/* A data write operation */
	cy_as_op_write
} cy_as_oper_type;

/* Summary
   This data structure describes a specific type of media

   Description
   This data structure is the return value from the
   CyAsStorageQueryDevice function.  This structure provides
   information about the specific storage device being queried.

   See Also
   * CyAsStorageQueryDevice
*/
typedef struct cy_as_device_desc {
	/* Type of device */
	cy_as_media_type   type;
	/* Is the device removable */
	cy_bool		removable;
	/* Is the device writeable */
	cy_bool		writeable;
	/* Basic block size for device */
	uint16_t		block_size;
	/* Number of LUNs on the device */
	uint32_t		number_units;
	/* Is the device password locked */
	cy_bool		locked;
	 /* Size in bytes of an Erase Unit. Block erase operation
	is only supported for SD storage, and the erase_unit_size
	is invalid for all other kinds of storage. */
	uint32_t		erase_unit_size;
} cy_as_device_desc;

/* Summary
   This data structure describes a specific unit on a
   specific type of media

   Description
   This data structure is the return value from the
   CyAsStorageQueryUnit function. This structure provides
   information about the specific unit.

   See Also
   * CyAsStorageQueryUnit
*/
typedef struct cy_as_unit_desc {
	/* Type of device */
	cy_as_media_type type;
	/* Basic block size for device */
	uint16_t block_size;
	/* Physical start block for LUN */
	uint32_t start_block;
	/* Number of blocks in the LUN */
	uint32_t unit_size;
} cy_as_unit_desc;

/* Summary
   This function type defines a callback to be called after an
   asynchronous operation

   Description
   This function type defines a callback function that is called
   at the completion of any asynchronous read or write operation.

   See Also
   * CyAsStorageReadAsync()
   * CyAsStorageWriteAsync()
*/
typedef void (*cy_as_storage_callback)(
	/* Handle to the device completing the storage operation */
	cy_as_device_handle handle,
	/* The bus completing the operation */
	cy_as_bus_number_t bus,
	/* The device completing the operation */
	uint32_t device,
	/* The unit completing the operation */
	uint32_t unit,
	/* The block number of the completed operation */
	uint32_t block_number,
	/* The type of operation */
	cy_as_oper_type op,
	/* The error status */
	cy_as_return_status_t status
	);

/* Summary
   This function type defines a callback to be called in the
   event of a storage related event

   Description
   At times West Bridge needs to inform the P port processor
   of events that have
   occurred.  These events are asynchronous to the thread of
   control on the P
   port processor and as such are generally delivered via a
   callback function that
   is called as part of an interrupt handler.  This type
   defines the type of function
   that must be provided as a callback function.

   See Also
   * CyAsStorageEvent
   * CyAsStorageRegisterCallback
*/
typedef void (*cy_as_storage_event_callback)(
	/* Handle to the device sending the event notification */
	cy_as_device_handle handle,
	/* The bus where the event happened */
	cy_as_bus_number_t  bus,
	/* The device where the event happened */
	uint32_t device,
	/* The event type */
	cy_as_storage_event evtype,
	/* Event related data */
	void *evdata
	);

/* Summary
   This function type defines a callback to be called after
   an asynchronous sdio operation

   Description
   The Callback function is called at the completion of an
   asynchronous sdio read or write operation.

   See Also
   * CyAsSdioExtendedRead()
   * CyAsSdioExtendedWrite()
*/
typedef void (*cy_as_sdio_callback)(
	/* Handle to the device completing the storage operation */
	cy_as_device_handle handle,
	/* The bus completing the operation */
	cy_as_bus_number_t bus,
	/* The device completing the operation */
	uint32_t device,
	/* The function number of the completing the operation.
	if the status of the operation is either CY_AS_ERROR_IO_ABORTED
	or CY_AS_IO_SUSPENDED then the most significant word parameter will
	contain the number of blocks still pending. */
	uint32_t function,
	/* The base address of the completed operation */
	uint32_t address,
	/* The type of operation */
	cy_as_oper_type op,
	/* The status of the operation */
	cy_as_return_status_t status
	);

/* Summary
   Enumeration of SD/MMC card registers that can be read
   through the API.

   Description
   Some of the registers on the SD/MMC card(s) attached to the
   West Bridge can be read through the API layers. This type
   enumerates the registers that can be read.

   See Also
   * CyAsStorageSDRegisterRead
 */
typedef enum cy_as_sd_card_reg_type {
	cy_as_sd_reg_OCR = 0,
	cy_as_sd_reg_CID,
	cy_as_sd_reg_CSD
} cy_as_sd_card_reg_type;

/* Summary
   Struct encapsulating parameters and return values for a
   CyAsStorageQueryDevice call.

   Description
   This struct holds the input parameters and the return values
   for an asynchronous CyAsStorageQueryDevice call.

   See Also
   * CyAsStorageQueryDevice
 */
typedef struct cy_as_storage_query_device_data {
	/* The bus with the device to query */
	cy_as_bus_number_t	bus;
	/* The logical device number to query */
	uint32_t		device;
	/* The return value for the device descriptor */
	cy_as_device_desc	 desc_p;
} cy_as_storage_query_device_data;


/* Summary
   Struct encapsulating parameters and return values
   for a CyAsStorageQueryUnit call.

   Description
   This struct holds the input parameters and the return
   values for an asynchronous CyAsStorageQueryUnit call.

   See Also
   * CyAsStorageQueryUnit
 */
typedef struct cy_as_storage_query_unit_data {
	/* The bus with the device to query */
	cy_as_bus_number_t	bus;
	/* The logical device number to query */
	uint32_t			device;
	/* The unit to query on the device */
	uint32_t			unit;
	/* The return value for the unit descriptor */
	cy_as_unit_desc	 desc_p;
} cy_as_storage_query_unit_data;

/* Summary
   Struct encapsulating the input parameter and return
   values for a CyAsStorageSDRegisterRead call.

   Description
   This struct holds the input parameter and return
   values for an asynchronous CyAsStorageSDRegisterRead
   call.

   See Also
   * CyAsStorageSDRegisterRead
 */
typedef struct cy_as_storage_sd_reg_read_data {
	/* Pointer to the result buffer. */
	uint8_t *buf_p;
	/* Length of data to be copied in bytes. */
	uint8_t  length;
} cy_as_storage_sd_reg_read_data;

/* Summary
   Controls which pins are used for card detection

   Description
   When a StorageDeviceControl call is made to enable or
   disable card detection this enum is passed in to
   control which pin is used for the detection.

   See Also
   * CyAsStorageDeviceControl
*/
typedef enum cy_as_storage_card_detect {
	cy_as_storage_detect_GPIO,
	cy_as_storage_detect_SDAT_3
} cy_as_storage_card_detect;

#ifndef __doxygen__
#define cy_as_storage_detect_GPIO_0 cy_as_storage_detect_GPIO

/* Length of OCR value in bytes. */
#define CY_AS_SD_REG_OCR_LENGTH		 (4)
/* Length of CID value in bytes. */
#define CY_AS_SD_REG_CID_LENGTH		 (16)
/* Length of CSD value in bytes. */
#define CY_AS_SD_REG_CSD_LENGTH		 (16)
/* Max. length of register response in words. */
#define CY_AS_SD_REG_MAX_RESP_LENGTH	(10)

#endif

/* Summary
   This data structure is the data passed via the evdata
   paramater on a usb event callback for the mass storage
   device progress event.

   Description
   This data structure reports the number of sectors that have
   been written and read on the USB mass storage device since
   the last event report.  The corresponding event is only sent
   when either the number of writes, or the number of reads has
   crossed a pre-set threshold.

   See Also
   * CyAsUsbEventCallback
   * CyAsUsbRegisterCallback
*/
typedef struct cy_as_m_s_c_progress_data {
	/* Number of sectors written since the last event. */
	uint32_t wr_count;
	/* Number of sectors read since the last event. */
	uint32_t rd_count;
} cy_as_m_s_c_progress_data;

/* Summary
Flag to set Direct Write operation to read back from the
address written to.


 See Also
 *CyAsSdioDirectWrite()
*/
#define CY_SDIO_RAW	(0x01)


/* Summary
Flag to set Extended Read and Write to perform IO
using a FIFO i.e. read or write from the specified
address only.

 See Also
 *CyAsSdioExtendedRead()
 *CyAsSdioExtendedWrite()
*/
#define CY_SDIO_OP_FIFO (0x00)

/* Summary
Flag to set Extended Read and Write to perform incremental
IO using the address provided as the base address.


 See Also
 *CyAsSdioExtendedRead()
 *CyAsSdioExtendedWrite()
*/
#define CY_SDIO_OP_INCR		 (0x02)

/* Summary
Flag to set Extended Read and Write to Block Mode operation

 See Also
 *CyAsSdioExtendedRead()
 *CyAsSdioExtendedWrite()
*/
#define CY_SDIO_BLOCKMODE	   (0x04)

/* Summary
Flag to set Extended Read and Write to Byte Mode operation

 See Also
 *CyAsSdioExtendedRead()
 *CyAsSdioExtendedWrite()
*/
#define CY_SDIO_BYTEMODE		(0x00)

/* Summary
Flag to force re/initialization of a function.

Description
If not set a call to CyAsSdioInitFunction()
will not initialize a function that has been previously
initialized.
 See Also
 *CyAsSdioInitFunction()
 */
#define CY_SDIO_FORCE_INIT	  (0x40)

/* Summary
Flag to re-enable the SDIO interrupts.

Description
Used with a direct read or direct write
after the Interrupt triggerred by SDIO has been serviced
and cleared to reset the West Bridge Sdio Interrupt.
 See Also
 *CyAsSdioDirectRead()
 *CyAsSdioDirectWrite()
*/

#define CY_SDIO_REARM_INT	   (0x80)


/* Summary
   Flag to check if 4 bit support is enabled on a
   low speed card
   See Also
   <link CyAsSDIOCard::card_capability>*/
#define CY_SDIO_4BLS	(0x80)

/* Summary
   Flag to check if card is a low speed card
   See Also
   <link CyAsSDIOCard::card_capability>	  */
#define CY_SDIO_LSC	 (0x40)

/* Summary
   Flag to check if interrupt during multiblock data
   transfer is enabled
   See Also
   <link CyAsSDIOCard::card_capability>*/
#define CY_SDIO_E4MI	(0x20)

/* Summary
   Flag to check if interrupt during multiblock data
   transfer is supported
   See Also
   <link CyAsSDIOCard::card_capability>	*/
#define CY_SDIO_S4MI	(0x10)

/* Summary
   Flag to check if card supports function suspending.
   See Also
   <link CyAsSDIOCard::card_capability>	 */
#define CY_SDIO_SBS	 (0x08)

/* Summary
   Flag to check if card supports SDIO Read-Wait
   See Also
   <link CyAsSDIOCard::card_capability>	 */
#define CY_SDIO_SRW	 (0x04)

/* Summary
   Flag to check if card supports multi-block transfers
   See Also
   <link CyAsSDIOCard::card_capability>	*/
#define CY_SDIO_SMB	 (0x02)

/* Summary
   Flag to check if card supports Direct IO commands
   during execution of an Extended
   IO function
   See Also
   <link CyAsSDIOCard::card_capability>*/
#define CY_SDIO_SDC	 (0x01)

/* Summary
   Flag to check if function has a CSA area.
   See Also
   <link CyAsSDIOFunc::csa_bits> */
#define CY_SDIO_CSA_SUP		 (0x40)

/* Summary
   Flag to check if CSA access is enabled.
   See Also
   <link CyAsSDIOFunc::csa_bits> */
#define CY_SDIO_CSA_EN		  (0x80)

/* Summary
   Flag to check if CSA is Write protected.
   See Also
   <link CyAsSDIOFunc::csa_bits> */
#define CY_SDIO_CSA_WP		  (0x01)

/* Summary
   Flag to check if CSA formatting is prohibited.
   See Also
   <link CyAsSDIOFunc::csa_bits>*/
#define CY_SDIO_CSA_NF		  (0x02)

/* Summary
   Flag to check if the function allows wake-up from low
   power mode using some vendor specific method.
   See Also
   <link CyAsSDIOFunc::wakeup_support>*/
#define CY_SDIO_FN_WUS		  (0x01)


/* Summary
   This data structure stores SDIO function 0
   parameters for a SDIO card
*/
typedef struct cy_as_sdio_card {
	/* Number of functions present on the card. */
	uint8_t	 num_functions;
	/* Memory present(Combo card) or not */
	uint8_t	 memory_present;
	/* 16 bit manufacturer ID */
	uint16_t	manufacturer__id;
	/* Additional vendor specific info */
	uint16_t	manufacturer_info;
	/* Max Block size for function 0 */
	uint16_t	maxblocksize;
	/* Block size used for function 0 */
	uint16_t	blocksize;
	/* SDIO version supported by the card */
	uint8_t	 sdio_version;
	/* Card capability flags */
	uint8_t	 card_capability;
} cy_as_sdio_card;

/* Summary
   This data structure stores SDIO function 1-7 parameters
   for a SDIO card
*/
typedef struct cy_as_sdio_func {
	/* SDIO function code. 0 if non standard function */
	uint8_t	 function_code;
	/* Extended function type code for non-standard function */
	uint8_t	 extended_func_code;
	/* Max IO Blocksize supported by the function */
	uint16_t	maxblocksize;
	/* IO Blocksize used by the function */
	uint16_t	blocksize;
	/* 32 bit product serial number for the function */
	uint32_t	card_psn;
	/* Code storage area variables */
	uint8_t	 csa_bits;
	/* Function wake-up support */
	uint8_t	 wakeup_support;
} cy_as_sdio_func;

/***********************************
 * West Bridge Functions
 ************************************/

/* Summary
   This function starts the West Bridge storage module.

   Description
   This function initializes the West Bridge storage software
   stack and readies this module to service storage related
   requests.  If the stack is already running, the reference
   count for the stack is incremented.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed in
   * CY_AS_ERROR_SUCCESS - the module started successfully
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_INVALID_RESPONSE

   See Also
   * CyAsStorageStop
*/
EXTERN cy_as_return_status_t
cy_as_storage_start(
	/* Handle to the device */
	cy_as_device_handle	handle,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback	cb,
	/* Client data to be passed to the callback */
	uint32_t		client
	);

/* Summary
   This function stops the West Bridge storage module.

   Description
   This function decrements the reference count for the
   storage stack and if this count is zero, the storage
   stack is shut down.  The shutdown frees all resources
   associated with the storage stack.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Notes
   While all resources associated with the storage stack
   will be freed is a shutdown occurs,
   resources associated with underlying layers of the
   software will not be freed if they
   are shared by the USB stack and the USB stack is
   active.  Specifically the DMA manager,
   the interrupt manager, and the West Bridge
   communications module are all shared by both the
   USB stack and the storage stack.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge
   *	device has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not
   *	been loaded into West Bridge
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - this module was shut
   *	down successfully
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING
   * CY_AS_ERROR_ASYNC_PENDING
   * CY_AS_ERROR_OUT_OF_MEMORY

   See Also
   * CyAsStorageStart
*/
EXTERN cy_as_return_status_t
cy_as_storage_stop(
	/* Handle to the device to configure */
	cy_as_device_handle	handle,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback	cb,
	/* Client data to be passed to the callback */
	uint32_t		client
	);

/* Summary
   This function is used to register a callback function
   for the storage API.

   Description
   At times West Bridge needs to inform the P port processor
   of events that have occurred.  These events are asynchronous
   to the thread of control on the P
   port processor and as such are generally delivered via a
   callback function that
   is called as part of an interrupt handler.  This function
   registers the callback
   function that is called when an event occurs.  Each call
   to this function
   replaces any old callback function with a new callback
   function supplied on
   the most recent call.  This function can also be called
   with a callback function
   of NULL in order to remove any existing callback function

   * Valid In Asynchronous Callback:YES

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has
   *	not been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle
   *	was passed in
   * CY_AS_ERROR_SUCCESS - the function was registered
   *	successfully
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running

   See Also
   * CyAsStorageEventCallback
   * CyAsStorageEvent
*/
EXTERN cy_as_return_status_t
cy_as_storage_register_callback(
	/* Handle to the device of interest */
	cy_as_device_handle			handle,
	/* The callback function to call for async storage events */
	cy_as_storage_event_callback	callback
	);

/* Summary
   This function claims a given media type.

   Description
   This function communicates to West Bridge that the
   processor wants control of the
   given storage media type.  Each media type can be
   claimed or released by the
   processor independently.  As the processor is the
   master for the storage,
   West Bridge should release control of the requested
   media as soon as possible and
   signal the processor via the CyAsStorageProcessor event.

   * Valid In Asynchronous Callback: NO

   Notes
   This function just notifies West Bridge that the storage
   is desired.  The storage
   has not actually been released by West Bridge until the
   registered callback function
   is called with the CyAsStorageProcessor event

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - this request was successfully
   *	transmitted to the West Bridge device
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_MEDIA
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_INVALID_RESPONSE
   * CY_AS_ERROR_NOT_ACQUIRED

   See Also:
   * CyAsStorageClaim
   * CyAsStorageRelease
*/
EXTERN cy_as_return_status_t
cy_as_storage_claim(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The bus to claim */
	cy_as_bus_number_t	 bus,
	/* The device to claim */
	uint32_t		 device,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback	cb,
	/* Client data to be passed to the callback */
	uint32_t		client
	);

/* Summary
   This function releases a given media type.

   Description
   This function communicates to West Bridge that the
   processor has released control of
   the given storage media type.  Each media type can
   be claimed or released by the
   processor independently.  As the processor is the
   master for the storage, West Bridge
   can now assume ownership of the media type.  No callback
   or event is generated.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle
   *	was passed in
   * CY_AS_ERROR_SUCCESS - the media was successfully
   *	released
   * CY_AS_ERROR_MEDIA_NOT_CLAIMED - the media was not
   *	claimed by the P port
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_MEDIA
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_INVALID_RESPONSE

   See Also
   * CyAsStorageClaim
*/
EXTERN cy_as_return_status_t
cy_as_storage_release(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The bus to release */
	cy_as_bus_number_t	 bus,
	/* The device to release */
	uint32_t		 device,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback	cb,
	/* Client data to be passed to the callback */
	uint32_t		client
	);

/* Summary
   This function information about the number of devices present
   on a given bus

   Description
   This function retrieves information about how many devices on
   on the given
   West Bridge bus.

   * Valid In Asynchronous Callback: NO

   Notes
   While the current implementation of West Bridge only
   supports one of logical device of
   each media type, future versions WestBridge/Antioch may
   support multiple devices.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_INVALID_RESPONSE

   See Also
   * CyAsStorageQueryDevice
   * CyAsStorageQueryUnit
*/
EXTERN cy_as_return_status_t
cy_as_storage_query_bus(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The bus to query */
	cy_as_bus_number_t		bus,
	/* The return value containing the number of
	devices present for this media type */
	uint32_t *count,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback	 cb,
	/* Client data to be passed to the callback */
	uint32_t client
	);

/* Summary
   This function information about the number of devices
   present for a given media type

   Description
   This function retrieves information about how many
   devices of a given media type are attached to West Bridge.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Notes
   While the current implementation of West Bridge only
   supports one of logical device of each media type, future
   versions West Bridge may support multiple devices.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_INVALID_RESPONSE

   See Also
   * CyAsStorageQueryMedia
   * CyAsMediaType
   * CyAsStorageQueryDevice
   * CyAsStorageQueryUnit
*/
EXTERN cy_as_return_status_t
cy_as_storage_query_media(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The type of media to query */
	cy_as_media_type		type,
	/* The return value containing the number of
	devices present for this media type */
	uint32_t *count,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback	 cb,
	/* Client data to be passed to the callback */
	uint32_t		client
	);

/* Summary
   This function returns information about a given device
   of a specific media type

   Description
   This function retrieves information about a device of a
   given type of media.  The function is called with a given
   media type and device and a pointer to a media descriptor
   (CyAsDeviceDesc).  This function fills in the data in the
   media descriptor to provide information about the
   attributes of the device of the given device.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Notes
   Currently this API only supports a single logical device
   of each media type.  Therefore the only acceptable value
   for the parameter device is zero (0).

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_NO_SUCH_MEDIA
   * CY_AS_ERROR_NO_SUCH_DEVICE
   * CY_AS_ERROR_INVALID_RESPONSE

   See Also
   * CyAsMediaType
   * CyAsStorageQueryMedia
   * CyAsStorageQueryUnit
   * CyAsDeviceDesc
*/
EXTERN cy_as_return_status_t
cy_as_storage_query_device(
	/* Handle to the device of interest */
	cy_as_device_handle		handle,
	/* Parameters and return value for the query call */
	cy_as_storage_query_device_data *data,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback		cb,
	 /* Client data to be passed to the callback */
	uint32_t			client
	);

/* Summary
   This function returns information about a given unit on a
   specific device

   Description
   This function retrieves information about a device of a
   given logical unit.  The function is called with a given
   media type, device address, unit address,  and a pointer
   to a unit descriptor (CyAsUnitDesc).  This function fills
   in the data in the unit descriptor to provide information
   about the attributes of the device of the given logical
   unit.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_NO_SUCH_DEVICE
   * CY_AS_ERROR_NO_SUCH_UNIT
   * CY_AS_ERROR_INVALID_RESPONSE


   See Also
   * CyAsMediaType
   * CyAsStorageQueryMedia
   * CyAsStorageQueryDevice
   * CyAsUnitDesc
*/
EXTERN cy_as_return_status_t
cy_as_storage_query_unit(
	/* Handle to the device of interest */
	cy_as_device_handle		handle,
	/* Parameters and return value for the query call */
	cy_as_storage_query_unit_data *data_p,
	/* Callback to be called when the operation is complete */
	cy_as_function_callback		cb,
	/* Client data to be passed to the callback */
	uint32_t			client
	);

/* Summary
   This function enables/disables the handling of SD/MMC card
   detection and SD/MMC write protection in West Bridge Firmware.

   Description
   If the detection of SD/MMC card insertion or removal is being
   done by the Processor directly, the West Bridge firmware needs
   to be instructed to disable the card detect feature. Also, if
   the hardware design does not use the SD_WP GPIO of the West
   Bridge to handle SD card's write protect notch, the handling
   of write protection if firmware should be disabled. This API
   is used to enable/disable the card detect and write protect
   support in West Bridge firmware.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Returns
   * CY_AS_ERROR_SUCCESS - the feature controls were
   *	set successfully
   * CY_AS_ERROR_NO_SUCH_BUS - the specified bus is invalid
   * CY_AS_ERROR_NOT_SUPPORTED - function not supported on
   *	the device in the specified bus
   * CY_AS_ERROR_IN_SUSPEND - the West Brdige device is in
   *	suspended mode
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_INVALID_HANDLE
   * CY_AS_ERROR_OUT_OF_MEMORY
   * CY_AS_ERROR_INVALID_RESPONSE

*/
EXTERN cy_as_return_status_t
cy_as_storage_device_control(
	/* Handle to the West Bridge device */
	cy_as_device_handle	handle,
	/* The bus to control */
	cy_as_bus_number_t	 bus,
	/* The device to control */
	uint32_t		 device,
	/* Enable/disable control for card detection */
	cy_bool		card_detect_en,
	/* Enable/disable control for write protect handling */
	cy_bool		write_prot_en,
	/* Control which pin is used for card detection */
	cy_as_storage_card_detect	config_detect,
	 /* Callback to be called when the operation is complete */
	cy_as_function_callback	 cb,
	/* Client data to be passed to the callback */
	uint32_t		client
		);

/* Summary
   This function reads one or more blocks of data from
   the storage system.

   Description
   This function synchronously reads one or more blocks
   of data from the given media
   type/device and places the data into the data buffer
   given.  This function does not
   return until the data is read and placed into the buffer.

   * Valid In Asynchronous Callback: NO

   Notes
   If the Samsung CEATA drive is the target for a
   read/write operation, the maximum
   number of sectors that can be accessed through a
   single API call is limited to 2047.
   Longer accesses addressed to a Samsung CEATA drive
   can result in time-out errors.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle
   *	was passed in
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified
   *	does not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified
   *	media/device pair does not exist
   * CY_AS_ERROR_NO_SUCH_UNIT - the unit specified
   *	does not exist
   * CY_AS_ERROR_ASYNC_PENDING - an async operation
   *	is pending
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was
   *	error in reading from the media
   * CY_AS_ERROR_MEDIA_WRITE_PROTECTED - the media is
   *	write protected
   * CY_AS_ERROR_INVALID_PARAMETER - Reads/Writes greater
   *	than 4095 logic blocks are not allowed

   See Also
   * CyAsStorageReadAsync
   * CyAsStorageWrite
   * CyAsStorageWriteAsync
   * CyAsStorageCancelAsync
   * <LINK Asynchronous Versus Synchronous Operation>
*/
EXTERN cy_as_return_status_t
cy_as_storage_read(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The bus to access */
	cy_as_bus_number_t		bus,
	/* The device to access */
	uint32_t		device,
	/* The unit to access */
	uint32_t		unit,
	/* The first block to access */
	uint32_t		block,
	/* The buffer where data will be placed */
	void *data_p,
	/* The number of blocks to be read */
	uint16_t		num_blocks
	);

/* Summary
   This function asynchronously reads one or more blocks of data
   from the storage system.

   Description
   This function asynchronously reads one or more blocks of
   data from the given media
   type/device and places the data into the data buffer given.
   This function returns
   as soon as the request is transmitted to the West Bridge
   device but before the data is
   available.  When the read is complete, the callback function
   is called to indicate the
   data has been placed into the data buffer.  Note that the
   data buffer must remain
   valid from when the read is requested until the callback
   function is called.

   * Valid In Asynchronous Callback: YES

   Notes
   If the Samsung CEATA drive is the target for a read/write
   operation, the maximum
   number of sectors that can be accessed through a single API
   call is limited to 2047.
   Longer accesses addressed to a Samsung CEATA drive can
   result in time-out errors.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle
   *	was passed in
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_ASYNC_PENDING - an async operation
   *	is pending
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error
   *	in reading from the media
   * CY_AS_ERROR_MEDIA_WRITE_PROTECTED - the media is
   *	write protected
   * CY_AS_ERROR_QUERY_DEVICE_NEEDED - Before an
   *	asynchronous read can be issue a call to
   * CyAsStorageQueryDevice must be made
   * CY_AS_ERROR_INVALID_PARAMETER - Reads/Writes greater
   * than 4095 logic blocks are not allowed

   See Also
   * CyAsStorageRead
   * CyAsStorageWrite
   * CyAsStorageWriteAsync
   * CyAsStorageCancelAsync
   * CyAsStorageQueryDevice
   * <LINK Asynchronous Versus Synchronous Operation>
*/
EXTERN cy_as_return_status_t
cy_as_storage_read_async(
	/* Handle to the device of interest */
	cy_as_device_handle handle,
	/* The bus to access */
	cy_as_bus_number_t	bus,
	/* The device to access */
	uint32_t device,
	/* The unit to access */
	uint32_t unit,
	/* The first block to access */
	uint32_t block,
	/* The buffer where data will be placed */
	void *data_p,
	/* The number of blocks to be read */
	uint16_t num_blocks,
	/* The function to call when the read is complete
	or an error occurs */
	cy_as_storage_callback		callback
	);

/* Summary
   This function writes one or more blocks of data
   to the storage system.

   Description
   This function synchronously writes one or more blocks of
   data to the given media/device.
   This function does not return until the data is written
   into the media.

   * Valid In Asynchronous Callback: NO

   Notes
   If the Samsung CEATA drive is the target for a read/write
   operation, the maximum
   number of sectors that can be accessed through a single
   API call is limited to 2047.
   Longer accesses addressed to a Samsung CEATA drive can
   result in time-out errors.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does
   *	not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified
   *	media/device pair does not exist
   * CY_AS_ERROR_NO_SUCH_UNIT - the unit specified
   *	does not exist
   * CY_AS_ERROR_ASYNC_PENDING - an async operation
   *	is pending
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error
   *	in reading from the media
   * CY_AS_ERROR_MEDIA_WRITE_PROTECTED - the media is
   *	write protected
   * CY_AS_ERROR_INVALID_PARAMETER - Reads/Writes greater
   *	than 4095 logic blocks are not allowed

   See Also
   * CyAsStorageRead
   * CyAsStorageReadAsync
   * CyAsStorageWriteAsync
   * CyAsStorageCancelAsync
   * <LINK Asynchronous Versus Synchronous Operation>
*/
EXTERN cy_as_return_status_t
cy_as_storage_write(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The bus to access */
	cy_as_bus_number_t bus,
	/* The device to access */
	uint32_t device,
	/* The unit to access */
	uint32_t unit,
	/* The first block to access */
	uint32_t block,
	/* The buffer containing the data to be written */
	void *data_p,
	/* The number of blocks to be written */
	uint16_t num_blocks
	);

/* Summary
   This function asynchronously writes one or more blocks
   of data to the storage system

   Description
   This function asynchronously writes one or more blocks of
   data to the given media type/device.
   This function returns as soon as the request is transmitted
   to the West Bridge device
   but before the data is actually written.  When the write is
   complete, the callback
   function is called to indicate the data has been physically
   written into the media.

   * Valid In Asynchronous Callback: YES

   Notes
   If the Samsung CEATA drive is the target for a read/write
   operation, the maximum
   number of sectors that can be accessed through a single API
   call is limited to 2047.
   Longer accesses addressed to a Samsung CEATA drive can
   result in time-out errors.

   Notes
   The data buffer must remain valid from when the write is
   requested until the callback function is called.

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has
   *	not been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed in
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_ASYNC_PENDING - an async operation is
   *	pending
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   *	reading from the media
   * CY_AS_ERROR_MEDIA_WRITE_PROTECTED - the media is write
   *	protected
   * CY_AS_ERROR_QUERY_DEVICE_NEEDED - A query device call is
   *	required before async writes are allowed
   * CY_AS_ERROR_INVALID_PARAMETER - Reads/Writes greater
   *	than 4095 logic blocks are not allowed

   See Also
   * CyAsStorageRead
   * CyAsStorageWrite
   * CyAsStorageReadAsync
   * CyAsStorageCancelAsync
   * CyAsStorageQueryDevice
   * <LINK Asynchronous Versus Synchronous Operation>
*/
EXTERN cy_as_return_status_t
cy_as_storage_write_async(
	/* Handle to the device of interest */
	cy_as_device_handle	handle,
	/* The bus to access */
	cy_as_bus_number_t	bus,
	/* The device to access */
	uint32_t	device,
	/* The unit to access */
	uint32_t	unit,
	/* The first block to access */
	uint32_t	block,
	/* The buffer where the data to be written is stored */
	void *data_p,
	/* The number of blocks to be written */
	uint16_t num_blocks,
	/* The function to call when the write is complete
		or an error occurs */
	cy_as_storage_callback	callback
	);

/* Summary
   This function aborts any outstanding asynchronous operation

   Description
   This function aborts any asynchronous block read or block
   write operation.  As only a single asynchronous block read
   or write operation is possible at one time, this aborts
   the single operation in progress.

   * Valid In Asynchronous Callback: YES

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed in
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_OPERATION_PENDING - no asynchronous
   *	operation is pending

   See Also
   * CyAsStorageRead
   * CyAsStorageReadAsync
   * CyAsStorageWrite
   * CyAsStorageWriteAsync
   * <LINK Asynchronous Versus Synchronous Operation>
*/
EXTERN cy_as_return_status_t
cy_as_storage_cancel_async(
	/* Handle to the device with outstanding async request */
	cy_as_device_handle		handle
	);

/* Summary
   This function is used to read the content of SD registers

   Description
   This function is used to read the contents of CSD, CID and
   CSD registers of the SD Card.

   * Valid In Asynchronous Callback: YES (if cb supplied)
   * Nestable: YES

   Returns
   * CY_AS_ERROR_SUCCESS - the read operation was successful
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed in
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has not
   *	been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   *	started
   * CY_AS_ERROR_IN_SUSPEND - The West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device pair
   *	does not exist
   * CY_AS_ERROR_INVALID_PARAMETER - The register type is invalid
   *	or the media is not supported on the bus
   * CY_AS_ERROR_OUT_OF_MEMORY - failed to get memory to process
   *	request
   * CY_AS_ERROR_INVALID_RESPONSE - communication failure with
   *	West Bridge firmware

   See Also
   * CyAsStorageSDRegReadData
 */
EXTERN cy_as_return_status_t
cy_as_storage_sd_register_read(
	/* Handle to the West Bridge device. */
	cy_as_device_handle	handle,
	/* The bus to query */
	cy_as_bus_number_t	bus,
	/* The device to query */
	uint8_t	device,
	/* The type of register to read. */
	cy_as_sd_card_reg_type reg_type,
	/* Output data buffer and length. */
	cy_as_storage_sd_reg_read_data	 *data_p,
	/* Callback function to call when done. */
	cy_as_function_callback		cb,
	/* Call context to send to the cb function. */
	uint32_t client
	);

/* Summary
   Creates a partition starting at the given block and using the
   remaining blocks on the card.

   Description
   Storage devices attached to West Bridge can be partitioned
   into two units.
   The visibility of these units through the mass storage
   interface can be
   individually controlled.  This API is used to partition
   a device into two.

   * Valid in Asynchronous Callback: Yes (if cb supplied)
   * Nestable: Yes

   Returns
   * CY_AS_ERROR_SUCCESS - the partition was successfully created
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed in
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has not
   *	been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   *	started
   * CY_AS_ERROR_IN_SUSPEND - The West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_USB_RUNNING - Partition cannot be created while
   *	USB stack is active
   * CY_AS_ERROR_OUT_OF_MEMORY - failed to get memory to
   *	process request
   * CY_AS_ERROR_INVALID_REQUEST - feature not supported by
   *	active device or firmware
   * CY_AS_ERROR_INVALID_RESPONSE - communication failure with
   *	West Bridge firmware
   * CY_AS_ERROR_ALREADY_PARTITIONED - the storage device already
   *	has been partitioned
   * CY_AS_ERROR_INVALID_BLOCK - Size specified for the partition
   *	exceeds the actual device capacity

   See Also
   * <LINK Partitioning>
   * CyAsStorageRemovePPartition
 */
EXTERN cy_as_return_status_t
cy_as_storage_create_p_partition(
	/* Handle to the device of interest */
	cy_as_device_handle handle,
	/* Bus on which the device to be partitioned is connected */
	cy_as_bus_number_t bus,
	/* Device number to be partitioned */
	uint32_t device,
	/* Size of partition number 0 in blocks */
	uint32_t size,
	/* Callback in case of async call */
	cy_as_function_callback cb,
	/* Client context to pass to the callback */
	uint32_t client
	);

/* Summary
   Removes the partition table on a storage device connected
   to the West Bridge.

   Description
   Storage devices attached to West Bridge can be partitioned
   into two units.This partition information is stored on the
   device and is non-volatile.  This API is used to remove the
   stored partition information and make the entire device
   visible as a single partition (unit).

   * Valid in Asynchronous Callback: Yes (if cb supplied)
   * Nestable: Yes

   Returns
   * CY_AS_ERROR_SUCCESS - the partition was successfully
   *	deleted
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_IN_SUSPEND - The West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_USB_RUNNING - Partition cannot be created
   *	while USB stack is active
   * CY_AS_ERROR_OUT_OF_MEMORY - failed to get memory to
   *	process request
   * CY_AS_ERROR_INVALID_REQUEST - operation not supported
   *	by active device/firmware
   * CY_AS_ERROR_NO_SUCH_UNIT - the addressed device is
   *	not partitioned

   See Also
   * <LINK Partitioning>
   * CyAsStorageCreatePPartition
 */
EXTERN cy_as_return_status_t
cy_as_storage_remove_p_partition(
	/* Handle to the device of interest */
	cy_as_device_handle handle,
	/* Bus on which device of interest is connected */
	cy_as_bus_number_t  bus,
	/* Device number of interest */
	uint32_t device,
	/* Callback in case of async call */
	cy_as_function_callback cb,
	/* Client context to pass to the callback */
	uint32_t client
	);

/* Summary
   Returns the amount of data read/written to the given
   device from the USB host.

   Description

   * Valid in Asynchronous Callback: Yes (if cb supplied)
   * Nestable: Yes

   Returns
   * CY_AS_ERROR_SUCCESS - API call completed successfully
   * CY_AS_ERROR_INVALID_HANDLE - Invalid West Bridge device
   *	handle
   * CY_AS_ERROR_NOT_CONFIGURED - West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - No firmware image has been
   * loaded on West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - Storage stack has not been
   *	started
   * CY_AS_ERROR_NOT_SUPPORTED - This function is not
   *	supported by active firmware version
   * CY_AS_ERROR_OUT_OF_MEMORY - Failed to get memory to
   *	process the request
   * CY_AS_ERROR_TIMEOUT - West Bridge firmware did not
   *	respond to request
   * CY_AS_ERROR_INVALID_RESPONSE - Unexpected reply from
   *	West Bridge firmware

   See Also
   * CyAsUsbSetMSReportThreshold
*/
EXTERN cy_as_return_status_t
cy_as_storage_get_transfer_amount(
	/* Handle to the device of interest */
	cy_as_device_handle handle,
	/* Bus on which device of interest is connected */
	cy_as_bus_number_t  bus,
	/* Device number of interest */
	uint32_t device,
	/* Return value containing read/write sector counts. */
	cy_as_m_s_c_progress_data *data_p,
	/* Callback in case of async call */
	cy_as_function_callback cb,
	/* Client context to pass to the callback */
	uint32_t client
	);

/* Summary
   Performs a Sector Erase on an attached SD Card

   Description
   This allows you to erase an attached SD card. The area to erase
   is specified in terms of a starting Erase Unit and a number of
   Erase Units. The size of each Erase Unit is defined in the
   DeviceDesc returned from a StorageQueryDevice call and it can
   differ between SD cards.

   A large erase can take a while to complete depending on the SD
   card. In such a case it is recommended that an async call is made.

   Returns
   * CY_AS_ERROR_SUCCESS - API call completed successfully
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has not
   *	been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   *	started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed in
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating with
   *	the West Bridge device
   * CY_AS_ERROR_ASYNC_PENDING - an async operation is pending
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   * reading from the media
   * CY_AS_ERROR_MEDIA_WRITE_PROTECTED - the media is write protected
   * CY_AS_ERROR_QUERY_DEVICE_NEEDED - A query device call is
   *	required before erase is allowed
   * CY_AS_ERROR_NO_SUCH_BUS
   * CY_AS_ERROR_NO_SUCH_DEVICE
   * CY_AS_ERROR_NOT_SUPPORTED - Erase is currently only supported
   *	on SD and using SD only firmware
   * CY_AS_ERROR_OUT_OF_MEMORY

   See Also
   * CyAsStorageSDRegisterRead
*/
EXTERN cy_as_return_status_t
cy_as_storage_erase(
	/* Handle to the device of interest */
	cy_as_device_handle	 handle,
	/* Bus on which device of interest is connected */
	cy_as_bus_number_t	bus,
	/* Device number of interest */
	uint32_t device,
	/* Erase Unit to start the erase */
	uint32_t erase_unit,
	/* Number of Erase Units to erase */
	uint16_t num_erase_units,
	/* Callback in case of async call */
	cy_as_function_callback cb,
	/* Client context to pass to the callback */
	uint32_t client
	);

/* Summary
   This function is used to read a Tuple from the SDIO CIS area.

   Description
   This function is used to read a Tuple from the SDIO CIS area.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device
   *	is in suspend mode
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_ASYNC_PENDING - an async operation is pending
   * CY_AS_ERROR_INVALID_REQUEST - an invalid IO request
   *	type was made
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   *	reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made to
   *	an invalid function
   * CY_AS_ERROR_INVALID_ENDPOINT - A DMA request was made to
   * an invalid endpoint
   * CY_AS_ERROR_ENDPOINT_DISABLED - A DMA request was made to
   *	a disabled endpoint

*/
cy_as_return_status_t
cy_as_sdio_get_c_i_s_info(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t		bus,
	/* Device number */
	uint32_t		device,
	 /* IO function Number */
	uint8_t			n_function_no,
	/* Id of tuple to be fetched */
	uint16_t		tuple_id,
	/* Buffer to hold tuple read from card.
	 should be at least 256 bytes in size */
	uint8_t *data_p
	);


/* Summary
   This function is used to read properties of the SDIO card.

   Description
   This function is used to read properties of the SDIO card
   into a CyAsSDIOCard structure.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   * loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   *	started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_SUCCESS - the card information was returned
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   * suspend mode
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware

*/
cy_as_return_status_t
cy_as_sdio_query_card(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	 bus,
	/* Device number */
	uint32_t		device,
	/* Buffer to store card properties */
	cy_as_sdio_card		*data_p
		);

/* Summary
   This function is used to reset a SDIO card.

   Description
   This function is used to reset a SDIO card by writing to
   the reset bit in the CCCR and reinitializing the card. This
   function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware
   */
cy_as_return_status_t
cy_as_sdio_reset_card(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t device
	);

/* Summary
   This function performs a Synchronous 1 byte read from the sdio
   device function.

   Description
   This function is used to perform a synchronous 1 byte read
   from an SDIO card function. This function is to be used only
   for IO to an SDIO card as other media will not respond to the
   SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has not
   *	been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed
   *	in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating with
   *	the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device pair
   *	does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was received
   *	from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in reading
   *	from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made to an
   *	invalid function
   * CY_AS_ERROR_FUNCTION_SUSPENDED - The function to which read
   *	was attempted is in suspend
*/
cy_as_return_status_t
cy_as_sdio_direct_read(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t		 bus,
	/* Device number */
	uint32_t		device,
	/* IO function Number */
	uint8_t			n_function_no,
	/* Address for IO */
	uint32_t		address,
	/* Set to CY_SDIO_REARM_INT to reinitialize SDIO interrupt */
	uint8_t			misc_buf,
	/* Buffer to hold byte read from card */
	uint8_t *data_p
		);

/* Summary
   This function performs a Synchronous 1 byte write to the
   sdio device function.

   Description
   This function is used to perform a synchronous 1 byte write
   to an SDIO card function.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   * not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   * loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   * started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   * passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   * suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   * with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   * pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was received
   * from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   * reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made to
   * an invalid function
   * CY_AS_ERROR_FUNCTION_SUSPENDED - The function to which
   * write was attempted is in suspend
*/
cy_as_return_status_t
cy_as_sdio_direct_write(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t		device,
	/* IO function Number */
	uint8_t			n_function_no,
	/* Address for IO */
	uint32_t		address,
	/* Set to CY_SDIO_REARM_INT to reinitialize SDIO interrupt,
	set to CY_SDIO_RAW for read after write */
	uint8_t			misc_buf,
	/* Byte to write */
	uint16_t		argument,
	/* Buffer to hold byte read from card in Read after write mode */
	uint8_t *data_p
	);

/* Summary
   This function is used to set the blocksize of an SDIO function.

   Description
   This function is used to set the blocksize of an SDIO function.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory
   *	available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   *	reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made
   * to an invalid function
   * CY_AS_ERROR_INVALID_BLOCKSIZE - An incorrect blocksize
   * was passed to the function.
   * CY_AS_ERROR_FUNCTION_SUSPENDED - The function to which
   * write was attempted is in suspend
*/
cy_as_return_status_t
cy_as_sdio_set_blocksize(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no,
	/* Block size to set. */
	uint16_t blocksize
	);

/* Summary
   This function is used to read Multibyte/Block data from a
   IO function.

   Description
   This function is used to read Multibyte/Block data from a
   IO function. This function is to be used only for IO to an
   SDIO card as other media will not respond to the SDIO
   command set.

   * Valid in Asynchronous Callback: YES
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating with
   *	the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_ASYNC_PENDING - an async operation is pending
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was received
   *	from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   *	reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made to
   *	an invalid function
   * CY_AS_ERROR_INVALID_BLOCKSIZE - An incorrect blocksize or
   *	block count was passed to the function.
   * CY_AS_ERROR_FUNCTION_SUSPENDED - The function to which
   *	write was attempted is in suspend
   * CY_AS_ERROR_IO_ABORTED - The IO operation was aborted
   * CY_AS_ERROR_IO_SUSPENDED - The IO operation was suspended
   * CY_AS_ERROR_INVALID_REQUEST - An invalid request was
   *	passed to the card.

*/
cy_as_return_status_t
cy_as_sdio_extended_read(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no,
	/* Base Address for IO */
	uint32_t address,
	/* Set to CY_SDIO_BLOCKMODE for block IO,
	CY_SDIO_BYTEMODE for multibyte IO,
	CY_SDIO_OP_FIFO to read multiple bytes from the
	same address, CY_SDIO_OP_INCR to read bytes from
	the incrementing addresses */
	uint8_t			misc_buf,
	/* Block/Byte count to read */
	uint16_t		argument,
	/* Buffer to hold data read from card */
	uint8_t *data_p,
	/* Callback in case of Asyncronous call. 0 if Synchronous */
	cy_as_sdio_callback		callback
	);

/* Summary
   This function is used to write Multibyte/Block data
   to a IO function.

   Description
   This function is used to write Multibyte/Block data
   to a IO function. This function is to be used only
   for IO to an SDIO card as other media will not respond
   to the SDIO command set.

   * Valid in Asynchronous Callback: YES
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_ASYNC_PENDING - an async operation is pending
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   *	reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made
   *	to an invalid function
   * CY_AS_ERROR_INVALID_BLOCKSIZE - An incorrect blocksize or
   *	block count was passed to the function.
   * CY_AS_ERROR_FUNCTION_SUSPENDED - The function to which
   *	write was attempted is in suspend
   * CY_AS_ERROR_IO_ABORTED - The IO operation was aborted
   * CY_AS_ERROR_IO_SUSPENDED - The IO operation was suspended
   * CY_AS_ERROR_INVALID_REQUEST - An invalid request was
   *	passed to the card.
*/
cy_as_return_status_t
cy_as_sdio_extended_write(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no,
	/* Base Address for IO */
	uint32_t address,
	/* Set to CY_SDIO_BLOCKMODE for block IO,
	CY_SDIO_BYTEMODE for multibyte IO,
	CY_SDIO_OP_FIFO to write multiple bytes to the same address,
	CY_SDIO_OP_INCR to write multiple bytes to incrementing
	addresses */
	uint8_t	 misc_buf,
	/* Block/Byte count to write
	in case of byte mode the count should not exceed the block size
	or 512, whichever is smaller.
	in case of block mode, maximum number of blocks is 511. */
	uint16_t		argument,
	/* Buffer to hold data to be written to card. */
	uint8_t *data_p,
	/* Callback in case of Asyncronous call. 0 if Synchronous */
	cy_as_sdio_callback		callback
	);

/* Summary
   This function is used to initialize a SDIO card function.

   Description
   This function is used to initialize a SDIO card function
   (1 - 7). This function is to be used only for IO to an
   SDIO card as other media will not respond to the SDIO
   command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   *	started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed
   *	in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   * pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error in
   *	reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made
   *	to an invalid function
*/
cy_as_return_status_t
cy_as_sdio_init_function(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no,
	/* Set to CY_SDIO_FORCE_INIT to reinitialize function */
	uint8_t	misc_buf
	);

/* Summary
   This function is used to get properties of a SDIO card function.

   Description
   This function is used to get properties of a SDIO card functio
   (1 - 7) into a CyAsSDIOFunc structure. This function is to be
   used only for IO to an SDIO card as other media will not respond
   to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has not
   *	been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been loaded
   *	into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not been
   *	started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was passed
   *	in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the media specified does
   *	not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device pair
   *	does not exist
   * CY_AS_ERROR_INVALID_FUNCTION - An IO request was made to
   *	an invalid function
*/
cy_as_return_status_t
cy_as_sdio_query_function(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no,
	/* Buffer to store function properties */
	cy_as_sdio_func *data_p
	);

/* Summary
   This function is used to Abort the current IO function.

   Description
   This function is used to Abort the current IO function.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified
   *	media/device pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory
   *	available
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made
   *	to an invalid function
*/
cy_as_return_status_t
cy_as_sdio_abort_function(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t  bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no
		);

/* Summary
   This function is used to Disable IO to an SDIO function.

   Description
   This function is used to Disable IO to an SDIO function.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is
   *	in suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified media/device
   *	pair does not exist
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made
   *	to an invalid function
*/
cy_as_return_status_t
cy_as_sdio_de_init_function(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no
	);

/* Summary
   This function is used to Suspend the current IO function.

   Description
   This function is used to Suspend the current IO function.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device has
   *	not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is in
   *	suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred communicating
   *	with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified does not
   *	exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified
   *	media/device pair does not exist
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory
   *	available
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was made
   *	to an invalid function
*/
cy_as_return_status_t
cy_as_sdio_suspend(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t  bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no
	);

/* Summary
   This function is used to resume a Suspended IO function.

   Description
   This function is used to resume a Suspended IO function.
   This function is to be used only for IO to an SDIO card as
   other media will not respond to the SDIO command set.

   * Valid in Asynchronous Callback: NO
   * Valid on Antioch device: NO

   Returns
   * CY_AS_ERROR_NOT_CONFIGURED - the West Bridge device
   *	has not been configured
   * CY_AS_ERROR_NO_FIRMWARE - the firmware has not been
   *	loaded into West Bridge
   * CY_AS_ERROR_NOT_RUNNING - the storage stack has not
   *	been started
   * CY_AS_ERROR_INVALID_HANDLE - an invalid handle was
   *	passed in
   * CY_AS_ERROR_IN_SUSPEND - the West Bridge device is
   *	in suspend mode
   * CY_AS_ERROR_SUCCESS - the media information was
   *	returned
   * CY_AS_ERROR_TIMEOUT - a timeout occurred
   *	communicating with the West Bridge device
   * CY_AS_ERROR_NOT_RUNNING - the stack is not running
   * CY_AS_ERROR_NO_SUCH_BUS - the bus specified
   *	does not exist
   * CY_AS_ERROR_NO_SUCH_DEVICE - the specified
   *	media/device pair does not exist
   * CY_AS_ERROR_ASYNC_PENDING - an async operation
   *	is pending
   * CY_AS_ERROR_OUT_OF_MEMORY - insufficient memory
   *	available
   * CY_AS_ERROR_INVALID_RESPONSE - an error message was
   *	received from the firmware
   * CY_AS_ERROR_MEDIA_ACCESS_FAILURE - there was error
   *	in reading from the media
   * CY_AS_ERROR_INVALID_FUNCTION - An IO attempt was
   *	made to an invalid function
   * CY_AS_ERROR_IO_ABORTED - The IO operation was
   *	aborted
   * CY_AS_ERROR_IO_SUSPENDED - The IO operation was
   *	suspended
   * CY_AS_ERROR_INVALID_REQUEST - An invalid request was
   *	passed to the card.

*/
cy_as_return_status_t
cy_as_sdio_resume(
	/* Handle to the Westbridge device */
	cy_as_device_handle	handle,
	/* Bus to use */
	cy_as_bus_number_t	bus,
	/* Device number */
	uint32_t device,
	/* IO function Number */
	uint8_t	n_function_no,
	/* Operation to resume (Read or Write) */
	cy_as_oper_type	op,
	/* Micellaneous buffer same as for Extended read and Write */
	uint8_t	misc_buf,
	/* Number of pending blocks for IO. Should be less
	than or equal to the maximum defined for extended
	read and write */
	uint16_t pendingblockcount,
	 /* Buffer to continue the Suspended IO operation */
	uint8_t		 *data_p
	);



/* For supporting deprecated functions */
#include "cyasstorage_dep.h"

#include "cyas_cplus_end.h"

#endif				/* _INCLUDED_CYASSTORAGE_H_ */
