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