uboot/arch/arm/include/asm/arch-rockchip/f_rockusb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2017
   4 *
   5 * Eddie Cai <eddie.cai.linux@gmail.com>
   6 */
   7
   8#ifndef _F_ROCKUSB_H_
   9#define _F_ROCKUSB_H_
  10#include <blk.h>
  11
  12#define ROCKUSB_VERSION         "0.1"
  13
  14#define ROCKUSB_INTERFACE_CLASS 0xff
  15#define ROCKUSB_INTERFACE_SUB_CLASS     0x06
  16#define ROCKUSB_INTERFACE_PROTOCOL      0x05
  17
  18#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_2_0  0x0200
  19#define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_1_1  0x0040
  20#define TX_ENDPOINT_MAXIMUM_PACKET_SIZE      0x0040
  21
  22#define EP_BUFFER_SIZE                  4096
  23/*
  24 * EP_BUFFER_SIZE must always be an integral multiple of maxpacket size
  25 * (64 or 512 or 1024), else we break on certain controllers like DWC3
  26 * that expect bulk OUT requests to be divisible by maxpacket size.
  27 */
  28
  29#define RKUSB_BUF_SIZE          EP_BUFFER_SIZE * 2
  30#define RKBLOCK_BUF_SIZE                4096
  31
  32#define RKUSB_STATUS_IDLE                       0
  33#define RKUSB_STATUS_CMD                        1
  34#define RKUSB_STATUS_RXDATA                     2
  35#define RKUSB_STATUS_TXDATA                     3
  36#define RKUSB_STATUS_CSW                        4
  37#define RKUSB_STATUS_RXDATA_PREPARE             5
  38#define RKUSB_STATUS_TXDATA_PREPARE             6
  39
  40enum rkusb_command {
  41K_FW_TEST_UNIT_READY    = 0x00,
  42K_FW_READ_FLASH_ID = 0x01,
  43K_FW_SET_DEVICE_ID = 0x02,
  44K_FW_TEST_BAD_BLOCK = 0x03,
  45K_FW_READ_10 = 0x04,
  46K_FW_WRITE_10 = 0x05,
  47K_FW_ERASE_10 = 0x06,
  48K_FW_WRITE_SPARE = 0x07,
  49K_FW_READ_SPARE = 0x08,
  50
  51K_FW_ERASE_10_FORCE = 0x0b,
  52K_FW_GET_VERSION = 0x0c,
  53
  54K_FW_LBA_READ_10 = 0x14,
  55K_FW_LBA_WRITE_10 = 0x15,
  56K_FW_ERASE_SYS_DISK = 0x16,
  57K_FW_SDRAM_READ_10 = 0x17,
  58K_FW_SDRAM_WRITE_10 = 0x18,
  59K_FW_SDRAM_EXECUTE = 0x19,
  60K_FW_READ_FLASH_INFO = 0x1A,
  61K_FW_GET_CHIP_VER = 0x1B,
  62K_FW_LOW_FORMAT = 0x1C,
  63K_FW_SET_RESET_FLAG = 0x1E,
  64K_FW_SPI_READ_10 = 0x21,
  65K_FW_SPI_WRITE_10 = 0x22,
  66K_FW_LBA_ERASE_10 = 0x25,
  67
  68K_FW_SESSION = 0X30,
  69K_FW_RESET = 0xff,
  70};
  71
  72#define CBW_DIRECTION_OUT               0x00
  73#define CBW_DIRECTION_IN                0x80
  74
  75struct cmd_dispatch_info {
  76        enum rkusb_command cmd;
  77        /* call back function to handle rockusb command */
  78        void (*cb)(struct usb_ep *ep, struct usb_request *req);
  79};
  80
  81/* Bulk-only data structures */
  82
  83/* Command Block Wrapper */
  84struct fsg_bulk_cb_wrap {
  85        __le32  signature;              /* Contains 'USBC' */
  86        u32     tag;                    /* Unique per command id */
  87        __le32  data_transfer_length;   /* Size of the data */
  88        u8      flags;                  /* Direction in bit 7 */
  89        u8      lun;                    /* lun (normally 0) */
  90        u8      length;                 /* Of the CDB, <= MAX_COMMAND_SIZE */
  91        u8      CDB[16];                /* Command Data Block */
  92};
  93
  94#define USB_BULK_CB_WRAP_LEN    31
  95#define USB_BULK_CB_SIG         0x43425355      /* Spells out USBC */
  96#define USB_BULK_IN_FLAG        0x80
  97
  98/* Command status Wrapper */
  99struct bulk_cs_wrap {
 100        __le32  signature;              /* Should = 'USBS' */
 101        u32     tag;                    /* Same as original command */
 102        __le32  residue;                /* Amount not transferred */
 103        u8      status;                 /* See below */
 104};
 105
 106#define USB_BULK_CS_WRAP_LEN    13
 107#define USB_BULK_CS_SIG         0x53425355      /* Spells out 'USBS' */
 108#define USB_STATUS_PASS         0
 109#define USB_STATUS_FAIL         1
 110#define USB_STATUS_PHASE_ERROR  2
 111
 112#define CSW_GOOD                0x00
 113#define CSW_FAIL                0x01
 114
 115struct f_rockusb {
 116        struct usb_function usb_function;
 117        struct usb_ep *in_ep, *out_ep;
 118        struct usb_request *in_req, *out_req;
 119        char *dev_type;
 120        unsigned int dev_index;
 121        unsigned int tag;
 122        unsigned int lba;
 123        unsigned int dl_size;
 124        unsigned int dl_bytes;
 125        unsigned int ul_size;
 126        unsigned int ul_bytes;
 127        struct blk_desc *desc;
 128        int reboot_flag;
 129        void *buf;
 130        void *buf_head;
 131};
 132
 133/* init rockusb device, tell rockusb which device you want to read/write*/
 134void rockusb_dev_init(char *dev_type, int dev_index);
 135#endif /* _F_ROCKUSB_H_ */
 136