/*
* \brief C-API Genode USB-client backend
* \author Sebastian Sumpf
* \author Stefan Kalkowski
* \date 2023-06-29
*/
/*
* Copyright (C) 2023 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef __GENODE_C_API__USB_CLIENT_H_
#define __GENODE_C_API__USB_CLIENT_H_
#include
#include
#include
#ifdef __cplusplus
extern "C" {
#endif
/*************************
** Lifetime management **
*************************/
typedef unsigned long genode_usb_client_dev_handle_t;
/**
* Callback to announce a device
*/
typedef void* (*genode_usb_client_dev_add_t)
(genode_usb_client_dev_handle_t handle, char const *name,
genode_usb_speed_t speed);
/**
* Callback to delete a device
*/
typedef void (*genode_usb_client_dev_del_t)
(genode_usb_client_dev_handle_t handle, void *opaque_data);
void genode_usb_client_update(genode_usb_client_dev_add_t add,
genode_usb_client_dev_del_t del);
/******************************************
** USB device and interface interaction **
******************************************/
typedef enum {
INVALID,
HALT,
NO_DEVICE,
NO_MEMORY,
TIMEOUT,
OK
} genode_usb_client_ret_val_t;
/**
* Callback to produce out content of an USB request
*/
typedef void (*genode_usb_client_produce_out_t)
(void *opaque_data, genode_buffer_t buffer);
/**
* Callback to consume in result of an USB request
*/
typedef void (*genode_usb_client_consume_in_t)
(void *opaque_data, genode_buffer_t buffer);
/**
* Callback to produce out content of isochronous packet i
*/
typedef genode_uint32_t (*genode_usb_client_produce_out_isoc_t)
(void *opaque_data, genode_uint32_t i, genode_buffer_t buffer);
/**
* Callback to consume in result of isochronous packet i
*/
typedef void (*genode_usb_client_consume_in_isoc_t)
(void *opaque_data, genode_uint32_t i, genode_buffer_t buffer);
/**
* Callback to complete an USB request
*/
typedef void (*genode_usb_client_complete_t)
(void *opaque_data, genode_usb_client_ret_val_t result);
genode_usb_client_ret_val_t
genode_usb_client_device_control(genode_usb_client_dev_handle_t handle,
genode_uint8_t request,
genode_uint8_t request_type,
genode_uint16_t value,
genode_uint16_t index,
unsigned long size,
void *opaque_data);
void
genode_usb_client_device_update(genode_usb_client_produce_out_t out,
genode_usb_client_consume_in_t in,
genode_usb_client_produce_out_isoc_t out_isoc,
genode_usb_client_consume_in_isoc_t in_isoc,
genode_usb_client_complete_t complete);
typedef enum { BULK, IRQ, ISOC, FLUSH } genode_usb_client_iface_type_t;
void
genode_usb_client_claim_interface(genode_usb_client_dev_handle_t handle,
unsigned interface_num);
void
genode_usb_client_release_interface(genode_usb_client_dev_handle_t handle,
unsigned interface_num);
genode_usb_client_ret_val_t
genode_usb_client_iface_transfer(genode_usb_client_dev_handle_t handle,
genode_usb_client_iface_type_t type,
genode_uint8_t index,
unsigned long size,
void *opaque_data);
#ifdef __cplusplus
} /* extern "C" */
#endif /* __cplusplus */
#ifdef __cplusplus
#include
#include
#include
namespace Genode_c_api {
using namespace Genode;
/**
* Initialize USB client c++ backend
*/
void initialize_usb_client(Env &env,
Allocator &alloc,
Signal_context_capability io_handler,
Signal_context_capability rom_handler);
}
#endif /* __cplusplus */
#endif /* __GENODE_C_API__USB_CLIENT_H_ */