mirror of
git://projects.qi-hardware.com/ben-wpan.git
synced 2024-11-26 05:17:19 +02:00
atusb/fw/: added transition from runtime to DFU mode according to DFU spec
- descr.c (config_descriptor): added DFU interface descriptor - ep0.c (my_dfu_setup, my_set_interface, ep0_init): added DFU interface switching - ep0.c (my_reset, ep0_init): CPU-reset (into boot loader) on USB bus reset when in appDETACH - Makefile (OBJS): added dfu_common.o
This commit is contained in:
parent
5f50611735
commit
2d7ee91430
@ -31,7 +31,8 @@ SIZE = $(AVR_PREFIX)size
|
|||||||
USB_ID = 20b7:1540
|
USB_ID = 20b7:1540
|
||||||
|
|
||||||
USB_OBJS = usb.o atu2.o
|
USB_OBJS = usb.o atu2.o
|
||||||
OBJS = atusb.o board.o board_app.o sernum.o spi.o descr.o ep0.o $(USB_OBJS)
|
OBJS = atusb.o board.o board_app.o sernum.o spi.o descr.o ep0.o dfu_common.o \
|
||||||
|
$(USB_OBJS)
|
||||||
BOOT_OBJS = boot.o board.o sernum.o spi.o flash.o dfu.o dfu_common.o \
|
BOOT_OBJS = boot.o board.o sernum.o spi.o flash.o dfu.o dfu_common.o \
|
||||||
$(USB_OBJS)
|
$(USB_OBJS)
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
#include "dfu.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
|
||||||
|
|
||||||
@ -55,9 +56,9 @@ const uint8_t config_descriptor[] = {
|
|||||||
#if 0
|
#if 0
|
||||||
LE(9+9+7+7), /* wTotalLength */
|
LE(9+9+7+7), /* wTotalLength */
|
||||||
#else
|
#else
|
||||||
LE(9+9), /* wTotalLength */
|
LE(9+9+9), /* wTotalLength */
|
||||||
#endif
|
#endif
|
||||||
1, /* bNumInterfaces */
|
2, /* bNumInterfaces */
|
||||||
1, /* bConfigurationValue (> 0 !) */
|
1, /* bConfigurationValue (> 0 !) */
|
||||||
0, /* iConfiguration */
|
0, /* iConfiguration */
|
||||||
USB_ATTR_BUS_POWERED, /* bmAttributes */
|
USB_ATTR_BUS_POWERED, /* bmAttributes */
|
||||||
@ -98,4 +99,8 @@ const uint8_t config_descriptor[] = {
|
|||||||
LE(EP1_SIZE), /* wMaxPacketSize */
|
LE(EP1_SIZE), /* wMaxPacketSize */
|
||||||
0, /* bInterval */
|
0, /* bInterval */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Interface #1 */
|
||||||
|
|
||||||
|
DFU_ITF_DESCR(1, dfu_proto_runtime)
|
||||||
};
|
};
|
||||||
|
@ -21,11 +21,13 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
#include "dfu.h"
|
||||||
|
|
||||||
#include "at86rf230.h"
|
#include "at86rf230.h"
|
||||||
#include "atusb/ep0.h"
|
#include "atusb/ep0.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
|
#include "sernum.h"
|
||||||
#include "spi.h"
|
#include "spi.h"
|
||||||
|
|
||||||
|
|
||||||
@ -207,7 +209,43 @@ static int my_setup(const struct setup_request *setup)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int my_dfu_setup(const struct setup_request *setup)
|
||||||
|
{
|
||||||
|
switch (setup->bmRequestType | setup->bRequest << 8) {
|
||||||
|
case DFU_TO_DEV(DFU_DETACH):
|
||||||
|
/* @@@ should use wTimeout */
|
||||||
|
dfu.state = appDETACH;
|
||||||
|
return 1;
|
||||||
|
default:
|
||||||
|
return dfu_setup_common(setup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void my_set_interface(int nth)
|
||||||
|
{
|
||||||
|
if (nth) {
|
||||||
|
user_setup = my_dfu_setup;
|
||||||
|
user_get_descriptor = dfu_my_descr;
|
||||||
|
dfu.state = appIDLE;
|
||||||
|
} else {
|
||||||
|
user_setup = my_setup;
|
||||||
|
user_get_descriptor = sernum_get_descr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void my_reset(void)
|
||||||
|
{
|
||||||
|
if (dfu.state == appDETACH)
|
||||||
|
reset_cpu();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ep0_init(void)
|
void ep0_init(void)
|
||||||
{
|
{
|
||||||
user_setup = my_setup;
|
user_setup = my_setup;
|
||||||
|
user_set_interface = my_set_interface;
|
||||||
|
my_set_interface(0);
|
||||||
|
user_reset = my_reset;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user