MMIO classes
Norman Feske
norman.feske at ...1...
Wed Apr 9 11:36:55 CEST 2014
Hello Aditya,
it looks like you would need to keep an array of 'Genode::Mmio' objects.
Here is a rough sketch of the idea:
struct Device
{
Genode::addr_t const base; /* base of the entire device */
struct Block : Genode::Mmio
{
struct Reg1 : Register<0x0,32> { };
struct Reg2 : Register<0x4,32> { };
/**
* Constructor
*
* \param base base address of the block
*/
Block(Genode::addr_t base) : Genode::Mmio(base) { }
/**
* Init single block
*/
void init()
{
write<Reg1>(1);
write<Reg2>(2);
}
};
Block blocks[3] = {
{ base + 0 },
{ base + 0x4c },
{ base + 0x3a }
};
unsigned num_blocks() const
{
return sizeof(blocks)/sizeof(blocks[0]);
}
Device(Genode::addr_t base) : base(base) { }
void init()
{
for (unsigned i = 0; i < num_blocks(); i++)
blocks[i].init();
}
};
With 'Block' I denote the part of the device that occurs repeatedly. The
code above models each block as a separate 'Genode::Mmio' instance.
Hence, it can be individually positioned. Of course, the 'Device' may
also be an 'Genode::Mmio' instance. So registers that occur only once
would be placed directly in the 'Device' scope.
Best regards
Norman
--
Dr.-Ing. Norman Feske
Genode Labs
http://www.genode-labs.com · http://genode.org
Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth
More information about the users
mailing list