Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
keyboard.cpp
Go to the documentation of this file.
1#include "dev/event.h"
2#include "ioforge/ioforge.h"
3#include "ioforge/ioforge.hpp"
5#include "memory/kalloc.h"
6#include "vfs/vfs.h"
7#include "vfs/vnode.h"
8#include <vfs/dentry.h>
9#include <usb-hid/keyboard.hpp>
10#include <str.h>
11
13
16
18 dev_ = dev;
19 instance = this;
20
21 vxNamei((char*) "/dev/event/event0", &dentry_);
22
23 if (!dentry_) {
24 serial2_printf("failed create dentry\n");
25 return;
26 }
27
28 void* priv = kalloc(sizeof(struct dev_event_data));
29 if (!priv) {
30 serial2_printf("failed alloc priv\n");
31 return;
32 }
33 serial2_printf("private alloc 0x%x\n", priv);
34 memset(priv, 0, sizeof(struct dev_event_data));
35
36 serial2_printf("dentry_ name %s\n", dentry_->name->c_str);
38 if (!inode_) {
39 serial2_printf("failed create inode\n");
40 return;
41 }
42 serial2_printf("inode at 0x%x\n", inode_);
43 dentry_->vnode = inode_;
44 inode_->permission = 600;
45 inode_->type = VNODE_TYPE_DIR;
46 inode_->size = 128;
47 inode_->vnode_private = (void*) priv;
48
49 // setup usb interrupt pipe
50 USBInterruptPipe* pipe = (USBInterruptPipe*) dev_->pipe;
51 serial2_printf("Pipe pointer before: 0x%x\n", pipe);
52
53 if (priv == (void*) pipe) {
54 serial2_printf("FATAL: priv aliasing pipe!\n");
55 // trace allocator untuk cari double-free di EHCI
56 return;
57 }
58
59 auto desc = (struct USBInterruptPipeDesc){
60 .dev_addr = dev_->addr,
61 .endpoint = (uint8_t) (dev_->endpoints[0].address & 0xF),
62 .speed = 2, // high speed
63 .interval_ms = dev_->endpoints[0].interval,
64 .buffer_size = 128,
65 };
66 pipe->open(desc, HIDKeyboard::fireHandler);
67}
68
70 if (!inode_)
71 return;
72
73 if (!inode_->vnode_private)
74 return;
75
76 auto event = (struct dev_event_data*) inode_->vnode_private;
77 event->len = len;
78 event->available = len > 0;
79}
80
82 if (instance)
83 instance->store_in_vfs(data, len);
84}
static AHCIModule instance
Definition init.cpp:5
void store_in_vfs(const uint8_t *data, size_t len)
Definition keyboard.cpp:69
ioforge_usb_device * dev_
Definition keyboard.hpp:16
vnode_ptr_t inode_
Definition keyboard.hpp:17
void load(ioforge_usb_device *dev)
Definition keyboard.cpp:17
static void fireHandler(const uint8_t *data, size_t len)
Definition keyboard.cpp:81
dentry_ptr dentry_
Definition keyboard.hpp:18
virtual bool open(const USBInterruptPipeDesc &desc, InterruptCallback cb)=0
struct fs_data data
Definition filesystem.h:1
void serial2_printf(const char *fmt,...)
void * kalloc(size_t size)
size_t len
Definition oct2bin.h:7
void memset(void *ptr, int value, size_t num)
unsigned char uint8_t
Definition type.h:7
vnode_t * create_and_attach_vnode()
@ VNODE_TYPE_DIR
Definition vnode.h:13