2 * Copyright (C) 2009 Samsung Electronics
3 * Minkyu Kang <mk7.kang@samsung.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of
8 * the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24 #include "usb-hs-otg.h"
25 #ifdef CONFIG_S5PC1XXFB
29 static char tx_data[8] = "MPL";
30 static long tx_len = 4;
32 static char rx_data[2048];
33 static long rx_len = 64;
35 extern int s5p_receive_done;
36 extern int s5p_usb_connected;
39 static int __usb_board_init(void)
44 int usb_board_init(void) __attribute__((weak, alias("__usb_board_init")));
46 /* clear download informations */
47 static void s5p_usb_clear_dnfile_info(void)
54 /* clear upload informations */
55 static void s5p_usb_clear_upfile_info(void)
62 /* start the usb controller */
63 static void usb_init(void)
65 if (usb_board_init()) {
66 printf("Failed to usb_board_init\n");
70 #ifdef CONFIG_S5PC1XXFB
72 set_font_color(FONT_WHITE);
73 fb_printf("Ready to USB Connection\n");
79 printf("USB Start!! - %s Speed\n",
80 otg.speed ? "Full" : "High");
82 while (!s5p_usb_connected) {
83 if (s5p_usb_detect_irq()) {
89 s5p_usb_clear_dnfile_info();
91 printf("Connected!!\n");
93 #ifdef CONFIG_S5PC1XXFB
94 fb_printf("Download Start\n");
95 draw_progress(40, 0, FONT_WHITE);
99 static void usb_stop(void)
102 #ifdef CONFIG_S5PC1XXFB
105 /* it uses fb3 as default window. */
106 s5pc_fimd_lcd_off(3);
107 s5pc_fimd_window_off(3);
112 * receive the packet from host PC
113 * return received size
115 static int usb_receive_packet(void)
118 if (s5p_usb_detect_irq()) {
123 if (s5p_receive_done) {
124 s5p_receive_done = 0;
125 return otg.dn_filesize;
130 /* setup the download informations */
131 static void recv_setup(char *addr, int len)
133 s5p_usb_clear_dnfile_info();
135 otg.dn_addr = (u32)addr;
136 otg.dn_ptr = (u8 *) addr;
137 otg.dn_filesize = len;
140 #ifdef CONFIG_GENERIC_MMC
143 static void usbd_set_mmc_dev(struct usbd_ops *usbd)
149 usbd->mmc_max = 0x400;
150 /* get from mmc->capacity?? */
151 usbd->mmc_total = 0xf50000; /* 8GB / 0x200 */
153 mmc = find_mmc_device(usbd->mmc_dev);
156 usbd->mmc_blk = mmc->read_bl_len;
160 #ifdef CONFIG_S5PC1XXFB
161 static void set_progress(int progress)
163 draw_progress(40, progress, FONT_WHITE);
167 * This function is interfaced between
168 * USB Device Controller and USB Downloader
170 struct usbd_ops *usbd_set_interface(struct usbd_ops *usbd)
172 usbd->usb_init = usb_init;
173 usbd->usb_stop = usb_stop;
174 usbd->send_data = s5p_usb_tx;
175 usbd->recv_data = usb_receive_packet;
176 usbd->recv_setup = recv_setup;
177 usbd->tx_data = tx_data;
178 usbd->rx_data = rx_data;
179 usbd->tx_len = tx_len;
180 usbd->rx_len = rx_len;
181 usbd->ram_addr = CONFIG_SYS_DOWN_ADDR;
182 #ifdef CONFIG_S5PC1XXFB
183 usbd->set_progress = set_progress;
185 #ifdef CONFIG_GENERIC_MMC
186 usbd_set_mmc_dev(usbd);