some debug stuff. let zeh ohci hack begin! \o/
[ppcskel.git] / usb / core / usb.c
1 /*
2  * Copyright (c) 2007, Benedikt Sauter <sauter@ixbat.de>
3  * All rights reserved.
4  *
5  * Short descripton of file:
6  * I take the function names and parameters mainly from
7  * libusb.sf.net.
8  *
9  *
10  * Redistribution and use in source and binary forms, with or without 
11  * modification, are permitted provided that the following conditions 
12  * are met:
13  *
14  *   * Redistributions of source code must retain the above copyright 
15  *     notice, this list of conditions and the following disclaimer.
16  *   * Redistributions in binary form must reproduce the above 
17  *     copyright notice, this list of conditions and the following 
18  *     disclaimer in the documentation and/or other materials provided 
19  *     with the distribution.
20  *   * Neither the name of the FH Augsburg nor the names of its 
21  *     contributors may be used to endorse or promote products derived 
22  *     from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
25  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
26  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
27  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
28  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
29  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
30  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
31  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
32  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
33  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
34  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  */
36
37 //wtf??!
38 //#ifndef _USB_H_
39 //#define _USB_H_
40
41 //#include <stdlib.h>
42
43 #include "usb.h"
44 #include "core.h"
45 #include "../host/host.h"
46 #include "../usbspec/usb11spec.h"
47 #include "../../malloc.h"
48
49
50 /******************* Device Operations **********************/
51
52 /**
53  * Open a device with verndor- and product-id for a communication.
54  */
55 usb_device * usb_open(u32 vendor_id, u32 product_id)
56 {
57   usb_device* dev;
58   element * iterator = core.devices->head;
59   while(iterator != NULL) {
60     dev = (usb_device*)iterator->data;
61     
62     if(dev->idVendor==vendor_id&&dev->idProduct==product_id)
63       return dev;
64
65     iterator=iterator->next;
66   }
67
68   return NULL;
69 }
70
71
72 /**
73  * Open a device with an class code for a communication.
74  */
75 usb_device * usb_open_class(u8 class)
76 {
77   usb_device* dev;
78   element * iterator = core.devices->head;
79   while(iterator != NULL) {
80     dev = (usb_device*)iterator->data;
81     
82     if(dev->bDeviceClass==class)
83       return dev;
84
85     iterator=iterator->next;
86   }
87   return NULL;
88 }
89
90 /**
91  * Close device after a communication.
92  */
93 u8 usb_close(usb_device *dev)
94 {
95
96   return 0;
97 }
98
99 u8 usb_get_device_descriptor(usb_device *dev, char *buf,u8 size)
100 {
101
102   return 0;
103 }
104
105 u8 usb_set_address(usb_device *dev, u8 address)
106 {
107
108   return 0;
109 }
110
111 u8 usb_set_configuration(usb_device *dev, u8 configuration)
112 {
113
114   return 0;
115 }
116
117 u8 usb_set_altinterface(usb_device *dev, u8 alternate)
118 {
119
120   return 0;
121 }
122
123 u8 usb_reset(usb_device *dev)
124 {
125
126
127   return 0;
128 }
129
130
131 /******************* Control Transfer **********************/
132
133 /**
134  * Create a control transfer.
135  */
136 u8 usb_control_msg(usb_device *dev, u8 requesttype, u8 request, u16 value, u16 index, u16 length,char *buf, u16 size, u16 timeout)
137 {
138   usb_irp *irp = (usb_irp*)malloc(sizeof(usb_irp));
139   irp->dev = dev;
140   //irp->devaddress = dev->address;
141   irp->endpoint = 0;
142   
143   irp->epsize = dev->bMaxPacketSize0;
144   irp->type = USB_CTRL;
145
146   buf[0]=(char)requesttype;
147   buf[1]=(char)request;    
148   buf[2]=(char)(value >> 8);
149   buf[3]=(char)(value);   
150   buf[4]=(char)(index >> 8);
151   buf[5]=(char)(index); 
152   // lenght buf are the only where the order is inverted
153   buf[6]=(char)(length);
154   buf[7]=(char)(length >> 8);
155
156   irp->buffer = buf;
157   irp->len = length;
158   irp->timeout = timeout;
159
160   usb_submit_irp(irp);
161   free(irp);
162
163   return 0;
164 }
165
166
167 u8 usb_get_string(usb_device *dev, u8 index, u8 langid, char *buf, u8 buflen)
168 {
169
170   return 0;
171 }
172
173
174 u8 usb_get_string_simple(usb_device *dev, u8 index, char *buf, u8 buflen)
175 {
176
177   return 0;
178 }
179
180 u8 usb_get_descriptor(usb_device *dev, unsigned char type, unsigned char index, void *buf, u8 size)
181 {
182
183   return 0;
184 }
185
186
187 /******************* Bulk Transfer **********************/
188
189 /**
190  * Write to an a bulk endpoint.
191  */
192 u8 usb_bulk_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
193 {
194   usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
195   irp->dev = dev;
196   //irp->devaddress = dev->address;
197   
198   irp->endpoint = ep;
199   irp->epsize = dev->epSize[ep]; // ermitteln
200   irp->type = USB_BULK;
201
202   irp->buffer = buf;
203   irp->len = size;
204   irp->timeout = timeout;
205
206   usb_submit_irp(irp);
207   free(irp);
208
209   return 0;
210 }
211
212 /**
213  * Read from an bulk endpoint.
214  */
215 u8 usb_bulk_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
216 {
217   usb_irp * irp = (usb_irp*)malloc(sizeof(usb_irp));
218   //irp->devaddress = dev->address;
219   irp->dev = dev;
220   
221   irp->endpoint = ep | 0x80;  // from device to host
222   irp->epsize = dev->epSize[ep]; // ermitteln
223   irp->type = USB_BULK;
224
225   irp->buffer = buf;
226   irp->len = size;
227   irp->timeout = timeout;
228
229   usb_submit_irp(irp);
230   free(irp);
231
232   return 0;
233 }
234
235
236 /******************* Interrupt Transfer **********************/
237 /**
238  * Write to an interrupt endpoint.
239  */
240 u8 usb_interrupt_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
241 {
242
243   return 0;
244 }
245
246 /**
247  * Read from an interrupt endpoint.
248  */
249 u8 usb_interrupt_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
250 {
251
252   return 0;
253 }
254
255
256 /******************* Isochron Transfer **********************/
257
258 /**
259  * Write to an isochron endpoint.
260  */
261 u8 usb_isochron_write(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
262 {
263
264   return 0;
265 }
266
267 /**
268  * Read from an isochron endpoint.
269  */
270 u8 usb_isochron_read(usb_device *dev, u8 ep, char *buf, u8 size, u8 timeout)
271 {
272
273
274   return 0;
275 }
276
277
278 //#endif        //_USB_H_