61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
// Copyright 2017 The Periph Authors. All rights reserved.
|
|
// Use of this source code is governed under the Apache License, Version 2.0
|
|
// that can be found in the LICENSE file.
|
|
|
|
package bcm283x
|
|
|
|
import (
|
|
"time"
|
|
|
|
"periph.io/x/host/v3/cpu"
|
|
)
|
|
|
|
// ReadTime returns the time on a monotonic 1Mhz clock (1µs resolution).
|
|
//
|
|
// It only works if bcm283x-dma successfully loaded. Otherwise it returns 0.
|
|
func ReadTime() time.Duration {
|
|
if drvDMA.timerMemory == nil {
|
|
return 0
|
|
}
|
|
return (time.Duration(drvDMA.timerMemory.high)<<32 | time.Duration(drvDMA.timerMemory.low)) * time.Microsecond
|
|
}
|
|
|
|
// Nanospin spins the CPU without calling into the kernel code if possible.
|
|
func Nanospin(t time.Duration) {
|
|
start := ReadTime()
|
|
if start == 0 {
|
|
// Use the slow generic version.
|
|
cpu.Nanospin(t)
|
|
return
|
|
}
|
|
// TODO(maruel): Optimize code path for sub-1µs duration.
|
|
for ReadTime()-start < t {
|
|
}
|
|
}
|
|
|
|
//
|
|
|
|
const (
|
|
// 31:4 reserved
|
|
timerM3 = 1 << 3 // M3
|
|
timerM2 = 1 << 2 // M2
|
|
timerM1 = 1 << 1 // M1
|
|
timerM0 = 1 << 0 // M0
|
|
)
|
|
|
|
// Page 173
|
|
type timerCtl uint32
|
|
|
|
// timerMap represents the registers to access the 1Mhz timer.
|
|
//
|
|
// Page 172
|
|
type timerMap struct {
|
|
ctl timerCtl // CS
|
|
low uint32 // CLO
|
|
high uint32 // CHI
|
|
c0 uint32 // 0
|
|
c1 uint32 // C1
|
|
c2 uint32 // C2
|
|
c3 uint32 // C3
|
|
}
|