/*clear device address */
s5p_otg_write_reg(s5p_otg_read_reg(OTG_DCFG) & ~(0x7f << 4),
OTG_DCFG);
+
+ s5p_usb_connected = 0;
}
static int s5p_usb_set_init(void)
if (((status & 0x6) >> 1) == USB_HIGH) {
s5p_usb_set_max_pktsize(USB_HIGH);
} else if (((status & 0x6) >> 1) == USB_FULL) {
- puts("Error: Don't support Full_Speed\n");
- return 0;
+ s5p_usb_set_max_pktsize(USB_FULL);
} else {
puts("Error: Neither High_Speed nor Full_Speed\n");
return 0;
s5p_otg_write_reg(int_status, OTG_GINTSTS);
if (int_status & INT_RESET) {
+ debug("INT RESET\n");
s5p_otg_write_reg(INT_RESET, OTG_GINTSTS);
s5p_usb_reset();
- debug("INT RESET\n");
}
if (int_status & INT_ENUMDONE) {
- s5p_otg_write_reg(INT_ENUMDONE, OTG_GINTSTS);
debug("INT ENUMDONE\n");
+ s5p_otg_write_reg(INT_ENUMDONE, OTG_GINTSTS);
tmp = s5p_usb_set_init();
if (tmp == 0)
/*clear device address */
s5p_otg_write_reg(s5p_otg_read_reg(OTG_DCFG) & ~(0x7f << 4),
OTG_DCFG);
+
+ s5p_usb_connected = 0;
}
static int s5p_usb_set_init(void)
if (((status & 0x6) >> 1) == USB_HIGH) {
s5p_usb_set_max_pktsize(USB_HIGH);
} else if (((status & 0x6) >> 1) == USB_FULL) {
- puts("Error: Don't support Full_Speed\n");
- return 0;
+ s5p_usb_set_max_pktsize(USB_FULL);
} else {
puts("Error: Neither High_Speed nor Full_Speed\n");
return 0;
#endif
}
-static void down_cancel(void)
+static void down_cancel(int mode)
{
#ifdef CONFIG_S5PC1XXFB
if (!s5p_no_lcd_support()) {
exit_font();
/* clear fb */
- fb_clear(100);
+ fb_clear(120);
}
#endif
- run_command("run ubifsboot", 0);
+ if (mode)
+ run_command("usbdown", 0);
+ else
+ run_command("run ubifsboot", 0);
}
/*
s5p_usb_clear_irq();
}
+ if (!s5p_usb_connected) {
+ puts("Disconnected!!\n");
+ return 0;
+ }
+
if (s5p_receive_done) {
s5p_receive_done = 0;
return otg.dn_filesize;
/* Receive image by using dma */
recvlen = usbd->recv_data();
- if (recvlen < len) {
+ if (recvlen == 0) {
+ send_ack(usbd, STATUS_ERROR);
+ return 0;
+ } else if (recvlen < len) {
printf("Error: wrong image size -> %d/%d\n",
(int)recvlen, (int)len);
/* init the usb controller */
if (!usbd->usb_init()) {
- usbd->down_cancel();
+ usbd->down_cancel(0);
return 0;
}
mmc = find_mmc_device(usbd->mmc_dev);
return 0;
}
} else {
- usbd->down_cancel();
+ usbd->down_cancel(1);
return 0;
}
usbd->recv_setup(usbd->rx_data, usbd->rx_len);
if (usbd->recv_data()) {
- if (process_data(usbd) == 0)
+ if (process_data(usbd) == 0) {
+ usbd->down_cancel(1);
return 0;
+ }
+ } else {
+ usbd->down_cancel(1);
+ return 0;
}
}
void (*set_progress)(int);
void (*cpu_reset)(void);
void (*down_start)(void);
- void (*down_cancel)(void);
+ void (*down_cancel)(int);
};
/* This function is interfaced between USB Device Controller and USB Downloader