usbhost.h revision 7a96ba436c9a2bacc64e712bdb53bd7accc5c3a9
130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* 230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Copyright (C) 2010 The Android Open Source Project 330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * 430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * you may not use this file except in compliance with the License. 630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * You may obtain a copy of the License at 730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * 830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * 1030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Unless required by applicable law or agreed to in writing, software 1130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * See the License for the specific language governing permissions and 1430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * limitations under the License. 1530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 1630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 1730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#ifndef __USB_HOST_H 1830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#define __USB_HOST_H 1930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 2030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#ifdef __cplusplus 2130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodextern "C" { 2230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#endif 2330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 2430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#include <stdint.h> 2530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 267a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwoodstruct usb_host_context; 2730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodstruct usb_endpoint_descriptor; 2830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 2930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodstruct usb_descriptor_iter { 3030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood unsigned char* config; 3130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood unsigned char* config_end; 3230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood unsigned char* curr_desc; 3330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood}; 3430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 357a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood/* Callback for notification when new USB devices are attached. 367a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood * Return true to exit from usb_host_run. 377a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood */ 387a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwoodtypedef int (* usb_device_added_cb)(const char *dev_name, void *client_data); 397a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood 407a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood/* Callback for notification when USB devices are removed. 417a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood * Return true to exit from usb_host_run. 427a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood */ 437a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwoodtypedef int (* usb_device_removed_cb)(const char *dev_name, void *client_data); 447a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood 457a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood/* Call this to initialize the USB host library. */ 467a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwoodstruct usb_host_context *usb_host_init(void); 4730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 487a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood/* Call this to cleanup the USB host library. */ 497a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwoodvoid usb_host_cleanup(struct usb_host_context *context); 5030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 517a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood/* Call this to monitor the USB bus for new and removed devices. 527a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood * This is intended to be called from a dedicated thread, 537a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood * as it will not return until one of the callbacks returns true. 5430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * added_cb will be called immediately for each existing USB device, 5530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * and subsequently each time a new device is added. 5630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * removed_cb is called when USB devices are removed from the bus. 5730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 587a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwoodvoid usb_host_run(struct usb_host_context *context, 597a96ba436c9a2bacc64e712bdb53bd7accc5c3a9Mike Lockwood usb_device_added_cb added_cb, 606ac3aa157493ef24bc837b679dd8292fad8961e0Mike Lockwood usb_device_removed_cb removed_cb, 616ac3aa157493ef24bc837b679dd8292fad8961e0Mike Lockwood void *client_data); 6230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 6330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Creates a usb_device object for a USB device */ 6430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodstruct usb_device *usb_device_open(const char *dev_name); 6530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 6630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Releases all resources associated with the USB device */ 6730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodvoid usb_device_close(struct usb_device *device); 6830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 6930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the name for the USB device, which is the same as 7030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * the dev_name passed to usb_device_open() 7130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 7230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodconst char* usb_device_get_name(struct usb_device *device); 7330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 74203f102028c4df33c191d8cd610775eba8d5366dMike Lockwood/* Returns a unique ID for the device. Currently this is generated from the 75203f102028c4df33c191d8cd610775eba8d5366dMike Lockwood * dev_name path. 76203f102028c4df33c191d8cd610775eba8d5366dMike Lockwood */ 77203f102028c4df33c191d8cd610775eba8d5366dMike Lockwoodint usb_device_get_unique_id(struct usb_device *device); 78203f102028c4df33c191d8cd610775eba8d5366dMike Lockwood 7930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the USB vendor ID from the device descriptor for the USB device */ 8030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwooduint16_t usb_device_get_vendor_id(struct usb_device *device); 8130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 8230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the USB product ID from the device descriptor for the USB device */ 8330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwooduint16_t usb_device_get_product_id(struct usb_device *device); 8430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 8530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns a USB descriptor string for the given string ID. 8630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Used to implement usb_device_get_manufacturer_name, 8730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * usb_device_get_product_name and usb_device_get_serial. 8830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Call free() to free the result when you are done with it. 8930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 9030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodchar* usb_device_get_string(struct usb_device *device, int id); 9130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 9230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the manufacturer name for the USB device. 9330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Call free() to free the result when you are done with it. 9430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 9530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodchar* usb_device_get_manufacturer_name(struct usb_device *device); 9630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 9730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the product name for the USB device. 9830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Call free() to free the result when you are done with it. 9930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 10030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodchar* usb_device_get_product_name(struct usb_device *device); 10130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 10230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the USB serial number for the USB device. 10330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * Call free() to free the result when you are done with it. 10430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 10530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodchar* usb_device_get_serial(struct usb_device *device); 10630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 10730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns true if we have write access to the USB device, 10830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * and false if we only have access to the USB device configuration. 10930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 11030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_device_is_writeable(struct usb_device *device); 11130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 11230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Initializes a usb_descriptor_iter, which can be used to iterate through all 11330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * the USB descriptors for a USB device. 11430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 11530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodvoid usb_descriptor_iter_init(struct usb_device *device, struct usb_descriptor_iter *iter); 11630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 11730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the next USB descriptor for a device, or NULL if we have reached the 11830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * end of the list. 11930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 12030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodstruct usb_descriptor_header *usb_descriptor_iter_next(struct usb_descriptor_iter *iter); 12130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 12230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Claims the specified interface of a USB device */ 12330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_device_claim_interface(struct usb_device *device, unsigned int interface); 12430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 12530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Releases the specified interface of a USB device */ 12630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_device_release_interface(struct usb_device *device, unsigned int interface); 12730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 12830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 12930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Creates a new usb_endpoint for the specified endpoint of a USB device. 13030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * This can be used to read or write data across the endpoint. 13130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 13230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodstruct usb_endpoint *usb_endpoint_open(struct usb_device *dev, 13330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood const struct usb_endpoint_descriptor *desc); 13430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 13530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Releases all resources associated with the endpoint */ 13630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodvoid usb_endpoint_close(struct usb_endpoint *ep); 13730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 13830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Begins a read or write operation on the specified endpoint */ 13930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_endpoint_queue(struct usb_endpoint *ep, void *data, int len); 14030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 14130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood /* Waits for the results of a previous usb_endpoint_queue operation on the 14230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * specified endpoint. Returns number of bytes transferred, or a negative 14330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * value for error. 14430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 14530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_endpoint_wait(struct usb_device *device, int *out_ep_num); 14630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 14730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Cancels a pending usb_endpoint_queue() operation on an endpoint. */ 14830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_endpoint_cancel(struct usb_endpoint *ep); 14930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 1505e567cb34b5e54467f501fc9703db82ca6639ff3Mike Lockwood/* Returns the usb_device for the given endpoint */ 1515e567cb34b5e54467f501fc9703db82ca6639ff3Mike Lockwoodstruct usb_device *usb_endpoint_get_device(struct usb_endpoint *ep); 1525e567cb34b5e54467f501fc9703db82ca6639ff3Mike Lockwood 15330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the endpoint address for the given endpoint */ 15430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_endpoint_number(struct usb_endpoint *ep); 15530ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 15630ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood/* Returns the maximum packet size for the given endpoint. 15730ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood * For bulk endpoints this should be 512 for highspeed or 64 for fullspeed. 15830ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood */ 15930ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwoodint usb_endpoint_max_packet(struct usb_endpoint *ep); 16030ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood 16130ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#ifdef __cplusplus 16230ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood} 16330ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#endif 16430ff2c70ce05d761e8cb0ab7ee02b39a681fe0cbMike Lockwood#endif /* __USB_HOST_H */ 165