blob: 05d3449697764d0ea3de8f61cec5ff8efd243a48 [file] [log] [blame]
/* Cypress West Bridge API header file (cyasmtp.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_CYASMTP_H_
#define _INCLUDED_CYASMTP_H_
#include "cyasmisc.h"
#include "cyas_cplus_start.h"
/*@@Media Transfer Protocol (MTP) Overview
Summary
The MTP API has been designed to allow MTP enabled West Bridge
devices to implement the MTP protocol while maintaining high
performance. West Bridge has the capability to enter into a
Turbo mode during a MTP SendObject or GetObject operation
enabling it to directly stream the data into or out of the
attached SD card with minimal involvement from the Processor.
Description
The MTP API is designed to act as a pass through implementation
of the MTP protocol for all operations. Each MTP transaction
received from the Host is passed through West Bridge and along
to the Processor. The Processor can then respond to the
transaction and pass data and/or responses back to the Host
through West Bridge.
The MTP API also allows for a high speed handling of MTP
SendObject and GetObject operations, referred to as Turbo MTP.
During a Turbo MTP operation West Bridge is responsible for
reading or writing the data for the MTP operation directly from
or to the SD card with minimal interaction from the Processor.
The is done by having the Processor transfer a Block Table
to West Bridge which contains the locations on the SD card that
need to be read or written. During the handling of a Turbo
Operation the Processor will then only periodically need to
send a new Block Table to West Bridge when the first is used up.
See the CyAsMTPInitSendObject and CyAsMTPInitGetObject functions
for more details.
In order to enable the MTP API you must first have a MTP enabled
West Bridge loaded with MTP firmware. You then must start the USB
and Storage APIs before starting the MTP API. See CyAsMTPStart
for more details.
*/
/*@@Endpoints
Summary
When using MTP firmware endpoints 2 and 6 are dedicated
to bulk MTP traffic and endpoint 1 is available for MTP
events.
Description
When using a MTP enabled West Brdige device endpoints 2 and
6 are made available for use to implement the MTP protocol.
These endpoints have a few special restrictions noted below
but otherwise the existing USB APIs can be used normally with
these endpoints.
1. CyAsUsbSetNak, CyAsUsbClearNak, and CyAsUsbGetNak are
disabled for these endpoints
2. During a turbo operation CyAsUsbSetStall, CyAsUsbClearStall,
and CyAsUsbGetStall are disabled.
*/
/* Summary
This constants defines the maximum number of
entries in the Block Table used to describe
the locations for Send/GetObject operations.
See Also
* CyAsMtpSendObject
* CyAsMtpGetObject
*/
#define CY_AS_MAX_BLOCK_TABLE_ENTRIES 64
/* Summary
Endpoint to be used for MTP reads from the USB host.
*/
#define CY_AS_MTP_READ_ENDPOINT (2)
/* Summary
Endpoint to be used fro MTP writes to the USB host.
*/
#define CY_AS_MTP_WRITE_ENDPOINT (6)
/******************************************
* MTP Types
******************************************/
/* Summary
The BlockTable used for turbo operations.
Description
This struct is used to specify the blocks
to be used for both read/write and send/getObject
operations.
The start block is a starting Logical Block Address
and num block is the number of blocks in that contiguous
region.
start_blocks[i]->[-------] <- start_blocks[i] + num_blocks[i]
If you need fewer than CY_AS_MAX_BLOCK_TABLE_ENTRIES
the remainder should be left empty. Empty is defined
as num_blocks equal to 0.
See Also
* CyAsMTPInitSendObject
* CyAsMTPInitGetObject
*/
typedef struct cy_as_mtp_block_table {
uint32_t start_blocks[CY_AS_MAX_BLOCK_TABLE_ENTRIES];
uint16_t num_blocks[CY_AS_MAX_BLOCK_TABLE_ENTRIES];
} cy_as_mtp_block_table;
/* Summary
This type specifies the type of MTP event that has occurred.
Description
MTP events are used to communicate that West Bridge has
either finished the handling of the given operation, or
that it requires additional data to complete the operation.
In no case does West Bridge send any MTP protocol responses,
this always remain the responsibility of the client.
See Also
* CyAsMTPInitSendObject
* CyAsMTPInitGetObject
* CyAsMTPSendBlockTable
*/
typedef enum cy_as_mtp_event {
/* This event is sent when West Bridge
has finished writing the data from a
send_object. west bridge will -not- send
the MTP response. */
cy_as_mtp_send_object_complete,
/* This event is sent when West Bridge
has finished sending the data for a
get_object operation. west bridge will
-not- send the MTP response. */
cy_as_mtp_get_object_complete,
/* This event is called when West Bridge
needs a new block_table. this is only a
notification, to transfer a block_table
to west bridge the cy_as_mtp_send_block_table
use the function. while west bridge is waiting
for a block_table during a send_object it
may need to NAK the endpoint. it is important
that the cy_as_mtp_send_block_table call is made
in a timely manner as eventually a delay
will result in an USB reset. this event has
no data */
cy_as_mtp_block_table_needed
} cy_as_mtp_event;
/* Summary
Data for the CyAsMTPSendObjectComplete event.
Description
Notification that a SendObject operation has been
completed. The status of the operation is given
(to distinguish between a cancelled and a success
for example) as well as the block count. The blocks
are used in order based on the current block table.
If more than one block table was used for a given
SendObject the count will include the total number
of blocks written.
This callback will be made only once per SendObject
operation and it will only be called after all of
the data has been committed to the SD card.
See Also
* CyAsMTPEvent
*/
typedef struct cy_as_mtp_send_object_complete_data {
cy_as_return_status_t status;
uint32_t byte_count;
uint32_t transaction_id;
} cy_as_mtp_send_object_complete_data;
/* Summary
Data for the CyAsMTPGetObjectComplete event.
Description
Notification that a GetObject has finished. This
event allows the P side to know when to send the MTP
response for the GetObject operation.
See Also
* CyAsMTPEvent
*/
typedef struct cy_as_mtp_get_object_complete_data {
cy_as_return_status_t status;
uint32_t byte_count;
} cy_as_mtp_get_object_complete_data;
/* Summary
MTP Event callback.
Description
Callback used to communicate that a SendObject
operation has finished.
See Also
* CyAsMTPEvent
*/
typedef void (*cy_as_mtp_event_callback)(
cy_as_device_handle handle,
cy_as_mtp_event evtype,
void *evdata
);
/* Summary
This is the callback function called after asynchronous API
functions have completed.
Description
When calling API functions from callback routines (interrupt
handlers usually) the async version of these functions must
be used. This callback is called when an asynchronous API
function has completed.
*/
typedef void (*cy_as_mtp_function_callback)(
/* Handle to the device to configure */
cy_as_device_handle handle,
/* The error status of the operation */
cy_as_return_status_t status,
/* A client supplied 32 bit tag */
uint32_t client
);
/**************************************
* MTP Functions
**************************************/
/* Summary
This function starts the MTP stack.
Description
Initializes West Bridge for MTP activity and registers the MTP
event callback.
Before calling CyAsMTPStart, CyAsUsbStart and CyAsStorageStart must be
called (in either order).
MTPStart must be called before the device is enumerated. Please
see the documentation for CyAsUsbSetEnumConfig and CyAsUsbEnumControl
for details on enumerating a device for MTP.
Calling MTPStart will not affect any ongoing P<->S traffic.
This requires a MTP firmware image to be loaded on West Bridge.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_CONFIGURED
* CY_AS_ERROR_NO_FIRMWARE
* CY_AS_ERROR_IN_SUSPEND
* CY_AS_ERROR_INVALID_IN_CALLBACK
* CY_AS_ERROR_STARTSTOP_PENDING
* CY_AS_ERROR_NOT_RUNNING - CyAsUsbStart or CyAsStorageStart
* have not been called
* CY_AS_ERROR_NOT_SUPPORTED - West Bridge is not running
* firmware with MTP support
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_INVALID_RESPONSE
See Also
* CyAsMTPStop
* CyAsUsbStart
* CyAsStorageStart
* CyAsUsbSetEnumConfig
* CyAsUsbEnumControl
*/
cy_as_return_status_t
cy_as_mtp_start(
cy_as_device_handle handle,
cy_as_mtp_event_callback event_c_b,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function stops the MTP stack.
Description
Stops all MTP activity. Any ongoing transfers are
canceled.
This will not cause a UsbDisconnect but all
MTP activity (both pass through and turbo) will
stop.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_CONFIGURED
* CY_AS_ERROR_NO_FIRMWARE
* CY_AS_ERROR_NOT_RUNNING
* CY_AS_ERROR_IN_SUSPEND
* CY_AS_ERROR_INVALID_IN_CALLBACK
* CY_AS_ERROR_STARTSTOP_PENDING
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_INVALID_RESPONSE
See Also
* CyAsMTPStart
*/
cy_as_return_status_t
cy_as_mtp_stop(
cy_as_device_handle handle,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function sets up a Turbo SendObject operation.
Description
Calling this function will setup West Bridge to
enable Tubo handling of the next SendObject
operation received. This will pass down the initial
block table to the firmware and setup a direct u->s
write for the SendObject operation.
If this function is not called before a SendObject
operation is seen the SendObject operation and data
will be passed along to the P port like any other MTP
command. It would then be the responsibility of the
client to perform a normal StorageWrite call to
store the data on the SD card. N.B. This will be
very slow compared with the Turbo handling.
The completion of this function only signals that
West Bridge has been set up to receive the next SendObject
operation. When the SendObject operation has been fully
handled and the data written to the SD card a separate
event will be triggered.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_CONFIGURED
* CY_AS_ERROR_NO_FIRMWARE
* CY_AS_ERROR_IN_SUSPEND
* CY_AS_ERROR_NOT_RUNNING
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_ASYNC_PENDING
* CY_AS_ERROR_INVALID_RESPONSE
* CY_AS_ERROR_NOT_SUPPORTED - West Bridge is not running
* firmware with MTP support
See Also
* CyAsMTPCancelSendObject
* CyAsMTPInitGetObject
* CyAsMTPEvent
* CyAsMTPSendBlockTable
*/
cy_as_return_status_t
cy_as_mtp_init_send_object(
cy_as_device_handle handle,
cy_as_mtp_block_table *blk_table,
uint32_t num_bytes,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function cancels an ongoing MTP operation.
Description
Causes West Bridge to cancel an ongoing SendObject
operation. Note this is only a cancel to West Bridge,
the MTP operation still needs to be canceled by
sending a response.
West Bridge will automatically set a Stall on the endpoint
when the cancel is received.
This function is only valid after CyAsMTPInitSendObject
has been called, but before the CyAsMTPSendObjectComplete
event has been sent.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_RUNNING
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_INVALID_RESPONSE
* CY_AS_ERROR_NOT_SUPPORTED - West Bridge is not running
* firmware with MTP support
* CY_AS_ERROR_NO_OPERATION_PENDING
See Also
* CyAsMTPInitSendObject
*/
cy_as_return_status_t
cy_as_mtp_cancel_send_object(
cy_as_device_handle handle,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function sets up a turbo GetObject operation.
Description
Called by the P in response to a GetObject
operation. This provides West Bridge with the block
addresses for the Object data that needs to be
transferred.
It is the responsibility of the Processor to send the MTP
operation before calling CyAsMTPInitGetObject. West Bridge
will then send the data phase of the transaction,
automatically creating the required container for Data.
Once all of the Data has been transferred a callback will
be issued to inform the Processor that the Data phase has
completed allowing it to send the required MTP response.
If an entire Block Table is used then after the
last block is transferred the CyAsMTPBtCallback
will be called to allow an additional Block Table(s)
to be specified.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_CONFIGURED
* CY_AS_ERROR_NO_FIRMWARE
* CY_AS_ERROR_NOT_RUNNING
* CY_AS_ERROR_IN_SUSPEND
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_ASYNC_PENDING
* CY_AS_ERROR_INVALID_RESPONSE
* CY_AS_ERROR_NOT_SUPPORTED - West Bridge is not running
* firmware with MTP support
See Also
* CyAsMTPInitSendObject
* CyAsMTPCancelGetObject
* CyAsMTPEvent
* CyAsMTPSendBlockTable
*/
cy_as_return_status_t
cy_as_mtp_init_get_object(
cy_as_device_handle handle,
cy_as_mtp_block_table *table_p,
uint32_t num_bytes,
uint32_t transaction_id,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function cancels an ongoing turbo GetObject
operation.
Description
Causes West Bridge to cancel an ongoing GetObject
operation. Note this is only a cancel to West Bridge,
the MTP operation still needs to be canceled by
sending a response.
This function is only valid after CyAsMTPGetSendObject
has been called, but before the CyAsMTPGetObjectComplete
event has been sent.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_RUNNING
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_INVALID_RESPONSE
* CY_AS_ERROR_NOT_SUPPORTED - West Bridge is not running
* firmware with MTP support
* CY_AS_ERROR_NO_OPERATION_PENDING
See Also
* CyAsMTPInitGetObject
*/
cy_as_return_status_t
cy_as_mtp_cancel_get_object(
cy_as_device_handle handle,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function is used to transfer a BlockTable as part of
an ongoing MTP operation.
Description
This function is called in response to the
CyAsMTPBlockTableNeeded event. This allows the client to
pass in a BlockTable structure to West Bridge.
The memory associated with the table will be copied and
can be safely disposed of when the function returns if
called synchronously, or when the callback is made if
called asynchronously.
This function is used for both SendObject and GetObject
as both can generate the CyAsMTPBlockTableNeeded event.
Returns
* CY_AS_ERROR_SUCCESS
* CY_AS_ERROR_INVALID_HANDLE
* CY_AS_ERROR_NOT_CONFIGURED
* CY_AS_ERROR_NO_FIRMWARE
* CY_AS_ERROR_NOT_RUNNING
* CY_AS_ERROR_IN_SUSPEND
* CY_AS_ERROR_OUT_OF_MEMORY
* CY_AS_ERROR_ASYNC_PENDING
* CY_AS_ERROR_INVALID_RESPONSE
* CY_AS_ERROR_NOT_SUPPORTED - West Bridge is not running
* firmware with MTP support
See Also
* CyAsMTPInitSendObject
* CyAsMTPInitGetObject
*/
cy_as_return_status_t
cy_as_mtp_send_block_table(
cy_as_device_handle handle,
cy_as_mtp_block_table *table,
cy_as_function_callback cb,
uint32_t client
);
/* Summary
This function is used to mark the start of a storage
read/write burst from the P port processor.
Description
This function is used to mark the start of a storage
read/write burst from the processor. All USB host access
into the mass storage / MTP endpoints will be blocked
while the read/write burst is ongoing, and will be allowed
to resume only after CyAsMTPStorageOnlyStop is called.
The burst mode is used to reduce the firmware overhead
due to configuring the internal data paths repeatedly,
and can help improve performance when a sequence of
read/writes is performed in a burst.
This function will not generate a special mailbox request,
it will only set a flag on the next Storage Read/Write
operation. Until such a call is made West Bridge will
continue to accept incoming packets from the Host.
* Valid in Asynchronous Callback: YES
Returns
* CY_AS_ERROR_INVALID_HANDLE - Invalid West Bridge device
* handle was passed in.
* CY_AS_ERROR_NOT_CONFIGURED - West Bridge device has not
* been configured.
* CY_AS_ERROR_NO_FIRMWARE - Firmware is not active on West
* Bridge device.
* CY_AS_ERROR_NOT_RUNNING - Storage stack is not running.
* CY_AS_ERROR_SUCCESS - Burst mode has been started.
See Also
* CyAsStorageReadWriteBurstStop
*/
cy_as_return_status_t
cy_as_mtp_storage_only_start(
/* Handle to the West Bridge device. */
cy_as_device_handle handle
);
/* Summary
This function is used to mark the end of a storage read/write
burst from the P port processor.
Description
This function is used to mark the end of a storage read/write
burst from the processor. At this point, USB access to the
mass storage / MTP endpoints on the West Bridge device will be
re-enabled.
* Valid in Asynchronous Callback: NO
Returns
* CY_AS_ERROR_INVALID_HANDLE - Invalid West Bridge device handle
* was passed in.
* CY_AS_ERROR_NOT_CONFIGURED - West Bridge device has not been
* configured.
* CY_AS_ERROR_NO_FIRMWARE - Firmware is not active on West Bridge
* device.
* CY_AS_ERROR_NOT_RUNNING - Storage stack is not running.
* CY_AS_ERROR_INVALID_IN_CALLBACK - This API cannot be called
* from a callback.
* CY_AS_ERROR_OUT_OF_MEMORY - Failed to allocate memory to
* process the request.
* CY_AS_ERROR_TIMEOUT - Failed to send request to firmware.
* CY_AS_ERROR_SUCCESS - Burst mode has been stopped.
See Also
* CyAsStorageReadWriteBurstStart
*/
cy_as_return_status_t
cy_as_mtp_storage_only_stop(
/* Handle to the West Bridge device. */
cy_as_device_handle handle,
cy_as_function_callback cb,
uint32_t client
);
#include "cyas_cplus_end.h"
#endif