diff --git a/ChangeLog b/ChangeLog index 1caf785..aeaaa68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2015-07-31 Niibe Yutaka + * regnual/regnual.c (usb_cb_ctrl_write_finish, usb_cb_setup) + (usb_cb_get_descriptor, usb_cb_interface): Follow the change + of USB API. + * tool/stlinkv2.py: Support ST-Link/V2-1. 2015-07-28 Niibe Yutaka diff --git a/regnual/Makefile b/regnual/Makefile index cb9d57c..9fb59c8 100644 --- a/regnual/Makefile +++ b/regnual/Makefile @@ -32,7 +32,7 @@ LDFLAGS = -T$(LDSCRIPT) -nostartfiles $(MCFLAGS) $(TOPT) all: regnual.hex -regnual.o: regnual.c ../src/sys.h +regnual.o: regnual.c ../src/sys.h ../src/usb_lld.h regnual.hex: regnual.elf $(OBJCOPY) -Obinary regnual.elf regnual.bin diff --git a/regnual/regnual.c b/regnual/regnual.c index 31e2164..7350015 100644 --- a/regnual/regnual.c +++ b/regnual/regnual.c @@ -1,7 +1,8 @@ /* * regnual.c -- Firmware installation for STM32F103 Flash ROM * - * Copyright (C) 2012, 2013 Free Software Initiative of Japan + * Copyright (C) 2012, 2013, 2015 + * Free Software Initiative of Japan * Author: NIIBE Yutaka * * This file is a part of Gnuk, a GnuPG USB Token implementation. @@ -32,12 +33,18 @@ extern void *memset (void *s, int c, size_t n); extern void set_led (int); -extern uint8_t _flash_start, _flash_end; extern int flash_write (uint32_t dst_addr, const uint8_t *src, size_t len); extern int flash_protect (void); extern void nvic_system_reset (void); +#define FLASH_START_ADDR 0x08000000 /* Fixed for all STM32F1. */ +#define FLASH_OFFSET 0x1000 /* First pages are not-writable. */ +#define FLASH_START (FLASH_START_ADDR+FLASH_OFFSET) +#define FLASH_SIZE_REG ((uint16_t *)0x1ffff7e0) +static uint32_t flash_end; + + #define ENDP0_RXADDR (0x40) #define ENDP0_TXADDR (0x80) @@ -166,8 +173,7 @@ static uint32_t calc_crc32 (void) } -void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value, - uint16_t index, uint16_t len) +void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value) { uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT); @@ -175,24 +181,21 @@ void usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value, { if (req_no == USB_REGNUAL_SEND && value == 0) result = calc_crc32 (); - else if (req_no == USB_REGNUAL_FLASH && len == 0 && index == 0) + else if (req_no == USB_REGNUAL_FLASH) { uint32_t dst_addr = (0x08000000 + value * 0x100); result = flash_write (dst_addr, (const uint8_t *)mem, 256); } - else if (req_no == USB_REGNUAL_PROTECT && len == 0 - && value == 0 && index == 0) + else if (req_no == USB_REGNUAL_PROTECT && value == 0) result = flash_protect (); - else if (req_no == USB_REGNUAL_FINISH && len == 0 - && value == 0 && index == 0) + else if (req_no == USB_REGNUAL_FINISH && value == 0) nvic_system_reset (); } } int -usb_cb_setup (uint8_t req, uint8_t req_no, - uint16_t value, uint16_t index, uint16_t len) +usb_cb_setup (uint8_t req, uint8_t req_no, struct control_info *detail) { uint8_t type_rcp = req & (REQUEST_TYPE|RECIPIENT); @@ -202,45 +205,42 @@ usb_cb_setup (uint8_t req, uint8_t req_no, { if (req_no == USB_REGNUAL_MEMINFO) { - static const uint8_t *mem_info[2]; + const uint8_t *mem_info[2]; - mem_info[0] = &_flash_start; - mem_info[1] = &_flash_end; - usb_lld_set_data_to_send (mem_info, sizeof (mem_info)); - return USB_SUCCESS; + mem_info[0] = (const uint8_t *)FLASH_START; + mem_info[1] = (const uint8_t *)flash_end; + return usb_lld_reply_request (mem_info, sizeof (mem_info), detail); } else if (req_no == USB_REGNUAL_RESULT) - { - usb_lld_set_data_to_send (&result, sizeof (uint32_t)); - return USB_SUCCESS; - } + return usb_lld_reply_request (&result, sizeof (uint32_t), detail); } else /* SETUP_SET */ { if (req_no == USB_REGNUAL_SEND) { - if (value != 0 || index + len > 256) + if (detail->value != 0 || detail->index + detail->len > 256) return USB_UNSUPPORT; - if (index + len < 256) - memset ((uint8_t *)mem + index + len, 0xff, - 256 - (index + len)); + if (detail->index + detail->len < 256) + memset ((uint8_t *)mem + detail->index + detail->len, 0xff, + 256 - (detail->index + detail->len)); - usb_lld_set_data_to_recv (mem + index, len); + usb_lld_set_data_to_recv (mem + detail->index, detail->len); return USB_SUCCESS; } - else if (req_no == USB_REGNUAL_FLASH && len == 0 && index == 0) + else if (req_no == USB_REGNUAL_FLASH && detail->len == 0 + && detail->index == 0) { - uint32_t dst_addr = (0x08000000 + value * 0x100); + uint32_t dst_addr = (0x08000000 + detail->value * 0x100); - if (dst_addr + 256 <= (uint32_t)&_flash_end) + if (dst_addr + 256 <= flash_end) return USB_SUCCESS; } - else if (req_no == USB_REGNUAL_PROTECT && len == 0 - && value == 0 && index == 0) + else if (req_no == USB_REGNUAL_PROTECT && detail->len == 0 + && detail->value == 0 && detail->index == 0) return USB_SUCCESS; - else if (req_no == USB_REGNUAL_FINISH && len == 0 - && value == 0 && index == 0) + else if (req_no == USB_REGNUAL_FINISH && detail->len == 0 + && detail->value == 0 && detail->index == 0) return USB_SUCCESS; } } @@ -250,25 +250,17 @@ usb_cb_setup (uint8_t req, uint8_t req_no, int usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, - uint16_t index, uint16_t length) + struct control_info *detail) { - (void)index; - (void)length; if (rcp != DEVICE_RECIPIENT) return USB_UNSUPPORT; if (desc_type == DEVICE_DESCRIPTOR) - { - usb_lld_set_data_to_send (regnual_device_desc, - sizeof (regnual_device_desc)); - return USB_SUCCESS; - } + return usb_lld_reply_request (regnual_device_desc, + sizeof (regnual_device_desc), detail); else if (desc_type == CONFIG_DESCRIPTOR) - { - usb_lld_set_data_to_send (regnual_config_desc, - sizeof (regnual_config_desc)); - return USB_SUCCESS; - } + return usb_lld_reply_request (regnual_config_desc, + sizeof (regnual_config_desc), detail); else if (desc_type == STRING_DESCRIPTOR) { const uint8_t *str; @@ -281,12 +273,12 @@ usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, size = sizeof (regnual_string_lang_id); break; case 1: - str = gnukStringVendor; - size = sizeof (gnukStringVendor); + str = gnuk_string_vendor; + size = sizeof (gnuk_string_vendor); break; case 2: - str = gnukStringProduct; - size = sizeof (gnukStringProduct); + str = gnuk_string_product; + size = sizeof (gnuk_string_product); break; case 3: str = regnual_string_serial; @@ -296,8 +288,7 @@ usb_cb_get_descriptor (uint8_t rcp, uint8_t desc_type, uint8_t desc_index, return USB_UNSUPPORT; } - usb_lld_set_data_to_send (str, size); - return USB_SUCCESS; + return usb_lld_reply_request (str, size, detail); } return USB_UNSUPPORT; @@ -319,9 +310,9 @@ int usb_cb_handle_event (uint8_t event_type, uint16_t value) return USB_UNSUPPORT; } -int usb_cb_interface (uint8_t cmd, uint16_t interface, uint16_t alt) +int usb_cb_interface (uint8_t cmd, struct control_info *detail) { - (void)cmd; (void)interface; (void)alt; + (void)cmd; (void)detail; return USB_UNSUPPORT; } @@ -343,6 +334,7 @@ main (int argc, char *argv[]) set_led (0); + flash_end = FLASH_START_ADDR + (*FLASH_SIZE_REG)*1024; usb_lld_init (regnual_config_desc[7]); while (1) diff --git a/regnual/regnual.ld b/regnual/regnual.ld index ea7ea2d..0b1ba98 100644 --- a/regnual/regnual.ld +++ b/regnual/regnual.ld @@ -12,8 +12,6 @@ MEMORY } vector = 0x08000000; -_flash_start = 0x08001000; -_flash_end = 0x08020000; __ram_start__ = ORIGIN(ram0); __ram_size__ = 20k;