USB accessory mode allows users to connect USB host hardware specifically designed for Android-powered devices. The accessories must adhere to the Android accessory protocol outlined in the http://accessories.android.com documentation. This allows Android devices that cannot act as a USB host to still interact with USB hardware. When an Android device is in USB accessory mode, the attached Android USB accessory acts as the host, provides power to the USB bus, and enumerates connected devices. There are issues (especially with regards to reference counting) which carry over from prior iterations of this driver, and therefore this driver should not be used as an example for other development. For these reasons, this patch is not eligible for android-mainline or future android16+ branches. Much of this functionality should be deprecated and removed. Bug: 120441124 Bug: 317149848 Change-Id: I6b7b6e7b2a348da0d57487e82913de6fe19f2b6e Signed-off-by: Neill Kapron <nkapron@google.com>
88 lines
3.1 KiB
C
88 lines
3.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright 2024 Google LLC
|
|
*/
|
|
#ifndef __ANDROID_ACCESSORY_H
|
|
#define __ANDROID_ACCESSORY_H
|
|
|
|
#include <linux/usb/composite.h>
|
|
#include <linux/usb/ch9.h>
|
|
|
|
#ifdef CONFIG_ANDROID_USB_CONFIGFS_F_ACC
|
|
|
|
/**
|
|
* android_acc_req_match_composite - used to check if the android accessory
|
|
* driver can handle a usb_ctrlrequest
|
|
* @cdev - the usb_composite_dev instance associated with the incoming ctrl
|
|
* request
|
|
* @ctrl - a usb_ctrlrequest for the accessory driver to check
|
|
*
|
|
* This function should be called in composite_setup() after other req_match
|
|
* checks have failed and the usb_ctrlrequest is still unhandled.
|
|
*
|
|
* The reason this must be implemented instead of the standard req_match
|
|
* interface is that the accessory function does not get bound to a config
|
|
* by userspace until a connected device sends the ACCESSORY_START control
|
|
* request, and therefore the composite driver does not know about f_accessory
|
|
* yet we need to check for the control requests.
|
|
*
|
|
* Returns: true if the accessory driver can handle the request, false if not
|
|
*/
|
|
bool android_acc_req_match_composite(struct usb_composite_dev *cdev,
|
|
const struct usb_ctrlrequest *ctrl);
|
|
|
|
/**
|
|
* android_acc_setup_composite - function for the f_accessory driver to handle
|
|
* usb_ctrlrequests
|
|
* @cdev - the usb_composite_dev instance associated with the incoming ctrl
|
|
* request.
|
|
* @ctrl - a usb_ctrlrequest to be handled by the f_accessory driver.
|
|
*
|
|
* This function should be called in composite_setup() after successfully
|
|
* checking for ctrl request support in android_acc_req_match_composite().
|
|
*
|
|
* The reason this additional api must be defined is due to the fact that
|
|
* userspace does not bind the f_accessory instance to a gadget config until
|
|
* after receiving an ACCESSORY_START control request from a connected
|
|
* accessory device, and therefore we have a circular dependency. The addition
|
|
* of this allows compatibility with the existing Android userspace, but is
|
|
* not ideal and should be refactored in the future.
|
|
*
|
|
* Returns: Negative error value upon failure, >=0 upon successful handdling
|
|
* of the usb_ctrlrequest aligned with the standard composite function driver
|
|
* setup() api.
|
|
*/
|
|
int android_acc_setup_composite(struct usb_composite_dev *cdev,
|
|
const struct usb_ctrlrequest *ctrl);
|
|
|
|
/**
|
|
* android_acc_disconnect - used to cleanup the accessory function
|
|
* and update the connection state on device disconnection.
|
|
*
|
|
* This should be called in the composite driver's __composite_disconnect()
|
|
* path to notify the accessory function of device disconnect. This is
|
|
* required because the accessory function exists outside of a gadget config
|
|
* and therefore the composite driver's standard cleanup paths may not apply.
|
|
*/
|
|
void android_acc_disconnect(void);
|
|
|
|
#else
|
|
|
|
static inline bool android_acc_req_match_composite(struct usb_composite_dev *cdev,
|
|
const struct usb_ctrlrequest *ctrl)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int android_acc_setup_composite(struct usb_composite_dev *cdev,
|
|
const struct usb_ctrlrequest *ctrl)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void android_acc_disconnect(void)
|
|
{
|
|
}
|
|
#endif /* CONFIG_ANDROID_USB_CONFIGFS_F_ACC */
|
|
#endif /* __ANDROID_ACCESSORY_H */
|