1 /******************************************************************************
2 ** File Name: usb_boot.c *
3 ** Author: Daniel.Ding *
5 ** Copyright: 2005 Spreatrum, Incoporated. All Rights Reserved. *
7 *****************************************************************************/
8 /******************************************************************************
10 **---------------------------------------------------------------------------*
11 ** DATE NAME DESCRIPTION *
12 ** 3/25/2005 Daniel.Ding Create. *
13 *****************************************************************************/
14 /*----------------------------------------------------------------------------*
16 **---------------------------------------------------------------------------*/
17 #include <asm/arch/usb_boot.h>
18 #include <asm/arch/drv_usb.h>
19 #include <asm/arch/virtual_com.h>
20 #include <asm/arch/fdl_crc.h>
21 #include <asm/arch/fdl_channel.h>
22 #include <asm/arch/usb20_reg_v3.h>
23 /**---------------------------------------------------------------------------*
25 **---------------------------------------------------------------------------*/
30 /*----------------------------------------------------------------------------*
31 ** Mcaro Definitions *
32 **---------------------------------------------------------------------------*/
34 #if (defined CONFIG_SC8830) || (defined CONFIG_SC9630)
35 #define AHB_CTRL0 (0x20D00000)
42 #define AHB_CTRL0 (0x20900200)
45 #define AHB_CONTROL_REG3 (0x2090020c)
46 #define CLK_USB_REF_SEL BIT_1
47 #define USB_S_HBIGENDIAN BIT_2
48 #define CLK_USB_REF_EN BIT_6
49 //#define AHB_SOFT_RST (0x20900210)
50 //#define USBPHY_SOFT_RST BIT_7
51 //#define AHB_ARM_CLK (0x20900224)
53 #define USB_BUFF_SIZE 0x4000
54 /*----------------------------------------------------------------------------*
56 **---------------------------------------------------------------------------*/
58 /*--------------------------- Local Data ------------------------------------*/
59 LOCAL __align(32) uint8 s_usb_snd_buff[USB_BUFF_SIZE];
60 /*--------------------------- Global Data -----------------------------------*/
61 /*--------------------------- External Data ---------------------------------*/
62 extern void usb_core_init (void);
63 /*----------------------------------------------------------------------------*
64 ** Local Function Prototype *
65 **---------------------------------------------------------------------------*/
67 void usb_write (unsigned char *write_buf, unsigned int write_len);
68 void usb_init (unsigned long ext_clk26M);
70 #if !(defined( CONFIG_SC8830) || defined(CONFIG_SC9630))
71 static void SetPllClock (void)
74 clk = * (volatile uint32 *) (AHB_ARM_CLK);
75 clk &= ~ ( (3 << 23) | (7 << 4) | (7));
76 clk |= ( (1 << 23) | (1 << 4) | (0));
78 * (volatile uint32 *) (AHB_ARM_CLK) = clk;
81 /*****************************************************************************/
83 // Global resource dependence:
84 // Author: Daniel.Ding
86 /*****************************************************************************/
87 void usb_init (unsigned long ext_clk26M)
89 #if !(defined( CONFIG_SC8830) || defined(CONFIG_SC9630))
90 #if (!defined(_LITTLE_ENDIAN) && !defined(CHIP_ENDIAN_LITTLE))
91 *(volatile uint32 *)AHB_CONTROL_REG3 |= USB_S_HBIGENDIAN; //master AHB interface: Big Endian
93 *(volatile uint32 *)AHB_CONTROL_REG3 &= ~USB_S_HBIGENDIAN; //master AHB interface: Little Endian
97 *(volatile uint32 *)AHB_CTRL0 |= USBD_EN; // usbd enable
100 /*****************************************************************************/
102 // Global resource dependence:
103 // Author: Daniel.Ding
105 /*****************************************************************************/
106 void usb_boot (uint32 ext_clk26M)
108 usb_init (ext_clk26M);
110 void usb_varinit (void)
114 /*****************************************************************************/
116 // Global resource dependence:
119 /*****************************************************************************/
120 PUBLIC void usb_ldo_enable (BOOLEAN is_usb_ldo_enabled)
122 volatile unsigned long usb_ldo = 0;
124 // usb_ldo = *(volatile unsigned long *)(GLOBAL_CTL_LDO);
126 if (is_usb_ldo_enabled)
128 usb_ldo &= ~ (BIT_10);
134 usb_ldo &= ~ (BIT_11);
137 //*(volatile unsigned long *)(GLOBAL_CTL_LDO) = usb_ldo;
141 /*****************************************************************************/
143 // Global resource dependence:
144 // Author: Daniel.Ding
146 /*****************************************************************************/
147 void usb_write (unsigned char *write_buf,unsigned int write_len)
149 memcpy (s_usb_snd_buff, write_buf, write_len);
150 USB_EPxSendData (USB_EP5 , (unsigned int *) s_usb_snd_buff, write_len);
152 extern char VCOM_GetChar (void);
153 extern int VCOM_GetSingleChar (void);
154 extern int VCOM_Read(unsigned char *buf, unsigned int len);
156 static int FDL_UsbOpen (struct FDL_ChannelHandler *channel, unsigned int baudrate)
160 static int FDL_UsbRead (struct FDL_ChannelHandler *channel, unsigned char *buf, unsigned int len)
162 return VCOM_Read(buf, len);
164 static char FDL_UsbGetChar (struct FDL_ChannelHandler *channel)
166 return VCOM_GetChar();
168 static int FDL_UsbGetSingleChar (struct FDL_ChannelHandler *channel)
170 return VCOM_GetSingleChar();
172 static int FDL_UsbWrite (struct FDL_ChannelHandler *channel, const unsigned char *buf, unsigned int len)
174 usb_write ( (unsigned char *) buf, len);
178 static int FDL_UsbPutChar (struct FDL_ChannelHandler *channel, const unsigned char ch)
180 s_usb_snd_buff[0] = ch;
182 USB_EPxSendData (USB_EP3 , (unsigned int *) &s_usb_snd_buff, 1);
186 static int FDL_UsbSetBaudrate (struct FDL_ChannelHandler *channel, unsigned int baudrate)
190 static int FDL_UsbClose (struct FDL_ChannelHandler *channel)
194 struct FDL_ChannelHandler gUSBChannel =
199 FDL_UsbGetSingleChar,
207 /**---------------------------------------------------------------------------*
209 **---------------------------------------------------------------------------*/