/* * boot/dfu.h - DFU protocol constants and data structures * * Written 2008, 2011, 2013-2015 by Werner Almesberger * Copyright 2008, 2011, 2013-2015 Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ #ifndef DFU_H #define DFU_H #include #include #include "usb.h" enum dfu_request { DFU_DETACH, DFU_DNLOAD, DFU_UPLOAD, DFU_GETSTATUS, DFU_CLRSTATUS, DFU_GETSTATE, DFU_ABORT, }; enum dfu_status { OK, errTARGET, errFILE, errWRITE, errERASE, errCHECK_ERASED, errPROG, errVERIFY, errADDRESS, errNOTDONE, errFIRMWARE, errVENDOR, errUSBR, errPOR, errUNKNOWN, errSTALLEDPKT, }; enum dfu_state { appIDLE, appDETACH, dfuIDLE, dfuDNLOAD_SYNC, dfuDNBUSY, dfuDNLOAD_IDLE, dfuMANIFEST_SYNC, dfuMANIFEST, dfuMANIFEST_WAIT_RESET, dfuUPLOAD_IDLE, dfuERROR }; enum dfu_itf_proto { dfu_proto_runtime = 1, /* Runtime protocol */ dfu_proto_dfu = 2, /* DFU mode protocol */ }; #define DFU_DT_FUNCTIONAL 0x21 /* DFU FUNCTIONAL descriptor type */ #define DFU_TO_DEV(req) (0x21 | (req) << 8) #define DFU_FROM_DEV(req) (0xa1 | (req) << 8) struct dfu { uint8_t status; /* bStatus */ uint8_t toL, toM, toH; /* bwPollTimeout */ uint8_t state; /* bState */ uint8_t iString; }; #define DFU_ITF_DESCR(itf, alt, proto, idx) \ 9, /* bLength */ \ USB_DT_INTERFACE, /* bDescriptorType */ \ (itf), /* bInterfaceNumber */ \ (alt), /* bAlternateSetting */ \ 0, /* bNumEndpoints */ \ 0xfe, /* bInterfaceClass (application specific) */ \ 0x01, /* bInterfaceSubClass (device fw upgrade) */ \ (proto), /* bInterfaceProtocol (dfu_proto_*) */ \ (idx), /* iInterface */ struct dfu_flash_ops { void (*start)(void); bool (*can_write)(uint16_t size); void (*write)(const uint8_t *buf, uint16_t size); void (*end_write)(void); uint16_t (*read)(uint8_t *buf, uint16_t size); }; extern struct dfu dfu; extern const struct dfu_flash_ops *dfu_flash_ops; bool dfu_setup_common(const struct setup_request *setup); bool dfu_my_descr(uint8_t type, uint8_t index, const uint8_t **reply, uint8_t *size); void dfu_init(void); #endif /* !DFU_H */