Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
pipe.cpp
Go to the documentation of this file.
1#include <cstdint>
2#include <ioforge/ioforge.hpp>
3#include <ehci/ehci_pipe.hpp>
4
6 desc_ = desc;
7 cb_ = cb;
8 toggle_ = 0;
9
10 ehci_->retrieve_qh(&qh_node_);
12 sizeof(struct ehci_queue_head));
13
14 ehci_->retrieve_qtd(&data_node_);
15 IOForge::IOUtils::memset(data_node_->task_descriptor, 0,
16 sizeof(struct ehci_queue_task_descriptor));
17
19 &buf_phys_);
20
21 setup_qh();
22 arm();
23 ehci_->insert_periodic(qh_node_, desc.interval_ms);
24
25 return true;
26}
27
29 auto qh = qh_node_->head;
30 qh->altTD = EHCI_QTD_TERMINATE;
31 qh->currentTD = 0;
32 qh->ch = (desc_.dev_addr & 0x7F);
33 qh->ch |= ((desc_.endpoint & 0xF) << 8);
34 qh->ch |= (desc_.speed & 0x3) << 12; // EPS High Speed
35 qh->ch |= (desc_.endpoint & 0x7FF) << 16; // Max Packet
36 qh->cap = (1 << 0); // S-mask
37 qh->cap |= EHCI_QH_CAP_MULT_1; // ← FIX 2
38}
39
41 auto* qtd = data_node_->task_descriptor;
42 IOForge::IOUtils::memset(qtd, 0, sizeof(*qtd));
43 qtd->link = EHCI_QTD_TERMINATE;
44 qtd->altlink = EHCI_QTD_TERMINATE;
45 qtd->token = EHCI_QTD_TOKEN_LENGTH(desc_.buffer_size)
49 qtd->buffer[0] = (uint32_t) buf_phys_;
50
52
53 auto* qh = qh_node_->head;
54 qh->token = 0;
55 __sync_synchronize();
56 qh->nextTD = data_node_->physaddr;
57}
58
60 // ehci_->remove_periodic(qh_node_);
61 // ehci_->release_qh(qh_node_);
62 // ehci_->release_qtd(qtd_node_);
63 // IOUtils::DMAFree(buf_);
64}
65
66void EHCIPipe::on_complete(uint8_t* /*buf*/, size_t len, bool error) {
67 size_t real_len =
68 desc_.buffer_size
69 - ((data_node_->task_descriptor->token >> 16) & 0x7FFF);
70 if (!error && cb_)
71 cb_(buf_, real_len); // naik ke USBDevice::handle_report
72 arm();
73}
InterruptCallback cb_
Definition ehci_pipe.hpp:23
uintptr_t buf_phys_
Definition ehci_pipe.hpp:29
void close() override
Definition pipe.cpp:59
uint8_t * buf_
Definition ehci_pipe.hpp:28
EHCIModule * ehci_
Definition ehci_pipe.hpp:21
void arm()
Definition pipe.cpp:40
bool open(const USBInterruptPipeDesc &desc, InterruptCallback cb) override
Definition pipe.cpp:5
USBInterruptPipeDesc desc_
Definition ehci_pipe.hpp:22
void setup_qh()
Definition pipe.cpp:28
uint32_t toggle_
Definition ehci_pipe.hpp:27
ehci_queue_head_node_t * qh_node_
Definition ehci_pipe.hpp:17
ehci_queue_task_descriptor_node_t * data_node_
Definition ehci_pipe.hpp:18
void on_complete(uint8_t *buf, size_t len, bool error) override
Definition pipe.cpp:66
static void * DMAAlloc(size_t size, uintptr_t *paddr)
Definition ioforge.hpp:23
static void memset(void *ptr, uint8_t value, size_t num)
Definition ioforge.hpp:49
@ EHCI_QTD_TOKEN_ERROR_COUNT_3
Definition ehci.hpp:102
@ EHCI_QH_CAP_MULT_1
Definition ehci.hpp:107
#define EHCI_QTD_TERMINATE
Definition ehci.hpp:66
@ EHCI_QTD_TOKEN_PID_IN
Definition ehci.hpp:84
#define EHCI_QTD_TOKEN_IOC
Definition ehci.hpp:71
@ EHCI_QTD_TOKEN_STATUS_ACTIVE
Definition ehci.hpp:90
#define EHCI_QTD_TOKEN_DATA
Definition ehci.hpp:70
#define EHCI_QTD_TOKEN_LENGTH(l)
Definition ehci.hpp:69
void(*)(const uint8_t *data, size_t len) InterruptCallback
size_t len
Definition oct2bin.h:7
unsigned int uint32_t
Definition type.h:19
unsigned char uint8_t
Definition type.h:7