1215976Sjmallett#ifndef __CVMX_USBD_H__ 2215976Sjmallett#define __CVMX_USBD_H__ 3215976Sjmallett/***********************license start*************** 4232812Sjmallett * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 5215976Sjmallett * reserved. 6215976Sjmallett * 7215976Sjmallett * 8215976Sjmallett * Redistribution and use in source and binary forms, with or without 9215976Sjmallett * modification, are permitted provided that the following conditions are 10215976Sjmallett * met: 11215976Sjmallett * 12215976Sjmallett * * Redistributions of source code must retain the above copyright 13215976Sjmallett * notice, this list of conditions and the following disclaimer. 14215976Sjmallett * 15215976Sjmallett * * Redistributions in binary form must reproduce the above 16215976Sjmallett * copyright notice, this list of conditions and the following 17215976Sjmallett * disclaimer in the documentation and/or other materials provided 18215976Sjmallett * with the distribution. 19215976Sjmallett 20232812Sjmallett * * Neither the name of Cavium Inc. nor the names of 21215976Sjmallett * its contributors may be used to endorse or promote products 22215976Sjmallett * derived from this software without specific prior written 23215976Sjmallett * permission. 24215976Sjmallett 25215976Sjmallett * This Software, including technical data, may be subject to U.S. export control 26215976Sjmallett * laws, including the U.S. Export Administration Act and its associated 27215976Sjmallett * regulations, and may be subject to export or import regulations in other 28215976Sjmallett * countries. 29215976Sjmallett 30215976Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 31232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 32215976Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 33215976Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 34215976Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 35215976Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 36215976Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 37215976Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 38215976Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 39215976Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 40215976Sjmallett ***********************license end**************************************/ 41215976Sjmallett 42215976Sjmallett 43215976Sjmallett/** 44215976Sjmallett * @file 45215976Sjmallett * 46215976Sjmallett * "cvmx-usbd.h" defines a set of low level USB functions to help developers 47215976Sjmallett * create Octeon USB devices for various operating systems. These functions 48215976Sjmallett * provide a generic API to the Octeon USB blocks, hiding the internal hardware 49215976Sjmallett * specific operations. 50215976Sjmallett * 51215976Sjmallett * <hr>$Revision: 32636 $<hr> 52215976Sjmallett */ 53215976Sjmallett 54215976Sjmallett#ifdef __cplusplus 55215976Sjmallettextern "C" { 56215976Sjmallett#endif 57215976Sjmallett 58215976Sjmalletttypedef enum 59215976Sjmallett{ 60215976Sjmallett CVMX_USBD_TRANSFER_CONTROL = 0, 61215976Sjmallett CVMX_USBD_TRANSFER_ISOCHRONOUS = 1, 62215976Sjmallett CVMX_USBD_TRANSFER_BULK = 2, 63215976Sjmallett CVMX_USBD_TRANSFER_INTERRUPT = 3, 64215976Sjmallett} cvmx_usbd_transfer_t; 65215976Sjmallett 66215976Sjmalletttypedef enum 67215976Sjmallett{ 68215976Sjmallett CVMX_USBD_SPEED_HIGH = 0, 69215976Sjmallett CVMX_USBD_SPEED_FULL = 1, 70215976Sjmallett CVMX_USBD_SPEED_LOW = 2, 71215976Sjmallett} cvmx_usbd_speed_t; 72215976Sjmallett 73215976Sjmalletttypedef enum 74215976Sjmallett{ 75215976Sjmallett CVMX_USBD_CALLBACK_SUSPEND, 76215976Sjmallett CVMX_USBD_CALLBACK_RESET, 77215976Sjmallett CVMX_USBD_CALLBACK_ENUM_COMPLETE, 78215976Sjmallett CVMX_USBD_CALLBACK_DEVICE_SETUP, 79215976Sjmallett CVMX_USBD_CALLBACK_IN_COMPLETE, 80215976Sjmallett CVMX_USBD_CALLBACK_OUT_COMPLETE, 81215976Sjmallett __CVMX_USBD_CALLBACK_END 82215976Sjmallett} cvmx_usbd_callback_t; 83215976Sjmallett 84215976Sjmalletttypedef enum 85215976Sjmallett{ 86215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_XO_XI = 1<<0, /**< The USB port uses a 12MHz crystal as clock source 87215976Sjmallett at USB_XO and USB_XI. */ 88215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_XO_GND = 1<<1, /**< The USB port uses 12/24/48MHz 2.5V board clock 89215976Sjmallett source at USB_XO. USB_XI should be tied to GND.*/ 90215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_AUTO = 0, /**< Automatically determine clock type based on function 91215976Sjmallett in cvmx-helper-board.c. */ 92215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_MHZ_MASK = 3<<3, /**< Mask for clock speed field */ 93215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_12MHZ = 1<<3, /**< Speed of reference clock or crystal */ 94215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_24MHZ = 2<<3, /**< Speed of reference clock */ 95215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_CLOCK_48MHZ = 3<<3, /**< Speed of reference clock */ 96215976Sjmallett /* Bits 3-4 used to encode the clock frequency */ 97215976Sjmallett CVMX_USBD_INITIALIZE_FLAGS_DEBUG = 1<<16 98215976Sjmallett} cvmx_usbd_initialize_flags_t; 99215976Sjmallett 100215976Sjmalletttypedef void (*cvmx_usbd_callback_func_t)(cvmx_usbd_callback_t reason, int endpoint_num, int bytes_transferred, void *user_data); 101215976Sjmallett 102215976Sjmalletttypedef struct 103215976Sjmallett{ 104215976Sjmallett int init_flags; 105215976Sjmallett int index; 106215976Sjmallett cvmx_usbd_callback_func_t callback[__CVMX_USBD_CALLBACK_END]; 107215976Sjmallett void *callback_data[__CVMX_USBD_CALLBACK_END]; 108215976Sjmallett struct { 109215976Sjmallett int buffer_length; 110215976Sjmallett } endpoint[16]; 111215976Sjmallett} cvmx_usbd_state_t; 112215976Sjmallett 113215976Sjmallett/** 114215976Sjmallett * Initialize a USB port for use. This must be called before any 115215976Sjmallett * other access to the Octeon USB port is made. The port starts 116215976Sjmallett * off in the disabled state. 117215976Sjmallett * 118215976Sjmallett * @param usb Pointer to an empty cvmx_usbd_state_t structure 119215976Sjmallett * that will be populated by the initialize call. 120215976Sjmallett * This structure is then passed to all other USB 121215976Sjmallett * functions. 122215976Sjmallett * @param usb_port_number 123215976Sjmallett * Which Octeon USB port to initialize. 124215976Sjmallett * @param flags Flags to control hardware initialization. See 125215976Sjmallett * cvmx_usbd_initialize_flags_t for the flag 126215976Sjmallett * definitions. Some flags are mandatory. 127215976Sjmallett * 128215976Sjmallett * @return Zero or a negative on error. 129215976Sjmallett */ 130215976Sjmallettint cvmx_usbd_initialize(cvmx_usbd_state_t *usb, int usb_port_number, 131215976Sjmallett cvmx_usbd_initialize_flags_t flags); 132215976Sjmallett 133215976Sjmallett/** 134215976Sjmallett * Shutdown a USB port after a call to cvmx_usbd_initialize(). 135215976Sjmallett * 136215976Sjmallett * @param usb USB device state populated by 137215976Sjmallett * cvmx_usbd_initialize(). 138215976Sjmallett * 139215976Sjmallett * @return Zero or a negative on error. 140215976Sjmallett */ 141215976Sjmallettint cvmx_usbd_shutdown(cvmx_usbd_state_t *usb); 142215976Sjmallett 143215976Sjmallett/** 144215976Sjmallett * Enable a USB port. After this call succeeds, the USB port is 145215976Sjmallett * online and servicing requests. 146215976Sjmallett * 147215976Sjmallett * @param usb USB device state populated by 148215976Sjmallett * cvmx_usb_initialize(). 149215976Sjmallett * 150215976Sjmallett * @return Zero or negative on error. 151215976Sjmallett */ 152215976Sjmallettint cvmx_usbd_enable(cvmx_usbd_state_t *usb); 153215976Sjmallett 154215976Sjmallett/** 155215976Sjmallett * Disable a USB port. After this call the USB port will not 156215976Sjmallett * generate data transfers and will not generate events. 157215976Sjmallett * 158215976Sjmallett * @param usb USB device state populated by 159215976Sjmallett * cvmx_usb_initialize(). 160215976Sjmallett * 161215976Sjmallett * @return Zero or negative on error. 162215976Sjmallett */ 163215976Sjmallettint cvmx_usbd_disable(cvmx_usbd_state_t *usb); 164215976Sjmallett 165215976Sjmallett/** 166215976Sjmallett * Register a callback function to process USB events 167215976Sjmallett * 168215976Sjmallett * @param usb USB device state populated by 169215976Sjmallett * cvmx_usbd_initialize(). 170215976Sjmallett * @param reason The reason this callback should be called 171215976Sjmallett * @param func Function to call 172215976Sjmallett * @param user_data User supplied data for the callback 173215976Sjmallett * 174215976Sjmallett * @return Zero on succes, negative on failure 175215976Sjmallett */ 176215976Sjmallettint cvmx_usbd_register(cvmx_usbd_state_t *usb, cvmx_usbd_callback_t reason, cvmx_usbd_callback_func_t func, void *user_data); 177215976Sjmallett 178215976Sjmallett/** 179215976Sjmallett * Poll the USB block for status and call all needed callback 180215976Sjmallett * handlers. This function is meant to be called in the interrupt 181215976Sjmallett * handler for the USB controller. It can also be called 182215976Sjmallett * periodically in a loop for non-interrupt based operation. 183215976Sjmallett * 184215976Sjmallett * @param usb USB device state populated by 185215976Sjmallett * cvmx_usbd_initialize(). 186215976Sjmallett * 187215976Sjmallett * @return Zero or negative on error. 188215976Sjmallett */ 189215976Sjmallettint cvmx_usbd_poll(cvmx_usbd_state_t *usb); 190215976Sjmallett 191215976Sjmallett/** 192215976Sjmallett * Get the current USB address 193215976Sjmallett * 194215976Sjmallett * @param usb USB device state populated by 195215976Sjmallett * cvmx_usbd_initialize(). 196215976Sjmallett * 197215976Sjmallett * @return The USB address 198215976Sjmallett */ 199215976Sjmallettint cvmx_usbd_get_address(cvmx_usbd_state_t *usb); 200215976Sjmallett 201215976Sjmallett/** 202215976Sjmallett * Set the current USB address 203215976Sjmallett * 204215976Sjmallett * @param usb USB device state populated by 205215976Sjmallett * cvmx_usbd_initialize(). 206215976Sjmallett * @param address Address to set 207215976Sjmallett */ 208215976Sjmallettvoid cvmx_usbd_set_address(cvmx_usbd_state_t *usb, int address); 209215976Sjmallett 210215976Sjmallett/** 211215976Sjmallett * Get the current USB speed 212215976Sjmallett * 213215976Sjmallett * @param usb USB device state populated by 214215976Sjmallett * cvmx_usbd_initialize(). 215215976Sjmallett * 216215976Sjmallett * @return The USB speed 217215976Sjmallett */ 218215976Sjmallettcvmx_usbd_speed_t cvmx_usbd_get_speed(cvmx_usbd_state_t *usb); 219215976Sjmallett 220215976Sjmallett/** 221215976Sjmallett * Set the current USB speed 222215976Sjmallett * 223215976Sjmallett * @param usb USB device state populated by 224215976Sjmallett * cvmx_usbd_initialize(). 225215976Sjmallett * @param speed The requested speed 226215976Sjmallett */ 227215976Sjmallettvoid cvmx_usbd_set_speed(cvmx_usbd_state_t *usb, cvmx_usbd_speed_t speed); 228215976Sjmallett 229215976Sjmallett/** 230215976Sjmallett * Enable an endpoint to respond to an OUT transaction 231215976Sjmallett * 232215976Sjmallett * @param usb USB device state populated by 233215976Sjmallett * cvmx_usbd_initialize(). 234215976Sjmallett * @param endpoint_num 235215976Sjmallett * Endpoint number to enable 236215976Sjmallett * @param transfer_type 237215976Sjmallett * Transfer type for the endpoint 238215976Sjmallett * @param max_packet_size 239215976Sjmallett * Maximum packet size for the endpoint 240215976Sjmallett * @param buffer Buffer to receive the data 241215976Sjmallett * @param buffer_length 242215976Sjmallett * Length of the buffer in bytes 243215976Sjmallett * 244215976Sjmallett * @return Zero on success, negative on failure 245215976Sjmallett */ 246215976Sjmallettint cvmx_usbd_out_endpoint_enable(cvmx_usbd_state_t *usb, 247215976Sjmallett int endpoint_num, cvmx_usbd_transfer_t transfer_type, 248215976Sjmallett int max_packet_size, uint64_t buffer, int buffer_length); 249215976Sjmallett 250215976Sjmallett/** 251215976Sjmallett * Disable an OUT endpoint 252215976Sjmallett * 253215976Sjmallett * @param usb USB device state populated by 254215976Sjmallett * cvmx_usbd_initialize(). 255215976Sjmallett * @param endpoint_num 256215976Sjmallett * Endpoint number to disable 257215976Sjmallett * 258215976Sjmallett * @return Zero on success, negative on failure 259215976Sjmallett */ 260215976Sjmallettint cvmx_usbd_out_endpoint_disable(cvmx_usbd_state_t *usb, int endpoint_num); 261215976Sjmallett 262215976Sjmallett/** 263215976Sjmallett * Enable an endpoint to respond to an IN transaction 264215976Sjmallett * 265215976Sjmallett * @param usb USB device state populated by 266215976Sjmallett * cvmx_usbd_initialize(). 267215976Sjmallett * @param endpoint_num 268215976Sjmallett * Endpoint number to enable 269215976Sjmallett * @param transfer_type 270215976Sjmallett * Transfer type for the endpoint 271215976Sjmallett * @param max_packet_size 272215976Sjmallett * Maximum packet size for the endpoint 273215976Sjmallett * @param buffer Buffer to send 274215976Sjmallett * @param buffer_length 275215976Sjmallett * Length of the buffer in bytes 276215976Sjmallett * 277215976Sjmallett * @return Zero on success, negative on failure 278215976Sjmallett */ 279215976Sjmallettint cvmx_usbd_in_endpoint_enable(cvmx_usbd_state_t *usb, 280215976Sjmallett int endpoint_num, cvmx_usbd_transfer_t transfer_type, 281215976Sjmallett int max_packet_size, uint64_t buffer, int buffer_length); 282215976Sjmallett 283215976Sjmallett/** 284215976Sjmallett * Disable an IN endpoint 285215976Sjmallett * 286215976Sjmallett * @param usb USB device state populated by 287215976Sjmallett * cvmx_usbd_initialize(). 288215976Sjmallett * @param endpoint_num 289215976Sjmallett * Endpoint number to disable 290215976Sjmallett * 291215976Sjmallett * @return Zero on success, negative on failure 292215976Sjmallett */ 293215976Sjmallettint cvmx_usbd_in_endpoint_disable(cvmx_usbd_state_t *usb, int endpoint_num); 294215976Sjmallett 295215976Sjmallett#ifdef __cplusplus 296215976Sjmallett} 297215976Sjmallett#endif 298215976Sjmallett 299215976Sjmallett#endif /* __CVMX_USBD_H__ */ 300215976Sjmallett 301