Browse Source

Add even more debugging stuff, still no workie :(

main
PaulStoffregen 7 years ago
parent
commit
d58e0c207e
1 changed files with 72 additions and 5 deletions
  1. +72
    -5
      k66_usbhost.ino

+ 72
- 5
k66_usbhost.ino View File

Serial.println(); Serial.println();
Serial.println("Ring Doorbell"); Serial.println("Ring Doorbell");
USBHS_USBCMD |= USBHS_USBCMD_IAA; USBHS_USBCMD |= USBHS_USBCMD_IAA;
if (rootdev) print(rootdev->control_pipe);
} }


void loop() void loop()
Serial.println(" end recovery"); Serial.println(" end recovery");


// HCSPARAMS TTCTRL page 1671 // HCSPARAMS TTCTRL page 1671
rootdev = new_Device((USBHS_PORTSC1 >> 26) & 3, 0, 0);
uint32_t speed = (USBHS_PORTSC1 >> 26) & 3;
rootdev = new_Device(speed, 0, 0);
} }
} }


dev = allocate_Device(); dev = allocate_Device();
if (!dev) return NULL; if (!dev) return NULL;
dev->speed = speed; dev->speed = speed;
dev->address = 1; // TODO: dynamic assign address
dev->address = 0;
dev->hub_address = hub_addr; dev->hub_address = hub_addr;
dev->hub_port = hub_port; dev->hub_port = hub_port;
dev->control_pipe = new_Pipe(dev, 0, 0, 0, 8); dev->control_pipe = new_Pipe(dev, 0, 0, 0, 8);
dev->setup.wIndex = 0x0000; dev->setup.wIndex = 0x0000;
dev->setup.wLength = 0; dev->setup.wLength = 0;
Transfer_t *transfer = new_Transfer(dev->control_pipe, buffer, 8); Transfer_t *transfer = new_Transfer(dev->control_pipe, buffer, 8);
//print(dev->control_pipe);
if (transfer) queue_Transfer(transfer); if (transfer) queue_Transfer(transfer);


return dev; return dev;
Serial.println("new_Pipe"); Serial.println("new_Pipe");
pipe = allocate_Pipe(); pipe = allocate_Pipe();
if (!pipe) return NULL; if (!pipe) return NULL;
pipe->device = dev;
pipe->qh.current = 0; pipe->qh.current = 0;
pipe->qh.next = 1; pipe->qh.next = 1;
pipe->qh.alt_next = 1; pipe->qh.alt_next = 1;
transfer->qtd.next = (uint32_t)status; transfer->qtd.next = (uint32_t)status;
status_direction = 1; // always IN, USB 2.0 page 226 status_direction = 1; // always IN, USB 2.0 page 226
} }
init_qTD(transfer, &(pipe->device->setup), 8, 2, 0, false);
Serial.print("setup address ");
Serial.println((uint32_t)&pipe->device->setup, HEX);
init_qTD(transfer, &pipe->device->setup, 8, 2, 0, false);
init_qTD(status, NULL, 0, status_direction, 1, true); init_qTD(status, NULL, 0, status_direction, 1, true);
status->pipe = pipe; status->pipe = pipe;
status->qtd.next = 1; status->qtd.next = 1;
void queue_Transfer(Transfer_t *transfer) void queue_Transfer(Transfer_t *transfer)
{ {
Serial.println("queue_Transfer"); Serial.println("queue_Transfer");
volatile Pipe_t *pipe = transfer->pipe;
Pipe_t *pipe = transfer->pipe;


if (!pipe->active) { if (!pipe->active) {
if (pipe->type == 0 || pipe->type == 2) { if (pipe->type == 0 || pipe->type == 2) {
// control or bulk: add to async queue // control or bulk: add to async queue
pipe->qh.next = (uint32_t)transfer; pipe->qh.next = (uint32_t)transfer;
volatile Pipe_t *list = (Pipe_t *)USBHS_ASYNCLISTADDR;
Pipe_t *list = (Pipe_t *)USBHS_ASYNCLISTADDR;
if (list == NULL) { if (list == NULL) {
Serial.println(" first in async list, with qTD"); Serial.println(" first in async list, with qTD");
pipe->qh.capabilities[0] |= 0x8000; // H bit pipe->qh.capabilities[0] |= 0x8000; // H bit
pipe->qh.horizontal_link = (uint32_t)(&(pipe->qh)) | 2; // 2=QH pipe->qh.horizontal_link = (uint32_t)(&(pipe->qh)) | 2; // 2=QH
USBHS_ASYNCLISTADDR = (uint32_t)pipe; USBHS_ASYNCLISTADDR = (uint32_t)pipe;
print(pipe);
Serial.println(USBHS_USBSTS & USBHS_USBSTS_AS, HEX); Serial.println(USBHS_USBSTS & USBHS_USBSTS_AS, HEX);
Serial.println(USBHS_USBCMD & USBHS_USBCMD_ASE, HEX); Serial.println(USBHS_USBCMD & USBHS_USBCMD_ASE, HEX);
//USBHS_USBCMD |= USBHS_USBCMD_IAA; //USBHS_USBCMD |= USBHS_USBCMD_IAA;
} }




void print(const Transfer_t *transfer)
{
if (!((uint32_t)transfer & 0xFFFFFFE0)) return;
Serial.print("Transfer @ ");
Serial.println(((uint32_t)transfer & 0xFFFFFFE0), HEX);
Serial.print(" next: ");
Serial.println(transfer->qtd.next, HEX);
Serial.print(" anext: ");
Serial.println(transfer->qtd.alt_next, HEX);
Serial.print(" token: ");
Serial.println(transfer->qtd.token, HEX);
Serial.print(" bufs: ");
for (int i=0; i < 5; i++) {
Serial.print(transfer->qtd.buffer[i], HEX);
if (i < 4) Serial.print(',');
}
Serial.println();
}

void print(const Pipe_t *pipe)
{
if (!((uint32_t)pipe & 0xFFFFFFE0)) return;
Serial.print("Pipe ");
if (pipe->type == 0) Serial.print("control");
else if (pipe->type == 1) Serial.print("isochronous");
else if (pipe->type == 2) Serial.print("bulk");
else if (pipe->type == 3) Serial.print("interrupt");
Serial.print(pipe->direction ? " IN" : " OUT");
Serial.print(" @ ");
Serial.println((uint32_t)pipe, HEX);
Serial.print(" horiz link: ");
Serial.println(pipe->qh.horizontal_link, HEX);
Serial.print(" capabilities: ");
Serial.print(pipe->qh.capabilities[0], HEX);
Serial.print(',');
Serial.println(pipe->qh.capabilities[1], HEX);
Serial.println(" overlay:");
Serial.print(" cur: ");
Serial.println(pipe->qh.current, HEX);
Serial.print(" next: ");
Serial.println(pipe->qh.next, HEX);
Serial.print(" anext: ");
Serial.println(pipe->qh.alt_next, HEX);
Serial.print(" token: ");
Serial.println(pipe->qh.token, HEX);
Serial.print(" bufs: ");
for (int i=0; i < 5; i++) {
Serial.print(pipe->qh.buffer[i], HEX);
if (i < 4) Serial.print(',');
}
Serial.println();
const Transfer_t *t = (Transfer_t *)pipe->qh.next;
while (((uint32_t)t & 0xFFFFFFE0)) {
print(t);
t = (Transfer_t *)t->qtd.next;
}
//Serial.print();
}




void print(const char *s) void print(const char *s)
{ {

Loading…
Cancel
Save