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