1 //go:build nxp && mk66f18
2 3 package volatile
4 5 import "unsafe"
6 7 const registerBase = 0x40000000
8 const registerEnd = 0x40100000
9 const bitbandBase = 0x42000000
10 11 //go:inline
12 func bitbandAddress(reg uintptr, bit uint8) uintptr {
13 if uintptr(bit) > 32 {
14 panic("invalid bit position")
15 }
16 if reg < registerBase || reg >= registerEnd {
17 panic("register is out of range")
18 }
19 return (reg-registerBase)*32 + uintptr(bit)*4 + bitbandBase
20 }
21 22 // Special types that causes loads/stores to be volatile (necessary for
23 // memory-mapped registers).
24 type BitRegister struct {
25 Reg uint32
26 }
27 28 // Get returns the of the mapped register bit. It is the volatile equivalent of:
29 //
30 // *r.Reg
31 //
32 //go:inline
33 func (r *BitRegister) Get() bool {
34 return LoadUint32(&r.Reg) != 0
35 }
36 37 // Set sets the mapped register bit. It is the volatile equivalent of:
38 //
39 // *r.Reg = 1
40 //
41 //go:inline
42 func (r *BitRegister) Set(v bool) {
43 var i uint32
44 if v {
45 i = 1
46 }
47 StoreUint32(&r.Reg, i)
48 }
49 50 // Bit maps bit N of register R to the corresponding bitband address. Bit panics
51 // if R is not an AIPS or GPIO register or if N is out of range (greater than
52 // the number of bits in a register minus one).
53 //
54 //go:inline
55 func (r *Register8) Bit(bit uint8) *BitRegister {
56 ptr := bitbandAddress(uintptr(unsafe.Pointer(&r.Reg)), bit)
57 return (*BitRegister)(unsafe.Pointer(ptr))
58 }
59 60 // Bit maps bit N of register R to the corresponding bitband address. Bit panics
61 // if R is not an AIPS or GPIO register or if N is out of range (greater than
62 // the number of bits in a register minus one).
63 //
64 //go:inline
65 func (r *Register16) Bit(bit uint8) *BitRegister {
66 ptr := bitbandAddress(uintptr(unsafe.Pointer(&r.Reg)), bit)
67 return (*BitRegister)(unsafe.Pointer(ptr))
68 }
69 70 // Bit maps bit N of register R to the corresponding bitband address. Bit panics
71 // if R is not an AIPS or GPIO register or if N is out of range (greater than
72 // the number of bits in a register minus one).
73 //
74 //go:inline
75 func (r *Register32) Bit(bit uint8) *BitRegister {
76 ptr := bitbandAddress(uintptr(unsafe.Pointer(&r.Reg)), bit)
77 return (*BitRegister)(unsafe.Pointer(ptr))
78 }
79