小磷光一

USB枚举主函数

0
阅读(1846)

 

void main(void)//page 121
{
	int i = 0;
	int len = 0;
	volatile int intt_status = 0;
	volatile int ep_status = 0;
	struct usb_dev usb_dev;
	usb_dev.controler = &usb_isp1362_dc;
	
	Set_PLL(15,5);
	isp1362_ebiuinit();
	Init_SDRAM();
	Setup_LEDs();
	Leda_Off();
	usbpf_init();
	irq_init();
	UART_setbaudrate(9600);
	UART_init();	
	printf("USB enumerate Start!\r\n");
	
	if ( isp1362_dc_probe(&usb_isp1362_dc) != 0 ){
//		printf("isp1362 is absent!\r\n");
		exit(1);
	}
	isp1362_dc_init(&usb_isp1362_dc);		
	while(1){
		intt_status = dc_read_intt_status(&usb_isp1362_dc);
	//	printf("intt_status = 0x%x\r\n", intt_status);

		if (intt_status & 0x01){
			printf("bus reset\r\n");
			dc_endpoint_cfg(&usb_isp1362_dc);
		}
			
		if (intt_status & 0x100){
			ep_status = dc_read_ep_status(&usb_isp1362_dc, 0);//clear interrupt
	//		printf("epout_status = 0x%x\r\n", ep_status);
			ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
	//		printf("epin_status = 0x%x\r\n", ep_status);
			
			len = dc_read_ep(&usb_isp1362_dc, buff, 64, 0);
			for (i=0; i 0x20)
						len = 0x20;
					dc_write_ep(&usb_isp1362_dc, (void *)&config_descriptor, len, 1);
				}
				else if (buff[3] == 0x06){
					int len = buff[6];
					if (len > 0x0a)
						len = 0x0a;
					dc_write_ep(&usb_isp1362_dc, (void *)&device_qualifier_descriptor, len, 1);
				}
				else{
					ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
					dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0, 1);
				}
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
			}
			//set address
			if ( (buff[0] == 0x00) && (buff[1] == 0x05) ){
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
				dc_enable_address(&usb_isp1362_dc);
				dc_set_address(&usb_isp1362_dc, buff[2]);
				dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0, 1);
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
			}
			//set configuration
			if ( (buff[1] == 0x09) && (buff[2] == 0x01) ){
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
				dc_write_ep(&usb_isp1362_dc, (void *)&device_descriptor, 0, 1);
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
				dc_endpoint_cfg(&usb_isp1362_dc);
			}
			if ( (buff[0] == 0xa1) && (buff[1] == 0xfe) ){
				ep_status = dc_read_ep_status(&usb_isp1362_dc, 1);//clear interrupt
				dc_write_ep(&usb_isp1362_dc, (void *)&flag, 1, 1);
				do{
					intt_status = dc_read_intt_status(&usb_isp1362_dc);
				}while(intt_status != 0x200);
			}
			dc_unstall_ep(&usb_isp1362_dc, 1);
		}
		if (intt_status & 0x200){
			len = len;
		}
		memset(buff, 0, 512);
	}
}