it works now, but we don't know why... *sigh* :(
[ppcskel.git] / usb / core / core.h
1 /*
2  * Copyright (c) 2007, Benedikt Sauter <sauter@ixbat.de>
3  * All rights reserved.
4  *
5  * Short descripton of file:
6  *
7  *
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions 
10  * are met:
11  *
12  *       * Redistributions of source code must retain the above copyright 
13  *               notice, this list of conditions and the following disclaimer.
14  *       * Redistributions in binary form must reproduce the above 
15  *               copyright notice, this list of conditions and the following 
16  *               disclaimer in the documentation and/or other materials provided 
17  *               with the distribution.
18  *       * Neither the name of the FH Augsburg nor the names of its 
19  *               contributors may be used to endorse or promote products derived 
20  *               from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
25  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
26  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
27  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
28  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
30  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
31  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
32  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #ifndef _CORE_H_
36 #define _CORE_H_
37
38 #include "../../types.h"
39 #include "../lib/list.h"
40
41
42 #include "../../bootmii_ppc.h"
43 inline static void wait_ms(int ms)
44 {
45         while(ms--)
46                 udelay(1000);
47 }
48
49 /**
50  * Main datastructure of the usbstack, which have to be instanced
51  * in the main application.
52  */
53
54 typedef struct usb_device_t usb_device;
55 struct usb_device_t {
56         u8  address;
57         u8  fullspeed;
58         u8  bMaxPacketSize0;
59         u8  bDeviceClass;
60         u8  bDeviceSubClass;
61         u8  bDeviceProtocoll;
62         u32 idVendor;
63         u32 idProduct;
64         u32 bcdDevice;
65         u8  bNumConfigurations;
66
67         u8 epSize[16];
68         u8 epTogl[16];
69
70         usb_device *next;
71 };
72
73
74 typedef struct usb_endpoint_t usb_endpoint;
75 struct usb_endpoint_t {
76         u8 type;
77         u8 size;
78         u8 togl;
79         usb_endpoint *next;
80 };
81
82
83
84
85 typedef struct usb_transfer_descriptor_ep_t usb_transfer_descriptor_ep;
86 struct usb_transfer_descriptor_ep_t {
87         usb_transfer_descriptor_ep *next;
88         u8 device_address;
89         u8 endpoint;
90         struct usb_transfer_descriptor_t *start;
91 };
92
93 /**
94  * USB Driver data structure
95  */
96 typedef struct usb_driver_t usb_driver;
97 struct usb_driver_t {
98         char* name;
99         void (*probe)(void);
100         void (*check)(void);
101         void * data;
102         usb_driver *next;
103 };
104
105
106 /**
107  * I/O Request Block
108  */
109
110 typedef struct usb_irp_t usb_irp;
111 struct usb_irp_t {
112         usb_device * dev;
113         u8 endpoint;                            /* ep -> bit 7 is for direction 1=from  dev to host */
114         u8 epsize;
115         u8 type;                                /* control, interrupt, bulk or isochron */
116
117         char * buffer;
118         u16 len;
119
120         //list * td_list;
121         u16 timeout;
122 };
123
124
125 /**
126  * usb transfer descriptor
127  */
128 typedef struct usb_transfer_descriptor_t usb_transfer_descriptor;
129 struct usb_transfer_descriptor_t {
130         u8 devaddress;
131         u8 endpoint;
132         
133         // TODO: zusammenfassen!
134         u8 pid;
135         u8 iso;
136         u8 togl;        
137         
138         char * buffer;
139         u16 actlen;
140         
141         u8 state;
142         usb_transfer_descriptor *next;
143         u8 maxp;
144 };
145
146 //typedef struct usb_core_t usb_core;
147 struct usb_core_t {
148         u8 nextaddress;
149         void (*stdout)(char * arg); 
150         // driver list
151         list * drivers;
152         list * devices;
153 } core;
154
155 void usb_init();
156 void usb_periodic();
157 u8 usb_next_address();
158
159
160 usb_device * usb_add_device();
161 u8 usb_remove_device(usb_device *dev);
162 u8 usb_register_driver(usb_driver *driver);
163 void usb_probe_driver();
164
165
166
167 usb_irp * usb_get_irp();
168 u8 usb_remove_irp(usb_irp *irp);
169 u16 usb_submit_irp(usb_irp *irp);
170
171
172 usb_transfer_descriptor * usb_create_transfer_descriptor(usb_irp *irp);
173
174
175 #define USB_IRP_WAITING         1
176
177
178 #define USB_TRANSFER_DESCR_NONE 1
179 #define USB_TRANSFER_DESCR_SEND 2
180
181 #endif  //_CORE_H_