blob: 62d9986079542d59fc2bdd9c8d730b5c266afbc7 [file] [log] [blame]
/*
* Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
* SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
* INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
* CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
* OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
* BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
* COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
* DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
* TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
*/
#ifndef __usb_mass_ufi_h__
#define __usb_mass_ufi_h__
#include "diag_common.h"
/* a should be two byte number */
#define HIGH_BYTE(a) ((a) >> 8)
#define LOW_BYTE(a) ((a) & 0xFF)
/* Operation code for the UFI Commands (floppy drives) */
#define UFI_FORMAT_UNIT (0x04)
#define FORMAT_LUN_HEADER_BITS (0x17)
#define UFI_READ_CAPACITY (0x25)
#define READ_CAPCITY_LUN_HEADER_BITS (0x00)
#define UFI_READ_FORMAT_CAPACITY (0x23)
#define UFI_INQUIRY (0x12)
#define INQUIRY_LUN_HEADER_BITS (0x00)
#define UFI_MODE_SELECT (0x55)
#define MODE_SELECT_LUN_HEADER_BITS (0x10)
#define UFI_MODE_SENSE (0x5A)
#define MODE_SENSE_LUN_HEADER_BITS (0x00)
#define PAGE_CURRENT_VALUE (0x00)
#define PAGE_CHANGEABLE_VALUE (0x01)
#define PAGE_DEFAULT_VALUE (0x10)
#define PAGE_SAVED_VALUE (0x11)
#define PAGE_CODE_ALL_PAGES (0x3F)
#define UFI_PREVENT_ALLOW_MEDIUM_ROMVAL (0x1E)
#define UFI_READ10 (0x28)
#define READ10_LUN_HEADER_BITS (0x00)
#define UFI_READ12 (0xA8)
#define READ12_LUN_HEADER_BITS (0x00)
#define UFI_REQUEST_SENSE (0x03)
#define UFI_REZERO_UNIT (0x01)
#define UFI_SEEK10 (0x2B)
#define UFI_SEND_DIAGNOSTIC (0x1D)
#define SEND_DIAG_LUN_HEADER_BITS (0x00)
#define UFI_START_STOP (0x1B)
#define UFI_STOP_MEDIA (0x00)
#define UFI_START_MEDIA_AND_GET_FORMAT (0x01)
#define UFI_TEST_UNIT_READY (0x00)
#define UFI_VERIFY (0x2F)
#define VERIFY_LUN_HEADER_BITS (0x00)
#define UFI_WRITE10 (0x2A)
#define UFI_WRITE_LUN_HEADER_BITS (0x00)
#define UFI_WRITE12 (0xAA)
#define UFI_WRITE_AND_VERIFY (0x2E)
#define DEFAULT_INTERLEAVE (0x00)
/* Mass storage defs*/
/* Constants */
#define MAX_CBWCB_SIZE 16
#define CBW_DIRECTION_IN 0x80
#define CBW_DIRECTION_OUT 0x00
#define MAX_RETRIAL_ATTEMPTS 3
#define QUEUE_SIZE 16 /* Must be a power of 2 */
#define DIRECTION_OUT 0x00
#define DIRECTION_IN 0x80
#define MASK_NON_DIRECTION_BITS 0x80
/* Command Status Wrapper Signature 'USBS'*/
#define CBW_SIGNATURE 0x43425355
#define CSW_SIGNATURE 0x53425355
#define CSW_STATUS_GOOD 0x00
#define CSW_STATUS_FAILED 0x01
#define CSW_STATUS_PHASE_ERROR 0x02
#define CSW_SIZE 0x0D
#define CBW_SIZE 0x1F
#define GET_MAX_LUN 0xFE
#define MASS_STORAGE_RESET 0xFF
// Some util funcs
#define utou32(b,n) {b[0] = n&0x0ff; \
b[1] = (n>>8)&0x0ff; \
b[2] = (n>>16)&0x0ff; \
b[3] = (n>>24)&0x0ff;}
#define utou32swap(b,n) {b[3] = n&0x0ff; \
b[2] = (n>>8)&0x0ff; \
b[1] = (n>>16)&0x0ff; \
b[0] = (n>>24)&0x0ff;}
#define transfer_low_nibble(val, dest) {dest = (dest&0xf0) | (val&0x0f);}
#define USB_MASS_SENSE { int res; \
dbg_printf(PRN_RES,"\t--MODE SENSE.."); \
res = usb_mass_ufi_request_sense((uchar_ptr)USB_MASS_SENSE_DATA_BASE, \
sizeof(REQ_SENSE_DATA_FORMAT)); \
RETURN_ON_ERROR(res); \
dbg_printf(PRN_RES, "OK\n"); \
}
/* USB Mass storage FORMAT UNIT Command information */
typedef struct _DEFECT_LIST_HEADER
{
uint_8 RESERVED1;
uint_8 BBIT_INFO_HEADER;
#define DEFAULT_BIT_INFO (0xA0)
uint_8 BLENGTH_MSB;
uint_8 BLENGTH_LSB;
#define DEFAULT_LENGTH_MSB (0x00)
#define DEFAULT_LENGTH_LSB (0x08)
} DEFECT_LIST_HEADER, _PTR_ DEFECT_LIST_HEADER_PTR;
typedef struct _FORMAT_CAPACITY_DESCRIPTOR
{
uint_8 NNUM_BLOCKS[4];
uint_8 RESERVED;
uint_8 NBLOCK_LENGTH[3];
} FORMAT_CAPACITY_DESCRIPTOR, _PTR_ FORMAT_CAPACITY_DESCRIPTOR_PTR;
typedef struct _FORMAT_UNIT_PARAMETER_BLOCK
{
DEFECT_LIST_HEADER DEF_LIST_HEADER;
FORMAT_CAPACITY_DESCRIPTOR FMT_CAPACITY_DESC;
} FORMAT_UNIT_PARAMETER_BLOCK, _PTR_ FORMAT_UNIT_PARAMETER_BLOCK_PTR;
/* USB Mass storage READ CAPACITY Command information */
/* USB Mass storage Read10 Command information */
typedef struct _MASS_STORAGE_READ_CAPACITY_CMD_STRUCT_INFO
{
uint_8 BLLBA[4]; /* Last Logical Block Address */
uint_8 BLENGTH[4]; /*Block length */
} MASS_STORAGE_READ_CAPACITY_CMD_STRUCT_INFO,
_PTR_ MASS_STORAGE_READ_CAPACITY_CMD_STRUCT_INFO_PTR;
/* USB Mass storage READ FORMAT CAPACITY Command information */
typedef struct _CAPACITY_LIST_HEADER {
uint_8 RESERVED[3];
uint_8 BLENGTH[1]; /* Capacity list length */
} CAPACITY_LIST_HEADER,_PTR_ CAPACITY_LIST_HEADER_PTR;
typedef struct _CURRENT_CAPACITY_DESCRIPTOR {
uint_8 NNUM_BLOCKS[4];
uint_8 BDESC_CODE; /* Only last two bits are used */
#define UNFORMATTED_MEDIA (0x01)
#define FORMATTED_MEDIA (0x02)
#define NO_MEDIA (0x03)
uint_8 NBLOCK_LENGTH[3];
} CURRENT_CAPACITY_DESCRIPTOR,_PTR_ CURRENT_CAPACITY_DESCRIPTOR_PTR;
typedef struct _CAPACITY_LIST {
CAPACITY_LIST_HEADER LIST_HEADER; /* 4 bytes */
CURRENT_CAPACITY_DESCRIPTOR CAPACITY_DESCRIPTOR; /* 8 bytes */
FORMAT_CAPACITY_DESCRIPTOR FMT_CAPACITY_DESC; /* 8 bytes */
} CAPACITY_LIST, _PTR_ CAPACITY_LIST_PTR;
/* USB Mass storage INQUIRY Command information */
typedef struct _INQUIRY_DATA_FORMAT
{
/*device type currently connected to Logical Unit */
uint_8 BDEVICE_TYPE;
#define DIRECT_ACCESS_DEVICE (0x00)
#define NONE (0x1F)
/*removable media bit only bit 7 is used. rest reserved*/
uint_8 BRMB;
/*ISO, ECMA, ANSI Version bits*/
uint_8 BVERSION_SPEC;
#define DEFAULT_VERSION_SPEC (0x00)
/*Response data format */
uint_8 BRESP_DATA_FORMAt;
#define DEFAULT_RESNPOSE_FORMAT (0x01)
/* length of parameters */
uint_8 BADITIONAL_LENGTH;
#define DEFAULT_LENGTH (0x1F)
uint_8 RESERVED1;
uint_8 RESERVED2;
uint_8 RESERVED3;
uint_8 BVID[8]; /* Vendor Identification String */
uint_8 BPID[16]; /* Product Identification String */
uint_8 BPRODUCT_REV[4]; /* Product revision level */
} INQUIRY_DATA_FORMAT, _PTR_ INQUIRY_DATA_FORMAT_PTR;
/* USB Mass storage MODE SELECT Command information */
typedef union _READ_WRITE_RECOVERY_PAGE {
uint_8 FIELDS[12];
} READ_WRITE_RECOVERY_PAGE, _PTR_ READ_WRITE_RECOVERY_PAGE_PTR;
typedef union _MODE_SELECT_PAGE {
READ_WRITE_RECOVERY_PAGE READ_WRITE_PAGE;
} MODE_SELECT_PAGE, _PTR_ MODE_SELECT_PAGE_PTR;
typedef struct _MODE_PARAM_HEADER {
uint_8 BLENGTH[2]; /* Mode Data Length */
uint_8 BMEDIA_TYPE; /* Media type code */
#define DEFAULT_MEDIA_TYPE (0x00)
#define DD_720KB (0x1E)
#define HD_125MB (0x93)
#define DD_144MB (0x94)
uint_8 WP_DPOFUA;
#define WP_DPOFUA_HEADER (0xEF)
} MODE_PARAM_HEADER,_PTR_ MODE_PARAM_HEADER_PTR;
typedef struct _MODE_SELECT_PARAMETER_LIST {
MODE_PARAM_HEADER MODE_PARAM_HEADER;
#define DEFAULT_NO_OF_PAGES (0x01)
MODE_SELECT_PAGE PAGES[DEFAULT_NO_OF_PAGES];
} MODE_SELECT_PARAMETER_LIST, _PTR_ MODE_SELECT_PARAMETER_LIST_PTR;
/* USB Mass storage REQUEST SENSE Command information */
typedef struct _REQ_SENSE_DATA_FORMAT
{
/* Valid and Error code*/
uint_8 BERROR_CODE; /* 0 */
#define REQUEST_SENSE_NOT_VALID (0x00)
#define REQUEST_SENSE_IS_VALID (0x01)
#define REQUEST_SENSE_ERROR_CODE (0x70)
uint_8 RESERVED1; /* 1 */
uint_8 BSENSE_KEY; /* 2 Only lower 4 bits are used */
uint_8 BINFO[4]; /* 3,4,5,6 Information data format */
uint_8 BADITIONAL_LENGTH; /* 7 additional sense length */
uint_8 RESERVED2[4]; /* 8,9,10,11*/
uint_8 BADITIONAL_CODE; /* 12 Additional sense code */
uint_8 BADITIONAL_QUALIFIEr; /* 13 Additional sense code qualifier */
uint_8 RESERVED3[4]; /* 14,15,16,17*/
} REQ_SENSE_DATA_FORMAT, _PTR_ REQ_SENSE_DATA_FORMAT_PTR;
/* USB Mass storage WRITE10 Command information */
typedef struct _MASS_STORAGE_WRITE10_CMD_STRUCT_INFO {
uint_8 BLBA[4];
uint_8 BTRANSFER_LENGTH[2];
} MASS_STORAGE_WRITE10_CMD_STRUCT_INFO,
_PTR_ MASS_STORAGE_WRITE10_CMD_STRUCT_INFO_PTR;
/* USB Mass storage WRITE12 Command information */
typedef struct _MASS_STORAGE_WRITE12_CMD_STRUCT_INFO {
uint_8 BLBA[4];
uint_8 BTRANSFER_LENGTH;
} MASS_STORAGE_WRITE12_CMD_STRUCT_INFO,
_PTR_ MASS_STORAGE_WRITE12_CMD_STRUCT_INFO_PTR;
/* USB Mass storage SEEK10 Command information */
typedef struct MASS_STORAGE_SEEK10_STRUCT_INFO {
uint_8 BLBA[4];
} MASS_STORAGE_SEEK10_STRUCT_INFO, _PTR_ MASS_STORAGE_SEEK10_STRUCT_INFO_PTR;
/* USB Mass storage SEND DIAGNOSTIC Command information */
typedef struct _MASS_STORAGE_SEND_DIAGNOSTIC_STRUCT_INFO {
boolean SELF_TEST;
} MASS_STORAGE_SEND_DIAGNOSTIC_STRUCT_INFO,
_PTR_ MASS_STORAGE_SEND_DIAGNOSTIC_STRUCT_INFO_PTR;
/* USB Mass storage START-STOP UNIT Command information */
typedef struct _MASS_STORAGE_START_STOP_UNIT_STRUCT_INFO {
boolean START;
boolean LOEJ;
} MASS_STORAGE_START_STOP_UNIT_STRUCT_INFO,
_PTR_ MASS_STORAGE_START_STOP_UNIT_STRUCT_INFO_PTR;
/* USB Mass storage VERIFY Command information */
typedef struct _MASS_STORAGE_VERIFY_CMD_STRUCT_INFO {
uint_8 BLBA[4];
uint_8 BTRANSFER_LENGTH[2];
} MASS_STORAGE_VERIFY_CMD_STRUCT_INFO,
_PTR_ MASS_STORAGE_VERIFY_CMD_STRUCT_INFO_PTR;
/* UFI commands */
/* Used by host-side to send the READ CAPACITY command */
#define usb_mass_ufi_read_capacity( \
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len \
) \
\
usb_mass_ufi_generic( \
UFI_READ_CAPACITY, \
(g_mass_lun << 5) | READ_CAPCITY_LUN_HEADER_BITS, \
0, \
0, \
CBW_DIRECTION_IN, \
buf_ptr, \
buf_len)
/* Used by host-side to send the FORMAT UNIT command */
#define usb_mass_ufi_format_unit( \
/* [IN] Track number to be formatted (see UFI specs) */ \
/* uint_8 */ track_num, \
\
/* [IN] Interleave number (see UFI specs) */ \
/* uint_8 */ interleave, \
\
/* [IN] command specific parameters (see UFI specs) */ \
/* FORMAT_UNIT_PARAMETER_BLOCK_PTR */ format_ptr \
) \
\
mass_ufi_generif( \
UFI_FORMAT_UNIT, \
(g_mass_lun << 5) | FORMAT_LUN_HEADER_BITS, \
(track_num << 24) | (HIGH_BYTE(interleave) << 16) | \
(LOW_BYTE(interleave) << 8), \
format_ptr ? (sizeof(FORMAT_LUN_HEADER_BITS) << 8) : 0, \
CBW_DIRECTION_OUT, \
(uchar_ptr)format_ptr, \
format_ptr ? (sizeof(FORMAT_LUN_HEADER_BITS) << 8) : 0)
/* Used by host-side to send the FORMAT CAPACITY command */
#define usb_mass_ufi_format_capacity( \
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len \
) \
\
mass_ufi_generif( \
UFI_READ_FORMAT_CAPACITY, \
g_mass_lun << 5, \
0, \
0, \
CBW_DIRECTION_IN, \
buf_ptr, \
buf_len)
/*
** Used by host-side to send the INQUIRY command, to request information
** regarding parameters of the UFI device itself
*/
#define usb_mass_ufi_inquiry( \
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len \
) \
\
usb_mass_ufi_generic( \
UFI_INQUIRY, \
(g_mass_lun << 5) | INQUIRY_LUN_HEADER_BITS, \
(buf_len & 0xFF) << 8, \
0, \
CBW_DIRECTION_IN, \
buf_ptr, \
buf_len)
/* Used by host-side to send the MODE SELECT command */
#define usb_mass_ufi_mode_select( \
/* [IN] command specific parameters (see UFI specs) */ \
/*MODE_SELECT_PARAMETER_LIST_PTR*/ pMode_select_param \
) \
usb_mass_ufi_generic( \
UFI_MODE_SELECT, \
(g_mass_lun << 5) | MODE_SELECT_LUN_HEADER_BITS, \
0, \
pMode_select_param ? (sizeof(MODE_SELECT_PARAMETER_LIST) << 8) : 0, \
CBW_DIRECTION_OUT, \
(uchar_ptr)pMode_select_param, \
pMode_select_param ? (sizeof(MODE_SELECT_PARAMETER_LIST) << 8) : 0)
/* Used by host-side to send the MODE SENSE command */
#define usb_mass_ufi_mode_sense( \
/*[IN] Page control byte 2 bits */ \
/* uint_8 */ bPC, \
\
/*[IN] Page code 6 bit */ \
/* uint_8 */ bPage_code, \
\
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len \
) \
\
usb_mass_ufi_generic( \
UFI_MODE_SENSE, \
(g_mass_lun << 5) | MODE_SENSE_LUN_HEADER_BITS, \
((bPC << 6)|(bPage_code & 0x3F)) << 24, \
buf_ptr ? (buf_len << 8) : 0, \
CBW_DIRECTION_IN, \
buf_ptr, \
buf_ptr ? buf_len : 0)
/* Used by host-side to send the PREVENT-ALLOW MEDIUM REMOVAL command */
#define usb_mass_ufi_prevent_allow_medium_removal( \
/* [IN] command specific parameters (see UFI specs) */ \
/* uint_8 */ bPrevent /*1 or 0 values */ \
) \
\
usb_mass_ufi_generic( \
UFI_PREVENT_ALLOW_MEDIUM_ROMVAL, \
g_mass_lun << 5, \
(bPrevent & 0x01) << 8, \
0, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the READ(10) command, to get data from device */
#define usb_mass_ufi_read_10( \
/* [IN] Address of the block to be read */ \
/* uint_32 */ bBlock_address, \
\
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len, \
\
/* [IN] the number of sectors to read */ \
/* uint_32 */ num_of_sectors \
) \
\
usb_mass_ufi_generic( \
UFI_READ10, \
(g_mass_lun << 5) | READ10_LUN_HEADER_BITS, \
bBlock_address, \
num_of_sectors << 8, \
CBW_DIRECTION_IN, \
buf_ptr, \
buf_len)
/* Used by host-side to send the READ(12) command, to get data from device */
#define usb_mass_ufi_read_12( \
/* [IN] Address of the block to be read */ \
/* uint_32 */ bBlock_address, \
\
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len, \
\
/* [IN] number of sectors to read */ \
/* uint_32 */ num_of_sectors \
) \
\
usb_mass_ufi_generic( \
UFI_READ12, \
(g_mass_lun << 5) | READ12_LUN_HEADER_BITS, \
bBlock_address, \
num_of_sectors, \
CBW_DIRECTION_IN, \
buf_ptr, \
buf_len)
/* Used by host-side to send the REQUEST SENSE command */
#define usb_mass_ufi_request_sense( \
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len \
) \
usb_mass_ufi_generic( \
UFI_REQUEST_SENSE, \
(g_mass_lun << 5), \
(buf_len & 0xFF) << 8, \
0, \
CBW_DIRECTION_IN, \
(uchar_ptr)buf_ptr, \
buf_len)
/* Used by host-side to send the REZERO UNIT command */
#define usb_mass_ufi_rezero_unit( \
) \
\
usb_mass_ufi_generic( \
UFI_REZERO_UNIT, \
(g_mass_lun << 5), \
0, \
0, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the SEEK command */
#define usb_mass_ufi_seek_10( \
/* [IN] block address (see UFI specs) */ \
/* uint_32 */ bBlock_address \
) \
usb_mass_ufi_generic( \
UFI_SEEK10, \
g_mass_lun << 5, \
bBlock_address, \
0, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the SEND DIAGNOSTIC command */
#define usb_mass_ufi_send_diagnostic( \
/* [IN] command specific parameters (see UFI specs) */ \
/* uint_8 */ bSelf_test \
) \
\
usb_mass_ufi_generic( \
UFI_SEND_DIAGNOSTIC, \
((g_mass_lun << 5) | SEND_DIAG_LUN_HEADER_BITS) | \
((bSelf_test & 0xFF) << 2), \
0, \
0, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the START-STOP command */
#define usb_mass_ufi_start_stop( \
\
/* Load Object Bit */ \
/* uint_8 */ bLoej, \
\
/* Start Stop bit */ \
/* uint_8 */ bStart \
) \
\
usb_mass_ufi_generic( \
UFI_START_STOP, \
(g_mass_lun << 5) | SEND_DIAG_LUN_HEADER_BITS, \
(((bLoej << 1) | bStart) & 0x3) << 8, \
0, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the TEST UNIT READY command */
#define usb_mass_ufi_test_unit_ready( \
) \
\
usb_mass_ufi_generic( \
UFI_TEST_UNIT_READY, \
(g_mass_lun << 5), \
0, \
0, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the VERIFY command */
#define usb_mass_ufi_verify( \
/* [IN] address of the block to verify */ \
/* uint_32 */ bBlock_address, \
\
/* Length of the data to verify */ \
/*uint_16 */ dLength \
) \
\
mass_ufi_generif( \
UFI_VERIFY, \
(g_mass_lun << 5) | VERIFY_LUN_HEADER_BITS, \
bBlock_address, \
dLength << 8, \
CBW_DIRECTION_OUT, \
NULL, \
0)
/* Used by host-side to send the WRITE(10) command, to send data to device */
#define usb_mass_ufi_write_10( \
/* [IN] Address of the block to be read */ \
/* uint_32 */ bBlock_address, \
\
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len, \
\
/* [IN] number of sectors to write */ \
/* uint_32 */ num_of_sectors \
) \
\
usb_mass_ufi_generic( \
UFI_WRITE10, \
(g_mass_lun << 5) | UFI_WRITE_LUN_HEADER_BITS, \
bBlock_address, \
num_of_sectors << 8, \
CBW_DIRECTION_OUT, \
buf_ptr, \
buf_len)
/* Used by host-side to send the WRITE(12) command, to send data to device */
#define usb_mass_ufi_write_12( \
/* [IN] Address of the block to be read */ \
/* uint_32 */ bBlock_address, \
\
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len, \
\
/* [IN] the number of sectors to write */ \
/* uint_32 */ num_of_sectors \
) \
\
mass_ufi_generif( \
UFI_WRITE12, \
(g_mass_lun << 5) | UFI_WRITE_LUN_HEADER_BITS, \
bBlock_address, \
num_of_sectors, \
CBW_DIRECTION_OUT, \
buf_ptr, \
buf_len);
/* Used by host-side to send the WRITE AND VERIFY command */
#define usb_mass_ufi_write_and_verify( \
/* [IN] Address of the block to be read */ \
/* uint_32 */ bBlock_address, \
\
/* [IN] buffer to send or receive data*/ \
/* pointer */ buf_ptr, \
\
/* [IN] length of the expected data */ \
/* uint_32 */ buf_len, \
\
/* [IN] the number of sectors */ \
/* uint_32 */ num_of_sectors \
) \
\
mass_ufi_generif( \
UFI_WRITE_AND_VERIFY, \
(g_mass_lun << 5) | UFI_WRITE_LUN_HEADER_BITS, \
bBlock_address, \
num_of_sectors << 8, \
CBW_DIRECTION_OUT, \
buf_ptr, \
buf_len);
/* Prototypes */
#ifdef __cplusplus
extern "C" {
#endif
extern int usb_mass_ufi_generic
(
/* [IN] command object allocated by application*/
// COMMAND_OBJECT_PTR cmd_ptr,
uint_8 opcode,
uint_8 lun,
uint_32 lbaddr,
uint_32 blen,
uint_8 cbwflags,
uchar_ptr buf,
uint_32 buf_len
);
#ifdef __cplusplus
}
#endif
#endif
/* EOF */