USB枚举主函数
0赞
发表于 2012/8/4 0:57:54
阅读(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; i0x20) 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); } }