Skip to content

Commit 7063bc0

Browse files
committed
Detect USB CDC device again
1 parent f6d83df commit 7063bc0

File tree

7 files changed

+34
-12
lines changed

7 files changed

+34
-12
lines changed

src/console.cc

+1-3
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,7 @@ void PutChar(char c) {
101101
}
102102

103103
void PutString(const char* s) {
104-
while (*s) {
105-
PutChar(*(s++));
106-
}
104+
CoreFunc::PutString(s);
107105
}
108106

109107
void PutDecimal64(uint64_t value) {

src/corefunc.h

+1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
class EFI;
66
namespace CoreFunc {
77
void PutChar(char c);
8+
void PutString(const char* s);
89
EFI& GetEFI();
910
}; // namespace CoreFunc

src/kernel.cc

+4-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void kprintf(const char* fmt, ...) {
4242
PutStringAndHex("kprintf: warning: vsnprintf returned", len);
4343
buf[kSizeOfBuffer - 1] = 0;
4444
}
45-
PutString(buf);
45+
liumos->main_console->PutString(buf);
4646
va_end(args);
4747
}
4848

@@ -212,6 +212,9 @@ void TimerHandler(uint64_t, InterruptInfo* info) {
212212
void CoreFunc::PutChar(char c) {
213213
liumos->main_console->PutChar(c);
214214
}
215+
void CoreFunc::PutString(const char* s) {
216+
liumos->main_console->PutString(s);
217+
}
215218

216219
EFI& CoreFunc::GetEFI() {
217220
assert(loader_info_);

src/libcxx_support.cc

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ void* operator new(unsigned long size) {
55
return AllocKernelMemory<void*>(size);
66
}
77

8-
void operator delete(void*) {
9-
kprintf("warning: delete called but not implemented yet\n");
10-
}
8+
void operator delete(void*) {}
119

1210
void* operator new(unsigned long, std::align_val_t) {
1311
Panic("void * operator new(unsigned long, std::align_val_t)");

src/loader.cc

+3
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ void IdentifyCPU() {
123123
void CoreFunc::PutChar(char c) {
124124
main_console_.PutChar(c);
125125
}
126+
void CoreFunc::PutString(const char* s) {
127+
main_console_.PutString(s);
128+
}
126129

127130
EFI& CoreFunc::GetEFI() {
128131
return efi_;

src/usb_manager.cc

+23-4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class USBCommunicationClassDriver : public USBClassDriver {
3737
switch (state_) {
3838
case kDriverAttached: {
3939
config_desc_idx_ = 0;
40+
kprintf("Requesting config descriptor...\n");
4041
xhc.RequestConfigDescriptor(slot_, config_desc_idx_);
4142
state_ = kCheckingConfigDescriptor;
4243
} break;
@@ -45,6 +46,7 @@ class USBCommunicationClassDriver : public USBClassDriver {
4546
if (!e.has_value()) {
4647
return;
4748
}
49+
kprintf("Got config descriptor\n");
4850
ConfigDescriptor* config_desc =
4951
xhc.ReadDescriptorBuffer<ConfigDescriptor>(slot_, 0);
5052
assert(config_desc);
@@ -127,6 +129,7 @@ class USBCommunicationClassDriver : public USBClassDriver {
127129
}
128130
kprintf("\n");
129131
xhc.SetConfig(slot_, config_value_);
132+
kprintf("Using config value = %d\n", config_value_);
130133
state_ = kWaitingForConfigCompletion;
131134
} break;
132135
case kWaitingForConfigCompletion: {
@@ -166,6 +169,8 @@ class USBCommunicationClassDriver : public USBClassDriver {
166169

167170
xhc.SetInterface(slot_, data_interface_alt_setting_,
168171
data_interface_number_);
172+
kprintf("Using interface num = %d, alt setting = %d\n",
173+
data_interface_number_, data_interface_alt_setting_);
169174
state_ = kWaitingForSetInterfaceCompletion;
170175
} break;
171176
case kWaitingForSetInterfaceCompletion: {
@@ -339,14 +344,18 @@ class USBCommonDriver : public USBClassDriver {
339344
} break;
340345
case kDone: {
341346
kprintf("Got %d config descriptors in total\n", config_desc_idx_);
347+
bool found_cdc_net = false;
342348
for (int i = 0; i < config_desc_idx_; i++) {
343349
auto& config = slot_state[slot_].config_descriptors[i];
344350
kprintf("config[%d]:\n", i);
351+
kprintf(" config value = %d:\n", config->config_value);
345352
for (const auto& e : *config) {
346353
if (e->type == kDescriptorTypeInterface) {
347354
InterfaceDescriptor& interface_desc =
348355
*reinterpret_cast<InterfaceDescriptor*>(e);
349356
kprintf(" interface:\n");
357+
kprintf(" num: %d\n", interface_desc.interface_number);
358+
kprintf(" alt: %d\n", interface_desc.alt_setting);
350359
kprintf(" class: 0x%02X\n", interface_desc.interface_class);
351360
kprintf(" subclass: 0x%02X\n",
352361
interface_desc.interface_subclass);
@@ -356,14 +365,24 @@ class USBCommonDriver : public USBClassDriver {
356365
interface_desc.interface_subclass == 0x06 &&
357366
interface_desc.interface_protocol == 0x00) {
358367
kprintf("USB CDC Network device found!\n");
359-
auto cdc_net_driver = new USBCommunicationClassDriver(slot_);
360-
delete slot_state[slot_].driver;
361-
slot_state[slot_].driver = cdc_net_driver;
362-
return;
368+
found_cdc_net = true;
363369
}
364370
}
371+
if (e->type == kDescriptorTypeEndpoint) {
372+
EndpointDescriptor& ep_desc =
373+
*reinterpret_cast<EndpointDescriptor*>(e);
374+
kprintf(" endpoint:\n");
375+
kprintf(" addr: 0x%02X\n", ep_desc.endpoint_address);
376+
kprintf(" attributes: 0x%02X\n", ep_desc.attributes);
377+
}
365378
}
366379
}
380+
if (found_cdc_net) {
381+
auto cdc_net_driver = new USBCommunicationClassDriver(slot_);
382+
delete slot_state[slot_].driver;
383+
slot_state[slot_].driver = cdc_net_driver;
384+
return;
385+
}
367386
state_ = kFailed;
368387
} break;
369388
case kFailed: {

src/xhci.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,7 @@ void Controller::HandleTransferEvent(BasicTRB& e) {
818818
"(%02X, %02X, %02X)\n",
819819
si.device_class, si.device_subclass, si.device_protocol);
820820
si.state = SlotState::kAvailable;
821+
port_is_initializing_[slot_info_[slot].port] = false;
821822
} break;
822823
case SlotState::kManaged: {
823824
si.event_queue.Push(SlotEvent::kTransferSucceeded);
@@ -952,7 +953,6 @@ void Controller::HandleAddressDeviceCommandCompletion(const BasicTRB& e) {
952953
}
953954
uint8_t* buf = AllocMemoryForMappedIO<uint8_t*>(kSizeOfDescriptorBuffer);
954955
descriptor_buffers_[slot] = buf;
955-
port_is_initializing_[slot_info_[slot].port] = false;
956956
RequestDeviceDescriptor(slot, SlotState::kWaitingForDeviceDescriptor);
957957
}
958958

0 commit comments

Comments
 (0)