Hey Martin,
looks great. I also had in mind that the generic part from Mmio should be separated as Mmio is already a specialisation of IO access.
So, how do we proceed. Do you want to do the refactoring yourself and I add the I2c implementation afterwards?
Cheers Johannes
On Fri, 9 Dec 2016 09:42:04 +0100 Martin Stein <martin.stein@...1...> wrote:
Hey Johannes,
I could not get it out of my mind. What do you think of the following solution scheme:
template <typename IO> class Io_space { .. public: Io_space(IO &io) .. template .. struct Register ..; template .. struct Register_array ..; template .. read(..) { .. _io._read(..); .. } template .. write(..) { .. _io._write(..); .. } .. }; ~~~util/mmio.h~~~ class Mmio : public Io_space<Mmio> { friend class Io_space<Mmio>; private: template .. _read(..) { .. } template .. _write(..) { .. } public: Mmio_b(addr_t base) : Io_space<Mmio_accessor>(*this) .. }; ~~~i2c_io.h~~~ class I2c_io : public Io_space<I2c_io> { .. };
This would keep the back-end hidden and enable diversification.
Cheers, Martin
Am 08.12.2016 um 15:37 schrieb Martin Stein:
Hi Johannes,
We actually had an internal discussion about such an approach. As far as I remember, it was in the context of the Zynq drivers. I absolutely like the idea of using the Mmio framework with different back-ends. I think you would have to exchange merely the two raw-access methods of the framework:
! template <typename _ACCESS_T> ! void Mmio::_write(off_t const, _ACCESS_T const)' ! ! template <typename _ACCESS_T> ! _ACCESS_T Mmio::_read(off_t const) const
The read<>() and write<>() methods you mention should not contain any code that depends on the way of accessing registers but only the bit and offset logic that could be reused.
I'm curious about the outcome of your idea and help willingly if you have further questions.
Cheers, Martin
Am 07.12.2016 um 18:26 schrieb Johannes Schlatow:
Hi,
I really like Genode's Register API as it makes accessing memory mapped hardware registers quite clean and simple.
However, I recently encountered the need to access a rather complex I2C slave device. The I2C controller itself is accessible via MMIO. Yet, the slave device itself has a notion of registers. Basically, you first send the register address to the I2C slave and, in a second transaction, you can read/write the register's value.
Being used to the clean appearance of MMIO in Genode, I was wondering whether the access to I2C slave registers could be wrapped in a similar way. My intuition is that it might simply suffice to inherit from the Mmio class and modify the write<>() and read<>() functions but haven't checked the code in detail. Any suggestions/ideas?
Cheers Johannes
Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today.http://sdm.link/xeonphi _______________________________________________ genode-main mailing list genode-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main
Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today.http://sdm.link/xeonphi _______________________________________________ genode-main mailing list genode-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main
Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today.http://sdm.link/xeonphi _______________________________________________ genode-main mailing list genode-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main