mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-12 05:41:36 +00:00
os: extend USB C-API with claim/release
To signal that a device gets used and released by a session introduce claim, release, and release all callbacks in the USB interface of the C-API. Ref genodelabs/genode#4483
This commit is contained in:
parent
2e9e5c37b5
commit
8ca2c597e0
@ -68,6 +68,24 @@ typedef int (*genode_usb_rpc_endp_desc_t)
|
||||
(genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, unsigned idx,
|
||||
unsigned alt, unsigned endp, void * buf, unsigned long buf_size);
|
||||
|
||||
/**
|
||||
* Callback to claim a given interface
|
||||
*/
|
||||
typedef int (*genode_usb_rpc_claim_t)
|
||||
(genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, unsigned iface);
|
||||
|
||||
/**
|
||||
* Callback to release a given interface
|
||||
*/
|
||||
typedef int (*genode_usb_rpc_release_t)
|
||||
(genode_usb_bus_num_t bus, genode_usb_dev_num_t dev, unsigned iface);
|
||||
|
||||
/**
|
||||
* Callback to release all interfaces
|
||||
*/
|
||||
typedef void (*genode_usb_rpc_release_all_t)
|
||||
(genode_usb_bus_num_t bus, genode_usb_dev_num_t dev);
|
||||
|
||||
struct genode_usb_rpc_callbacks {
|
||||
genode_shared_dataspace_alloc_attach_t alloc_fn;
|
||||
genode_shared_dataspace_free_t free_fn;
|
||||
@ -76,6 +94,9 @@ struct genode_usb_rpc_callbacks {
|
||||
genode_usb_rpc_iface_desc_t iface_desc_fn;
|
||||
genode_usb_rpc_iface_extra_t iface_extra_fn;
|
||||
genode_usb_rpc_endp_desc_t endp_desc_fn;
|
||||
genode_usb_rpc_claim_t claim_fn;
|
||||
genode_usb_rpc_release_t release_fn;
|
||||
genode_usb_rpc_release_all_t release_all_fn;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -376,15 +376,27 @@ void genode_usb_session::endpoint_descriptor(unsigned interface_num,
|
||||
}
|
||||
|
||||
|
||||
void genode_usb_session::claim_interface(unsigned)
|
||||
void genode_usb_session::claim_interface(unsigned iface)
|
||||
{
|
||||
warning(__func__, " gets ignored!");
|
||||
genode_usb_bus_num_t bus;
|
||||
genode_usb_dev_num_t dev;
|
||||
if (!_root.device_associated(this, bus, dev))
|
||||
throw Device_not_found();
|
||||
|
||||
if (_callbacks->claim_fn(bus, dev, iface))
|
||||
throw Interface_not_found();
|
||||
}
|
||||
|
||||
|
||||
void genode_usb_session::release_interface(unsigned)
|
||||
void genode_usb_session::release_interface(unsigned iface)
|
||||
{
|
||||
warning(__func__, " gets ignored!");
|
||||
genode_usb_bus_num_t bus;
|
||||
genode_usb_dev_num_t dev;
|
||||
if (!_root.device_associated(this, bus, dev))
|
||||
throw Device_not_found();
|
||||
|
||||
if (_callbacks->release_fn(bus, dev, iface))
|
||||
throw Interface_not_found();
|
||||
}
|
||||
|
||||
|
||||
@ -576,8 +588,10 @@ genode_usb_session * ::Root::_create_session(const char * args,
|
||||
void ::Root::_destroy_session(genode_usb_session * session)
|
||||
{
|
||||
_for_each_device([&] (Device & d) {
|
||||
if (d.usb_session == session)
|
||||
if (d.usb_session == session) {
|
||||
_callbacks->release_all_fn(d.bus, d.dev);
|
||||
d.usb_session = nullptr;
|
||||
}
|
||||
});
|
||||
|
||||
genode_usb_session_handle_t id = session->_id;
|
||||
|
Loading…
x
Reference in New Issue
Block a user