Home | History | Annotate | Download | only in arch-rockchip
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * (C) Copyright 2017
      4  *
      5  * Eddie Cai <eddie.cai.linux (at) 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 
     31 #define RKUSB_STATUS_IDLE			0
     32 #define RKUSB_STATUS_CMD			1
     33 #define RKUSB_STATUS_RXDATA			2
     34 #define RKUSB_STATUS_TXDATA			3
     35 #define RKUSB_STATUS_CSW			4
     36 #define RKUSB_STATUS_RXDATA_PREPARE		5
     37 #define RKUSB_STATUS_TXDATA_PREPARE		6
     38 
     39 enum rkusb_command {
     40 K_FW_TEST_UNIT_READY	= 0x00,
     41 K_FW_READ_FLASH_ID = 0x01,
     42 K_FW_SET_DEVICE_ID = 0x02,
     43 K_FW_TEST_BAD_BLOCK = 0x03,
     44 K_FW_READ_10 = 0x04,
     45 K_FW_WRITE_10 = 0x05,
     46 K_FW_ERASE_10 = 0x06,
     47 K_FW_WRITE_SPARE = 0x07,
     48 K_FW_READ_SPARE = 0x08,
     49 
     50 K_FW_ERASE_10_FORCE = 0x0b,
     51 K_FW_GET_VERSION = 0x0c,
     52 
     53 K_FW_LBA_READ_10 = 0x14,
     54 K_FW_LBA_WRITE_10 = 0x15,
     55 K_FW_ERASE_SYS_DISK = 0x16,
     56 K_FW_SDRAM_READ_10 = 0x17,
     57 K_FW_SDRAM_WRITE_10 = 0x18,
     58 K_FW_SDRAM_EXECUTE = 0x19,
     59 K_FW_READ_FLASH_INFO = 0x1A,
     60 K_FW_GET_CHIP_VER = 0x1B,
     61 K_FW_LOW_FORMAT = 0x1C,
     62 K_FW_SET_RESET_FLAG = 0x1E,
     63 K_FW_SPI_READ_10 = 0x21,
     64 K_FW_SPI_WRITE_10 = 0x22,
     65 
     66 K_FW_SESSION = 0X30,
     67 K_FW_RESET = 0xff,
     68 };
     69 
     70 #define CBW_DIRECTION_OUT		0x00
     71 #define CBW_DIRECTION_IN		0x80
     72 
     73 struct cmd_dispatch_info {
     74 	enum rkusb_command cmd;
     75 	/* call back function to handle rockusb command */
     76 	void (*cb)(struct usb_ep *ep, struct usb_request *req);
     77 };
     78 
     79 /* Bulk-only data structures */
     80 
     81 /* Command Block Wrapper */
     82 struct fsg_bulk_cb_wrap {
     83 	__le32  signature;              /* Contains 'USBC' */
     84 	u32     tag;                    /* Unique per command id */
     85 	__le32  data_transfer_length;   /* Size of the data */
     86 	u8      flags;                  /* Direction in bit 7 */
     87 	u8      lun;                    /* lun (normally 0) */
     88 	u8      length;                 /* Of the CDB, <= MAX_COMMAND_SIZE */
     89 	u8      CDB[16];                /* Command Data Block */
     90 };
     91 
     92 #define USB_BULK_CB_WRAP_LEN    31
     93 #define USB_BULK_CB_SIG         0x43425355      /* Spells out USBC */
     94 #define USB_BULK_IN_FLAG        0x80
     95 
     96 /* Command status Wrapper */
     97 struct bulk_cs_wrap {
     98 	__le32  signature;              /* Should = 'USBS' */
     99 	u32     tag;                    /* Same as original command */
    100 	__le32  residue;                /* Amount not transferred */
    101 	u8      status;                 /* See below */
    102 };
    103 
    104 #define USB_BULK_CS_WRAP_LEN    13
    105 #define USB_BULK_CS_SIG         0x53425355      /* Spells out 'USBS' */
    106 #define USB_STATUS_PASS         0
    107 #define USB_STATUS_FAIL         1
    108 #define USB_STATUS_PHASE_ERROR  2
    109 
    110 #define CSW_GOOD                0x00
    111 #define CSW_FAIL                0x01
    112 
    113 struct f_rockusb {
    114 	struct usb_function usb_function;
    115 	struct usb_ep *in_ep, *out_ep;
    116 	struct usb_request *in_req, *out_req;
    117 	char *dev_type;
    118 	unsigned int dev_index;
    119 	unsigned int tag;
    120 	unsigned int lba;
    121 	unsigned int dl_size;
    122 	unsigned int dl_bytes;
    123 	struct blk_desc *desc;
    124 	int reboot_flag;
    125 	void *buf;
    126 	void *buf_head;
    127 };
    128 
    129 /* init rockusb device, tell rockusb which device you want to read/write*/
    130 void rockusb_dev_init(char *dev_type, int dev_index);
    131 #endif /* _F_ROCKUSB_H_ */
    132 
    133