scsi request, part usb mass storage class driver, bulk transfers
[quarnos.git] / resources / uhci.h
blob59a177095e9bd7e071d9873dbe602b410cd06232
1 /* Quarn OS
3 * UHCI driver
5 * Copyright (C) 2009 Pawel Dziepak
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 #ifndef _UHCI_H_
24 #define _UHCI_H_
26 #include "device.h"
27 #include "arch/low/general.h"
28 #include "pci.h"
29 #include "usb.h"
30 #include "usb_hc.h"
32 namespace resources {
33 class uhci : public usb_hc {
34 public:
35 enum {
36 hc_stop = 0,
37 hc_run = 1,
38 hc_reset = 2,
39 hc_greset = 4,
40 hc_egsm = 8,
41 hc_fgr = 0x10,
42 hc_swdgb = 0x20,
43 hc_cf = 0x40,
44 hc_maxp = 0x80
47 enum uhci_registers {
48 uhci_command,
49 uhci_status = 2,
50 uhci_flbaseadd = 8,
51 uhci_portsc1 = 0x10
54 /* TD, QH, frame */
56 struct transfer_descriptor {
57 u32 link_ptr;
58 volatile u32 control;
59 u32 token;
60 u32 buffer;
63 struct queue_head {
64 u32 head_ptr;
65 volatile u32 element_ptr;
68 typedef u32 frame_pointer;
70 void irq();
72 transfer_descriptor *td;
73 frame_pointer *fp;
74 int last_fp;
75 queue_head *qh;
77 protected:
79 pci_did pciid;
80 public:
81 void init_structures();
82 int get_free_address();
83 void *control_transfer(int pid, void *val, int length, int rlength, u8 address);
84 void bulk_transfer(int, void *, int, int, int);
86 void init();
87 void device_connected(int port);
89 uhci() : td(0), fp(0), last_fp(0) {}
91 //virtual void init_port(int i) = 0;
93 //virtual array<char> control_transfer(usb_pid, array<char>, int, int) = 0;
95 bool init_device(p<did>);
97 void scan_bus(delegate<void, int>);
99 static bool check_device(p<did>);
100 static void register_type();
104 #endif