Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
ioforge_usb.hpp
Go to the documentation of this file.
1#ifndef __IOFORGE__IOFORGE_USB_HPP_
2#define __IOFORGE__IOFORGE_USB_HPP_
3
4#include "ioforge/ioforge.hpp"
6#include <usb.h>
7
8class IoForgeUSB : public IOForge {
9 public:
10 IoForgeUSB(const char* mod) : IOForge(mod) {}
11 virtual void load();
12 virtual void unload();
13
14 template <typename Fn>
15 inline static void
17 uint16_t devclass, Fn&& fn) {
18 // Bungkus lambda ke dalam void* ctx
20 node, devclass,
21 [](struct ioforge_usb_device* dev, void* ctx) {
22 (*reinterpret_cast<Fn*>(ctx))(dev);
23 },
24 reinterpret_cast<void*>(&fn));
25 };
26
27 inline static uint8_t
29 uintptr_t setup_addr = 0;
30 struct usb_setup_packet* setup =
31 (struct usb_setup_packet*)IOUtils::DMAAlloc(
32 sizeof(struct usb_setup_packet), &setup_addr);
33
34 uintptr_t resp_paddr = 0;
35 uint8_t* resp = (uint8_t*)IOUtils::DMAAlloc(64, &resp_paddr);
36 IOUtils::memset(resp, 0, 64);
37
38 setup->bRequest = 0x08;
39 setup->bmRequestType = 0b10000000;
40 setup->wValue = 0;
41 setup->wIndex = 0;
42 setup->wLength = 1;
43
44 // todo: modify send method to add endpoint parameter
45 dev->controller->ops.send(dev->addr, 0, (uint32_t)setup_addr,
46 sizeof(*setup), (uint32_t)resp_paddr,
47 1);
48
49 uint8_t res = *resp;
50
51 IOUtils::DMAFree((void*)setup_addr, (void*)setup,
52 sizeof(struct usb_setup_packet));
53 IOUtils::DMAFree((void*)resp_paddr, (void*)resp, 64);
54
55 return res;
56 }
57
58 inline static void set_configuration(struct ioforge_usb_device* dev,
59 uint8_t val) {
60 uintptr_t setup_addr = 0;
61 struct usb_setup_packet* setup =
62 (struct usb_setup_packet*)IOUtils::DMAAlloc(
63 sizeof(struct usb_setup_packet), &setup_addr);
64
65 setup->bmRequestType = 0x0;
66 setup->bRequest = 0x09;
67 setup->wValue = val;
68 setup->wIndex = 0;
69 setup->wLength = 0;
70
71 // todo: modify send method to add endpoint parameter
72 dev->controller->ops.send(dev->addr, 0, (uint32_t)setup_addr,
73 sizeof(struct usb_setup_packet), 0,
74 0);
75 IOUtils::DMAFree((void*)setup_addr, (void*)setup,
76 sizeof(*setup));
77 }
78};
79
80#endif // __IOFORGE__IOFORGE_USB_HPP_
IOForge(const char *mod)
Definition ioforge.hpp:18
const char * mod
Definition ioforge.hpp:65
static void foreach_usb_device_by_devclass(struct ioforge_device *node, uint16_t devclass, Fn &&fn)
static uint8_t get_configuration(struct ioforge_usb_device *dev)
static void set_configuration(struct ioforge_usb_device *dev, uint8_t val)
virtual void unload()
IoForgeUSB(const char *mod)
virtual void load()
void ioforge_find_usb_device_by_devclass(struct ioforge_device *node, uint16_t devclass, ioforge_usb_visitor_fn callback, void *ctx)
void(* send)(uint32_t addr, uint8_t endpoint, uint32_t data_phys, size_t request_size, uint32_t response_phys, size_t response_size)
Definition ioforge_usb.h:16
struct UsbControllerOp ops
Definition ioforge_usb.h:23
struct ioforge_usb_controller_service * controller
Definition ioforge_usb.h:52
uint8_t bmRequestType
Definition usb.h:81
uint16_t wLength
Definition usb.h:85
uint16_t wValue
Definition usb.h:83
uint16_t wIndex
Definition usb.h:84
uint8_t bRequest
Definition usb.h:82
unsigned short uint16_t
Definition type.h:13
unsigned int uint32_t
Definition type.h:19
unsigned long uintptr_t
Definition type.h:73
unsigned char uint8_t
Definition type.h:7