usb: getting string descriptors, minor improvements
[quarnos.git] / resources / usb_mass_storage.cpp
blobe00793925e708887265a704c06d2e6f370b465b1
1 #include "scsi_request.h"
2 #include "usb.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>();
15 if (!uid.valid())
16 return false;
18 id = uid;
20 usb::usb_setup_data req;
21 req.bmRequestType = 0x21;
22 req.bRequest = 0xff;
23 req.wValue = 0;
24 req.wIndex = 0;
25 req.wLength = 0;
26 uid->control(buffer::to_mem(req));
28 req.bmRequestType = 0xa1;
29 req.bRequest = 0xfe;
30 req.wLength = 1;
31 // buffer luns = uid->control(buffer::to_mem(req), 1);
33 p<cbw> cmd = new cbw;
34 cmd->dCBWSignature = 0x43425355;
35 cmd->dCBWTag = 0xbeef + tag++;
36 cmd->dCBWDataTransferLength = 512;
37 cmd->bmCBWFlags = 1 << 7;
38 cmd->bCBWLUN = 0;
39 cmd->bCBWCBLength = 10;
41 scsi_request scsi_cmd;
42 scsi_cmd.set_address(1);
43 scsi_cmd.set_size(1);
44 scsi_cmd.read();
46 buffer bufc = buffer::to_mem(cmd);
47 bufc += scsi_cmd.generate();
48 buffer fill(6);
49 bufc += fill;
50 bufc.align(0x1000);
51 uid->bulk_write(bufc);
52 buffer buf(new (0x1000)char[512], 512);
53 uid->bulk_read(buf);
55 buffer bufs(new (0x1000) char[13], 13);
56 uid->bulk_read(bufs);
57 asm("cli\nhlt"::"a"(bufs.get_address()), "b"(buf.get_address()), "c"(bufc.get_address()));
59 return true;
63 bool usb_mass_storage::check_device(p<did> id) {
64 p<usb_did> uid = id.cast<usb_did>();
66 if (!uid.valid())
67 return false;
70 * Class: Mass Storage
71 * Subclass: SCSI
72 * Protocol: bulk-only
74 if (uid->get_class() == 8
75 && uid->get_subclass() == 6
76 && uid->get_protocol() == 0x50)
77 return true;
79 return false;
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));