xref: /rk3399_ARM-atf/plat/st/common/include/usb_dfu.h (revision 4fcbbb33c31ddf4461e6b557f8aec1a72411ac10)
1*efbd65faSPatrick Delaunay /*
2*efbd65faSPatrick Delaunay  * Copyright (c) 2021, STMicroelectronics - All Rights Reserved
3*efbd65faSPatrick Delaunay  *
4*efbd65faSPatrick Delaunay  * SPDX-License-Identifier: BSD-3-Clause
5*efbd65faSPatrick Delaunay  */
6*efbd65faSPatrick Delaunay 
7*efbd65faSPatrick Delaunay #ifndef USB_DFU_H
8*efbd65faSPatrick Delaunay #define USB_DFU_H
9*efbd65faSPatrick Delaunay 
10*efbd65faSPatrick Delaunay #include <stdint.h>
11*efbd65faSPatrick Delaunay 
12*efbd65faSPatrick Delaunay #include <drivers/usb_device.h>
13*efbd65faSPatrick Delaunay 
14*efbd65faSPatrick Delaunay #define DFU_DESCRIPTOR_TYPE		0x21U
15*efbd65faSPatrick Delaunay 
16*efbd65faSPatrick Delaunay /* Max DFU Packet Size = 1024 bytes */
17*efbd65faSPatrick Delaunay #define USBD_DFU_XFER_SIZE		1024U
18*efbd65faSPatrick Delaunay 
19*efbd65faSPatrick Delaunay #define TRANSFER_SIZE_BYTES(size) \
20*efbd65faSPatrick Delaunay 	((uint8_t)((size) & 0xFF)), /* XFERSIZEB0 */\
21*efbd65faSPatrick Delaunay 	((uint8_t)((size) >> 8))    /* XFERSIZEB1 */
22*efbd65faSPatrick Delaunay 
23*efbd65faSPatrick Delaunay /*
24*efbd65faSPatrick Delaunay  * helper for descriptor of DFU interface 0 Alternate setting n
25*efbd65faSPatrick Delaunay  * with iInterface = index of string descriptor, assumed Nth user string
26*efbd65faSPatrick Delaunay  */
27*efbd65faSPatrick Delaunay #define USBD_DFU_IF_DESC(n)	0x09U, /* Interface Descriptor size */\
28*efbd65faSPatrick Delaunay 				USB_DESC_TYPE_INTERFACE, /* descriptor type */\
29*efbd65faSPatrick Delaunay 				0x00U, /* Number of Interface */\
30*efbd65faSPatrick Delaunay 				(n), /* Alternate setting */\
31*efbd65faSPatrick Delaunay 				0x00U, /* bNumEndpoints*/\
32*efbd65faSPatrick Delaunay 				0xFEU, /* Application Specific Class Code */\
33*efbd65faSPatrick Delaunay 				0x01U, /* Device Firmware Upgrade Code */\
34*efbd65faSPatrick Delaunay 				0x02U, /* DFU mode protocol */ \
35*efbd65faSPatrick Delaunay 				USBD_IDX_USER0_STR + (n) /* iInterface */
36*efbd65faSPatrick Delaunay 
37*efbd65faSPatrick Delaunay /* DFU1.1 Standard */
38*efbd65faSPatrick Delaunay #define USB_DFU_VERSION			0x0110U
39*efbd65faSPatrick Delaunay #define USB_DFU_ITF_SIZ			9U
40*efbd65faSPatrick Delaunay #define USB_DFU_DESC_SIZ(itf)		(USB_DFU_ITF_SIZ * ((itf) + 2U))
41*efbd65faSPatrick Delaunay 
42*efbd65faSPatrick Delaunay /*
43*efbd65faSPatrick Delaunay  * bmAttribute value for DFU:
44*efbd65faSPatrick Delaunay  * bitCanDnload = 1(bit 0)
45*efbd65faSPatrick Delaunay  * bitCanUpload = 1(bit 1)
46*efbd65faSPatrick Delaunay  * bitManifestationTolerant = 1 (bit 2)
47*efbd65faSPatrick Delaunay  * bitWillDetach = 1(bit 3)
48*efbd65faSPatrick Delaunay  * Reserved (bit4-6)
49*efbd65faSPatrick Delaunay  * bitAcceleratedST = 0(bit 7)
50*efbd65faSPatrick Delaunay  */
51*efbd65faSPatrick Delaunay #define DFU_BM_ATTRIBUTE		0x0FU
52*efbd65faSPatrick Delaunay 
53*efbd65faSPatrick Delaunay #define DFU_STATUS_SIZE			6U
54*efbd65faSPatrick Delaunay 
55*efbd65faSPatrick Delaunay /* Callback for media access */
56*efbd65faSPatrick Delaunay struct usb_dfu_media {
57*efbd65faSPatrick Delaunay 	int (*upload)(uint8_t alt, uintptr_t *buffer, uint32_t *len,
58*efbd65faSPatrick Delaunay 		      void *user_data);
59*efbd65faSPatrick Delaunay 	int (*download)(uint8_t alt, uintptr_t *buffer, uint32_t *len,
60*efbd65faSPatrick Delaunay 			void *user_data);
61*efbd65faSPatrick Delaunay 	int (*manifestation)(uint8_t alt, void *user_data);
62*efbd65faSPatrick Delaunay };
63*efbd65faSPatrick Delaunay 
64*efbd65faSPatrick Delaunay /* Internal DFU handle */
65*efbd65faSPatrick Delaunay struct usb_dfu_handle {
66*efbd65faSPatrick Delaunay 	uint8_t status[DFU_STATUS_SIZE];
67*efbd65faSPatrick Delaunay 	uint8_t dev_state;
68*efbd65faSPatrick Delaunay 	uint8_t dev_status;
69*efbd65faSPatrick Delaunay 	uint8_t alt_setting;
70*efbd65faSPatrick Delaunay 	const struct usb_dfu_media *callback;
71*efbd65faSPatrick Delaunay };
72*efbd65faSPatrick Delaunay 
73*efbd65faSPatrick Delaunay void usb_dfu_register(struct usb_handle *pdev, struct usb_dfu_handle *phandle);
74*efbd65faSPatrick Delaunay 
75*efbd65faSPatrick Delaunay int usb_dfu_loop(struct usb_handle *pdev, const struct usb_dfu_media *pmedia);
76*efbd65faSPatrick Delaunay 
77*efbd65faSPatrick Delaunay /* Function provided by plat */
78*efbd65faSPatrick Delaunay struct usb_handle *usb_dfu_plat_init(void);
79*efbd65faSPatrick Delaunay 
80*efbd65faSPatrick Delaunay #endif /* USB_DFU_H */
81