static void controlReceived(uint32_t token) { OpenIBootCmd* cmd = (OpenIBootCmd*)controlRecvBuffer; OpenIBootCmd* reply = (OpenIBootCmd*)controlSendBuffer; if(cmd->command == OPENIBOOTCMD_DUMPBUFFER) { int length; if(sendFileBytesLeft > 0) { length = sendFileBytesLeft; } else { length = getScrollbackLen(); // getScrollbackLen();// USB_BYTES_AT_A_TIME; } reply->command = OPENIBOOTCMD_DUMPBUFFER_LEN; reply->dataLen = length; usb_send_interrupt(3, controlSendBuffer, sizeof(OpenIBootCmd)); //uartPrintf("got dumpbuffer cmd, returning length: %d\r\n", length); } else if(cmd->command == OPENIBOOTCMD_DUMPBUFFER_GOAHEAD) { left = cmd->dataLen; //uartPrintf("got dumpbuffer goahead, writing length: %d\r\n", (int)left); size_t toRead = (left > USB_BYTES_AT_A_TIME) ? USB_BYTES_AT_A_TIME: left; if(sendFileBytesLeft > 0) { usb_send_bulk(1, sendFilePtr, toRead); sendFilePtr += toRead; sendFileBytesLeft -= toRead; if(sendFileBytesLeft == 0) { bufferPrintf("file sent.\r\n"); } } else { bufferFlush((char*) dataSendBuffer, toRead); usb_send_bulk(1, dataSendBuffer, toRead); } left -= toRead; } else if(cmd->command == OPENIBOOTCMD_SENDCOMMAND) { dataRecvPtr = dataRecvBuffer; rxLeft = cmd->dataLen; lastRxLen = rxLeft; //uartPrintf("got sendcommand, receiving length: %d\r\n", (int)rxLeft); reply->command = OPENIBOOTCMD_SENDCOMMAND_GOAHEAD; reply->dataLen = cmd->dataLen; usb_send_interrupt(3, controlSendBuffer, sizeof(OpenIBootCmd)); size_t toRead = (rxLeft > USB_BYTES_AT_A_TIME) ? USB_BYTES_AT_A_TIME: rxLeft; usb_receive_bulk(2, dataRecvPtr, toRead); rxLeft -= toRead; dataRecvPtr += toRead; } usb_receive_interrupt(4, controlRecvBuffer, sizeof(OpenIBootCmd)); }
static void acm_parse(int32_t _amt) { int i = 0; char **argv; int argc; char scratch[ACM_BUFFER_SIZE]; for(; i < _amt; i++) { if(acm_recv_buffer[i] == '\n' || acm_recv_buffer[i] == '\r') { _amt = i; break; } } acm_recv_buffer[_amt] = 0; memcpy(scratch, acm_recv_buffer, _amt+1); argv = command_parse(scratch, &argc); if(argc >= 3 && strcmp(argv[0], "sendfile") == 0) { acm_busy = TRUE; acm_file_ptr = (char*)parseNumber(argv[1]); acm_file_recv_left = parseNumber(argv[2]); received_file_size = acm_file_recv_left; bufferPrintf("ACM: Started receiving file at 0x%08x - 0x%08x (%d bytes).\n", acm_file_ptr, acm_file_ptr + acm_file_recv_left, acm_file_recv_left); } else if(argc >= 3 && strcmp(argv[0], "recvfile") == 0) { acm_busy = TRUE; acm_file_ptr = (char*)parseNumber(argv[1]); acm_file_send_left = parseNumber(argv[2]); bufferPrintf("ACM: Started sending file at 0x%08x - 0x%08x (%d bytes).\n", acm_file_ptr, acm_file_ptr + acm_file_send_left, acm_file_send_left); int amt = sprintf(acm_send_buffer, "ACM: Starting File: %d %d\n", (uint32_t)acm_file_ptr, acm_file_send_left); usb_send_bulk(ACM_EP_SEND, acm_send_buffer, amt); } else { bufferPrintf("ACM: Starting %s\n", acm_recv_buffer); if(command_run(argc, argv) == 0) bufferPrintf("ACM: Done: %s\n", acm_recv_buffer); else bufferPrintf("ACM: Unknown command: %s\n", argv[0]); } free(argv); EnterCriticalSection(); // Deliberately unended. usb_receive_bulk(ACM_EP_RECV, acm_recv_buffer, acm_usb_mps); task_stop(); }
static int acm_send() { if(acm_file_recv_left > 0) { acm_busy = TRUE; return 1; } if(acm_file_send_left > 0) { acm_busy = TRUE; int amt = acm_file_send_left; if(amt > acm_usb_mps) amt = acm_usb_mps; memcpy(acm_send_buffer, acm_file_ptr, amt); acm_file_ptr += amt; acm_file_send_left -= amt; usb_send_bulk(ACM_EP_SEND, acm_send_buffer, amt); if(acm_file_send_left == 0) bufferPrintf("ACM: Sent file (finished at 0x%08x)!\n", acm_file_ptr); return 1; } if(getScrollbackLen() > 0) { acm_busy = TRUE; int amt = getScrollbackLen(); if(amt > acm_usb_mps) amt = acm_usb_mps; bufferFlush(acm_send_buffer, amt); usb_send_bulk(ACM_EP_SEND, acm_send_buffer, amt); return 1; } acm_busy = FALSE; return 0; }
static void dataSent(uint32_t token) { //uartPrintf("sending remainder: %d\r\n", (int)left); if(left > 0) { size_t toRead = (left > USB_BYTES_AT_A_TIME) ? USB_BYTES_AT_A_TIME: left; if(sendFileBytesLeft > 0) { usb_send_bulk(1, sendFilePtr, toRead); sendFilePtr += toRead; sendFileBytesLeft -= toRead; if(sendFileBytesLeft == 0) { bufferPrintf("file sent.\r\n"); } } else { bufferFlush((char*) dataSendBuffer, toRead); usb_send_bulk(1, dataSendBuffer, toRead); } left -= toRead; } }
static int usb_msc_send(struct usbdrive_s *udrive_gf, int dir, void *buf, u32 bytes) { struct usb_pipe *pipe; if (dir == USB_DIR_OUT) pipe = GET_GLOBALFLAT(udrive_gf->bulkout); else pipe = GET_GLOBALFLAT(udrive_gf->bulkin); return usb_send_bulk(pipe, dir, buf, bytes); }
static void acm_parse(int32_t _amt) { int start = 0; int i = 0; if(acm_file_ptr != NULL && acm_file_recv_left > 0) { if(_amt >= acm_file_recv_left) { memcpy(acm_file_ptr, acm_recv_buffer, acm_file_recv_left); i = acm_file_recv_left; start = i; bufferPrintf("ACM: Received file (finished at 0x%08x)!\n", acm_file_ptr + acm_file_recv_left); acm_file_ptr = NULL; acm_file_recv_left = 0; } else { memcpy(acm_file_ptr, acm_recv_buffer, _amt); acm_file_ptr += _amt; acm_file_recv_left -= _amt; //bufferPrintf("ACM: Got %d of file (%d remain).\n", _amt, acm_file_recv_left); EnterCriticalSection(); // Deliberately unended. usb_receive_bulk(ACM_EP_RECV, acm_recv_buffer, acm_usb_mps); return; } } for(; i < _amt; i++) { if(acm_recv_buffer[i] == '\n') { acm_recv_buffer[i] = 0; if(i > 0) if(acm_recv_buffer[i-1] == '\r') acm_recv_buffer[i-1] = 0; char safeCommand[ACM_BUFFER_SIZE]; char *command = &acm_recv_buffer[start]; strcpy(safeCommand, command); int argc; char** argv = command_parse(command, &argc); if(argc >= 3 && strcmp(argv[0], "sendfile") == 0) { acm_file_ptr = (char*)parseNumber(argv[1]); acm_file_recv_left = parseNumber(argv[2]); received_file_size = acm_file_recv_left; bufferPrintf("ACM: Started receiving file at 0x%08x - 0x%08x (%d bytes).\n", acm_file_ptr, acm_file_ptr + acm_file_recv_left, acm_file_recv_left); i = _amt; start = i; } else if(argc >= 3 && strcmp(argv[0], "recvfile") == 0) { acm_busy = TRUE; acm_file_ptr = (char*)parseNumber(argv[1]); acm_file_send_left = parseNumber(argv[2]); bufferPrintf("ACM: Started sending file at 0x%08x - 0x%08x (%d bytes).\n", acm_file_ptr, acm_file_ptr + acm_file_send_left, acm_file_send_left); int amt = sprintf(acm_send_buffer, "ACM: Starting File: %d %d\n", (uint32_t)acm_file_ptr, acm_file_send_left); usb_send_bulk(ACM_EP_SEND, acm_send_buffer, amt+1); i = _amt; start = i; } else { bufferPrintf("ACM: Starting %s\n", safeCommand); if(command_run(argc, argv) == 0) bufferPrintf("ACM: Done: %s\n", safeCommand); else bufferPrintf("ACM: Unknown command: %s\n", command); start = i+1; } free(argv); } } EnterCriticalSection(); // Deliberately unended. if(start < _amt) { if(acm_unprocessed > 0) { bufferPrintf("ACM: command too long, discarding...\n"); acm_unprocessed = 0; usb_receive_bulk(ACM_EP_RECV, acm_recv_buffer, acm_usb_mps); task_stop(); return; } else memcpy(acm_recv_buffer, acm_recv_buffer+start, _amt-start); } acm_unprocessed = _amt-start; usb_receive_bulk(ACM_EP_RECV, acm_recv_buffer+acm_unprocessed, acm_usb_mps); task_stop(); }