Esempio n. 1
0
void main(void)
{
    init_boot();
    init_usb();

    while(1)
    {
        usb_sleep();
        dispatch_usb_event();
        if((application_data.invalid == 0) &&
           (GET_ACTIVE_CONFIGURATION() > FLASH_CONFIGURATION))
        {
            application_data.main();

            INTCON = 0; // Forbid interrupts
        }
    }
}
Esempio n. 2
0
u8 ep0_usb_std_request(void) {
	// hack to avoid register allocation bug in sdcc
	static u8 unknown_request;

	unknown_request = FALSE;

	if (SetupBuffer.request_type != STANDARD) {
		return FALSE;
	}

	switch (SetupBuffer.bRequest) {
	case CLEAR_FEATURE:
		debug_usb("CLEAR_FEATURE\n");
		// TODO not implemented
		break;
	case GET_CONFIGURATION:
		debug_usb("GET_CONFIGURATION\n");
		sourceData = &GET_ACTIVE_CONFIGURATION();
		num_bytes_to_be_send = 1;
		break;
	case GET_DESCRIPTOR:
		debug_usb("GET_DESCRIPTOR\n");
		switch (SetupBuffer.bDescType) {

		case DEVICE_DESCRIPTOR:
			debug_usb("device\n");
			sourceData = (u8 *) device_descriptor;
			num_bytes_to_be_send = device_descriptor->bLength;
			break;
		case CONFIGURATION_DESCRIPTOR:
			debug_usb("configuration\n");
			sourceData = configuration_descriptor[SetupBuffer.bDescIndex];
			num_bytes_to_be_send =
					((USB_Configuration_Descriptor*) sourceData)->wTotalLength;
			break;
		case STRING_DESCRIPTOR:
			debug_usb("string\n");
			sourceData = string_descriptor[SetupBuffer.bDescIndex];
			num_bytes_to_be_send = sourceData[0];
			break;
		default:
			debug_usb("unknown\n");
			// This is required to stall the DEVICE_QUALIFIER request
			unknown_request = TRUE;
			break;
		}
		break;
	case GET_INTERFACE:
		debug_usb("GET_INTERFACE\n");
		// TODO not implemented
		break;
	case GET_STATUS:
		debug_usb("GET_STATUS\n");
		// TODO not implemented
		break;
	case SET_ADDRESS:
		debug_usb("SET_ADDRESS\n");
		SET_DEVICE_STATE(ADDRESS_PENDING_STATE)
		;
		break;
	case SET_CONFIGURATION:
		debug_usb("SET_CONFIGURATION\n");
		// is this configuration valid ?
		if (device_descriptor->bNumConfigurations
				>= SetupBuffer.bConfigurationValue) {
			coming_cfg = SetupBuffer.bConfigurationValue;
			SET_DEVICE_STATE(CONFIGURATION_PENDING_STATE);
		} else // invalid configuration
		{
			debug_usb("invalid configuration\n");
			// Reply with a request error (STALL)
			unknown_request = TRUE;
		}

		break;
	case SET_FEATURE:
		debug_usb("SET_FEATURE\n");
		// TODO not implemented
		break;
	case SET_INTERFACE:
		debug_usb("SET_INTERFACE\n");
		// TODO not implemented
		break;
//        case SYNCH_FRAME:
// only for isochronous synchronization
//            break;
	default:
		unknown_request = TRUE;
		break;
	}
	return !unknown_request;
}