xref: /rk3399_rockchip-uboot/drivers/usb/gadget/f_rockusb.c (revision 5ec685037a799ecdc53ecb1a12a9ed5a9cecb4f4)
1 /*
2  * Copyright 2017 Rockchip Electronics Co., Ltd
3  * Frank Wang <frank.wang@rock-chips.com>
4  *
5  * SPDX-License-Identifier:	GPL-2.0+
6  */
7 
8 #include <rockusb.h>
9 
10 #define ROCKUSB_INTERFACE_CLASS	0xff
11 #define ROCKUSB_INTERFACE_SUB_CLASS	0x06
12 #define ROCKUSB_INTERFACE_PROTOCOL	0x05
13 
14 static struct usb_interface_descriptor rkusb_intf_desc = {
15 	.bLength		= USB_DT_INTERFACE_SIZE,
16 	.bDescriptorType	= USB_DT_INTERFACE,
17 	.bInterfaceNumber	= 0x00,
18 	.bAlternateSetting	= 0x00,
19 	.bNumEndpoints		= 0x02,
20 	.bInterfaceClass	= ROCKUSB_INTERFACE_CLASS,
21 	.bInterfaceSubClass	= ROCKUSB_INTERFACE_SUB_CLASS,
22 	.bInterfaceProtocol	= ROCKUSB_INTERFACE_PROTOCOL,
23 };
24 
25 static struct usb_descriptor_header *rkusb_fs_function[] = {
26 	(struct usb_descriptor_header *)&rkusb_intf_desc,
27 	(struct usb_descriptor_header *)&fsg_fs_bulk_in_desc,
28 	(struct usb_descriptor_header *)&fsg_fs_bulk_out_desc,
29 	NULL,
30 };
31 
32 static struct usb_descriptor_header *rkusb_hs_function[] = {
33 	(struct usb_descriptor_header *)&rkusb_intf_desc,
34 	(struct usb_descriptor_header *)&fsg_hs_bulk_in_desc,
35 	(struct usb_descriptor_header *)&fsg_hs_bulk_out_desc,
36 	NULL,
37 };
38 
39 struct rk_flash_info {
40 	u32	flash_size;
41 	u16	block_size;
42 	u8	page_size;
43 	u8	ecc_bits;
44 	u8	access_time;
45 	u8	manufacturer;
46 	u8	flash_mask;
47 } __packed;
48 
49 int g_dnl_bind_fixup(struct usb_device_descriptor *dev, const char *name)
50 {
51 	if (IS_RKUSB_UMS_DNL(name)) {
52 		/* Fix to Rockchip VID and PID */
53 		dev->idVendor  = __constant_cpu_to_le16(0x2207);
54 		dev->idProduct = __constant_cpu_to_le16(CONFIG_ROCKUSB_G_DNL_PID);
55 
56 		/* Enumerate as a loader device */
57 		dev->bcdUSB = cpu_to_le16(0x0201);
58 	}
59 
60 	return 0;
61 }
62 
63 __maybe_unused
64 static inline void dump_cbw(struct fsg_bulk_cb_wrap *cbw)
65 {
66 	assert(!cbw);
67 
68 	debug("%s:\n", __func__);
69 	debug("Signature %x\n", cbw->Signature);
70 	debug("Tag %x\n", cbw->Tag);
71 	debug("DataTransferLength %x\n", cbw->DataTransferLength);
72 	debug("Flags %x\n", cbw->Flags);
73 	debug("LUN %x\n", cbw->Lun);
74 	debug("Length %x\n", cbw->Length);
75 	debug("OptionCode %x\n", cbw->CDB[0]);
76 	debug("SubCode %x\n", cbw->CDB[1]);
77 	debug("SectorAddr %x\n", get_unaligned_be32(&cbw->CDB[2]));
78 	debug("BlkSectors %x\n\n", get_unaligned_be16(&cbw->CDB[7]));
79 }
80 
81 static int rkusb_check_lun(struct fsg_common *common)
82 {
83 	struct fsg_lun *curlun;
84 
85 	/* Check the LUN */
86 	if (common->lun >= 0 && common->lun < common->nluns) {
87 		curlun = &common->luns[common->lun];
88 		if (common->cmnd[0] != SC_REQUEST_SENSE) {
89 			curlun->sense_data = SS_NO_SENSE;
90 			curlun->info_valid = 0;
91 		}
92 	} else {
93 		curlun = NULL;
94 		common->bad_lun_okay = 0;
95 
96 		/*
97 		 * INQUIRY and REQUEST SENSE commands are explicitly allowed
98 		 * to use unsupported LUNs; all others may not.
99 		 */
100 		if (common->cmnd[0] != SC_INQUIRY &&
101 		    common->cmnd[0] != SC_REQUEST_SENSE) {
102 			debug("unsupported LUN %d\n", common->lun);
103 			return -EINVAL;
104 		}
105 	}
106 
107 	return 0;
108 }
109 
110 static void __do_reset(struct usb_ep *ep, struct usb_request *req)
111 {
112 	do_reset(NULL, 0, 0, NULL);
113 }
114 
115 static int rkusb_do_reset(struct fsg_common *common,
116 			  struct fsg_buffhd *bh)
117 {
118 	common->data_size_from_cmnd = common->cmnd[4];
119 	common->residue = 0;
120 	bh->inreq->complete = __do_reset;
121 	bh->state = BUF_STATE_EMPTY;
122 
123 	return 0;
124 }
125 
126 static int rkusb_do_test_unit_ready(struct fsg_common *common,
127 				    struct fsg_buffhd *bh)
128 {
129 	common->residue = 0x06 << 24; /* Max block xfer support from host */
130 	common->data_dir = DATA_DIR_NONE;
131 	bh->state = BUF_STATE_EMPTY;
132 
133 	return 0;
134 }
135 
136 static int rkusb_do_read_flash_id(struct fsg_common *common,
137 				  struct fsg_buffhd *bh)
138 {
139 	u8 *buf = (u8 *)bh->buf;
140 	u32 len = common->data_size;
141 
142 	memcpy((void *)&buf[0], "EMMC ", 5);
143 
144 	/* Set data xfer size */
145 	common->residue = common->data_size_from_cmnd = len;
146 
147 	return len;
148 }
149 
150 static int rkusb_do_test_bad_block(struct fsg_common *common,
151 				   struct fsg_buffhd *bh)
152 {
153 	u8 *buf = (u8 *)bh->buf;
154 	u32 len = common->data_size;
155 
156 	memset((void *)&buf[0], 0, len);
157 
158 	/* Set data xfer size */
159 	common->residue = common->data_size_from_cmnd = len;
160 
161 	return len;
162 }
163 
164 static int rkusb_do_read_flash_info(struct fsg_common *common,
165 				    struct fsg_buffhd *bh)
166 {
167 	u8 *buf = (u8 *)bh->buf;
168 	u32 len = common->data_size;
169 	struct rk_flash_info finfo = {
170 		.block_size = 1024,
171 		.ecc_bits = 0,
172 		.page_size = 4,
173 		.access_time = 40,
174 		.manufacturer = 0,
175 		.flash_mask = 0
176 	};
177 
178 	finfo.flash_size = (u32)ums[common->lun].block_dev.lba;
179 	if (finfo.flash_size)
180 		finfo.flash_mask = 1;
181 
182 	memset((void *)&buf[0], 0, len);
183 	memcpy((void *)&buf[0], (void *)&finfo, len);
184 
185 	/* Set data xfer size */
186 	common->residue = common->data_size_from_cmnd = len;
187 
188 	return len;
189 }
190 
191 static int rkusb_do_lba_erase(struct fsg_common *common,
192 			      struct fsg_buffhd *bh)
193 {
194 	struct fsg_lun *curlun = &common->luns[common->lun];
195 	u32 lba, amount;
196 	loff_t file_offset;
197 	int rc;
198 
199 	lba = get_unaligned_be32(&common->cmnd[2]);
200 	if (lba >= curlun->num_sectors) {
201 		curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
202 		rc = -EINVAL;
203 		goto out;
204 	}
205 
206 	file_offset = ((loff_t) lba) << 9;
207 	amount = get_unaligned_be16(&common->cmnd[7]) << 9;
208 	if (unlikely(amount == 0)) {
209 		curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
210 		rc = -EIO;
211 		goto out;
212 	}
213 
214 	/* Perform the erase */
215 	rc = ums[common->lun].erase_sector(&ums[common->lun],
216 			       file_offset / SECTOR_SIZE,
217 			       amount / SECTOR_SIZE);
218 	if (!rc) {
219 		curlun->sense_data = SS_MEDIUM_NOT_PRESENT;
220 		rc = -EIO;
221 	}
222 
223 out:
224 	common->data_dir = DATA_DIR_NONE;
225 	bh->state = BUF_STATE_EMPTY;
226 
227 	return rc;
228 }
229 
230 static int rkusb_do_read_capacity(struct fsg_common *common,
231 				    struct fsg_buffhd *bh)
232 {
233 	u8 *buf = (u8 *)bh->buf;
234 	u32 len = common->data_size;
235 
236 	/*
237 	 * bit[0]: Direct LBA, 0: Disabled;
238 	 * bit[1:63}: Reserved.
239 	 */
240 	memset((void *)&buf[0], 0, len);
241 
242 	/* Set data xfer size */
243 	common->residue = common->data_size_from_cmnd = len;
244 
245 	return len;
246 }
247 
248 static int rkusb_cmd_process(struct fsg_common *common,
249 			     struct fsg_buffhd *bh, int *reply)
250 {
251 	struct usb_request	*req = bh->outreq;
252 	struct fsg_bulk_cb_wrap	*cbw = req->buf;
253 	int rc;
254 
255 	dump_cbw(cbw);
256 
257 	if (rkusb_check_lun(common)) {
258 		*reply = -EINVAL;
259 		return RKUSB_RC_ERROR;
260 	}
261 
262 	switch (common->cmnd[0]) {
263 	case RKUSB_TEST_UNIT_READY:
264 		*reply = rkusb_do_test_unit_ready(common, bh);
265 		rc = RKUSB_RC_FINISHED;
266 		break;
267 
268 	case RKUSB_READ_FLASH_ID:
269 		*reply = rkusb_do_read_flash_id(common, bh);
270 		rc = RKUSB_RC_FINISHED;
271 		break;
272 
273 	case RKUSB_TEST_BAD_BLOCK:
274 		*reply = rkusb_do_test_bad_block(common, bh);
275 		rc = RKUSB_RC_FINISHED;
276 		break;
277 
278 	case RKUSB_LBA_READ_10:
279 		common->cmnd[0] = SC_READ_10;
280 		common->cmnd[1] = 0; /* Not support */
281 		rc = RKUSB_RC_CONTINUE;
282 		break;
283 
284 	case RKUSB_LBA_WRITE_10:
285 		common->cmnd[0] = SC_WRITE_10;
286 		common->cmnd[1] = 0; /* Not support */
287 		rc = RKUSB_RC_CONTINUE;
288 		break;
289 
290 	case RKUSB_READ_FLASH_INFO:
291 		*reply = rkusb_do_read_flash_info(common, bh);
292 		rc = RKUSB_RC_FINISHED;
293 		break;
294 
295 	case RKUSB_LBA_ERASE:
296 		*reply = rkusb_do_lba_erase(common, bh);
297 		rc = RKUSB_RC_FINISHED;
298 		break;
299 
300 	case RKUSB_READ_CAPACITY:
301 		*reply = rkusb_do_read_capacity(common, bh);
302 		rc = RKUSB_RC_FINISHED;
303 		break;
304 
305 	case RKUSB_RESET:
306 		*reply = rkusb_do_reset(common, bh);
307 		rc = RKUSB_RC_FINISHED;
308 		break;
309 
310 	case RKUSB_SET_DEVICE_ID:
311 	case RKUSB_READ_10:
312 	case RKUSB_WRITE_10:
313 	case RKUSB_ERASE_10:
314 	case RKUSB_WRITE_SPARE:
315 	case RKUSB_READ_SPARE:
316 	case RKUSB_ERASE_10_FORCE:
317 	case RKUSB_GET_VERSION:
318 	case RKUSB_ERASE_SYS_DISK:
319 	case RKUSB_SDRAM_READ_10:
320 	case RKUSB_SDRAM_WRITE_10:
321 	case RKUSB_SDRAM_EXECUTE:
322 	case RKUSB_GET_CHIP_VER:
323 	case RKUSB_LOW_FORMAT:
324 	case RKUSB_SET_RESET_FLAG:
325 	case RKUSB_SPI_READ_10:
326 	case RKUSB_SPI_WRITE_10:
327 	case RKUSB_SESSION:
328 		/* Fall through */
329 	default:
330 		rc = RKUSB_RC_UNKNOWN_CMND;
331 		break;
332 	}
333 
334 	return rc;
335 }
336 
337 DECLARE_GADGET_BIND_CALLBACK(rkusb_ums_dnl, fsg_add);
338