1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
diff --git a/firmware/target/arm/as3525/usb-drv-as3525v2.c b/firmware/target/arm/as3525/usb-drv-as3525v2.c
index a1ea7e3..e54191c 100644
--- a/firmware/target/arm/as3525/usb-drv-as3525v2.c
+++ b/firmware/target/arm/as3525/usb-drv-as3525v2.c
@@ -108,7 +108,7 @@ void usb_attach(void)
     usb_enable(true);
 }

-static void usb_delay(void)
+static inline void usb_delay(void)
 {
     int i = 0;
     while(i < 0x300)
@@ -125,10 +125,11 @@ static void as3525v2_connect(void)
     bitset32(&CGU_PERI, CGU_USB_CLOCK_ENABLE);
     usb_delay();
     /* 2) enable usb phy clock */
+    CCU_USB = (CCU_USB & ~(3<<24)) | (1 << 24); /* ?? */
     /* PHY clock */
-    CGU_USB = 1<<5 /* enable */
-        | (CLK_DIV(AS3525_PLLA_FREQ, 60000000)) << 2
-        | 1; /* source = PLLA */
+    CGU_USB = 1<<5  /* enable */
+        | 0 << 2    /* no divider */
+        | 0;        /* source = ?? */
     usb_delay();
     /* 3) clear "stop pclk" */
     PCGCCTL &= ~0x1;
@@ -156,9 +157,10 @@ static void as3525v2_connect(void)
     GUSBCFG |= GUSBCFG_force_device_mode;
     usb_delay();
     /* 11) Do something that is probably CCU related but undocumented*/
-    CCU_USB &= ~0x1000;
-    usb_delay();
-    CCU_USB &= ~0x300000;
+    CCU_USB &= ~(1<<12);
+    nop;nop;nop;nop;nop;
+    nop;nop;nop;nop;nop;
+    CCU_USB &= ~(3<<20);
     usb_delay();
     /* 12) reset usb core parameters (dev addr, speed, ...) */
     DCFG = 0;
@@ -457,6 +459,8 @@ void usb_drv_exit(void)

 static void handle_ep_int(int ep, bool dir_in)
 {
+    panicf("EP %d %s", ep, dir_in ? "in" : "out");
+
     struct usb_endpoint *endpoint = &endpoints[ep][dir_in];
     if(dir_in)
     {