diff --git a/examples/usb.rs b/examples/usb.rs
index 14f4f6287ef591e70d9cbf550c9fbebe1c1d9e00..3b4807962025c2ed234cd18450dd97cf7385b958 100644
--- a/examples/usb.rs
+++ b/examples/usb.rs
@@ -36,10 +36,10 @@ fn main() -> ! {
 
     let p = hal::stm32::Peripherals::take().unwrap();
 
-    // enable usb
+    // enable USB
     p.RCC.ahb2enr.modify(|_, w| w.otgfsen().set_bit());
 
-    // reset usb
+    // reset USB
     p.RCC.ahb2rstr.modify(|_, w| w.otgfsrst().set_bit());
     p.RCC.ahb2rstr.modify(|_, w| w.otgfsrst().clear_bit());
 
@@ -47,28 +47,37 @@ fn main() -> ! {
 
     let gpiod = p.GPIOD.split(); // enables clock to gpio d
 
-    // for the usb connect
+    // for the USB FS Detection
     let gpiog = p.GPIOG.split(); // enables cloc to gpio g
-    let mut usb_connect = gpiog.pg6.into_push_pull_output();
-
-    // for the usb D+/D-, page 68 data sheet
+    let mut usb_fs = gpiog.pg6.into_push_pull_output();
+    usb_fs.set_high();
+    //let mut usb_fs = gpiog.pg6.into_input().internal_pull_up(true);
+    //usb_fs.set_high();
+    
+
+    // USB Pin Setup
+    // PA8,..PA12, page 68 data sheet
     let gpioa = p.GPIOA.split(); // enables clock to gpio a
-    let mut pa12 = gpioa
-        .pa12
-        .into_alternate_af10()
-        .set_speed(stm32f4xx_hal::gpio::Speed::VeryHigh)
-        .internal_pull_up(false); // api broken, false implies 00 neither pull up/pull down
 
+    // Notice, API broken, internal_pull_up(false) implies 00 neither pull no pull down
+    let mut pa9 = gpioa.pa9.into_analog(); // USB_FS_VBUS input
+    let mut pa8 = gpioa.pa8.into_alternate_af10(); // USB_FS_SOF
+    let mut pa10 = gpioa.pa10.into_alternate_af10(); // USB_FS_ID
     let mut pa11 = gpioa
         .pa11
         .into_alternate_af10()
         .set_speed(stm32f4xx_hal::gpio::Speed::VeryHigh)
-        .internal_pull_up(false); // api broken, false implies 00 neither pull up/pull down
+        .internal_pull_up(false); // USB_FS_DM
+    let mut pa12 = gpioa
+        .pa12
+        .into_alternate_af10()
+        .set_speed(stm32f4xx_hal::gpio::Speed::VeryHigh)
+        .internal_pull_up(false); // USB_FS_DP
 
     let clocks = rcc
         .cfgr
         .use_hse(8.mhz())
-        .sysclk(96.mhz()) // to itm
+        .sysclk(96.mhz()) // to core/itm
         .pclk1(48.mhz())
         .pclk2(96.mhz())
         .use_usb()
@@ -76,6 +85,22 @@ fn main() -> ! {
 
     iprintln!(stim, "after freeze");
 
+    // Setup sequence according to 33.6.1
+    // Glabal interrupt
+    // p.OTG_FS_GLOBAL
+    //     .fs_gahbcfg
+    //     .modify(|_, w| w.gint().set_bit().txfelvl().set_bit());
+
+    // glabal interrupt enable
+    p.OTG_FS_GLOBAL.fs_gahbcfg.modify(|_, w| w.gint().set_bit());
+    // otgp->PCGCCTL = 0;
+    p.OTG_FS_PWRCLK.fs_pcgcctl.write(|w| unsafe { w.bits(0) });
+    // otgp->GOTGCTL = GOTGCTL_BVALOEN | GOTGCTL_BVALOVAL;
+
+    // // p.OTG_FS_GLOBAL.fs_gintsts.modify(|_,w| w.gint().set_bit());
+    // was not possible to understand, follow chibi
+    //
+
     //       /* - Forced device mode.
     //      - USB turn-around time = TRDT_VALUE_FS.
     //      - Full Speed 1.1 PHY.*/
@@ -92,10 +117,12 @@ fn main() -> ! {
     //   otgp->DCFG = 0x02200000 | DCFG_DSPD_FS11;
     // $6 = 0x0220 0003
     // reset value + 3 = fs
+    // should have enum
     p.OTG_FS_DEVICE
         .fs_dcfg
         .write(|w| unsafe { w.dspd().bits(0b11) });
 
+    // Seral
     let tx = gpiod.pd8.into_alternate_af7();
     let rx = gpiod.pd9.into_alternate_af7();
 
@@ -110,9 +137,9 @@ fn main() -> ! {
     // disconnect usb
     // usb_connect.
     iprintln!(stim, "before delay");
-    usb_connect.set_low();
+    p.OTG_FS_DEVICE.fs_dctl.modify(|_, w| w.sdis().clear_bit());
     cortex_m::asm::delay(clocks.sysclk().0);
-    usb_connect.set_high();
+    p.OTG_FS_DEVICE.fs_dctl.modify(|_, w| w.sdis().set_bit());
     iprintln!(stim, "after delay");
 
     // Separate out the sender and receiver of the serial port