1 #include "scsi_request.h"
3 #include "usb_mass_storage.h"
5 #include "manes/manec.h"
8 using namespace resources
;
10 int usb_mass_storage_count
= 0;
12 bool usb_mass_storage::init_device(p
<did
> _id
) {
13 p
<usb_did
> uid
= _id
.cast
<usb_did
>();
20 usb::usb_setup_data req
;
21 req
.bmRequestType
= 0x21;
26 uid
->control(buffer::to_mem(req
));
28 req
.bmRequestType
= 0xa1;
31 // buffer luns = uid->control(buffer::to_mem(req), 1);
34 cmd
->dCBWSignature
= 0x43425355;
35 cmd
->dCBWTag
= 0xbeef + tag
++;
36 cmd
->dCBWDataTransferLength
= 512;
37 cmd
->bmCBWFlags
= 1 << 7;
39 cmd
->bCBWCBLength
= 10;
41 scsi_request scsi_cmd
;
42 scsi_cmd
.set_address(1);
46 buffer bufc
= buffer::to_mem(cmd
);
47 bufc
+= scsi_cmd
.generate();
51 uid
->bulk_write(bufc
);
52 buffer
buf(new (0x1000)char[512], 512);
55 buffer
bufs(new (0x1000) char[13], 13);
57 asm("cli\nhlt"::"a"(bufs
.get_address()), "b"(buf
.get_address()), "c"(bufc
.get_address()));
63 bool usb_mass_storage::check_device(p
<did
> id
) {
64 p
<usb_did
> uid
= id
.cast
<usb_did
>();
74 if (uid
->get_class() == 8
75 && uid
->get_subclass() == 6
76 && uid
->get_protocol() == 0x50)
82 void usb_mass_storage::register_type() {
83 manes::manec::get()->register_driver
<usb_mass_storage
>("usb_mass_storage", "pci", delegate
<bool, p
<did
> >::function(&usb_mass_storage::check_device
));