mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
usb: gadget: accessory: Add Android Accessory function
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. Signed-off-by: Mike Lockwood <lockwood@android.com>
This commit is contained in:
committed by
Arve Hjønnevåg
parent
17c12acd8f
commit
9389147c63
@@ -47,6 +47,7 @@
|
||||
#include "f_acm.c"
|
||||
#include "f_adb.c"
|
||||
#include "f_mtp.c"
|
||||
#include "f_accessory.c"
|
||||
#define USB_ETH_RNDIS y
|
||||
#include "f_rndis.c"
|
||||
#include "rndis.c"
|
||||
@@ -633,6 +634,39 @@ static struct android_usb_function mass_storage_function = {
|
||||
};
|
||||
|
||||
|
||||
static int accessory_function_init(struct android_usb_function *f,
|
||||
struct usb_composite_dev *cdev)
|
||||
{
|
||||
return acc_setup();
|
||||
}
|
||||
|
||||
static void accessory_function_cleanup(struct android_usb_function *f)
|
||||
{
|
||||
acc_cleanup();
|
||||
}
|
||||
|
||||
static int accessory_function_bind_config(struct android_usb_function *f,
|
||||
struct usb_configuration *c)
|
||||
{
|
||||
return acc_bind_config(c);
|
||||
}
|
||||
|
||||
static int accessory_function_ctrlrequest(struct android_usb_function *f,
|
||||
struct usb_composite_dev *cdev,
|
||||
const struct usb_ctrlrequest *c)
|
||||
{
|
||||
return acc_ctrlrequest(cdev, c);
|
||||
}
|
||||
|
||||
static struct android_usb_function accessory_function = {
|
||||
.name = "accessory",
|
||||
.init = accessory_function_init,
|
||||
.cleanup = accessory_function_cleanup,
|
||||
.bind_config = accessory_function_bind_config,
|
||||
.ctrlrequest = accessory_function_ctrlrequest,
|
||||
};
|
||||
|
||||
|
||||
static struct android_usb_function *supported_functions[] = {
|
||||
&adb_function,
|
||||
&acm_function,
|
||||
@@ -640,6 +674,7 @@ static struct android_usb_function *supported_functions[] = {
|
||||
&ptp_function,
|
||||
&rndis_function,
|
||||
&mass_storage_function,
|
||||
&accessory_function,
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -825,6 +860,10 @@ static ssize_t enable_store(struct device *pdev, struct device_attribute *attr,
|
||||
struct usb_composite_dev *cdev = dev->cdev;
|
||||
int enabled = 0;
|
||||
|
||||
|
||||
if (!cdev)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
|
||||
sscanf(buff, "%d", &enabled);
|
||||
@@ -1072,6 +1111,12 @@ android_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *c)
|
||||
}
|
||||
}
|
||||
|
||||
/* Special case the accessory function.
|
||||
* It needs to handle control requests before it is enabled.
|
||||
*/
|
||||
if (value < 0)
|
||||
value = acc_ctrlrequest(cdev, c);
|
||||
|
||||
if (value < 0)
|
||||
value = composite_setup(gadget, c);
|
||||
|
||||
|
||||
796
drivers/usb/gadget/f_accessory.c
Normal file
796
drivers/usb/gadget/f_accessory.c
Normal file
File diff suppressed because it is too large
Load Diff
83
include/linux/usb/f_accessory.h
Normal file
83
include/linux/usb/f_accessory.h
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Gadget Function Driver for Android USB accessories
|
||||
*
|
||||
* Copyright (C) 2011 Google, Inc.
|
||||
* Author: Mike Lockwood <lockwood@android.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_USB_F_ACCESSORY_H
|
||||
#define __LINUX_USB_F_ACCESSORY_H
|
||||
|
||||
/* Use Google Vendor ID when in accessory mode */
|
||||
#define USB_ACCESSORY_VENDOR_ID 0x18D1
|
||||
|
||||
|
||||
/* Product ID to use when in accessory mode */
|
||||
#define USB_ACCESSORY_PRODUCT_ID 0x2D00
|
||||
|
||||
/* Product ID to use when in accessory mode and adb is enabled */
|
||||
#define USB_ACCESSORY_ADB_PRODUCT_ID 0x2D01
|
||||
|
||||
/* Indexes for strings sent by the host via ACCESSORY_SEND_STRING */
|
||||
#define ACCESSORY_STRING_MANUFACTURER 0
|
||||
#define ACCESSORY_STRING_MODEL 1
|
||||
#define ACCESSORY_STRING_DESCRIPTION 2
|
||||
#define ACCESSORY_STRING_VERSION 3
|
||||
#define ACCESSORY_STRING_URI 4
|
||||
#define ACCESSORY_STRING_SERIAL 5
|
||||
|
||||
/* Control request for retrieving device's protocol version (currently 1)
|
||||
*
|
||||
* requestType: USB_DIR_IN | USB_TYPE_VENDOR
|
||||
* request: ACCESSORY_GET_PROTOCOL
|
||||
* value: 0
|
||||
* index: 0
|
||||
* data version number (16 bits little endian)
|
||||
*/
|
||||
#define ACCESSORY_GET_PROTOCOL 51
|
||||
|
||||
/* Control request for host to send a string to the device
|
||||
*
|
||||
* requestType: USB_DIR_OUT | USB_TYPE_VENDOR
|
||||
* request: ACCESSORY_SEND_STRING
|
||||
* value: 0
|
||||
* index: string ID
|
||||
* data zero terminated UTF8 string
|
||||
*
|
||||
* The device can later retrieve these strings via the
|
||||
* ACCESSORY_GET_STRING_* ioctls
|
||||
*/
|
||||
#define ACCESSORY_SEND_STRING 52
|
||||
|
||||
/* Control request for starting device in accessory mode.
|
||||
* The host sends this after setting all its strings to the device.
|
||||
*
|
||||
* requestType: USB_DIR_OUT | USB_TYPE_VENDOR
|
||||
* request: ACCESSORY_START
|
||||
* value: 0
|
||||
* index: 0
|
||||
* data none
|
||||
*/
|
||||
#define ACCESSORY_START 53
|
||||
|
||||
/* ioctls for retrieving strings set by the host */
|
||||
#define ACCESSORY_GET_STRING_MANUFACTURER _IOW('M', 1, char[256])
|
||||
#define ACCESSORY_GET_STRING_MODEL _IOW('M', 2, char[256])
|
||||
#define ACCESSORY_GET_STRING_DESCRIPTION _IOW('M', 3, char[256])
|
||||
#define ACCESSORY_GET_STRING_VERSION _IOW('M', 4, char[256])
|
||||
#define ACCESSORY_GET_STRING_URI _IOW('M', 5, char[256])
|
||||
#define ACCESSORY_GET_STRING_SERIAL _IOW('M', 6, char[256])
|
||||
/* returns 1 if there is a start request pending */
|
||||
#define ACCESSORY_IS_START_REQUESTED _IO('M', 7)
|
||||
|
||||
#endif /* __LINUX_USB_F_ACCESSORY_H */
|
||||
Reference in New Issue
Block a user