2 * USB Downloader for SAMSUNG Platform
4 * Copyright (C) 2007-2010 Samsung Electronics
5 * Minkyu Kang <mk7.kang@samsung.com>
15 #define PUTS(s) serial_puts(DEBUG_MARK"usb: "s)
20 static struct usbd_ops usbd_ops;
21 static unsigned long down_ram_addr;
23 int update_boot_image(void)
25 struct onenand_op *onenand_ops = onenand_get_interface();
29 /* case: IPL, Recovery, u-boot are one file */
31 len = CONFIG_RECOVERY_SIZE + CONFIG_RECOVERY_ADDR;
33 /* case: IPL, Recover are one file and u-boot is another */
34 offset = CONFIG_RECOVERY_ADDR;
35 len = CONFIG_RECOVERY_SIZE;
38 onenand_ops->erase(offset, len, 0);
40 onenand_ops->write(offset, len, NULL, (u_char *)down_ram_addr);
45 /* Parsing received data packet and Process data */
46 static int process_data(struct usbd_ops *usbd)
48 ulong cmd = 0, arg = 0, len = 0, flag = 0;
54 cmd = *((ulong *) usbd->rx_data + 0);
55 arg = *((ulong *) usbd->rx_data + 1);
56 len = *((ulong *) usbd->rx_data + 2);
57 flag = *((ulong *) usbd->rx_data + 3);
60 *((ulong *) usbd->tx_data) = 0;
63 case COMMAND_DOWNLOAD_IMAGE:
64 PUTS("COMMAND_DOWNLOAD_IMAGE\n");
65 usbd->recv_setup((char *)down_ram_addr, (int)len);
68 usbd->send_data(usbd->tx_data, usbd->tx_len);
71 recvlen = usbd->recv_data();
73 /* Retry this commad */
75 PUTS("Error: wrong image size\n");
76 *((ulong *) usbd->tx_data) = STATUS_RETRY;
78 *((ulong *) usbd->tx_data) = STATUS_DONE;
80 usbd->send_data(usbd->tx_data, usbd->tx_len);
83 case COMMAND_PARTITION_SYNC:
84 *((ulong *) usbd->tx_data) = CONFIG_RECOVERY_BOOT_BLOCKS - 1;
85 usbd->send_data(usbd->tx_data, usbd->tx_len);
88 case COMMAND_WRITE_PART_1:
89 PUTS("COMMAND_WRITE_PART_BOOT\n");
93 /* Download complete -> reset */
94 case COMMAND_RESET_PDA:
95 PUTS("Download finished and Auto reset!\n");
96 PUTS("Wait........\n");
106 case COMMAND_RESET_USB:
107 PUTS("Error is occured!(maybe previous step)->\
108 Turn off and restart!\n");
117 /* Erase and Write to NAND */
129 /* Retry this commad */
130 *((ulong *) usbd->tx_data) = STATUS_RETRY;
131 usbd->send_data(usbd->tx_data, usbd->tx_len);
134 *((ulong *) usbd->tx_data) = STATUS_DONE;
136 /* Write image success -> Report status */
137 usbd->send_data(usbd->tx_data, usbd->tx_len);
142 int do_usbd_down(void)
144 struct usbd_ops *usbd;
146 PUTS("USB Downloader\n");
147 /* interface setting */
148 usbd = usbd_set_interface(&usbd_ops);
149 down_ram_addr = usbd->ram_addr;
151 /* init the usb controller */
154 /* receive setting */
155 usbd->recv_setup(usbd->rx_data, usbd->rx_len);
157 /* detect the download request from Host PC */
158 if (usbd->recv_data())
159 usbd->send_data(usbd->tx_data, usbd->tx_len);
163 PUTS("Receive the packet\n");
165 /* receive the data from Host PC */
167 usbd->recv_setup(usbd->rx_data, usbd->rx_len);
169 if (usbd->recv_data()) {
170 if (process_data(usbd) == 0)