blob: 0b62771c211a5928423744dfed50650ada23756d [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Eddie Caif6460922017-12-15 08:17:10 +08002/*
3 * (C) Copyright 2017
4 *
5 * Eddie Cai <eddie.cai.linux@gmail.com>
Eddie Caif6460922017-12-15 08:17:10 +08006 */
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
39enum rkusb_command {
40K_FW_TEST_UNIT_READY = 0x00,
41K_FW_READ_FLASH_ID = 0x01,
42K_FW_SET_DEVICE_ID = 0x02,
43K_FW_TEST_BAD_BLOCK = 0x03,
44K_FW_READ_10 = 0x04,
45K_FW_WRITE_10 = 0x05,
46K_FW_ERASE_10 = 0x06,
47K_FW_WRITE_SPARE = 0x07,
48K_FW_READ_SPARE = 0x08,
49
50K_FW_ERASE_10_FORCE = 0x0b,
51K_FW_GET_VERSION = 0x0c,
52
53K_FW_LBA_READ_10 = 0x14,
54K_FW_LBA_WRITE_10 = 0x15,
55K_FW_ERASE_SYS_DISK = 0x16,
56K_FW_SDRAM_READ_10 = 0x17,
57K_FW_SDRAM_WRITE_10 = 0x18,
58K_FW_SDRAM_EXECUTE = 0x19,
59K_FW_READ_FLASH_INFO = 0x1A,
60K_FW_GET_CHIP_VER = 0x1B,
61K_FW_LOW_FORMAT = 0x1C,
62K_FW_SET_RESET_FLAG = 0x1E,
63K_FW_SPI_READ_10 = 0x21,
64K_FW_SPI_WRITE_10 = 0x22,
65
66K_FW_SESSION = 0X30,
67K_FW_RESET = 0xff,
68};
69
70#define CBW_DIRECTION_OUT 0x00
71#define CBW_DIRECTION_IN 0x80
72
73struct 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 */
82struct 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 */
97struct 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
113struct 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*/
130void rockusb_dev_init(char *dev_type, int dev_index);
131#endif /* _F_ROCKUSB_H_ */
132