regmap is a lightweight library to manage direct register field manipulation.
Many times been in the situation where for development I have wanted to interact with an embedded system, where for testing I just want read and write raw register values. Most of these devices contain registers with multiple fields of varying bit lengths. This library abstracts away the awkward bit manipulation into a simple register definition.
You can install regmap from PyPi with the following command:
pip install regmapThe interface is the code that interacts with the system containing the registers. A read and a write method need to be defined.
fromregmapimportInterfaceclassDeviceInterface(Interface):
defread(self, address: int) ->int:
# Function to go read a register from the devicevalue=read_val_from_register(address)
returnvaluedefwrite(self, address: int, value: int) ->None:
# Function to go write a value to a register on the devicewrite_val_to_register(address, value)fromregmapimportBitField, Registerclassconfig_reg_a_def(Register):
_name="config_reg_a"_address=0x2000output=BitField(7, 1)
enable=BitField(0)
classconfig_reg_b_def(Register):
_name="config_reg_b"_address=0x2004setting2=BitField(7, 5)
setting1=BitField(4, 2)
setting0=BitField(1, 0)
classRegisters:
def__init__(self, interface):
self.config_reg_a=config_reg_a_def(interface)
self.config_reg_b=config_reg_b_def(interface)The context manager will deal with reading and writing to the register. By default the context manager will do read, modify, write. This can be changed to perform read-only or write-only operations.
fromregmapimportModeinterface=DeviceInterface()
registers=Registers(interface)
# Perform read, modify, writewithregisters.config_reg_a:
registers.config_reg_a.output=20registers.config_reg_a.enable=1# Perform read only, will warn if modifications were attemptedwithregisters.config_reg_a(mode=Mode.RO):
print(registers.config_reg_a.output)
# Perform write only, zeros will be written in any unset fieldswithregisters.config_reg_b(mode=Mode.WO):
registers.config_reg_b.setting1=2