machine/stm32: implement DeviceID() with unique ID per processor

Signed-off-by: deadprogram <ron@hybridgroup.com>
Этот коммит содержится в:
deadprogram 2023-10-27 16:06:03 +02:00 коммит произвёл Ron Evans
родитель 9fb5a5b9a4
коммит 938ce22307
8 изменённых файлов: 37 добавлений и 1 удалений

Просмотреть файл

@ -2,7 +2,12 @@
package machine package machine
import "device/stm32" import (
"device/stm32"
"runtime/volatile"
"unsafe"
)
const deviceName = stm32.Device const deviceName = stm32.Device
@ -80,3 +85,20 @@ func (p Pin) PortMaskClear() (*uint32, uint32) {
pin := uint8(p) % 16 pin := uint8(p) % 16
return &port.BSRR.Reg, 1 << (pin + 16) return &port.BSRR.Reg, 1 << (pin + 16)
} }
var deviceID [12]byte
// DeviceID returns an identifier that is unique within
// a particular chipset.
//
// The identity is one burnt into the MCU itself.
//
// The length of the device ID for STM32 is 12 bytes (96 bits).
func DeviceID() []byte {
for i := 0; i < len(deviceID); i++ {
word := (*volatile.Register32)(unsafe.Pointer(deviceIDAddr[i/4])).Get()
deviceID[i] = byte(word >> ((i % 4) * 8))
}
return deviceID[:]
}

Просмотреть файл

@ -15,6 +15,8 @@ func CPUFrequency() uint32 {
return 72000000 return 72000000
} }
var deviceIDAddr = []uintptr{0x1FFFF7E8, 0x1FFFF7EC, 0x1FFFF7F0}
// Internal use: configured speed of the APB1 and APB2 timers, this should be kept // Internal use: configured speed of the APB1 and APB2 timers, this should be kept
// in sync with any changes to runtime package which configures the oscillators // in sync with any changes to runtime package which configures the oscillators
// and clock frequencies // and clock frequencies

Просмотреть файл

@ -14,6 +14,8 @@ import (
"unsafe" "unsafe"
) )
var deviceIDAddr = []uintptr{0x1FFF7A10, 0x1FFF7A14, 0x1FFF7A18}
const ( const (
PA0 = portA + 0 PA0 = portA + 0
PA1 = portA + 1 PA1 = portA + 1

Просмотреть файл

@ -11,6 +11,8 @@ import (
"unsafe" "unsafe"
) )
var deviceIDAddr = []uintptr{0x1FF0F420, 0x1FF0F424, 0x1FF0F428}
// Alternative peripheral pin functions // Alternative peripheral pin functions
const ( const (
AF0_SYSTEM = 0 AF0_SYSTEM = 0

Просмотреть файл

@ -13,6 +13,8 @@ func CPUFrequency() uint32 {
return 32000000 return 32000000
} }
var deviceIDAddr = []uintptr{0x1FF80050, 0x1FF80054, 0x1FF80058}
// Internal use: configured speed of the APB1 and APB2 timers, this should be kept // Internal use: configured speed of the APB1 and APB2 timers, this should be kept
// in sync with any changes to runtime package which configures the oscillators // in sync with any changes to runtime package which configures the oscillators
// and clock frequencies // and clock frequencies

Просмотреть файл

@ -13,6 +13,8 @@ import (
// Peripheral abstraction layer for the stm32l4 // Peripheral abstraction layer for the stm32l4
var deviceIDAddr = []uintptr{0x1FFF7590, 0x1FFF7594, 0x1FFF7598}
const ( const (
AF0_SYSTEM = 0 AF0_SYSTEM = 0
AF1_TIM1_2_LPTIM1 = 1 AF1_TIM1_2_LPTIM1 = 1

Просмотреть файл

@ -11,6 +11,8 @@ import (
"unsafe" "unsafe"
) )
var deviceIDAddr = []uintptr{0x0BFA0590, 0x0BFA0594, 0x0BFA0598}
const ( const (
AF0_SYSTEM = 0 AF0_SYSTEM = 0
AF1_TIM1_2_5_8_LPTIM1 = 1 AF1_TIM1_2_5_8_LPTIM1 = 1

Просмотреть файл

@ -14,6 +14,8 @@ import (
"unsafe" "unsafe"
) )
var deviceIDAddr = []uintptr{0x1FFF7590, 0x1FFF7594, 0x1FFF7598}
const ( const (
AF0_SYSTEM = 0 AF0_SYSTEM = 0
AF1_TIM1_2_LPTIM1 = 1 AF1_TIM1_2_LPTIM1 = 1