Obtaining and accessing device abstractions in L4Re
paul at boddie.org.uk
Tue Jul 4 23:11:41 CEST 2017
I've been trying to write some drivers in L4Re, starting out with a GPIO
driver for a currently-unsupported board, and I think I have mostly understood
the concepts involved. Fortunately, there are already a couple of drivers to
borrow ideas from...
And if I am not mistaken, such drivers can be accessed from other components
by just doing something like this (testing for validity as we go):
vbus = l4re_env_get_cap("vbus");
l4vbus_get_device_by_hid(vbus, 0, &gpio_handle, gpio_hid, 0, 0);
l4vbus_gpio_set(vbus, gpio_handle, gpio_reg, value);
It appears that if I just declare the device appropriately in my board's
hw_devices.io file, I should be able to get a handle for it using code like
the above. And all access can apparently be done via the l4vbus_gpio functions
with this handle.
(I was also wondering if it was possible to actually instantiate or obtain a
device directly instead of obtaining a handle, for code written in C++, but
the above is easily good enough at the moment.)
But now I want to make another, non-GPIO, driver abstraction, instead of
directly accessing the mapped memory regions concerned (which I see that some
of the drivers do). It seems like I should be able to...
* define a class for the abstraction inheriting from Hw::Device
* declare the device in hw_devices.io using this class
* provide various properties in the hw_devices.io declaration
(for configuration purposes)
* read the properties in the actual class implementation
* access registers in memory just as the GPIO drivers do
I think I can muddle through all this. But how should another component access
methods provided by this driver? Do I have to implement functionality like
that provided by the following files...?
Does any of this make any sense? :-)
I'm just getting started here, but thanks are due in advance for any advice
anyone may have!
More information about the l4-hackers