forked from len0rd/rockbox
fix red and yellow - i hope and double content in some files.. dont ask how this could happen
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14473 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
dff023f4c9
commit
f286bdec63
4 changed files with 2 additions and 738 deletions
|
|
@ -219,8 +219,6 @@ void usb_arcotg_dcd_stop(void) {
|
||||||
|
|
||||||
void usb_arcotg_dcd_irq(void) {
|
void usb_arcotg_dcd_irq(void) {
|
||||||
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (dcd_controller.stopped == true) {
|
if (dcd_controller.stopped == true) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -353,358 +353,3 @@ static inline void list_splice_init(struct list_head *list,
|
||||||
pos = list_entry(pos->member.next, typeof(*pos), member))
|
pos = list_entry(pos->member.next, typeof(*pos), member))
|
||||||
|
|
||||||
#endif /*_LINKED_LIST_H_*/
|
#endif /*_LINKED_LIST_H_*/
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
||||||
* \/ \/ \/ \/ \/
|
|
||||||
* $Id: adc.h 13174 2007-04-15 23:35:56Z amiconn $
|
|
||||||
*
|
|
||||||
* Copyright (C) by Linux Kernel Developers
|
|
||||||
*
|
|
||||||
* Original source can be found in linux kernel: <kernel>/include/list.h
|
|
||||||
*
|
|
||||||
* All files in this archive are subject to the GNU General Public License.
|
|
||||||
* See the file COPYING in the source tree root for full license agreement.
|
|
||||||
*
|
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
||||||
* KIND, either express or implied.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _LINKED_LIST_H_
|
|
||||||
#define _LINKED_LIST_H_
|
|
||||||
|
|
||||||
#include <stddef.h> /* used for offsetof */
|
|
||||||
|
|
||||||
static inline void prefetch(const void *x) { (void)x; }
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Simple doubly linked list implementation.
|
|
||||||
*
|
|
||||||
* Some of the internal functions ("__xxx") are useful when
|
|
||||||
* manipulating whole lists rather than single entries, as
|
|
||||||
* sometimes we already know the next/prev entries and we can
|
|
||||||
* generate better code by using them directly rather than
|
|
||||||
* using the generic single-entry routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* TODO move this macro? */
|
|
||||||
/* more about this macro: http://www.kroah.com/log/linux/container_of.html */
|
|
||||||
#define container_of(ptr, type, member) ({ \
|
|
||||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
|
||||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are non-NULL pointers that will result in page faults
|
|
||||||
* under normal circumstances, used to verify that nobody uses
|
|
||||||
* non-initialized list entries.
|
|
||||||
*/
|
|
||||||
#define LIST_POISON1 ((void *) 0x00100100)
|
|
||||||
#define LIST_POISON2 ((void *) 0x00200200)
|
|
||||||
|
|
||||||
struct list_head {
|
|
||||||
struct list_head *next, *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define LIST_HEAD_INIT(name) { &(name), &(name) }
|
|
||||||
|
|
||||||
#define LIST_HEAD(name) \
|
|
||||||
struct list_head name = LIST_HEAD_INIT(name)
|
|
||||||
|
|
||||||
static inline void INIT_LIST_HEAD(struct list_head *list)
|
|
||||||
{
|
|
||||||
list->next = list;
|
|
||||||
list->prev = list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Insert a new entry between two known consecutive entries.
|
|
||||||
*
|
|
||||||
* This is only for internal list manipulation where we know
|
|
||||||
* the prev/next entries already!
|
|
||||||
*/
|
|
||||||
static inline void __list_add(struct list_head *new,
|
|
||||||
struct list_head *prev,
|
|
||||||
struct list_head *next)
|
|
||||||
{
|
|
||||||
next->prev = new;
|
|
||||||
new->next = next;
|
|
||||||
new->prev = prev;
|
|
||||||
prev->next = new;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_add - add a new entry
|
|
||||||
* @new: new entry to be added
|
|
||||||
* @head: list head to add it after
|
|
||||||
*
|
|
||||||
* Insert a new entry after the specified head.
|
|
||||||
* This is good for implementing stacks.
|
|
||||||
*/
|
|
||||||
static inline void list_add(struct list_head *new, struct list_head *head)
|
|
||||||
{
|
|
||||||
__list_add(new, head, head->next);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_add_tail - add a new entry
|
|
||||||
* @new: new entry to be added
|
|
||||||
* @head: list head to add it before
|
|
||||||
*
|
|
||||||
* Insert a new entry before the specified head.
|
|
||||||
* This is useful for implementing queues.
|
|
||||||
*/
|
|
||||||
static inline void list_add_tail(struct list_head *new, struct list_head *head)
|
|
||||||
{
|
|
||||||
__list_add(new, head->prev, head);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Delete a list entry by making the prev/next entries
|
|
||||||
* point to each other.
|
|
||||||
*
|
|
||||||
* This is only for internal list manipulation where we know
|
|
||||||
* the prev/next entries already!
|
|
||||||
*/
|
|
||||||
static inline void __list_del(struct list_head * prev, struct list_head * next)
|
|
||||||
{
|
|
||||||
next->prev = prev;
|
|
||||||
prev->next = next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_del - deletes entry from list.
|
|
||||||
* @entry: the element to delete from the list.
|
|
||||||
* Note: list_empty() on entry does not return true after this, the entry is
|
|
||||||
* in an undefined state.
|
|
||||||
*/
|
|
||||||
static inline void list_del(struct list_head *entry)
|
|
||||||
{
|
|
||||||
__list_del(entry->prev, entry->next);
|
|
||||||
entry->next = LIST_POISON1;
|
|
||||||
entry->prev = LIST_POISON2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_replace - replace old entry by new one
|
|
||||||
* @old : the element to be replaced
|
|
||||||
* @new : the new element to insert
|
|
||||||
*
|
|
||||||
* If @old was empty, it will be overwritten.
|
|
||||||
*/
|
|
||||||
static inline void list_replace(struct list_head *old,
|
|
||||||
struct list_head *new)
|
|
||||||
{
|
|
||||||
new->next = old->next;
|
|
||||||
new->next->prev = new;
|
|
||||||
new->prev = old->prev;
|
|
||||||
new->prev->next = new;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void list_replace_init(struct list_head *old,
|
|
||||||
struct list_head *new)
|
|
||||||
{
|
|
||||||
list_replace(old, new);
|
|
||||||
INIT_LIST_HEAD(old);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_del_init - deletes entry from list and reinitialize it.
|
|
||||||
* @entry: the element to delete from the list.
|
|
||||||
*/
|
|
||||||
static inline void list_del_init(struct list_head *entry)
|
|
||||||
{
|
|
||||||
__list_del(entry->prev, entry->next);
|
|
||||||
INIT_LIST_HEAD(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_move - delete from one list and add as another's head
|
|
||||||
* @list: the entry to move
|
|
||||||
* @head: the head that will precede our entry
|
|
||||||
*/
|
|
||||||
static inline void list_move(struct list_head *list, struct list_head *head)
|
|
||||||
{
|
|
||||||
__list_del(list->prev, list->next);
|
|
||||||
list_add(list, head);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_move_tail - delete from one list and add as another's tail
|
|
||||||
* @list: the entry to move
|
|
||||||
* @head: the head that will follow our entry
|
|
||||||
*/
|
|
||||||
static inline void list_move_tail(struct list_head *list,
|
|
||||||
struct list_head *head)
|
|
||||||
{
|
|
||||||
__list_del(list->prev, list->next);
|
|
||||||
list_add_tail(list, head);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_is_last - tests whether @list is the last entry in list @head
|
|
||||||
* @list: the entry to test
|
|
||||||
* @head: the head of the list
|
|
||||||
*/
|
|
||||||
static inline int list_is_last(const struct list_head *list,
|
|
||||||
const struct list_head *head)
|
|
||||||
{
|
|
||||||
return list->next == head;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_empty - tests whether a list is empty
|
|
||||||
* @head: the list to test.
|
|
||||||
*/
|
|
||||||
static inline int list_empty(const struct list_head *head)
|
|
||||||
{
|
|
||||||
return head->next == head;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __list_splice(struct list_head *list,
|
|
||||||
struct list_head *head)
|
|
||||||
{
|
|
||||||
struct list_head *first = list->next;
|
|
||||||
struct list_head *last = list->prev;
|
|
||||||
struct list_head *at = head->next;
|
|
||||||
|
|
||||||
first->prev = head;
|
|
||||||
head->next = first;
|
|
||||||
|
|
||||||
last->next = at;
|
|
||||||
at->prev = last;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_splice - join two lists
|
|
||||||
* @list: the new list to add.
|
|
||||||
* @head: the place to add it in the first list.
|
|
||||||
*/
|
|
||||||
static inline void list_splice(struct list_head *list, struct list_head *head)
|
|
||||||
{
|
|
||||||
if (!list_empty(list)) {
|
|
||||||
__list_splice(list, head);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_splice_init - join two lists and reinitialise the emptied list.
|
|
||||||
* @list: the new list to add.
|
|
||||||
* @head: the place to add it in the first list.
|
|
||||||
*
|
|
||||||
* The list at @list is reinitialised
|
|
||||||
*/
|
|
||||||
static inline void list_splice_init(struct list_head *list,
|
|
||||||
struct list_head *head)
|
|
||||||
{
|
|
||||||
if (!list_empty(list)) {
|
|
||||||
__list_splice(list, head);
|
|
||||||
INIT_LIST_HEAD(list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_entry - get the struct for this entry
|
|
||||||
* @ptr: the &struct list_head pointer.
|
|
||||||
* @type: the type of the struct this is embedded in.
|
|
||||||
* @member: the name of the list_struct within the struct.
|
|
||||||
*/
|
|
||||||
#define list_entry(ptr, type, member) \
|
|
||||||
container_of(ptr, type, member)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_for_each - iterate over a list
|
|
||||||
* @pos: the &struct list_head to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
*/
|
|
||||||
#define list_for_each(pos, head) \
|
|
||||||
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
|
|
||||||
pos = pos->next)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* __list_for_each - iterate over a list
|
|
||||||
* @pos: the &struct list_head to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
*
|
|
||||||
* This variant differs from list_for_each() in that it's the
|
|
||||||
* simplest possible list iteration code, no prefetching is done.
|
|
||||||
* Use this for code that knows the list to be very short (empty
|
|
||||||
* or 1 entry) most of the time.
|
|
||||||
*/
|
|
||||||
#define __list_for_each(pos, head) \
|
|
||||||
for (pos = (head)->next; pos != (head); pos = pos->next)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_for_each_prev - iterate over a list backwards
|
|
||||||
* @pos: the &struct list_head to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
*/
|
|
||||||
#define list_for_each_prev(pos, head) \
|
|
||||||
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
|
|
||||||
pos = pos->prev)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_for_each_entry - iterate over list of given type
|
|
||||||
* @pos: the type * to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
* @member: the name of the list_struct within the struct.
|
|
||||||
*/
|
|
||||||
#define list_for_each_entry(pos, head, member) \
|
|
||||||
for (pos = list_entry((head)->next, typeof(*pos), member); \
|
|
||||||
prefetch(pos->member.next), &pos->member != (head); \
|
|
||||||
pos = list_entry(pos->member.next, typeof(*pos), member))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_for_each_entry_reverse - iterate backwards over list of given type.
|
|
||||||
* @pos: the type * to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
* @member: the name of the list_struct within the struct.
|
|
||||||
*/
|
|
||||||
#define list_for_each_entry_reverse(pos, head, member) \
|
|
||||||
for (pos = list_entry((head)->prev, typeof(*pos), member); \
|
|
||||||
prefetch(pos->member.prev), &pos->member != (head); \
|
|
||||||
pos = list_entry(pos->member.prev, typeof(*pos), member))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
|
|
||||||
* @pos: the type * to use as a start point
|
|
||||||
* @head: the head of the list
|
|
||||||
* @member: the name of the list_struct within the struct.
|
|
||||||
*
|
|
||||||
* Prepares a pos entry for use as a start point in list_for_each_entry_continue().
|
|
||||||
*/
|
|
||||||
#define list_prepare_entry(pos, head, member) \
|
|
||||||
((pos) ? : list_entry(head, typeof(*pos), member))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_for_each_entry_continue - continue iteration over list of given type
|
|
||||||
* @pos: the type * to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
* @member: the name of the list_struct within the struct.
|
|
||||||
*
|
|
||||||
* Continue to iterate over list of given type, continuing after
|
|
||||||
* the current position.
|
|
||||||
*/
|
|
||||||
#define list_for_each_entry_continue(pos, head, member) \
|
|
||||||
for (pos = list_entry(pos->member.next, typeof(*pos), member); \
|
|
||||||
prefetch(pos->member.next), &pos->member != (head); \
|
|
||||||
pos = list_entry(pos->member.next, typeof(*pos), member))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* list_for_each_entry_from - iterate over list of given type from the current point
|
|
||||||
* @pos: the type * to use as a loop cursor.
|
|
||||||
* @head: the head for your list.
|
|
||||||
* @member: the name of the list_struct within the struct.
|
|
||||||
*
|
|
||||||
* Iterate over list of given type, continuing from current position.
|
|
||||||
*/
|
|
||||||
#define list_for_each_entry_from(pos, head, member) \
|
|
||||||
for (; prefetch(pos->member.next), &pos->member != (head); \
|
|
||||||
pos = list_entry(pos->member.next, typeof(*pos), member))
|
|
||||||
|
|
||||||
#endif /*_LINKED_LIST_H_*/
|
|
||||||
|
|
|
||||||
|
|
@ -379,384 +379,3 @@ struct usb_gadget_strings {
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*_CH9_H_*/
|
#endif /*_CH9_H_*/
|
||||||
/***************************************************************************
|
|
||||||
* __________ __ ___.
|
|
||||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
||||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
||||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
||||||
* \/ \/ \/ \/ \/
|
|
||||||
* $Id: $
|
|
||||||
*
|
|
||||||
* Copyright (C) by Linux Kernel Developers
|
|
||||||
*
|
|
||||||
* Based on code from the Linux Kernel
|
|
||||||
* available at http://www.kernel.org
|
|
||||||
* Original file: <kernel>/include/linux/usb/ch9.h
|
|
||||||
*
|
|
||||||
* All files in this archive are subject to the GNU General Public License.
|
|
||||||
* See the file COPYING in the source tree root for full license agreement.
|
|
||||||
*
|
|
||||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
||||||
* KIND, either express or implied.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef _CH9_H_
|
|
||||||
#define _CH9_H_
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* USB directions
|
|
||||||
*
|
|
||||||
* This bit flag is used in endpoint descriptors' bEndpointAddress field.
|
|
||||||
* It's also one of three fields in control requests bRequestType.
|
|
||||||
*/
|
|
||||||
#define USB_DIR_OUT 0 /* to device */
|
|
||||||
#define USB_DIR_IN 0x80 /* to host */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* USB types, the second of three bRequestType fields
|
|
||||||
*/
|
|
||||||
#define USB_TYPE_MASK (0x03 << 5)
|
|
||||||
#define USB_TYPE_STANDARD (0x00 << 5)
|
|
||||||
#define USB_TYPE_CLASS (0x01 << 5)
|
|
||||||
#define USB_TYPE_VENDOR (0x02 << 5)
|
|
||||||
#define USB_TYPE_RESERVED (0x03 << 5)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* USB recipients, the third of three bRequestType fields
|
|
||||||
*/
|
|
||||||
#define USB_RECIP_MASK 0x1f
|
|
||||||
#define USB_RECIP_DEVICE 0x00
|
|
||||||
#define USB_RECIP_INTERFACE 0x01
|
|
||||||
#define USB_RECIP_ENDPOINT 0x02
|
|
||||||
#define USB_RECIP_OTHER 0x03
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct usb_ctrlrequest - SETUP data for a USB device control request
|
|
||||||
* @bRequestType: matches the USB bmRequestType field
|
|
||||||
* @bRequest: matches the USB bRequest field
|
|
||||||
* @wValue: matches the USB wValue field (le16 byte order)
|
|
||||||
* @wIndex: matches the USB wIndex field (le16 byte order)
|
|
||||||
* @wLength: matches the USB wLength field (le16 byte order)
|
|
||||||
*/
|
|
||||||
struct usb_ctrlrequest {
|
|
||||||
uint8_t bRequestType;
|
|
||||||
uint8_t bRequest;
|
|
||||||
uint16_t wValue;
|
|
||||||
uint16_t wIndex;
|
|
||||||
uint16_t wLength;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Standard requests, for the bRequest field of a SETUP packet.
|
|
||||||
*
|
|
||||||
* These are qualified by the bRequestType field, so that for example
|
|
||||||
* TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
|
|
||||||
* by a GET_STATUS request.
|
|
||||||
*/
|
|
||||||
#define USB_REQ_GET_STATUS 0x00
|
|
||||||
#define USB_REQ_CLEAR_FEATURE 0x01
|
|
||||||
#define USB_REQ_SET_FEATURE 0x03
|
|
||||||
#define USB_REQ_SET_ADDRESS 0x05
|
|
||||||
#define USB_REQ_GET_DESCRIPTOR 0x06
|
|
||||||
#define USB_REQ_SET_DESCRIPTOR 0x07
|
|
||||||
#define USB_REQ_GET_CONFIGURATION 0x08
|
|
||||||
#define USB_REQ_SET_CONFIGURATION 0x09
|
|
||||||
#define USB_REQ_GET_INTERFACE 0x0A
|
|
||||||
#define USB_REQ_SET_INTERFACE 0x0B
|
|
||||||
#define USB_REQ_SYNCH_FRAME 0x0C
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or
|
|
||||||
* (rarely) accepted by SET_DESCRIPTOR.
|
|
||||||
*
|
|
||||||
* Note that all multi-byte values here are encoded in little endian
|
|
||||||
* byte order "on the wire". But when exposed through Linux-USB APIs,
|
|
||||||
* they've been converted to cpu byte order.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Descriptor types ... USB 2.0 spec table 9.5
|
|
||||||
*/
|
|
||||||
#define USB_DT_DEVICE 0x01
|
|
||||||
#define USB_DT_CONFIG 0x02
|
|
||||||
#define USB_DT_STRING 0x03
|
|
||||||
#define USB_DT_INTERFACE 0x04
|
|
||||||
#define USB_DT_ENDPOINT 0x05
|
|
||||||
#define USB_DT_DEVICE_QUALIFIER 0x06
|
|
||||||
#define USB_DT_OTHER_SPEED_CONFIG 0x07
|
|
||||||
#define USB_DT_INTERFACE_POWER 0x08
|
|
||||||
/* these are from a minor usb 2.0 revision (ECN) */
|
|
||||||
#define USB_DT_OTG 0x09
|
|
||||||
#define USB_DT_DEBUG 0x0a
|
|
||||||
#define USB_DT_INTERFACE_ASSOCIATION 0x0b
|
|
||||||
/* these are from the Wireless USB spec */
|
|
||||||
#define USB_DT_SECURITY 0x0c
|
|
||||||
#define USB_DT_KEY 0x0d
|
|
||||||
#define USB_DT_ENCRYPTION_TYPE 0x0e
|
|
||||||
#define USB_DT_BOS 0x0f
|
|
||||||
#define USB_DT_DEVICE_CAPABILITY 0x10
|
|
||||||
#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
|
|
||||||
#define USB_DT_WIRE_ADAPTER 0x21
|
|
||||||
#define USB_DT_RPIPE 0x22
|
|
||||||
|
|
||||||
/* Conventional codes for class-specific descriptors. The convention is
|
|
||||||
* defined in the USB "Common Class" Spec (3.11). Individual class specs
|
|
||||||
* are authoritative for their usage, not the "common class" writeup.
|
|
||||||
*/
|
|
||||||
#define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE)
|
|
||||||
#define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG)
|
|
||||||
#define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING)
|
|
||||||
#define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE)
|
|
||||||
#define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT)
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_DEVICE: Device descriptor */
|
|
||||||
struct usb_device_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
uint16_t bcdUSB;
|
|
||||||
uint8_t bDeviceClass;
|
|
||||||
uint8_t bDeviceSubClass;
|
|
||||||
uint8_t bDeviceProtocol;
|
|
||||||
uint8_t bMaxPacketSize0;
|
|
||||||
uint16_t idVendor;
|
|
||||||
uint16_t idProduct;
|
|
||||||
uint16_t bcdDevice;
|
|
||||||
uint8_t iManufacturer;
|
|
||||||
uint8_t iProduct;
|
|
||||||
uint8_t iSerialNumber;
|
|
||||||
uint8_t bNumConfigurations;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
#define USB_DT_DEVICE_SIZE 18
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Device and/or Interface Class codes
|
|
||||||
* as found in bDeviceClass or bInterfaceClass
|
|
||||||
* and defined by www.usb.org documents
|
|
||||||
*/
|
|
||||||
#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
|
|
||||||
#define USB_CLASS_AUDIO 1
|
|
||||||
#define USB_CLASS_COMM 2
|
|
||||||
#define USB_CLASS_HID 3
|
|
||||||
#define USB_CLASS_PHYSICAL 5
|
|
||||||
#define USB_CLASS_STILL_IMAGE 6
|
|
||||||
#define USB_CLASS_PRINTER 7
|
|
||||||
#define USB_CLASS_MASS_STORAGE 8
|
|
||||||
#define USB_CLASS_HUB 9
|
|
||||||
#define USB_CLASS_CDC_DATA 0x0a
|
|
||||||
#define USB_CLASS_CSCID 0x0b /* chip+ smart card */
|
|
||||||
#define USB_CLASS_CONTENT_SEC 0x0d /* content security */
|
|
||||||
#define USB_CLASS_VIDEO 0x0e
|
|
||||||
#define USB_CLASS_WIRELESS_CONTROLLER 0xe0
|
|
||||||
#define USB_CLASS_MISC 0xef
|
|
||||||
#define USB_CLASS_APP_SPEC 0xfe
|
|
||||||
#define USB_CLASS_VENDOR_SPEC 0xff
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_CONFIG: Configuration descriptor information.
|
|
||||||
*
|
|
||||||
* USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
|
|
||||||
* descriptor type is different. Highspeed-capable devices can look
|
|
||||||
* different depending on what speed they're currently running. Only
|
|
||||||
* devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
|
|
||||||
* descriptors.
|
|
||||||
*/
|
|
||||||
struct usb_config_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
uint16_t wTotalLength;
|
|
||||||
uint8_t bNumInterfaces;
|
|
||||||
uint8_t bConfigurationValue;
|
|
||||||
uint8_t iConfiguration;
|
|
||||||
uint8_t bmAttributes;
|
|
||||||
uint8_t bMaxPower;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
#define USB_DT_CONFIG_SIZE 9
|
|
||||||
|
|
||||||
/* from config descriptor bmAttributes */
|
|
||||||
#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */
|
|
||||||
#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */
|
|
||||||
#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */
|
|
||||||
#define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_STRING: String descriptor */
|
|
||||||
struct usb_string_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
|
|
||||||
uint16_t wData[1]; /* UTF-16LE encoded */
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
/* note that "string" zero is special, it holds language codes that
|
|
||||||
* the device supports, not Unicode characters.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_INTERFACE: Interface descriptor */
|
|
||||||
struct usb_interface_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
|
|
||||||
uint8_t bInterfaceNumber;
|
|
||||||
uint8_t bAlternateSetting;
|
|
||||||
uint8_t bNumEndpoints;
|
|
||||||
uint8_t bInterfaceClass;
|
|
||||||
uint8_t bInterfaceSubClass;
|
|
||||||
uint8_t bInterfaceProtocol;
|
|
||||||
uint8_t iInterface;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
#define USB_DT_INTERFACE_SIZE 9
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_ENDPOINT: Endpoint descriptor */
|
|
||||||
struct usb_endpoint_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
|
|
||||||
uint8_t bEndpointAddress;
|
|
||||||
uint8_t bmAttributes;
|
|
||||||
uint16_t wMaxPacketSize;
|
|
||||||
uint8_t bInterval;
|
|
||||||
|
|
||||||
/* NOTE: these two are _only_ in audio endpoints. */
|
|
||||||
/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
|
|
||||||
//uint8_t bRefresh;
|
|
||||||
//uint8_t bSynchAddress;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
#define USB_DT_ENDPOINT_SIZE 7
|
|
||||||
#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */
|
|
||||||
struct usb_qualifier_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
|
|
||||||
uint16_t bcdUSB;
|
|
||||||
uint8_t bDeviceClass;
|
|
||||||
uint8_t bDeviceSubClass;
|
|
||||||
uint8_t bDeviceProtocol;
|
|
||||||
uint8_t bMaxPacketSize0;
|
|
||||||
uint8_t bNumConfigurations;
|
|
||||||
uint8_t bRESERVED;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_OTG (from OTG 1.0a supplement) */
|
|
||||||
struct usb_otg_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
|
|
||||||
uint8_t bmAttributes; /* support for HNP, SRP, etc */
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
/* from usb_otg_descriptor.bmAttributes */
|
|
||||||
#define USB_OTG_SRP (1 << 0)
|
|
||||||
#define USB_OTG_HNP (1 << 1) /* swap host/device roles */
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USB_DT_DEBUG: for special highspeed devices, replacing serial console */
|
|
||||||
struct usb_debug_descriptor {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
|
|
||||||
/* bulk endpoints with 8 byte maxpacket */
|
|
||||||
uint8_t bDebugInEndpoint;
|
|
||||||
uint8_t bDebugOutEndpoint;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Endpoints
|
|
||||||
*/
|
|
||||||
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
|
|
||||||
#define USB_ENDPOINT_XFER_CONTROL 0
|
|
||||||
#define USB_ENDPOINT_XFER_ISOC 1
|
|
||||||
#define USB_ENDPOINT_XFER_BULK 2
|
|
||||||
#define USB_ENDPOINT_XFER_INT 3
|
|
||||||
|
|
||||||
enum usb_device_speed {
|
|
||||||
USB_SPEED_UNKNOWN = 0, /* enumerating */
|
|
||||||
USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */
|
|
||||||
USB_SPEED_HIGH, /* usb 2.0 */
|
|
||||||
USB_SPEED_VARIABLE, /* wireless (usb 2.5) */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usb_device_state {
|
|
||||||
/* NOTATTACHED isn't in the USB spec, and this state acts
|
|
||||||
* the same as ATTACHED ... but it's clearer this way.
|
|
||||||
*/
|
|
||||||
USB_STATE_NOTATTACHED = 0,
|
|
||||||
|
|
||||||
/* chapter 9 and authentication (wireless) device states */
|
|
||||||
USB_STATE_ATTACHED,
|
|
||||||
USB_STATE_POWERED, /* wired */
|
|
||||||
USB_STATE_UNAUTHENTICATED, /* auth */
|
|
||||||
USB_STATE_RECONNECTING, /* auth */
|
|
||||||
USB_STATE_DEFAULT, /* limited function */
|
|
||||||
USB_STATE_ADDRESS,
|
|
||||||
USB_STATE_CONFIGURED, /* most functions */
|
|
||||||
|
|
||||||
USB_STATE_SUSPENDED
|
|
||||||
|
|
||||||
/* NOTE: there are actually four different SUSPENDED
|
|
||||||
* states, returning to POWERED, DEFAULT, ADDRESS, or
|
|
||||||
* CONFIGURED respectively when SOF tokens flow again.
|
|
||||||
*/
|
|
||||||
};
|
|
||||||
|
|
||||||
/* All standard descriptors have these 2 fields at the beginning */
|
|
||||||
struct usb_descriptor_header {
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct usb_string - wraps a C string and its USB id
|
|
||||||
* @id:the (nonzero) ID for this string
|
|
||||||
* @s:the string, in UTF-8 encoding
|
|
||||||
*
|
|
||||||
* If you're using usb_gadget_get_string(), use this to wrap a string
|
|
||||||
* together with its ID.
|
|
||||||
*/
|
|
||||||
struct usb_string {
|
|
||||||
uint8_t id;
|
|
||||||
const char* s;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* struct usb_gadget_strings - a set of USB strings in a given language
|
|
||||||
* @language:identifies the strings' language (0x0409 for en-us)
|
|
||||||
* @strings:array of strings with their ids
|
|
||||||
*
|
|
||||||
* If you're using usb_gadget_get_string(), use this to wrap all the
|
|
||||||
* strings for a given language.
|
|
||||||
*/
|
|
||||||
struct usb_gadget_strings {
|
|
||||||
uint16_t language; /* 0x0409 for en-us */
|
|
||||||
struct usb_string* strings;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /*_CH9_H_*/
|
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,8 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
#include "button.h"
|
||||||
|
#include "ata.h"
|
||||||
#include "arcotg_udc.h"
|
#include "arcotg_udc.h"
|
||||||
|
|
||||||
#ifdef HAVE_USBSTACK
|
#ifdef HAVE_USBSTACK
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue