Exemple #1
0
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));
}
Exemple #2
0
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();
}
Exemple #3
0
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;
}
Exemple #4
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;
	}
}
Exemple #5
0
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);
}
Exemple #6
0
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();
}