bitband_nxpmk66f18.mx raw

   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