1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * f_dfu.h -- Device Firmware Update gadget 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2011-2012 Samsung Electronics 5*4882a593Smuzhiyun * author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __F_DFU_H_ 11*4882a593Smuzhiyun #define __F_DFU_H_ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/compiler.h> 14*4882a593Smuzhiyun #include <linux/usb/composite.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define DFU_CONFIG_VAL 1 17*4882a593Smuzhiyun #define DFU_DT_FUNC 0x21 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define DFU_BIT_WILL_DETACH (0x1 << 3) 20*4882a593Smuzhiyun #define DFU_BIT_MANIFESTATION_TOLERANT (0x1 << 2) 21*4882a593Smuzhiyun #define DFU_BIT_CAN_UPLOAD (0x1 << 1) 22*4882a593Smuzhiyun #define DFU_BIT_CAN_DNLOAD 0x1 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* big enough to hold our biggest descriptor */ 25*4882a593Smuzhiyun #define DFU_USB_BUFSIZ 4096 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define USB_REQ_DFU_DETACH 0x00 28*4882a593Smuzhiyun #define USB_REQ_DFU_DNLOAD 0x01 29*4882a593Smuzhiyun #define USB_REQ_DFU_UPLOAD 0x02 30*4882a593Smuzhiyun #define USB_REQ_DFU_GETSTATUS 0x03 31*4882a593Smuzhiyun #define USB_REQ_DFU_CLRSTATUS 0x04 32*4882a593Smuzhiyun #define USB_REQ_DFU_GETSTATE 0x05 33*4882a593Smuzhiyun #define USB_REQ_DFU_ABORT 0x06 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define DFU_STATUS_OK 0x00 36*4882a593Smuzhiyun #define DFU_STATUS_errTARGET 0x01 37*4882a593Smuzhiyun #define DFU_STATUS_errFILE 0x02 38*4882a593Smuzhiyun #define DFU_STATUS_errWRITE 0x03 39*4882a593Smuzhiyun #define DFU_STATUS_errERASE 0x04 40*4882a593Smuzhiyun #define DFU_STATUS_errCHECK_ERASED 0x05 41*4882a593Smuzhiyun #define DFU_STATUS_errPROG 0x06 42*4882a593Smuzhiyun #define DFU_STATUS_errVERIFY 0x07 43*4882a593Smuzhiyun #define DFU_STATUS_errADDRESS 0x08 44*4882a593Smuzhiyun #define DFU_STATUS_errNOTDONE 0x09 45*4882a593Smuzhiyun #define DFU_STATUS_errFIRMWARE 0x0a 46*4882a593Smuzhiyun #define DFU_STATUS_errVENDOR 0x0b 47*4882a593Smuzhiyun #define DFU_STATUS_errUSBR 0x0c 48*4882a593Smuzhiyun #define DFU_STATUS_errPOR 0x0d 49*4882a593Smuzhiyun #define DFU_STATUS_errUNKNOWN 0x0e 50*4882a593Smuzhiyun #define DFU_STATUS_errSTALLEDPKT 0x0f 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define RET_STALL -1 53*4882a593Smuzhiyun #define RET_ZLP 0 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun enum dfu_state { 56*4882a593Smuzhiyun DFU_STATE_appIDLE = 0, 57*4882a593Smuzhiyun DFU_STATE_appDETACH = 1, 58*4882a593Smuzhiyun DFU_STATE_dfuIDLE = 2, 59*4882a593Smuzhiyun DFU_STATE_dfuDNLOAD_SYNC = 3, 60*4882a593Smuzhiyun DFU_STATE_dfuDNBUSY = 4, 61*4882a593Smuzhiyun DFU_STATE_dfuDNLOAD_IDLE = 5, 62*4882a593Smuzhiyun DFU_STATE_dfuMANIFEST_SYNC = 6, 63*4882a593Smuzhiyun DFU_STATE_dfuMANIFEST = 7, 64*4882a593Smuzhiyun DFU_STATE_dfuMANIFEST_WAIT_RST = 8, 65*4882a593Smuzhiyun DFU_STATE_dfuUPLOAD_IDLE = 9, 66*4882a593Smuzhiyun DFU_STATE_dfuERROR = 10, 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct dfu_status { 70*4882a593Smuzhiyun __u8 bStatus; 71*4882a593Smuzhiyun __u8 bwPollTimeout[3]; 72*4882a593Smuzhiyun __u8 bState; 73*4882a593Smuzhiyun __u8 iString; 74*4882a593Smuzhiyun } __packed; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct dfu_function_descriptor { 77*4882a593Smuzhiyun __u8 bLength; 78*4882a593Smuzhiyun __u8 bDescriptorType; 79*4882a593Smuzhiyun __u8 bmAttributes; 80*4882a593Smuzhiyun __le16 wDetachTimeOut; 81*4882a593Smuzhiyun __le16 wTransferSize; 82*4882a593Smuzhiyun __le16 bcdDFUVersion; 83*4882a593Smuzhiyun } __packed; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #define DFU_POLL_TIMEOUT_MASK (0xFFFFFFUL) 86*4882a593Smuzhiyun #endif /* __F_DFU_H_ */ 87