Esempio n. 1
0
void Chap9_BurstTransmitEP0(PUCHAR pData, USHORT len)
{
    ControlData.wCount = 0;
    if(ControlData.wLength > len)
        ControlData.wLength = len;

    ControlData.Addr.pData = pData;

        if( ControlData.wLength >= EP0_PACKET_SIZE)
        {
            Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, EP0_PACKET_SIZE);

            RaiseIRQL();
            if(!ControlData.Abort)
            {
                ControlData.wCount += EP0_PACKET_SIZE;
                bD13flags.bits.DCP_state = USBFSM4DCP_DATAIN;

            }
            LowerIRQL();
        }
        else
        {
            Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, ControlData.wLength);

            RaiseIRQL();
            if(!ControlData.Abort)
            {
                ControlData.wCount += ControlData.wLength;
                bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE;

            }
            LowerIRQL();
        }
}
Esempio n. 2
0
void Isr_Ep00TxDone(void)
{
    short i = ControlData.wLength - ControlData.wCount;
    UCHAR ep_last;
    Hal4D13_ReadInterruptRegister();
    ep_last = Hal4D13_GetEndpointStatusWInteruptClear(EPINDEX4EP0_CONTROL_IN); /* Clear interrupt flag */

    switch (bD13flags.bits.DCP_state)
    {
    case USBFSM4DCP_HANDSHAKE:
        break;
    case USBFSM4DCP_DATAIN:
        if( i >= EP0_PACKET_SIZE)
        {
            Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN,ControlData.Addr.pData + ControlData.wCount, EP0_PACKET_SIZE);
            ControlData.wCount += EP0_PACKET_SIZE;
            // State remains at USBFSM4DCP_DATAIN
        }
        else if( i != 0)
        {
            Hal4D13_WriteEndpoint(1, ControlData.Addr.pData + ControlData.wCount, i);
            ControlData.wCount += i;
            bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE;
        }
        else if (i == 0)
        {
            bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE;
      Hal4D13_SingleTransmitEP0(0, 0);
        }
        break;
    case USBFSM4DCP_REQUESTPROC: break;
    case USBFSM4DCP_IDLE:       break;
    case USBFSM4DCP_SETUPPROC:  break;
    case USBFSM4DCP_STALL:      break;
    case USBFSM4DCP_DATAOUT:    break;
    default:
        USB_ISR_DEBUG(("Fatal Error: Isr_Ep0TxDone Unexpected FSMState=%x\r\n",bD13flags.bits.DCP_state));
        bD13flags.bits.DCP_state = USBFSM4DCP_STALL;
        Hal4D13_StallEP0InControlRead();
        break;
    }
}
Esempio n. 3
0
void Chap9_BurstTransmitEP0(PUCHAR pData, USHORT len)
{
	ControlData.wCount = 0;
    //printf("wCount = %d \n",ControlData.wCount);
	if(ControlData.wLength > len)
		ControlData.wLength = len;

	printf("wLength = %d \n",ControlData.wLength);	
	ControlData.Addr.pData = pData;

		if( ControlData.wLength >= EP0_PACKET_SIZE)
		{
			Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, EP0_PACKET_SIZE);

			RaiseIRQL();
			if(!ControlData.Abort)
			{
				ControlData.wCount += EP0_PACKET_SIZE;
				bD13flags.bits.DCP_state = USBFSM4DCP_DATAIN;

			}
			LowerIRQL();
		}
		else
		{
			USHORT i = Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, pData, ControlData.wLength);
            //printf("Descriptor size after writing to Ep0 is %d \n ",i);

			RaiseIRQL();
			if(!ControlData.Abort)
			{
				ControlData.wCount += ControlData.wLength;
				bD13flags.bits.DCP_state = USBFSM4DCP_HANDSHAKE;

			}
			LowerIRQL();
		}
}
Esempio n. 4
0
void Isr_Ep01Done(void)
{
    unsigned char bbuf[8]; 
    UCHAR  c;
    c = Hal4D13_GetEndpointStatusWInteruptClear(EPINDEX4EP01); 
//Richard     Hal4D13_ReadEndpoint(EPINDEX4EP01, &bbuf, 8);
//Richard   Hal4D13_ReadBulkEndpoint(EPINDEX4EP01,&bbuf, 1);
    Hal4D13_ReadEndpoint(EPINDEX4EP01, bbuf, 8);
  Hal4D13_ReadBulkEndpoint(EPINDEX4EP01,bbuf, 1);
  USB_ISR_DEBUG(("Received From Endpoint 1\r\n"));
  if (bbuf[0]==0xaa)   bbuf[0]=bUSBCheck_Device_State.State_bits.FOUR_RESERVED_BITS++;  
  else if (bbuf[0]==0x55) bUSBCheck_Device_State.State_bits.FOUR_RESERVED_BITS = 0;  
  else if (bbuf[0]==0x99) bUSBCheck_Device_State.State_bits.RESET_BITS = 1;  
  else bUSBCheck_Device_State.State_bits.FOUR_RESERVED_BITS=0xcc;
  bbuf[0]=bUSBCheck_Device_State.State_bits.FOUR_RESERVED_BITS;
  IOWR(LEDG_BASE,0,bbuf[0]);
  IOWR(LEDR_BASE,0,bbuf[0]);
  SEG7_Hex(bbuf[0], 0);
  //IOWR(SEG7_DISPLAY_BASE,0,bbuf[0]);
// richard  Hal4D13_WriteEndpoint(EPINDEX4EP02,&bbuf, 8);
  Hal4D13_WriteEndpoint(EPINDEX4EP02,bbuf, 8);
  Hal4D13_GetEndpointStatusWInteruptClear(EPINDEX4EP01); /* Clear interrupt flag*/  
}
void Hal4D13_SingleTransmitEP0(UCHAR * buf, USHORT len)
{
    if( len <= EP0_PACKET_SIZE) {
        Hal4D13_WriteEndpoint(EPINDEX4EP0_CONTROL_IN, buf, len);
    }
}
int main() {
	/* Local variables */
	HID_KEYS_REPORT old_report;

	BOOL bufferAvailable, readyToSend, watchdog_required;
	UCHAR gesture;
	UCHAR send_buffer[8];
	int i;

	/* Configure ISP1362 chip */
	disable_irq();
	disconnect_USB_controller();
	usleep(1000000);
	Hal4D13_ResetDevice(); //This is good because its a legit ISP1362 call
	//changed state settings to reset values -- If possible I would like to remove these.
	hid_settings.state = reset;
	watchdog_required = FALSE;
	bUSBCheck_Device_State.State_bits.DEVICE_DEFAULT_STATE = 1;
	bUSBCheck_Device_State.State_bits.DEVICE_ADDRESS_STATE = 0;
	bUSBCheck_Device_State.State_bits.DEVICE_CONFIGURATION_STATE = 0;
	bUSBCheck_Device_State.State_bits.RESET_BITS = 0;
	usleep(1000000);
	reconnect_USB_controller();
	CHECK_CHIP_ID(); //Checks chip ID and prints it to console. Is not actually required
	Hal4D13_AcquireD13(USB_0_BASE,(void*)usb_isr); //Registers main ISR. very important.
	enable_irq();

	/* Initialise HID report structures to zero */
	new_report.modifier = 0x00;
	new_report.reserved = 0x00;
	for(i=0; i<6; i++){
		new_report.keycode[i] = 0x00;
	}

	old_report.modifier = 0x00;
	old_report.reserved = 0x00;
	for(i=0; i<6; i++){
		old_report.keycode[i] = 0x00;
	}

	while(1) {

		/* Interrupt service routines modify state bits, calls handler based on state */
		if (bUSBCheck_Device_State.State_bits.RESET_BITS == 1) {
			disable_irq();
			break;
		}
		if (bD13flags.bits.suspend) {
			disable_irq();
			bD13flags.bits.suspend= 0;
			enable_irq();
			change_suspend_state();
		} // Suspend Change Handler
		if (bD13flags.bits.DCP_state == USBFSM4DCP_SETUPPROC) {
			disable_irq();
			SetupToken_Handler();
			enable_irq();
		} // Setup Token Handler
		if ((bD13flags.bits.DCP_state == USBFSM4DCP_REQUESTPROC) && !ControlData.Abort) {
			disable_irq();
			bD13flags.bits.DCP_state = 0x00;
			DeviceRequest_Handler();
			enable_irq();
		} // Device Request Handler

		//TODO: Revisit how toSend is decided. Now bufferAvailable
		if(bD13flags.bits.DCP_state == USBFSM4DCP_INTR1DONE) {
			bD13flags.bits.DCP_state = 0x00;
			if(Hal4D13_GetErrorCode(EPINDEX4EP01) & 0x01) {
				//I feel like I need to do something in here. We get interrupts from the other side when packet is received.
			}
		}

		UCHAR status = Hal4D13_GetEndpointStatusWOInteruptClear(EPINDEX4EP01);
		if(!(status & 0x60)) {
			bufferAvailable = TRUE;
		}
		printf("Status bits are  = %x\n", status);

		if(hid_settings.state == connected) {
			
			/* Check for gesture */
			disable_irq();
			gesture = readGesture();
			mapGestureToKeycodes(&new_report, gesture);
			enable_irq();

			/* See if we should send the next report */
			disable_irq();
			readyToSend = reportChanged(old_report, new_report) && bufferAvailable;
			if(readyToSend || watchdog_required) {
				send_buffer[0] =  new_report.modifier;
				send_buffer[1] =  new_report.reserved;
				send_buffer[2] =  new_report.keycode[0];
				send_buffer[3] =  new_report.keycode[1];
				send_buffer[4] =  new_report.keycode[2];
				send_buffer[5] =  new_report.keycode[3];
				send_buffer[6] =  new_report.keycode[4];
				send_buffer[7] =  new_report.keycode[5];

				Hal4D13_LockDevice(0);
				Hal4D13_WriteEndpoint(EPINDEX4EP01, send_buffer, 8);
				bufferAvailable = FALSE;
				readyToSend = FALSE;
				watchdog_required = FALSE;
			}
			enable_irq();

			/* Update old report */
			old_report.keycode[0] = new_report.keycode[0]; //We only use one key slot so only need to to update one
			old_report.modifier = new_report.modifier;

			if(new_report.keycode[0] != 0)
				IOWR(GREEN_LEDS_BASE, 0, new_report.keycode[0]);
		}

	} //End While(1)
	return 0;
 }//End Main
Esempio n. 7
0
void Chap9_GetDescriptor(void)
{
	UCHAR   bDescriptor =      MSB(ControlData.DeviceRequest.wValue);
	UCHAR   bDescriptorIndex = LSB(ControlData.DeviceRequest.wValue);
	//printf("bDescri %d\n",bDescriptor);
	//printf("Index %d\n",bDescriptorIndex);
	////printf("USB_DEVICE_DESCRIPTORsize %d\n",sizeof(USB_DEVICE_DESCRIPTOR));
	// //printf("CONFIGURATIONsize %d\n",sizeof(USB_CONFIGURATION_DESCRIPTOR_a));
	switch(bDescriptor)
	{
	//sDevice sConfiguration
	//sizeof(struct CONFIGURATION)
	//sizeof( struct DEVICE)

	case USB_DEVICE_DESCRIPTOR_TYPE://1
		{
            //printf("entering device descriptor");
		Chap9_BurstTransmitEP0( (PUCHAR)&DeviceDescr , sizeof(USB_DEVICE_DESCRIPTOR));
		//Chap9_BurstTransmitEP0((PUCHAR)&sDevice,sizeof(struct DEVICE));
		//printf("exiting device descriptor");
        break;
		}
	case USB_CONFIGURATION_DESCRIPTOR_TYPE://2
		{
		//		Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, CONFIG_DESCRIPTOR_LENGTH);

      
		  printf("\nConfigDescr     ");  
         Chap9_BurstTransmitEP0((PUCHAR)&ConfigDescr, sizeof(USB_CONFIGURATION_DESCRIPTOR));//sizeof(USB_CONFIGURATION_DESCRIPTOR));
		
		//Chap9_SetConfiguration();
        //config_endpoint();
		//printf("\nInterfaceDescr0  ");    
		//Chap9_BurstTransmitEP0((PUCHAR)&InterfaceDescr, sizeof(USB_INTERFACE_DESCRIPTOR));
		
		//printf("\nHID_TXDesc       ");
		//Chap9_BurstTransmitEP0( (PUCHAR)&hidDescr , sizeof(USB_HID_DESCRIPTOR));		
		
		//printf("\nEP1_TXDesc       ");
		//Chap9_BurstTransmitEP0((PUCHAR)&EP_Descr, sizeof(USB_ENDPOINT_DESCRIPTOR));
		////printf("\nEP1_RXDescr      ");    Chap9_BurstTransmitEP0((PUCHAR)&EP1_RXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
		////printf("\nEP2_TXDescr      ");    Chap9_BurstTransmitEP0((PUCHAR)&EP2_TXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
		////printf("\nEP2_RXDescr      ");    Chap9_BurstTransmitEP0((PUCHAR)&EP2_RXDescr, sizeof(USB_ENDPOINT_DESCRIPTOR));
		break;
		}
	case USB_STRING_DESCRIPTOR_TYPE://3
		switch(bDescriptorIndex)
		{
		case STR_INDEX_LANGUAGE:
			//printf("\n str1     \n");
			Chap9_BurstTransmitEP0((PUCHAR)&strLanguage, sizeof(USB_STRING_LANGUAGE_DESCRIPTOR));
			break;
		case STR_INDEX_MANUFACTURER:
			//printf("\n str2     \n");Chap9_BurstTransmitEP0((PUCHAR)&strManufacturer, sizeof(USB_STRING_MANUFACTURER_DESCRIPTOR));
			break;
		case STR_INDEX_PRODUCT:
			//printf("\n str3     \n");Chap9_BurstTransmitEP0((PUCHAR)&strProduct, sizeof(USB_STRING_PRODUCT_DESCRIPTOR));
			break;
		case STR_INDEX_SERIALNUMBER:
			//printf("\n str4     \n");Chap9_BurstTransmitEP0((PUCHAR)&strSerialNum, sizeof(USB_STRING_SERIALNUMBER_DESCRIPTOR));
			break;
		case STR_INDEX_CONFIGURATION:
			//printf("\n str5     \n");Chap9_BurstTransmitEP0((PUCHAR)&strConfiguration, sizeof(USB_STRING_CONFIGURATION_DESCRIPTOR) );
			break;
		case STR_INDEX_INTERFACE:
			//printf("\n str6     \n");Chap9_BurstTransmitEP0((PUCHAR)&strInterface, sizeof(USB_STRING_INTERFACE_DESCRIPTOR) );
			break;
		default:
			//printf("\n str7     \n");Chap9_StallEP0InControlRead();
			break;
		}
	//Mohamed Maged's code starts
	case USB_HID_DESCRIPTOR_TYPE://0x21
		{
            //printf("entering hid descriptor");
		Chap9_BurstTransmitEP0( (PUCHAR)&hidDescr , sizeof(USB_HID_DESCRIPTOR));
		//printf("exiting hid descriptor");
        break;
		}
	case USB_Report_DESCRIPTOR_TYPE://0x21
		{
            printf("sending Report descriptor \n");
		Chap9_BurstTransmitEP0( (PUCHAR)&REPORT_DESCRIPTOR , sizeof(REPORT_DESCRIPTOR));
		//filling Ep01 buffer to generate an EP01 done interrupt
		UCHAR rbuff[4]={0x00,0x0a,0x0b,0x0c};
		Hal4D13_WriteEndpoint(EPINDEX4EP01,(PUCHAR)&rbuff,8);
		//Hal4D13_WriteEndpoint(EPINDEX4EP01,(PUCHAR)&report1,4);
        //printf("exiting report descriptor");
		break;
		}
	
	case USB_INTERFACE_DESCRIPTOR_TYPE:
		{
            //printf("entering interface descriptor");
		Chap9_BurstTransmitEP0( (PUCHAR)&InterfaceDescr , sizeof(USB_INTERFACE_DESCRIPTOR));
		//printf("exiting interface descriptor");
        break;
		}
	
	case USB_ENDPOINT_DESCRIPTOR_TYPE:
		{
            //printf("entering EP descriptor");
		Chap9_BurstTransmitEP0( (PUCHAR)&EP_Descr , sizeof(USB_ENDPOINT_DESCRIPTOR));
		//printf("exiting Ep descriptor");
        break;
		}
	
	//end
	case USB_POWER_DESCRIPTOR_TYPE:
	default:
		Chap9_StallEP0InControlRead();
		break;
	}
}