atsam: Enable chipid as usb serial number

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2019-11-25 19:30:02 -05:00
parent d7ec5505a6
commit 401f7a879c
4 changed files with 79 additions and 4 deletions

View File

@ -6,9 +6,9 @@ All dates in this document are approximate.
# Changes # Changes
20191124: The USB names have changed on lpc176x, stm32, and atsamd. 20191124: The USB names have changed on lpc176x, stm32, atsamd, and
They now use the unique chip id by default. Update the "serial" atsam. They now use the unique chip id by default. Update the
setting in the "mcu" config section accordingly. "serial" setting in the "mcu" config section accordingly.
20191121: The pressure_advance_lookahead_time parameter has been 20191121: The pressure_advance_lookahead_time parameter has been
removed. See example.cfg for alternate configuration settings. removed. See example.cfg for alternate configuration settings.

View File

@ -11,6 +11,7 @@ config ATSAM_SELECT
select HAVE_GPIO_SPI select HAVE_GPIO_SPI
select HAVE_GPIO_HARD_PWM select HAVE_GPIO_HARD_PWM
select HAVE_GPIO_BITBANGING select HAVE_GPIO_BITBANGING
select HAVE_CHIPID
config BOARD_DIRECTORY config BOARD_DIRECTORY
string string

View File

@ -28,7 +28,7 @@ src-y += generic/armcm_boot.c generic/armcm_irq.c generic/armcm_timer.c
src-y += generic/crc16_ccitt.c src-y += generic/crc16_ccitt.c
usb-src-$(CONFIG_MACH_SAM3X) := atsam/sam3_usb.c usb-src-$(CONFIG_MACH_SAM3X) := atsam/sam3_usb.c
usb-src-$(CONFIG_MACH_SAM4) := atsam/sam4_usb.c usb-src-$(CONFIG_MACH_SAM4) := atsam/sam4_usb.c
src-$(CONFIG_USBSERIAL) += $(usb-src-y) generic/usb_cdc.c src-$(CONFIG_USBSERIAL) += $(usb-src-y) atsam/chipid.c generic/usb_cdc.c
src-$(CONFIG_SERIAL) += atsam/serial.c generic/serial_irq.c src-$(CONFIG_SERIAL) += atsam/serial.c generic/serial_irq.c
src-$(CONFIG_MACH_SAM3X) += atsam/adc.c src-$(CONFIG_MACH_SAM3X) += atsam/adc.c
src-$(CONFIG_MACH_SAM4S) += atsam/adc.c src-$(CONFIG_MACH_SAM4S) += atsam/adc.c

74
src/atsam/chipid.c Normal file
View File

@ -0,0 +1,74 @@
// Support for extracting the hardware chip id on sam3/sam4
//
// Copyright (C) 2019 Kevin O'Connor <kevin@koconnor.net>
//
// This file may be distributed under the terms of the GNU GPLv3 license.
#include "generic/irq.h" // irq_disable
#include "generic/usb_cdc.h" // usb_fill_serial
#include "generic/usbstd.h" // usb_string_descriptor
#include "internal.h" // EFC0
#include "sched.h" // DECL_INIT
#define CHIP_UID_LEN 16
static struct {
struct usb_string_descriptor desc;
uint16_t data[CHIP_UID_LEN * 2];
} cdc_chipid;
struct usb_string_descriptor *
usbserial_get_serialid(void)
{
return &cdc_chipid.desc;
}
// Compatibility definitions for sam4e8e
#ifndef EFC0
#define EFC0 EFC
#define IFLASH0_ADDR IFLASH_ADDR
#endif
void noinline __section(".ramfunc.read_chip_id")
read_chip_id(uint32_t *id)
{
// Workaround sam3 errata
uint32_t fmr = EFC0->EEFC_FMR;
EFC0->EEFC_FMR = fmr | EEFC_FMR_SCOD;
// Send the STUI command
while (!(EFC0->EEFC_FSR & EEFC_FSR_FRDY))
;
EFC0->EEFC_FCR = EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_STUI;
while (EFC0->EEFC_FSR & EEFC_FSR_FRDY)
;
// Copy the id
id[0] = *(uint32_t*)(IFLASH0_ADDR + 0x00);
id[1] = *(uint32_t*)(IFLASH0_ADDR + 0x04);
id[1] = *(uint32_t*)(IFLASH0_ADDR + 0x08);
id[1] = *(uint32_t*)(IFLASH0_ADDR + 0x0c);
// Send the SPUI command
EFC0->EEFC_FCR = EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SPUI;
while (!(EFC0->EEFC_FSR & EEFC_FSR_FRDY))
;
// Restore fmr
EFC0->EEFC_FMR = fmr;
}
void
chipid_init(void)
{
if (!CONFIG_USB_SERIAL_NUMBER_CHIPID)
return;
uint32_t id[4];
irq_disable();
read_chip_id(id);
irq_enable();
usb_fill_serial(&cdc_chipid.desc, ARRAY_SIZE(cdc_chipid.data), id);
}
DECL_INIT(chipid_init);