diff --git a/config/usbd_config.h b/config/usbd_config.h index e8334ec..e33f4ba 100644 --- a/config/usbd_config.h +++ b/config/usbd_config.h @@ -14,33 +14,54 @@ #define CONF_USBD_HS_SP 0 #endif -// ---- USB Device Stack CDC ACM Options ---- +// ---- USB Device Stack DFU Options ---- // Enable String Descriptors -// usb_cdcd_acm_str_en -#ifndef CONF_USB_CDCD_ACM_STR_EN -#define CONF_USB_CDCD_ACM_STR_EN 0 +// USB_DFUD_STR_EN +#ifndef CONF_USB_DFUD_STR_EN +#define CONF_USB_DFUD_STR_EN 0 #endif // Language IDs // Language IDs in c format, split by comma (E.g., 0x0409 ...) -// usb_cdcd_acm_langid -#ifndef CONF_USB_CDCD_ACM_LANGID -#define CONF_USB_CDCD_ACM_LANGID "0x0409" +// usb_dufd_langid +#ifndef CONF_USB_DFUD_LANGID +#define CONF_USB_DFUD_LANGID "0x0409" #endif -#ifndef CONF_USB_CDCD_ACM_LANGID_DESC -#define CONF_USB_CDCD_ACM_LANGID_DESC +#ifndef CONF_USB_DFUD_LANGID_DESC +#define CONF_USB_DFUD_LANGID_DESC 4, 0x03, 0x09, 0x04, #endif // -// CDC ACM Device Descriptor +// DFU Device Descriptor // bcdUSB // <0x0200=> USB 2.0 version // <0x0210=> USB 2.1 version -// usb_cdcd_acm_bcdusb -#ifndef CONF_USB_CDCD_ACM_BCDUSB -#define CONF_USB_CDCD_ACM_BCDUSB 0x200 +// usb_dfud_bcdusb +#ifndef CONF_USB_DFUD_BCDUSB +#define CONF_USB_DFUD_BCDUSB 0x200 +#endif + +// bDeviceClass +// <0=> unused +// usb_dfud_bdeviceclass +#ifndef CONF_USB_DFUD_BDEVICECLASS +#define CONF_USB_DFUD_BDEVICECLASS 0 +#endif + +// bDeviceSubClass +// <0=> unused +// usb_dfud_bdevicesubclass +#ifndef CONF_USB_DFUD_BDEVICESUBCLASS +#define CONF_USB_DFUD_BDEVICESUBCLASS 0 +#endif + +// bDeviceProtocol +// <0=> unused +// usb_dfud_bdeviceprotocol +#ifndef CONF_USB_DFUD_BDEVICEPROTOCOL +#define CONF_USB_DFUD_BDEVICEPROTOCOL 0 #endif // bMaxPackeSize0 @@ -48,133 +69,149 @@ // <0x0010=> 16 bytes // <0x0020=> 32 bytes // <0x0040=> 64 bytes -// usb_cdcd_acm_bmaxpksz0 -#ifndef CONF_USB_CDCD_ACM_BMAXPKSZ0 -#define CONF_USB_CDCD_ACM_BMAXPKSZ0 0x40 +// usb_dufd_bmaxpksz0 +#ifndef CONF_USB_DFUD_BMAXPKSZ0 +#define CONF_USB_DFUD_BMAXPKSZ0 0x40 #endif -// idVender <0x0000-0xFFFF> -// usb_cdcd_acm_idvender -#ifndef CONF_USB_CDCD_ACM_IDVENDER -#define CONF_USB_CDCD_ACM_IDVENDER 0x3eb +// idVendor <0x0000-0xFFFF> +// <0x1d50=> OpenMoko +// usb_octsim_idvendor +#ifndef CONF_USB_OCTSIM_IDVENDOR +#define CONF_USB_OCTSIM_IDVENDOR 0x1d50 #endif // idProduct <0x0000-0xFFFF> -// usb_cdcd_acm_idproduct -#ifndef CONF_USB_CDCD_ACM_IDPRODUCT -#define CONF_USB_CDCD_ACM_IDPRODUCT 0x2404 +// <0x6140=> sysmoOCTSIM +// usb_dufd_idproduct +#ifndef CONF_USB_OCTSIM_IDPRODUCT +#define CONF_USB_OCTSIM_IDPRODUCT 0x6140 #endif // bcdDevice <0x0000-0xFFFF> -// usb_cdcd_acm_bcddevice -#ifndef CONF_USB_CDCD_ACM_BCDDEVICE -#define CONF_USB_CDCD_ACM_BCDDEVICE 0x100 +// usb_dufd_bcddevice +#ifndef CONF_USB_DFUD_BCDDEVICE +#define CONF_USB_DFUD_BCDDEVICE 0x000 #endif // Enable string descriptor of iManufact -// usb_cdcd_acm_imanufact_en -#ifndef CONF_USB_CDCD_ACM_IMANUFACT_EN -#define CONF_USB_CDCD_ACM_IMANUFACT_EN 0 +// usb_dufd_imanufact_en +#ifndef CONF_USB_DFUD_IMANUFACT_EN +#define CONF_USB_DFUD_IMANUFACT_EN 1 #endif -#ifndef CONF_USB_CDCD_ACM_IMANUFACT -#define CONF_USB_CDCD_ACM_IMANUFACT (CONF_USB_CDCD_ACM_IMANUFACT_EN * (CONF_USB_CDCD_ACM_IMANUFACT_EN)) +#ifndef CONF_USB_DFUD_IMANUFACT +#define CONF_USB_DFUD_IMANUFACT (CONF_USB_DFUD_IMANUFACT_EN * (CONF_USB_DFUD_IMANUFACT_EN)) #endif // Unicode string of iManufact -// usb_cdcd_acm_imanufact_str -#ifndef CONF_USB_CDCD_ACM_IMANUFACT_STR -#define CONF_USB_CDCD_ACM_IMANUFACT_STR "Atmel" +// usb_dufd_imanufact_str +#ifndef CONF_USB_DFUD_IMANUFACT_STR +#define CONF_USB_DFUD_IMANUFACT_STR "sysmocom" #endif -#ifndef CONF_USB_CDCD_ACM_IMANUFACT_STR_DESC -#define CONF_USB_CDCD_ACM_IMANUFACT_STR_DESC +#ifndef CONF_USB_DFUD_IMANUFACT_STR_DESC +#define CONF_USB_DFUD_IMANUFACT_STR_DESC 18, 0x03, 's', 0x00, 'y', 0x00, 's', 0x00, 'm', 0x00, 'o', 0x00, 'c', 0x00, 'o', 0x00, 'm', 0x00, #endif // // Enable string descriptor of iProduct -// usb_cdcd_acm_iproduct_en -#ifndef CONF_USB_CDCD_ACM_IPRODUCT_EN -#define CONF_USB_CDCD_ACM_IPRODUCT_EN 0 +// usb_dufd_iproduct_en +#ifndef CONF_USB_DFUD_IPRODUCT_EN +#define CONF_USB_DFUD_IPRODUCT_EN 1 #endif -#ifndef CONF_USB_CDCD_ACM_IPRODUCT -#define CONF_USB_CDCD_ACM_IPRODUCT \ - (CONF_USB_CDCD_ACM_IPRODUCT_EN * (CONF_USB_CDCD_ACM_IMANUFACT_EN + CONF_USB_CDCD_ACM_IPRODUCT_EN)) +#ifndef CONF_USB_DFUD_IPRODUCT +#define CONF_USB_DFUD_IPRODUCT \ + (CONF_USB_DFUD_IPRODUCT_EN * (CONF_USB_DFUD_IMANUFACT_EN + CONF_USB_DFUD_IPRODUCT_EN)) #endif // Unicode string of iProduct -// usb_cdcd_acm_iproduct_str -#ifndef CONF_USB_CDCD_ACM_IPRODUCT_STR -#define CONF_USB_CDCD_ACM_IPRODUCT_STR "CDC ACM Serial Bridge Demo" +// usb_dufd_iproduct_str +#ifndef CONF_USB_DFUD_IPRODUCT_STR +#define CONF_USB_DFUD_IPRODUCT_STR "sysmoOCTSIM" #endif -#ifndef CONF_USB_CDCD_ACM_IPRODUCT_STR_DESC -#define CONF_USB_CDCD_ACM_IPRODUCT_STR_DESC +#ifndef CONF_USB_DFUD_IPRODUCT_STR_DESC +#define CONF_USB_DFUD_IPRODUCT_STR_DESC 24, 0x03, 's', 0x00, 'y', 0x00, 's', 0x00, 'm', 0x00, 'o', 0x00, 'O', 0x00, 'C', 0x00, 'T', 0x00, 'S', 0x00, 'I', 0x00, 'M', 0x00, #endif // // Enable string descriptor of iSerialNum -// usb_cdcd_acm_iserialnum_en -#ifndef CONF_USB_CDCD_ACM_ISERIALNUM_EN -#define CONF_USB_CDCD_ACM_ISERIALNUM_EN 0 +// usb_dufd_iserialnum_en +#ifndef CONF_USB_DFUD_ISERIALNUM_EN +#define CONF_USB_DFUD_ISERIALNUM_EN 0 #endif -#ifndef CONF_USB_CDCD_ACM_ISERIALNUM -#define CONF_USB_CDCD_ACM_ISERIALNUM \ - (CONF_USB_CDCD_ACM_ISERIALNUM_EN \ - * (CONF_USB_CDCD_ACM_IMANUFACT_EN + CONF_USB_CDCD_ACM_IPRODUCT_EN + CONF_USB_CDCD_ACM_ISERIALNUM_EN)) +#ifndef CONF_USB_DFUD_ISERIALNUM +#define CONF_USB_DFUD_ISERIALNUM \ + (CONF_USB_DFUD_ISERIALNUM_EN \ + * (CONF_USB_DFUD_IMANUFACT_EN + CONF_USB_DFUD_IPRODUCT_EN + CONF_USB_DFUD_ISERIALNUM_EN)) #endif // Unicode string of iSerialNum -// usb_cdcd_acm_iserialnum_str -#ifndef CONF_USB_CDCD_ACM_ISERIALNUM_STR -#define CONF_USB_CDCD_ACM_ISERIALNUM_STR "123456789ABCDEF" +// usb_dufd_iserialnum_str +#ifndef CONF_USB_DFUD_ISERIALNUM_STR +#define CONF_USB_DFUD_ISERIALNUM_STR "123456789ABCDEF" #endif -#ifndef CONF_USB_CDCD_ACM_ISERIALNUM_STR_DESC -#define CONF_USB_CDCD_ACM_ISERIALNUM_STR_DESC +#ifndef CONF_USB_DFUD_ISERIALNUM_STR_DESC +#define CONF_USB_DFUD_ISERIALNUM_STR_DESC #endif // // bNumConfigurations <0x01-0xFF> -// usb_cdcd_acm_bnumconfig -#ifndef CONF_USB_CDCD_ACM_BNUMCONFIG -#define CONF_USB_CDCD_ACM_BNUMCONFIG 0x1 +// usb_dufd_bnumconfig +#ifndef CONF_USB_DFUD_BNUMCONFIG +#define CONF_USB_DFUD_BNUMCONFIG 0x1 #endif // -// CDC ACM Configuration Descriptor -// bConfigurationValue <0x01-0xFF> -// usb_cdcd_acm_bconfigval -#ifndef CONF_USB_CDCD_ACM_BCONFIGVAL -#define CONF_USB_CDCD_ACM_BCONFIGVAL 0x1 -#endif -// Enable string descriptor of iConfig -// usb_cdcd_acm_iconfig_en -#ifndef CONF_USB_CDCD_ACM_ICONFIG_EN -#define CONF_USB_CDCD_ACM_ICONFIG_EN 0 +// DFU Configuration Descriptor + +// wTotalLength <0x01-0xFF> +// usb_dufd_wtotallength +#ifndef CONF_USB_DFUD_WTOTALLENGTH +#define CONF_USB_DFUD_WTOTALLENGTH 27 #endif -#ifndef CONF_USB_CDCD_ACM_ICONFIG -#define CONF_USB_CDCD_ACM_ICONFIG \ - (CONF_USB_CDCD_ACM_ICONFIG_EN \ - * (CONF_USB_CDCD_ACM_IMANUFACT_EN + CONF_USB_CDCD_ACM_IPRODUCT_EN + CONF_USB_CDCD_ACM_ISERIALNUM_EN \ - + CONF_USB_CDCD_ACM_ICONFIG_EN)) +// bNumInterfaces <0x01-0xFF> +// usb_dufd_bnuminterfaces +#ifndef CONF_USB_DFUD_BNUMINTERFACES +#define CONF_USB_DFUD_BNUMINTERFACES 1 +#endif + +// bConfigurationValue <0x01-0xFF> +// usb_dufd_bconfigval +#ifndef CONF_USB_DFUD_BCONFIGVAL +#define CONF_USB_DFUD_BCONFIGVAL 0x1 +#endif + +// Enable string descriptor of iConfig +// usb_dufd_iconfig_en +#ifndef CONF_USB_DFUD_ICONFIG_EN +#define CONF_USB_DFUD_ICONFIG_EN 0 +#endif + +#ifndef CONF_USB_DFUD_ICONFIG +#define CONF_USB_DFUD_ICONFIG \ + (CONF_USB_DFUD_ICONFIG_EN \ + * (CONF_USB_DFUD_IMANUFACT_EN + CONF_USB_DFUD_IPRODUCT_EN + CONF_USB_DFUD_ISERIALNUM_EN \ + + CONF_USB_DFUD_ICONFIG_EN)) #endif // Unicode string of iConfig -// usb_cdcd_acm_iconfig_str -#ifndef CONF_USB_CDCD_ACM_ICONFIG_STR -#define CONF_USB_CDCD_ACM_ICONFIG_STR "" +// usb_dufd_iconfig_str +#ifndef CONF_USB_DFUD_ICONFIG_STR +#define CONF_USB_DFUD_ICONFIG_STR "" #endif -#ifndef CONF_USB_CDCD_ACM_ICONFIG_STR_DESC -#define CONF_USB_CDCD_ACM_ICONFIG_STR_DESC +#ifndef CONF_USB_DFUD_ICONFIG_STR_DESC +#define CONF_USB_DFUD_ICONFIG_STR_DESC #endif // @@ -184,157 +221,62 @@ // <0xA0=> Bus power supply, support for remote wakeup // <0xC0=> Self powered, not support for remote wakeup // <0xE0=> Self powered, support for remote wakeup -// usb_cdcd_acm_bmattri -#ifndef CONF_USB_CDCD_ACM_BMATTRI -#define CONF_USB_CDCD_ACM_BMATTRI 0x80 +// usb_dufd_bmattri +#ifndef CONF_USB_DFUD_BMATTRI +#define CONF_USB_DFUD_BMATTRI 0x80 #endif // bMaxPower <0x00-0xFF> -// usb_cdcd_acm_bmaxpower -#ifndef CONF_USB_CDCD_ACM_BMAXPOWER -#define CONF_USB_CDCD_ACM_BMAXPOWER 0x32 +// usb_dufd_bmaxpower +#ifndef CONF_USB_DFUD_BMAXPOWER +#define CONF_USB_DFUD_BMAXPOWER 0x32 #endif // -// CDC ACM Communication Interface Descriptor +// DFU Interface Descriptor // bInterfaceNumber <0x00-0xFF> -// usb_cdcd_acm_comm_bifcnum -#ifndef CONF_USB_CDCD_ACM_COMM_BIFCNUM -#define CONF_USB_CDCD_ACM_COMM_BIFCNUM 0x0 +// usb_dufd_bifcnum +#ifndef CONF_USB_DFUD_BIFCNUM +#define CONF_USB_DFUD_BIFCNUM 0x0 #endif + // bAlternateSetting <0x00-0xFF> -// usb_cdcd_acm_comm_baltset -#ifndef CONF_USB_CDCD_ACM_COMM_BALTSET -#define CONF_USB_CDCD_ACM_COMM_BALTSET 0x0 +// usb_dufd_baltset +#ifndef CONF_USB_DFUD_BALTSET +#define CONF_USB_DFUD_BALTSET 0x0 #endif -// iInterface <0x00-0xFF> -// usb_cdcd_acm_comm_iifc -#ifndef CONF_USB_CDCD_ACM_COMM_IIFC -#define CONF_USB_CDCD_ACM_COMM_IIFC 0x0 +// bNumEndpoints <0x00-0xFF> +// usb_dufd_bnumep +#ifndef CONF_USB_DFUD_BNUMEP +#define CONF_USB_DFUD_BNUMEP 0x0 #endif -// Interrupt IN Endpoint Address -// <0x81=> EndpointAddress = 0x81 -// <0x82=> EndpointAddress = 0x82 -// <0x83=> EndpointAddress = 0x83 -// <0x84=> EndpointAddress = 0x84 -// <0x85=> EndpointAddress = 0x85 -// <0x86=> EndpointAddress = 0x86 -// <0x87=> EndpointAddress = 0x87 -// usb_cdcd_acm_epaddr -#ifndef CONF_USB_CDCD_ACM_COMM_INT_EPADDR -#define CONF_USB_CDCD_ACM_COMM_INT_EPADDR 0x82 +// Enable string descriptor of iInterface +// usb_dufd_iinterface_en +#ifndef CONF_USB_DFUD_IINTERFACE_EN +#define CONF_USB_DFUD_IINTERFACE_EN 1 #endif -// Interrupt IN Endpoint wMaxPacketSize -// <0x0008=> 8 bytes -// <0x0010=> 16 bytes -// <0x0020=> 32 bytes -// <0x0040=> 64 bytes -// usb_cdcd_acm_comm_int_maxpksz -#ifndef CONF_USB_CDCD_ACM_COMM_INT_MAXPKSZ -#define CONF_USB_CDCD_ACM_COMM_INT_MAXPKSZ 0x40 +#ifndef CONF_USB_DFUD_IINTERFACE +#define CONF_USB_DFUD_IINTERFACE \ + (CONF_USB_DFUD_IINTERFACE_EN \ + * (CONF_USB_DFUD_IMANUFACT_EN + CONF_USB_DFUD_IPRODUCT_EN + CONF_USB_DFUD_ISERIALNUM_EN \ + + CONF_USB_DFUD_ICONFIG_EN + CONF_USB_DFUD_IINTERFACE_EN)) #endif -// Interrupt IN Endpoint Interval <0x00-0xFF> -// usb_cdcd_acm_comm_int_interval -#ifndef CONF_USB_CDCD_ACM_COMM_INT_INTERVAL -#define CONF_USB_CDCD_ACM_COMM_INT_INTERVAL 0xa -#endif -// - -// CDC ACM Data Interface Descriptor - -// bInterfaceNumber <0x00-0xFF> -// usb_cdcd_acm_data_bifcnum -#ifndef CONF_USB_CDCD_ACM_DATA_BIFCNUM -#define CONF_USB_CDCD_ACM_DATA_BIFCNUM 0x1 -#endif -// bAlternateSetting <0x00-0xFF> -// usb_cdcd_acm_data_baltset -#ifndef CONF_USB_CDCD_ACM_DATA_BALTSET -#define CONF_USB_CDCD_ACM_DATA_BALTSET 0x0 +// Unicode string of iInterface +// usb_dufd_iinterface_str +#ifndef CONF_USB_DFUD_IINTERFAGE_STR +#define CONF_USB_DFUD_IINTERFACE_STR "SAM D5x/E5x DFU bootloader (DFU mode)" #endif -// iInterface <0x00-0xFF> -// usb_cdcd_acm_data_iifc -#ifndef CONF_USB_CDCD_ACM_DATA_IIFC -#define CONF_USB_CDCD_ACM_DATA_IIFC 0x0 +#ifndef CONF_USB_DFUD_IINTERFACE_STR_DESC +#define CONF_USB_DFUD_IINTERFACE_STR_DESC 76, 0x03, 'S', 0x00, 'A', 0x00, 'M', 0x00, ' ', 0x00, 'D', 0x00, '5', 0x00, 'x', 0x00, '/', 0x00, 'E', 0x00, '5', 0x00, 'x', 0x00, ' ', 0x00, 'D', 0x00, 'F', 0x00, 'U', 0x00, ' ', 0x00, 'b', 0x00, 'o', 0x00, 'o', 0x00, 't', 0x00, 'l', 0x00, 'o', 0x00, 'a', 0x00, 'd', 0x00, 'e', 0x00, 'r', 0x00, ' ', 0x00, '(', 0x00, 'D', 0x00, 'F', 0x00, 'U', 0x00, ' ', 0x00, 'm', 0x00, 'o', 0x00, 'd', 0x00, 'e', 0x00, ')', 0x00, #endif -// BULK IN Endpoint Address -// <0x81=> EndpointAddress = 0x81 -// <0x82=> EndpointAddress = 0x82 -// <0x83=> EndpointAddress = 0x83 -// <0x84=> EndpointAddress = 0x84 -// <0x85=> EndpointAddress = 0x85 -// <0x86=> EndpointAddress = 0x86 -// <0x87=> EndpointAddress = 0x87 -// usb_cdcd_acm_data_bulkin_epaddr -#ifndef CONF_USB_CDCD_ACM_DATA_BULKIN_EPADDR -#define CONF_USB_CDCD_ACM_DATA_BULKIN_EPADDR 0x81 -#endif - -// BULK IN Endpoint wMaxPacketSize -// <0x0008=> 8 bytes -// <0x0010=> 16 bytes -// <0x0020=> 32 bytes -// <0x0040=> 64 bytes -// usb_cdcd_acm_data_builin_maxpksz -#ifndef CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ -#define CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ 0x40 -#endif - -// BULK IN Endpoint wMaxPacketSize for High Speed -// <0x0008=> 8 bytes -// <0x0010=> 16 bytes -// <0x0020=> 32 bytes -// <0x0040=> 64 bytes -// <0x0080=> 128 bytes -// <0x0100=> 256 bytes -// <0x0200=> 512 bytes -// usb_cdcd_acm_data_builin_maxpksz_hs -#ifndef CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ_HS -#define CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ_HS 0x200 -#endif - -// BULK OUT Endpoint Address -// <0x01=> EndpointAddress = 0x01 -// <0x02=> EndpointAddress = 0x02 -// <0x03=> EndpointAddress = 0x03 -// <0x04=> EndpointAddress = 0x04 -// <0x05=> EndpointAddress = 0x05 -// <0x06=> EndpointAddress = 0x06 -// <0x07=> EndpointAddress = 0x07 -// usb_cdcd_acm_data_bulkout_epaddr -#ifndef CONF_USB_CDCD_ACM_DATA_BULKOUT_EPADDR -#define CONF_USB_CDCD_ACM_DATA_BULKOUT_EPADDR 0x1 -#endif - -// BULK OUT Endpoint wMaxPacketSize -// <0x0008=> 8 bytes -// <0x0010=> 16 bytes -// <0x0020=> 32 bytes -// <0x0040=> 64 bytes -// usb_cdcd_acm_data_buckout_maxpksz -#ifndef CONF_USB_CDCD_ACM_DATA_BULKOUT_MAXPKSZ -#define CONF_USB_CDCD_ACM_DATA_BULKOUT_MAXPKSZ 0x40 -#endif - -// BULK OUT Endpoint wMaxPacketSize for High Speed -// <0x0008=> 8 bytes -// <0x0010=> 16 bytes -// <0x0020=> 32 bytes -// <0x0040=> 64 bytes -// <0x0080=> 128 bytes -// <0x0100=> 256 bytes -// <0x0200=> 512 bytes -// usb_cdcd_acm_data_buckout_maxpksz_hs -#ifndef CONF_USB_CDCD_ACM_DATA_BULKOUT_MAXPKSZ_HS -#define CONF_USB_CDCD_ACM_DATA_BULKOUT_MAXPKSZ_HS 0x200 -#endif +// // // <<< end of configuration section >>> diff --git a/gcc/Makefile b/gcc/Makefile index 6542661..231ed39 100644 --- a/gcc/Makefile +++ b/gcc/Makefile @@ -31,7 +31,7 @@ gcc \ hpl/osc32kctrl \ hpl/ramecc \ hpl/dmac \ -usb/class/cdc/device \ +usb/class/dfu/device \ hal/src \ hpl/mclk \ usb \ @@ -49,7 +49,7 @@ hpl/cmcc OBJS += \ hal/src/hal_io.o \ hpl/core/hpl_core_m4.o \ -usb/class/cdc/device/cdcdf_acm.o \ +usb/class/dfu/device/dfudf.o \ hal/utils/src/utils_syscalls.o \ hpl/dmac/hpl_dmac.o \ gcc/system_same54.o \ @@ -77,14 +77,14 @@ hal/src/hal_sleep.o \ hal/src/hal_cache.o \ hpl/cmcc/hpl_cmcc.o \ atmel_start.o \ -usb_cdc_echo_main.o \ +usb_dfu_main.o \ usb/device/usbdc.o \ hal/src/hal_atomic.o OBJS_AS_ARGS += \ "hal/src/hal_io.o" \ "hpl/core/hpl_core_m4.o" \ -"usb/class/cdc/device/cdcdf_acm.o" \ +"usb/class/dfu/device/dfudf.o" \ "hal/utils/src/utils_syscalls.o" \ "hpl/dmac/hpl_dmac.o" \ "gcc/system_same54.o" \ @@ -112,7 +112,7 @@ OBJS_AS_ARGS += \ "hal/src/hal_cache.o" \ "hpl/cmcc/hpl_cmcc.o" \ "atmel_start.o" \ -"usb_cdc_echo_main.o" \ +"usb_dfu_main.o" \ "usb/device/usbdc.o" \ "hal/src/hal_atomic.o" @@ -125,7 +125,7 @@ DEPS_AS_ARGS += \ "hpl/ramecc/hpl_ramecc.d" \ "hpl/core/hpl_core_m4.d" \ "hal/utils/src/utils_syscalls.d" \ -"usb/class/cdc/device/cdcdf_acm.d" \ +"usb/class/dfu/device/dfudf.d" \ "gcc/gcc/startup_same54.d" \ "hpl/usb/hpl_usb.d" \ "hal/utils/src/utils_list.d" \ @@ -140,7 +140,7 @@ DEPS_AS_ARGS += \ "hal/src/hal_usb_device.d" \ "hpl/dmac/hpl_dmac.d" \ "hal/src/hal_init.d" \ -"usb_cdc_echo_main.d" \ +"usb_dfu_main.d" \ "hpl/mclk/hpl_mclk.d" \ "driver_init.d" \ "hpl/osc32kctrl/hpl_osc32kctrl.d" \ @@ -199,7 +199,7 @@ $(OUTPUT_FILE_PATH): $(OBJS) @echo ARM/GNU C Compiler $(QUOTE)arm-none-eabi-gcc$(QUOTE) -x c -mthumb -DDEBUG -Os -ffunction-sections -mlong-calls -g3 -Wall -c -std=gnu99 \ -D__SAME54P20A__ -mcpu=cortex-m4 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 \ --I"../" -I"../config" -I"../examples" -I"../hal/include" -I"../hal/utils/include" -I"../hpl/cmcc" -I"../hpl/core" -I"../hpl/dmac" -I"../hpl/gclk" -I"../hpl/mclk" -I"../hpl/osc32kctrl" -I"../hpl/oscctrl" -I"../hpl/pm" -I"../hpl/port" -I"../hpl/ramecc" -I"../hpl/usb" -I"../hri" -I"../" -I"../config" -I"../usb" -I"../usb/class/cdc" -I"../usb/class/cdc/device" -I"../usb/device" -I"../" -I"../CMSIS/Include" -I"../include" \ +-I"../" -I"../config" -I"../examples" -I"../hal/include" -I"../hal/utils/include" -I"../hpl/cmcc" -I"../hpl/core" -I"../hpl/dmac" -I"../hpl/gclk" -I"../hpl/mclk" -I"../hpl/osc32kctrl" -I"../hpl/oscctrl" -I"../hpl/pm" -I"../hpl/port" -I"../hpl/ramecc" -I"../hpl/usb" -I"../hri" -I"../" -I"../config" -I"../usb" -I"../usb/class/dfu" -I"../usb/class/dfu/device" -I"../usb/device" -I"../" -I"../CMSIS/Include" -I"../include" \ -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" @echo Finished building: $< @@ -208,7 +208,7 @@ $(OUTPUT_FILE_PATH): $(OBJS) @echo ARM/GNU Assembler $(QUOTE)arm-none-eabi-as$(QUOTE) -x c -mthumb -DDEBUG -Os -ffunction-sections -mlong-calls -g3 -Wall -c -std=gnu99 \ -D__SAME54P20A__ -mcpu=cortex-m4 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 \ --I"../" -I"../config" -I"../examples" -I"../hal/include" -I"../hal/utils/include" -I"../hpl/cmcc" -I"../hpl/core" -I"../hpl/dmac" -I"../hpl/gclk" -I"../hpl/mclk" -I"../hpl/osc32kctrl" -I"../hpl/oscctrl" -I"../hpl/pm" -I"../hpl/port" -I"../hpl/ramecc" -I"../hpl/usb" -I"../hri" -I"../" -I"../config" -I"../usb" -I"../usb/class/cdc" -I"../usb/class/cdc/device" -I"../usb/device" -I"../" -I"../CMSIS/Include" -I"../include" \ +-I"../" -I"../config" -I"../examples" -I"../hal/include" -I"../hal/utils/include" -I"../hpl/cmcc" -I"../hpl/core" -I"../hpl/dmac" -I"../hpl/gclk" -I"../hpl/mclk" -I"../hpl/osc32kctrl" -I"../hpl/oscctrl" -I"../hpl/pm" -I"../hpl/port" -I"../hpl/ramecc" -I"../hpl/usb" -I"../hri" -I"../" -I"../config" -I"../usb" -I"../usb/class/dfu" -I"../usb/class/dfu/device" -I"../usb/device" -I"../" -I"../CMSIS/Include" -I"../include" \ -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" @echo Finished building: $< @@ -217,7 +217,7 @@ $(OUTPUT_FILE_PATH): $(OBJS) @echo ARM/GNU Preprocessing Assembler $(QUOTE)arm-none-eabi-gcc$(QUOTE) -x c -mthumb -DDEBUG -Os -ffunction-sections -mlong-calls -g3 -Wall -c -std=gnu99 \ -D__SAME54P20A__ -mcpu=cortex-m4 -mfloat-abi=softfp -mfpu=fpv4-sp-d16 \ --I"../" -I"../config" -I"../examples" -I"../hal/include" -I"../hal/utils/include" -I"../hpl/cmcc" -I"../hpl/core" -I"../hpl/dmac" -I"../hpl/gclk" -I"../hpl/mclk" -I"../hpl/osc32kctrl" -I"../hpl/oscctrl" -I"../hpl/pm" -I"../hpl/port" -I"../hpl/ramecc" -I"../hpl/usb" -I"../hri" -I"../" -I"../config" -I"../usb" -I"../usb/class/cdc" -I"../usb/class/cdc/device" -I"../usb/device" -I"../" -I"../CMSIS/Include" -I"../include" \ +-I"../" -I"../config" -I"../examples" -I"../hal/include" -I"../hal/utils/include" -I"../hpl/cmcc" -I"../hpl/core" -I"../hpl/dmac" -I"../hpl/gclk" -I"../hpl/mclk" -I"../hpl/osc32kctrl" -I"../hpl/oscctrl" -I"../hpl/pm" -I"../hpl/port" -I"../hpl/ramecc" -I"../hpl/usb" -I"../hri" -I"../" -I"../config" -I"../usb" -I"../usb/class/dfu" -I"../usb/class/dfu/device" -I"../usb/device" -I"../" -I"../CMSIS/Include" -I"../include" \ -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" @echo Finished building: $< @@ -237,4 +237,4 @@ clean: rm -f $(DEPS_AS_ARGS) rm -f $(OUTPUT_FILE_NAME).a $(OUTPUT_FILE_NAME).hex $(OUTPUT_FILE_NAME).bin \ $(OUTPUT_FILE_NAME).lss $(OUTPUT_FILE_NAME).eep $(OUTPUT_FILE_NAME).map \ - $(OUTPUT_FILE_NAME).srec \ No newline at end of file + $(OUTPUT_FILE_NAME).srec diff --git a/usb/class/dfu/device/dfudf.c b/usb/class/dfu/device/dfudf.c new file mode 100644 index 0000000..7747a23 --- /dev/null +++ b/usb/class/dfu/device/dfudf.c @@ -0,0 +1,186 @@ +/** + * \file + * + * \brief USB Device Stack DFU Function Implementation. + * + * Copyright (c) 2018 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "dfudf.h" +#include "usb_protocol_dfu.h" + +/** USB Device DFU Fucntion Specific Data */ +struct dfudf_func_data { + /** DFU Interface information */ + uint8_t func_iface; + /** DFU Enable Flag */ + bool enabled; +}; + +static struct usbdf_driver _dfudf; +static struct dfudf_func_data _dfudf_funcd; + +/** + * \brief Enable DFU Function + * \param[in] drv Pointer to USB device function driver + * \param[in] desc Pointer to USB interface descriptor + * \return Operation status. + */ +static int32_t dfudf_enable(struct usbdf_driver *drv, struct usbd_descriptors *desc) +{ + struct dfudf_func_data *func_data = (struct dfudf_func_data *)(drv->func_data); + + usb_iface_desc_t ifc_desc; + uint8_t * ifc; + uint8_t i; + + ifc = desc->sod; + for (i = 0; i < 2; i++) { + if (NULL == ifc) { + return ERR_NOT_FOUND; + } + + ifc_desc.bInterfaceNumber = ifc[2]; + ifc_desc.bInterfaceClass = ifc[5]; + + if (USB_DFU_CLASS == ifc_desc.bInterfaceClass) { + if (func_data->func_iface == ifc_desc.bInterfaceNumber) { // Initialized + return ERR_ALREADY_INITIALIZED; + } else if (func_data->func_iface != 0xFF) { // Occupied + return ERR_NO_RESOURCE; + } else { + func_data->func_iface = ifc_desc.bInterfaceNumber; + } + } else { // Not supported by this function driver + return ERR_NOT_FOUND; + } + + // there are no endpoint to install since DFU uses only the control endpoint + + ifc = usb_find_desc(usb_desc_next(desc->sod), desc->eod, USB_DT_INTERFACE); + } + // Installed + _dfudf_funcd.enabled = true; + return ERR_NONE; +} + +/** + * \brief Disable DFU Function + * \param[in] drv Pointer to USB device function driver + * \param[in] desc Pointer to USB device descriptor + * \return Operation status. + */ +static int32_t dfudf_disable(struct usbdf_driver *drv, struct usbd_descriptors *desc) +{ + struct dfudf_func_data *func_data = (struct dfudf_func_data *)(drv->func_data); + + usb_iface_desc_t ifc_desc; + + if (desc) { + ifc_desc.bInterfaceClass = desc->sod[5]; + // Check interface + if (ifc_desc.bInterfaceClass != USB_DFU_CLASS) { + return ERR_NOT_FOUND; + } + } + + func_data->func_iface = 0xFF; + + _dfudf_funcd.enabled = false; + return ERR_NONE; +} + +/** + * \brief DFU Control Function + * \param[in] drv Pointer to USB device function driver + * \param[in] ctrl USB device general function control type + * \param[in] param Parameter pointer + * \return Operation status. + */ +static int32_t dfudf_ctrl(struct usbdf_driver *drv, enum usbdf_control ctrl, void *param) +{ + switch (ctrl) { + case USBDF_ENABLE: + return dfudf_enable(drv, (struct usbd_descriptors *)param); + + case USBDF_DISABLE: + return dfudf_disable(drv, (struct usbd_descriptors *)param); + + case USBDF_GET_IFACE: + return ERR_UNSUPPORTED_OP; + + default: + return ERR_INVALID_ARG; + } +} + +/** + * \brief Process the CDC class request + * \param[in] ep Endpoint address. + * \param[in] req Pointer to the request. + * \return Operation status. + */ +static int32_t dfudf_req(uint8_t ep, struct usb_req *req, enum usb_ctrl_stage stage) +{ + if (0x01 != ((req->bmRequestType >> 5) & 0x03)) { // class request + return ERR_NOT_FOUND; + } + if ((req->wIndex == _dfudf_funcd.func_iface)) { + // we don't verify the bmRequestType + switch (req->bRequest) { + default: + return ERR_UNSUPPORTED_OP; + } + } else { + return ERR_NOT_FOUND; + } +} + +/** USB Device DFU Handler Struct */ +static struct usbdc_handler dfudf_req_h = {NULL, (FUNC_PTR)dfudf_req}; + +/** + * \brief Initialize the USB DFU Function Driver + */ +int32_t dfudf_init(void) +{ + if (usbdc_get_state() > USBD_S_POWER) { + return ERR_DENIED; + } + + _dfudf.ctrl = dfudf_ctrl; + _dfudf.func_data = &_dfudf_funcd; + + usbdc_register_function(&_dfudf); + usbdc_register_handler(USBDC_HDL_REQ, &dfudf_req_h); + return ERR_NONE; +} + +/** + * \brief Deinitialize the USB DFU Function Driver + */ +void dfudf_deinit(void) +{ +} + +/** + * \brief Check whether DFU Function is enabled + */ +bool dfudf_is_enabled(void) +{ + return _dfudf_funcd.enabled; +} diff --git a/usb/class/dfu/device/dfudf.h b/usb/class/dfu/device/dfudf.h new file mode 100644 index 0000000..ba5cdd5 --- /dev/null +++ b/usb/class/dfu/device/dfudf.h @@ -0,0 +1,59 @@ +/** + * \file + * + * \brief USB Device Stack DFU Function Definition. + * + * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries. + * Copyright (c) 2018 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + */ + +#ifndef USBDF_DFU_H_ +#define USBDF_DFU_H_ + +#include "usbdc.h" + +/** + * \brief Initialize the USB DFU Function Driver + * \return Operation status. + */ +int32_t dfudf_init(void); + +/** + * \brief Deinitialize the USB DFU Function Driver + * \return Operation status. + */ +void dfudf_deinit(void); + +/** + * \brief Check whether DFU Function is enabled + * \return Operation status. + * \return true DFU Function is enabled + * \return false DFU Function is disabled + */ +bool dfudf_is_enabled(void); + +#endif /* USBDF_DFU_H_ */ diff --git a/usb/class/dfu/device/dfudf_desc.h b/usb/class/dfu/device/dfudf_desc.h new file mode 100644 index 0000000..f9eca38 --- /dev/null +++ b/usb/class/dfu/device/dfudf_desc.h @@ -0,0 +1,112 @@ +/** + * \file + * + * \brief USB Device Stack DFU Function Descriptor Setting. + * + * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries. + * Copyright (c) 2018 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon + * + * \asf_license_start + * + * \page License + * + * Subject to your compliance with these terms, you may use Microchip + * software and any derivatives exclusively with Microchip products. + * It is your responsibility to comply with third party license terms applicable + * to your use of third party software (including open source software) that + * may accompany Microchip software. + * + * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, + * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, + * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, + * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE + * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL + * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE + * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE + * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT + * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY + * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY, + * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE. + * + * \asf_license_stop + */ + +#ifndef USBDF_DFU_DESC_H_ +#define USBDF_DFU_DESC_H_ + +#include "usb_protocol.h" +#include "usbd_config.h" +#include "usb_protocol_dfu.h" + +#define DFUD_DEV_DESC \ + USB_DEV_DESC_BYTES(CONF_USB_DFUD_BCDUSB, \ + CONF_USB_DFUD_BDEVICECLASS, \ + CONF_USB_DFUD_BDEVICESUBCLASS, \ + CONF_USB_DFUD_BDEVICEPROTOCOL, \ + CONF_USB_DFUD_BMAXPKSZ0, \ + CONF_USB_OCTSIM_IDVENDOR, \ + CONF_USB_OCTSIM_IDPRODUCT, \ + CONF_USB_DFUD_BCDDEVICE, \ + CONF_USB_DFUD_IMANUFACT, \ + CONF_USB_DFUD_IPRODUCT, \ + CONF_USB_DFUD_ISERIALNUM, \ + CONF_USB_DFUD_BNUMCONFIG) + +#define DFUD_DEV_QUAL_DESC \ + USB_DEV_QUAL_DESC_BYTES(CONF_USB_DFUD_BCDUSB, \ + CONF_USB_DFUD_BDEVICECLASS, \ + CONF_USB_DFUD_BDEVICESUBCLASS, \ + CONF_USB_DFUD_BMAXPKSZ0, \ + CONF_USB_DFUD_BNUMCONFIG) + +#define DFUD_CFG_DESC \ + USB_CONFIG_DESC_BYTES(CONF_USB_DFUD_WTOTALLENGTH, \ + CONF_USB_DFUD_BNUMINTERFACES, \ + CONF_USB_DFUD_BCONFIGVAL, \ + CONF_USB_DFUD_ICONFIG, \ + CONF_USB_DFUD_BMATTRI, \ + CONF_USB_DFUD_BMAXPOWER) + +#define DFUD_OTH_SPD_CFG_DESC \ + USB_OTH_SPD_CFG_DESC_BYTES(CONF_USB_DFUD_WTOTALLENGTH, \ + CONF_USB_DFUD_BNUMINTERFACES, \ + CONF_USB_DFUD_BCONFIGVAL, \ + CONF_USB_DFUD_ICONFIG, \ + CONF_USB_DFUD_BMATTRI, \ + CONF_USB_DFUD_BMAXPOWER) + +#define DFUD_IFACE_DESCES \ + USB_IFACE_DESC_BYTES(CONF_USB_DFUD_BIFCNUM, \ + CONF_USB_DFUD_BALTSET, \ + CONF_USB_DFUD_BNUMEP, \ + USB_DFU_CLASS, \ + USB_DFU_SUBCLASS, \ + USB_DFU_PROTOCOL_DFU, \ + CONF_USB_DFUD_IINTERFACE), \ + USB_DFU_FUNC_DESC_BYTES(USB_DFU_ATTRIBUTES_CAN_DOWNLOAD | USB_DFU_ATTRIBUTES_WILL_DETACH, \ + 200, /* maximum time in milliseconds to detach (and reboot) */ \ + 1024, /* maximum transfer size */ \ + 0x0110 /*< DFU specification version 1.1 used */ ) + +#define DFUD_STR_DESCES \ + CONF_USB_DFUD_LANGID_DESC \ + CONF_USB_DFUD_IMANUFACT_STR_DESC \ + CONF_USB_DFUD_IPRODUCT_STR_DESC \ + CONF_USB_DFUD_ISERIALNUM_STR_DESC \ + CONF_USB_DFUD_ICONFIG_STR_DESC \ + CONF_USB_DFUD_IINTERFACE_STR_DESC + +/** USB Device descriptors and configuration descriptors */ +#define DFUD_DESCES_LS_FS \ + DFUD_DEV_DESC, DFUD_CFG_DESC, DFUD_IFACE_DESCES, DFUD_STR_DESCES + +#define DFUD_HS_DESCES_LS_FS \ + DFUD_DEV_DESC, DFUD_DEV_QUAL_DESC, DFUD_CFG_DESC, DFUD_M_IFACE_DESCES, \ + DFUD_IFACE_DESCES, DFUD_OTH_SPD_CFG_DESC, \ + DFUD_IFACE_DESCES_HS, DFUD_STR_DESCES + +#define DFUD_HS_DESCES_HS \ + DFUD_CFG_DESC, DFUD_IFACE_DESCES, DFUD_IFACE_DESCES_HS, DFUD_OTH_SPD_CFG_DESC, \ + DFUD_IFACE_DESCES + +#endif /* USBDF_DFU_DESC_H_ */ diff --git a/usb/class/dfu/usb_protocol_dfu.h b/usb/class/dfu/usb_protocol_dfu.h new file mode 100644 index 0000000..2e7323f --- /dev/null +++ b/usb/class/dfu/usb_protocol_dfu.h @@ -0,0 +1,150 @@ +/** + * \file + * + * \brief USB Device Firmware Upgrade (DFU) protocol definitions + * + * Copyright (c) 2018 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef _USB_PROTOCOL_DFU_H_ +#define _USB_PROTOCOL_DFU_H_ + +#include "usb_includes.h" + +/* + * \ingroup usb_protocol_group + * \defgroup dfu_protocol_group Device Firmware Upgrade Definitions + * \implements USB Device Firmware Upgrade Specification, Revision 1.1 + * @{ + */ + +/** + * \name USB DFU Subclass IDs + */ +//@{ +#define USB_DFU_CLASS 0xFE //!< Application Specific Class Code +//@} + +//! \name USB DFU Subclass IDs +//@{ +#define USB_DFU_SUBCLASS 0x01 //!< Device Firmware Upgrade Code +//@} + +//! \name USB DFU Protocol IDs +//@{ +#define USB_DFU_PROTOCOL_RUNTIME 0x01 //!< Runtime protocol +#define USB_DFU_PROTOCOL_DFU 0x02 //!< DFU mode protocol +//@} + +//! \name USB DFU Attributes bits mask +//@{ +#define USB_DFU_ATTRIBUTES_CAN_DOWNLOAD 0x01 +#define USB_DFU_ATTRIBUTES_CAN_UPLOAD 0x02 +#define USB_DFU_ATTRIBUTES_MANIFEST_TOLERANT 0x04 +#define USB_DFU_ATTRIBUTES_WILL_DETACH 0x08 +//@} + +//! \name USB DFU Request IDs +//@{ +#define USB_REQ_DFU_DETACH 0x00 +#define USB_REQ_DFU_DNLOAD 0x01 +#define USB_REQ_DFU_UPLOAD 0x02 +#define USB_REQ_DFU_GETSTATUS 0x03 +#define USB_REQ_DFU_CLRSTATUS 0x04 +#define USB_REQ_DFU_GETSTATE 0x05 +#define USB_REQ_DFU_ABORT 0x06 +//@} + +/* + * Need to pack structures tightly, or the compiler might insert padding + * and violate the spec-mandated layout. + */ +COMPILER_PACK_SET(1) + +//! \name USB DFU Descriptors +//@{ + +//! DFU Functional Descriptor +typedef struct usb_dfu_func_desc { + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bmAttributes; + le16_t wDetachTimeOut; + le16_t wTransferSize; + le16_t bcdDFUVersion; +} usb_dfu_func_desc_t; + +#define USB_DFU_FUNC_DESC_LEN 0x09 +#define USB_DFU_FUNC_DESC_TYPE 0x21 +#define USB_DFU_FUNC_DESC_BYTES(bmAttributes, wDetachTimeOut, wTransferSize, bcdDFUVersion) \ + USB_DFU_FUNC_DESC_LEN, /* bFunctionLength */ \ + USB_DFU_FUNC_DESC_TYPE, /* bDescriptorType */ \ + bmAttributes, \ + LE_BYTE0(wDetachTimeOut), LE_BYTE1(wDetachTimeOut), \ + LE_BYTE0(wTransferSize), LE_BYTE1(wTransferSize), \ + LE_BYTE0(bcdDFUVersion), LE_BYTE1(bcdDFUVersion) + +COMPILER_PACK_RESET() + +//! @} + +//! USB DFU Request IDs +enum usb_dfu_req { + USB_DFU_DETACH, + USB_DFU_DNLOAD, + USB_DFU_UPLOAD, + USB_DFU_GETSTATUS, + USB_DFU_CLRSTATUS, + USB_DFU_GETSTATE, + USB_DFU_ABORT, +}; + +//! USB DFU Device Status IDs +enum usb_dfu_status { + USB_DFU_STATUS_OK, + USB_DFU_STATUS_ERR_TARGET, + USB_DFU_STATUS_ERR_FILE, + USB_DFU_STATUS_ERR_WRITE, + USB_DFU_STATUS_ERR_ERASE, + USB_DFU_STATUS_ERR_CHECK_ERASED, + USB_DFU_STATUS_ERR_PROG, + USB_DFU_STATUS_ERR_VERIFY, + USB_DFU_STATUS_ERR_ADDRESS, + USB_DFU_STATUS_ERR_NOTDONE, + USB_DFU_STATUS_ERR_FIRMWARE, + USB_DFU_STATUS_ERR_VENDOR, + USB_DFU_STATUS_ERR_USBR, + USB_DFU_STATUS_ERR_POR, + USB_DFU_STATUS_ERR_UNKNOWN, + USB_DFU_STATUS_ERR_STALLEDPKT, +}; + +//! USB DFU Device State IDs +enum usb_dfu_state { + USB_DFU_STATE_APP_IDLE, + USB_DFU_STATE_APP_DETACH, + USB_DFU_STATE_DFU_IDLE, + USB_DFU_STATE_DFU_DNLOAD_SYNC, + USB_DFU_STATE_DFU_DNBUSY, + USB_DFU_STATE_DFU_DNLOAD_IDLE, + USB_DFU_STATE_DFU_MANIFEST_SYNC, + USB_DFU_STATE_DFU_MANIFEST, + USB_DFU_STATE_DFU_MANIFEST_WAIT_RESET, + USB_DFU_STATE_DFU_UPLOAD_IDLE, + USB_DFU_STATE_DFU_ERROR, +}; + +#endif // _USB_PROTOCOL_DFU_H_ diff --git a/usb_cdc_echo_main.c b/usb_dfu_main.c similarity index 93% rename from usb_cdc_echo_main.c rename to usb_dfu_main.c index fe02810..2535475 100644 --- a/usb_cdc_echo_main.c +++ b/usb_dfu_main.c @@ -4,6 +4,7 @@ * \brief Application implement * * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries. + * Copyright (c) 2018 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon * * \asf_license_start * @@ -40,5 +41,5 @@ int main(void) { atmel_start_init(); - cdcd_acm_example(); + usb_dfu(); } diff --git a/usb_start.c b/usb_start.c index de86172..4f9f875 100644 --- a/usb_start.c +++ b/usb_start.c @@ -1,9 +1,19 @@ /* - * Code generated from Atmel Start. + * (C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon * - * This file will be overwritten when reconfiguring your Atmel Start project. - * Please copy examples or other code you want to keep to a separate file or main.c - * to avoid loosing it when reconfiguring. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "atmel_start.h" #include "usb_start.h" @@ -11,16 +21,14 @@ #if CONF_USBD_HS_SP static uint8_t single_desc_bytes[] = { /* Device descriptors and Configuration descriptors list. */ - CDCD_ACM_HS_DESCES_LS_FS}; + DFUD_HS_DESCES_LS_FS}; static uint8_t single_desc_bytes_hs[] = { /* Device descriptors and Configuration descriptors list. */ - CDCD_ACM_HS_DESCES_HS}; -#define CDCD_ECHO_BUF_SIZ CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ_HS + DFUD_HS_DESCES_HS}; #else static uint8_t single_desc_bytes[] = { /* Device descriptors and Configuration descriptors list. */ - CDCD_ACM_DESCES_LS_FS}; -#define CDCD_ECHO_BUF_SIZ CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ + DFUD_DESCES_LS_FS}; #endif static struct usbd_descriptors single_desc[] @@ -31,62 +39,19 @@ static struct usbd_descriptors single_desc[] #endif }; -/** Buffers to receive and echo the communication bytes. */ -static uint32_t usbd_cdc_buffer[CDCD_ECHO_BUF_SIZ / 4]; - /** Ctrl endpoint buffer */ static uint8_t ctrl_buffer[64]; /** - * \brief Callback invoked when bulk OUT data received + * \brief USB DFU Init */ -static bool usb_device_cb_bulk_out(const uint8_t ep, const enum usb_xfer_code rc, const uint32_t count) -{ - cdcdf_acm_write((uint8_t *)usbd_cdc_buffer, count); - - /* No error. */ - return false; -} - -/** - * \brief Callback invoked when bulk IN data received - */ -static bool usb_device_cb_bulk_in(const uint8_t ep, const enum usb_xfer_code rc, const uint32_t count) -{ - /* Echo data. */ - cdcdf_acm_read((uint8_t *)usbd_cdc_buffer, sizeof(usbd_cdc_buffer)); - - /* No error. */ - return false; -} - -/** - * \brief Callback invoked when Line State Change - */ -static bool usb_device_cb_state_c(usb_cdc_control_signal_t state) -{ - if (state.rs232.DTR) { - /* Callbacks must be registered after endpoint allocation */ - cdcdf_acm_register_callback(CDCDF_ACM_CB_READ, (FUNC_PTR)usb_device_cb_bulk_out); - cdcdf_acm_register_callback(CDCDF_ACM_CB_WRITE, (FUNC_PTR)usb_device_cb_bulk_in); - /* Start Rx */ - cdcdf_acm_read((uint8_t *)usbd_cdc_buffer, sizeof(usbd_cdc_buffer)); - } - - /* No error. */ - return false; -} - -/** - * \brief CDC ACM Init - */ -void cdc_device_acm_init(void) +void usb_dfu_init(void) { /* usb stack init */ usbdc_init(ctrl_buffer); /* usbdc_register_funcion inside */ - cdcdf_acm_init(); + dfudf_init(); usbdc_start(single_desc); usbdc_attach(); @@ -102,14 +67,12 @@ void cdc_device_acm_init(void) * - Open a HyperTerminal or other COM tools in PC side. * - Send out a character or string and it will echo the content received. */ -void cdcd_acm_example(void) +void usb_dfu(void) { - while (!cdcdf_acm_is_enabled()) { - // wait cdc acm to be installed + while (!dfudf_is_enabled()) { + // wait DFU to be installed }; - cdcdf_acm_register_callback(CDCDF_ACM_CB_STATE_C, (FUNC_PTR)usb_device_cb_state_c); - while (1) { } } @@ -117,5 +80,5 @@ void cdcd_acm_example(void) void usb_init(void) { - cdc_device_acm_init(); + usb_dfu_init(); } diff --git a/usb_start.h b/usb_start.h index 48b2735..37502b4 100644 --- a/usb_start.h +++ b/usb_start.h @@ -1,9 +1,19 @@ /* - * Code generated from Atmel Start. + * (C) 2018, sysmocom -s.f.m.c. GmbH, Author: Kevin Redon * - * This file will be overwritten when reconfiguring your Atmel Start project. - * Please copy examples or other code you want to keep to a separate file or main.c - * to avoid loosing it when reconfiguring. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef USB_DEVICE_MAIN_H #define USB_DEVICE_MAIN_H @@ -12,11 +22,11 @@ extern "C" { #endif // __cplusplus -#include "cdcdf_acm.h" -#include "cdcdf_acm_desc.h" +#include "dfudf.h" +#include "dfudf_desc.h" -void cdcd_acm_example(void); -void cdc_device_acm_init(void); +void usb_dfu(void); +void usb_dfu_init(void); /** * \berif Initialize USB