mirror of https://github.com/ArduPilot/ardupilot
HAL_ChibiOS: improved default USB strings
use board name and serial number to make IDs unique
This commit is contained in:
parent
23e1b2e271
commit
4b8bde746e
|
@ -219,7 +219,7 @@ CPPWARN = -Wall -Wextra -Wundef
|
||||||
#
|
#
|
||||||
|
|
||||||
# List all user C define here, like -D_DEBUG=1
|
# List all user C define here, like -D_DEBUG=1
|
||||||
UDEFS = $(FATFS_FLAGS)
|
UDEFS = $(FATFS_FLAGS) -DHAL_BOARD_NAME=\"$(HAL_BOARD_NAME)\"
|
||||||
|
|
||||||
# Define ASM defines here
|
# Define ASM defines here
|
||||||
UADEFS =
|
UADEFS =
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "hwdef.h"
|
#include "hwdef.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#pragma GCC optimize("O0")
|
#pragma GCC optimize("O0")
|
||||||
|
|
||||||
|
@ -210,22 +211,73 @@ static USBDescriptor vcom_strings[] = {
|
||||||
{0, NULL}, // version
|
{0, NULL}, // version
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// start of 12 byte CPU ID
|
||||||
|
#ifndef UDID_START
|
||||||
|
#define UDID_START 0x1FFF7A10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
handle substitution of variables in strings for USB descriptors
|
||||||
|
*/
|
||||||
|
static char *string_substitute(const char *str)
|
||||||
|
{
|
||||||
|
uint8_t new_len = strlen(str);
|
||||||
|
if (strstr(str, "%BOARD%")) {
|
||||||
|
new_len += strlen(HAL_BOARD_NAME) - 7;
|
||||||
|
}
|
||||||
|
if (strstr(str, "%SERIAL%")) {
|
||||||
|
new_len += 24 - 8;
|
||||||
|
}
|
||||||
|
char *str2 = malloc(new_len+1);
|
||||||
|
char *p = str2;
|
||||||
|
while (*str) {
|
||||||
|
char c = *str;
|
||||||
|
if (c == '%') {
|
||||||
|
if (strcmp(str, "%BOARD%") == 0) {
|
||||||
|
memcpy(p, HAL_BOARD_NAME, strlen(HAL_BOARD_NAME));
|
||||||
|
str += 7;
|
||||||
|
p += strlen(HAL_BOARD_NAME);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (strcmp(str, "%SERIAL%") == 0) {
|
||||||
|
const char *hex = "0123456789ABCDEF";
|
||||||
|
const uint8_t *cpu_id = (const uint8_t *)UDID_START;
|
||||||
|
for (uint8_t i=0; i<12; i++) {
|
||||||
|
*p++ = hex[(cpu_id[i]>>4)&0xF];
|
||||||
|
*p++ = hex[cpu_id[i]&0xF];
|
||||||
|
}
|
||||||
|
str += 8;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*p++ = *str++;
|
||||||
|
}
|
||||||
|
*p = 0;
|
||||||
|
return str2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
dynamically allocate a USB descriptor string
|
dynamically allocate a USB descriptor string
|
||||||
*/
|
*/
|
||||||
static void setup_usb_string(USBDescriptor *desc, const char *str)
|
static void setup_usb_string(USBDescriptor *desc, const char *str)
|
||||||
{
|
{
|
||||||
uint8_t len = strlen(str);
|
char *str2 = string_substitute(str);
|
||||||
|
uint8_t len = strlen(str2);
|
||||||
desc->ud_size = 2+2*len;
|
desc->ud_size = 2+2*len;
|
||||||
uint8_t *b = (uint8_t *)calloc(1, desc->ud_size);
|
uint8_t *b = (uint8_t *)calloc(1, desc->ud_size);
|
||||||
desc->ud_string = (const char *)b;
|
desc->ud_string = (const uint8_t *)b;
|
||||||
b[0] = USB_DESC_BYTE(desc->ud_size);
|
b[0] = USB_DESC_BYTE(desc->ud_size);
|
||||||
b[1] = USB_DESC_BYTE(USB_DESCRIPTOR_STRING);
|
b[1] = USB_DESC_BYTE(USB_DESCRIPTOR_STRING);
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
b[2+i*2] = str[i];
|
b[2+i*2] = str2[i];
|
||||||
b[2+i*2+1] = 0;
|
b[2+i*2+1] = 0;
|
||||||
}
|
}
|
||||||
|
if (str2 != str) {
|
||||||
|
free(str2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -355,16 +355,12 @@ INCLUDE common.ld
|
||||||
|
|
||||||
def write_USB_config(f):
|
def write_USB_config(f):
|
||||||
'''write USB config defines'''
|
'''write USB config defines'''
|
||||||
if not 'USB_VENDOR' in config:
|
|
||||||
return
|
|
||||||
f.write('// USB configuration\n')
|
f.write('// USB configuration\n')
|
||||||
f.write('#define HAL_USB_VENDOR_ID %s\n' % get_config('USB_VENDOR'))
|
f.write('#define HAL_USB_VENDOR_ID %s\n' % get_config('USB_VENDOR', default=0x0483)) # default to ST
|
||||||
f.write('#define HAL_USB_PRODUCT_ID %s\n' % get_config('USB_PRODUCT'))
|
f.write('#define HAL_USB_PRODUCT_ID %s\n' % get_config('USB_PRODUCT', default=0x5740))
|
||||||
for s in [
|
f.write('#define HAL_USB_STRING_MANUFACTURER "%s"\n' % get_config("USB_STRING_MANUFACTURER", default="ArduPilot"))
|
||||||
'USB_STRING_MANUFACTURER', 'USB_STRING_PRODUCT',
|
f.write('#define HAL_USB_STRING_PRODUCT "%s"\n' % get_config("USB_STRING_PRODUCT", default="%BOARD%"))
|
||||||
'USB_STRING_SERIAL'
|
f.write('#define HAL_USB_STRING_SERIAL "%s"\n' % get_config("USB_STRING_SERIAL", default="%SERIAL%"))
|
||||||
]:
|
|
||||||
f.write('#define HAL_%s "%s"\n' % (s, get_config(s)))
|
|
||||||
|
|
||||||
f.write('\n\n')
|
f.write('\n\n')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue