Module tock_registers::fields

source ·
Expand description

Register bitfield types and macros

To conveniently access and manipulate fields of a register, this library provides types and macros to describe and access bitfields of a register. This can be especially useful in conjuction with the APIs defined in interfaces, which make use of these types and hence allow to access and manipulate bitfields of proper registers directly.

A specific section (bitfield) in a register is described by the Field type, consisting of an unshifted bitmask over the base register UIntLike type, and a shift parameter. It is further associated with a specific RegisterLongName, which can prevent its use with incompatible registers.

A value of a section of a register is described by the FieldValue type. It stores the information of the respective section in the register, as well as the associated value. A FieldValue can be created from a Field through the val method.

register_bitfields macro

For defining register layouts with an associated RegisterLongName, along with Fields and matching FieldValues, a convenient macro-based interface can be used.

The following example demonstrates how two registers can be defined, over a u32 base type:

register_bitfields![u32,
    Uart [
        ENABLE OFFSET(0) NUMBITS(4) [
            ON = 8,
            OFF = 0
        ]
    ],
    Psel [
        PIN OFFSET(0) NUMBITS(6),
        CONNECT OFFSET(31) NUMBITS(1)
    ],
];

// In this scope, `Uart` is a module, representing the register and
// its fields. `Uart::Register` is a `RegisterLongName` type
// identifying this register. `Uart::ENABLE` is a field covering the
// first 4 bits of this register. `Uart::ENABLE::ON` is a
// `FieldValue` over that field, with the associated value 8.
// We can now use the types like so:
let reg: InMemoryRegister<u32, Uart::Register> = InMemoryRegister::new(0);
assert!(reg.read(Uart::ENABLE) == 0x00000000);
reg.modify(Uart::ENABLE::ON);
assert!(reg.get() == 0x00000008);

use tock_registers::interfaces::Debuggable;
assert!(
    &format!("{:?}", reg.debug())
    == "Uart { ENABLE: ON }"
);

Structs

  • Specific section of a register.
  • Values for the specific register fields.

Traits

  • Conversion of raw register value into enumerated values member. Implemented inside register_bitfields! macro for each bit field.