void run_loop() { while (1) { protocol_with_recv_frame(^uint8 (protocol_frame* frame) { switch (frame->id) { case TERMINATE_ID: _terminate(0); break; case CHECK_REQ_ID: handle_check(frame); break; case QUERY_REQ_ID: handle_query(); break; case DOUBLE_REQ_ID: handle_double(frame); break; default: handle_unrecognized_id(frame->id); return 0; }; return 1; }); }
void handle_cmd(struct usb_ep *ep,struct usb_request *req) { struct cloner *cloner = req->context; if(req->status == -ECONNRESET) { cloner->ack = -ECONNRESET; return; } if (req->actual != req->length) { printf("cmd transfer length is err req->actual = %d, req->length = %d\n", req->actual,req->length); cloner->ack = -EIO; return; } union cmd *cmd = req->buf; debug_cond(BURNNER_DEBUG,"handle_cmd type=%x\n",cloner->cmd_type); switch(cloner->cmd_type) { case VR_UPDATE_CFG: cloner->args_req->length = cmd->update.length; usb_ep_queue(cloner->ep_out, cloner->args_req, 0); break; case VR_WRITE: realloc_buf(cloner, cmd->write.length); cloner->write_req->length = cmd->write.length; usb_ep_queue(cloner->ep_out, cloner->write_req, 0); break; case VR_INIT: if(!cloner->inited) { cloner->ack = -EBUSY; cloner_init(cloner); cloner->inited = 1; cloner->ack = 0; } break; case VR_READ: handle_read(cloner); break; case VR_GET_CRC: if (!cloner->ack) usb_ep_queue(cloner->ep_in, cloner->read_req, 0); break; case VR_SYNC_TIME: cloner->ack = rtc_set(&cloner->cmd->rtc); break; case VR_CHECK: cloner->ack = handle_check(cloner); break; case VR_GET_CHIP_ID: case VR_GET_USER_ID: case VR_GET_ACK: case VR_GET_CPU_INFO: case VR_SET_DATA_ADDR: case VR_SET_DATA_LEN: break; case VR_REBOOT: #ifdef CONFIG_FPGA mdelay(1000); do_udc_reset(); mdelay(10000); #endif do_reset(NULL,0,0,NULL); break; case VR_POWEROFF: burner_set_reset_tag(); do_reset(NULL,0,0,NULL); break; } }