DCMD_MMCSD_VUC_CMD

Execute a vendor-unique command

Synopsis:

#include <hw/dcmd_sim_mmcsd.h>

#define DCMD_MMCSD_VUC_CMD   __DIOTF(_DCMD_CAM, _SIM_MMCSD + 6, struct _mmcsd_vuc_cmd)

Arguments to devctl():

Argument Value
filedes A file descriptor that you obtained by opening the device
dcmd DCMD_MMCSD_VUC_CMD
dev_data_ptr An array of MMCSD_VUC_CMD structures
n_bytes The size of the array
dev_info_ptr NULL

Description:

This command executes a vendor-unique command. The MMCSD_VUC_CMD structure is defined as follows:

typedef struct _mmcsd_vuc_cmd {
        int             result;
        uint16_t        opcode;
        uint16_t        rsvd2;
        uint32_t        flags;
        uint32_t        arg;
        uint32_t        resp[4];
        uint32_t        blk_sz;
        paddr_t         data_ptr;
        uint32_t        buf_off;
        uint32_t        data_len;
        uint32_t        timeout;
        uint32_t        postdelay_us;
        uint32_t        rsvd[2];
} MMCSD_VUC_CMD;

The members include:

result
The return code from the VUC; one of:
  • MMC_VUC_SUCCESS
  • MMC_VUC_FAILED
  • MMC_VUC_NOTISSUED
  • MMC_VUC_NODEV
opcode
flags
A bitwise OR of the following:
  • MMCSD_VUC_END — this is the last command in the array
  • MMCSD_VUC_DATA_NONE
  • MMCSD_VUC_DATA_IN
  • MMCSD_VUC_DATA_OUT
  • MMCSD_VUC_DATA_PHYS — the data_ptr member holds the physical address of the data; if this bit isn't set, the device is using PIO mode.
  • MMCSD_VUC_RCA — is the relative card address valid in the rca field
  • MMCSD_VUC_ACMD — an application-specific command is needed
  • MMCSD_VUC_NOAC12 — by default, auto CMD12 is enabled
  • MMCSD_VUC_RESP_OFF — bit offset
  • MMCSD_VUC_RESP_NONE
  • MMCSD_VUC_RESP_R1
  • MMCSD_VUC_RESP_R1B
  • MMCSD_VUC_RESP_R2
  • MMCSD_VUC_RESP_R3
  • MMCSD_VUC_RESP_R6
  • MMCSD_VUC_RESP_R7

MMCSD_VUC_DATA_MSK is a mask for the bits that indicate whether or not data is present and its direction. MMCSD_VUC_RESP_MSK is a mask for the response type.

/*
 * for performance,
 * we assume that the RESP bits are the same as internal driver defines.
 * If any of the internal defines change (which I doubt), we will need to
 * add parsing code to do the translation.
#define MMC_RSP_PRESENT (1 << 0)
#define MMC_RSP_136             (1 << 1)        // 136 bit response
#define MMC_RSP_CRC             (1 << 2)        // expect valid crc
#define MMC_RSP_BUSY    (1 << 3)        // card may send busy
#define MMC_RSP_OPCODE  (1 << 4)        // response contains opcode
 */
arg
resp[4]
blk_sz
data_ptr
A physical address of a buffer that's provided by client. It's assumed to be noncacheable dma-able (contiguous).
buf_off
For PIO mode (i.e., MMCSD_VUC_DATA_PHYS isn't set), this is the offset of the buffer for this command in the array, starting from the first command structure.
data_len
timeout
The timeout value for the command, in milliseconds. The default is 5 seconds if this member is set to 0.
postdelay_us
The number of microseconds to sleep for after each VUC.

Input:

Output:

See also:

devctl() in the QNX Neutrino C Library Reference