Example #1
0
        // ------------------------------------------- #
        //          Static Functions
        // ------------------------------------------- #
        //
        // Return an array of all mbed boards connected
        //
        // [staticmethod]
        public static List <IDapAccessLink> get_connected_devices()
        {
            List <IDapAccessLink> all_daplinks = new List <IDapAccessLink>();
            var all_interfaces = DapAccessConsts._get_interfaces();

            foreach (var anInterface in all_interfaces)
            {
                try
                {
                    var           unique_id   = DapAccessConsts._get_unique_id(anInterface);
                    DapAccessLink new_daplink = new DapAccessLink(unique_id);
                    all_daplinks.Add(new_daplink);
                }
                catch
                {
                    //var logger = logging.getLogger(@__name__);
                    Trace.TraceError("Failed to get unique id");
                }
            }
            return(all_daplinks);
        }
Example #2
0
 public Transfer(
     DapAccessLink daplink,
     byte dap_index,
     UInt16 transfer_count,
     EDapTransferRequestByte transfer_request,
     List <UInt32> transfer_data)
 {
     // Writes should not need a transfer object
     // since they don't have any response data
     Debug.Assert((transfer_request & EDapTransferRequestByte.READ) != 0);
     this.daplink          = daplink;
     this.dap_index        = dap_index;
     this.transfer_count   = transfer_count;
     this.transfer_request = transfer_request;
     this.transfer_data    = transfer_data;
     this._size_bytes      = 0;
     if ((transfer_request & EDapTransferRequestByte.READ) != 0)
     {
         this._size_bytes = (UInt32)(transfer_count * 4);
     }
     this._result = null;
     this._error  = null;
 }
Example #3
0
        static void Main(string[] args)
        {
            // {
            //     byte[] bin = File.ReadAllBytes(@"c:\Projects\MOAP\RandD\VK_PyOCD\VK_pyOCD_Ported\Targets\STM32F7x_1024.bin");
            //     Debug.Assert(bin.Length % 4 == 0);
            //     UInt32[] uints = new UInt32[bin.Length / 4];
            //     Buffer.BlockCopy(bin, 0, uints, 0, bin.Length);
            //     foreach (UInt32 uin in uints)
            //     {
            //         Trace.TraceInformation("0x{0:X8}", uin);
            //     }
            // }

            // // List<IDapAccessLink> links = DapAccessLink.get_connected_devices();
            // // Debug.Assert(links.Count > 0);

            // GUID is an example, specify your own unique GUID in the .inf file
            USBDeviceInfo[] details = USBDevice.GetDevices("{CDB3B5AD-293B-4663-AA36-1AAE46463776}");
            USBDeviceInfo   match   = details.First(info => info.VID == 0xC251 && info.PID == 0xF00A);
            BackendWinUsb   backend = new BackendWinUsb(match);
            IDapAccessLink  link    = new DapAccessLink("WINUSB1", backend); // links.First();

            // IDapAccessLink link = links.First();
            link.open();
            link.set_clock(300000); // Typically 1.8..2.0 MHz is fastest speed allowed
            link.connect();
            ////link.set_deferred_transfer(true);
            link.set_deferred_transfer(false);
            {
                var ver = link.identify(EDapInfoIDByte.FW_VER);
                if (ver is string)
                {
                    ver = ((string)ver).TrimEnd('\0');
                }
                Trace.TraceInformation("CMSIS-DAP Firmware Version: {0}", ver);
            }

            {
                object capabilities = link.identify(EDapInfoIDByte.CAPABILITIES);
                //                 Available transfer protocols to target:
                //
                //                 Info0 - Bit 0: 1 = SWD Serial Wire Debug communication is implemented (0 = SWD Commands not implemented).
                // Info0 - Bit 1: 1 = JTAG communication is implemented (0 = JTAG Commands not implemented).
                // Serial Wire Trace(SWO) support:
                //
                //                 Info0 - Bit 2: 1 = SWO UART - UART Serial Wire Output is implemented (0 = not implemented).
                // Info0 - Bit 3: 1 = SWO Manchester - Manchester Serial Wire Output is implemented (0 = not implemented).
                // Command extensions for transfer protocol:
                //
                // Info0 - Bit 4: 1 = Atomic Commands - Atomic Commands support is implemented (0 = Atomic Commands not implemented).
                // Time synchronisation via Test Domain Timer:
                //
                // Info0 - Bit 5: 1 = Test Domain Timer -debug unit support for Test Domain Timer is implemented (0 = not implemented).
                // SWO Streaming Trace support:
                //
                // Info0 - Bit 6: 1 = SWO Streaming Trace is implemented (0 = not implemented).
                UInt16 flags = (capabilities is byte) ? (byte)capabilities : (UInt16)capabilities;
                if ((flags & 0x0001) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: SWD Serial Wire Debug communication is implemented");
                }
                if ((flags & 0x0002) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: JTAG communication is implemented");
                }
                if ((flags & 0x0004) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: SWO UART - UART Serial Wire Output is implemented");
                }
                if ((flags & 0x0008) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: SWO Manchester - Manchester Serial Wire Output is implemented");
                }
                if ((flags & 0x0010) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: Atomic Commands - Atomic Commands support is implemented");
                }
                if ((flags & 0x0020) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: Test Domain Timer -debug unit support for Test Domain Timer is implemented");
                }
                if ((flags & 0x0040) != 0)
                {
                    Trace.TraceInformation("CAPABILITY: SWO Streaming Trace is implemented");
                }
            }

            string uniqueID = link.get_unique_id();

            Targets.Target_W7500.W7500 w = new Targets.Target_W7500.W7500(link);
            //Targets.Target_STM32F7x_1024.STM32F7x_1024 w = new Targets.Target_STM32F7x_1024.STM32F7x_1024(link);
            w.init();
            w.halt();
            {
                ETargetState s = w.getState();
                Debug.Assert(s == ETargetState.TARGET_HALTED);
            }
            w.resetStopOnReset();
            {
                ETargetState s = w.getState();
                Debug.Assert(s == ETargetState.TARGET_HALTED);
            }

            {
                UInt32 idcode = w.readIDCode();
                //                     STM32                   Wiznet
                Debug.Assert(idcode == 0x5BA02477 || idcode == 0x0bb11477);
            }
            //58.341]  < sequence name = "DebugCoreStart" Pname = "" disable = "false" info = "" >
            //      [15:43:58.341] < block atomic = "false" info = "" >
            //      [15:43:58.341]
            w.write32(0xE000EDF0, 0xA05F0001);                                        // Enable Core Debug via DHCSR
                                                                                      //[15:43:58.342]        // -> [Write32(0xE000EDF0, 0xA05F0001)] (__dp=0, __ap=0)
                                                                                      //[15:43:58.342] Write32(0xE0042004, DbgMCU_CR);                                         // DBGMCU_CR: Configure MCU Debug
                                                                                      // [15:43:58.342]        // -> [Write32(0xE0042004, 0x00000007)] (__dp=0, __ap=0)
            w.write32(0xE0042004, 0x00000007);
            //[15:43:58.342] Write32(0xE0042008, DbgMCU_APB1_Fz);                                    // DBGMCU_APB1_FZ: Configure APB1 Peripheral Freeze Behavior
            //[15:43:58.343]        // -> [Write32(0xE0042008, 0x00000000)] (__dp=0, __ap=0)
            w.write32(0xE0042008, 0x00000000);
            //[15:43:58.343] Write32(0xE004200C, DbgMCU_APB2_Fz);                                    // DBGMCU_APB1_FZ: Configure APB2 Peripheral Freeze Behavior
            w.write32(0xE004200C, 0x00000000);
            //[15:43:58.343]        // -> [Write32(0xE004200C, 0x00000000)] (__dp=0, __ap=0)
            //[15:43:58.343]    </block>
            //[15:43:58.344]  </sequence>


            //#define PERIPH_BASE            0x40000000U /*!< Base address of : AHB/ABP Peripherals                                                   */
            // AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000U)
            // RCC_BASE              (AHB1PERIPH_BASE + 0x3800U)
            /* Reset the RCC clock configuration to the default reset state ------------*/
            /*!< RCC clock control register,                                  Address offset: 0x00 */
            /* Set HSION bit */
            // w.write32(0x40023800, 1);// RCC->CR |= (uint32_t)0x00000001;
            // /* Reset CFGR register RCC clock configuration register,                            Address offset: 0x08 */
            // w.write32(0x40023808, 0); //RCC->CFGR = 0x00000000;
            //                           // /* Reset HSEON, CSSON and PLLON bits */
            // w.write32(0x40023800, 0xFEF6FFFF); //RCC->CR &= (uint32_t)0xFEF6FFFF;
            //                                    /* Reset PLLCFGR register RCC PLL configuration register,                              Address offset: 0x04 */
            //
            // w.write32(0x40023804, 0x24003010); // RCC->PLLCFGR = 0x24003010;
            //                                    /* Reset HSEBYP bit */
            // w.write32(0x40023800, w.read32(0x40023804)() & 0xFFFBFFFF); //// RCC->CR &= (uint32_t)0xFFFBFFFF;
            //                                                             /* Disable all interrupts RCC clock interrupt register,                                Address offset: 0x0C */
            //
            // w.write32(0x4002380C, 0); // RCC->CIR = 0x00000000;



            // 0xE0042000 DEBUG_MCU base
            // 0x08 APB1FZ
            w.write32(0xE0042008, 0); // DbgMCU_APB1_Fz = 0x00000000;
            w.write32(0xE004200C, 0); // DbgMCU_APB2_Fz = 0x00000000;

            //UInt32 scbVtor = w.read32(0xE000ED08)();
            // 0xE000ED08 // SCB->VTOR vector table offset
            w.write32(0xE000ED08, 0x20010000);

            {
                /////
                //// #define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */
                //// #define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */
                //// SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */
                //unchecked
                //{
                //    w.write32(0xE000ED24, (UInt32)~(1 << 16));
                //}
                //w.write32(0xE000ED94, 0); // MPU->CR disable
                UInt32 mpuEnabled = w.read32(0xE000ED94)();
            }



            w.write32(0xE0042004, 0x00000007);
            //w.write32(0xE0042004, 0x00000027);

            // # Stop watchdog counters during halt
            // # DBGMCU_APB1_FZ |= DBG_IWDG_STOP | DBG_WWDG_STOP
            //w.write32(0xE0042008, 0x00001800 );
            //w.write32(0xE004200C, 0x00001800);

            {
                // 0xE000EDF0 Core Debug base
                // 0x00C DEMCR
                // Core Debug -> DEMCR & ~ (1 << DEMCR_MON_EN_Pos )  bit offset 16
                UInt32 demcr = w.read32(0xE000EDFC)();
                demcr &= ~((UInt32)1 << 16);
                w.write32(0xE000EDFC, demcr);
            }

            //Flash.Flash flash = new Targets.Target_STM32F7x_1024.Flash_STM32F7x_1024(w);
            Flash.Flash flash = new Targets.Target_W7500.Flash_w7500(w);
            flash.setFlashAlgoDebug(false); // flash.setFlashAlgoDebug(true);

            w.setFlash(flash);
            {
                w.flash.init();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                w.flash.eraseAll();
                sw.Stop();
                // Trace.TraceInformation("Chip erase speed is {0:0.000} s", sw.Elapsed.TotalSeconds);
            }
            {
                List <byte> l  = new List <byte>();
                Stopwatch   sw = new Stopwatch();
                sw.Start();
                //l.AddRange(w.readBlockMemoryUnaligned8(0x00000000, 49508));
                l.AddRange(w.readBlockMemoryUnaligned8(0x00000000, 128 * 1024));
                sw.Stop();
                Trace.TraceInformation("Reading speed is {0:0.000} kB/s", ((double)128 * 1024 / 1024.0) / sw.Elapsed.TotalSeconds);
                if (l.Any(b => b != 0xFF))
                {
                    Trace.TraceError("Erasing failed ..");
                }
                ;
                //byte[] bytes = l.ToArray();
                //File.WriteAllBytes(@"C:\temp\flash.bin", bytes);
            }

            //
            byte[] bytes = File.ReadAllBytes(@"c:\temp\flash.bin");
            {
                w.flash.flashBinary(
                    bytes,
                    smart_flash: false,
                    chip_erase: true, // meaning that chip erase is already done
                    fast_verify: false);
            }


            {
                List <byte> l  = new List <byte>();
                Stopwatch   sw = new Stopwatch();
                sw.Start();
                l.AddRange(w.readBlockMemoryUnaligned8(0x00000000, (UInt32)bytes.Length));
                //l.AddRange(w.readBlockMemoryUnaligned8(0x08000000, (UInt32)bytes.Length));
                sw.Stop();
                Trace.TraceInformation("Reading speed is {0:0.000} kB/s", ((double)bytes.Length / 1024.0) / sw.Elapsed.TotalSeconds);
                var ar = l.ToArray();
                File.WriteAllBytes(@"C:\TEMP\BIN.BIN", ar);
            }

            /*
             *
             * //var i = w.isRunning();
             * // w.setBreakpoint(0x00007840);
             * // w.resume();
             * // while (!w.isHalted())
             * // {
             * //     Trace.TraceInformation("... waiting for breakpoint ...");
             * //     //Thread.Sleep(1);
             * // }
             * //w.flush();
             * //var isRunning = w.isRunning();
             * //Debug.Assert(!isRunning);
             * //w.halt();
             * //var isHalted = w.isHalted();
             * //Debug.Assert(isHalted);
             * // w.removeBreakpoint(0x00007840);
             * {
             *  Stopwatch sw = new Stopwatch();
             *  sw.Start();
             *  //// for (int i = 0; i < 1000; i++)
             *  //// {
             *  ////     //var x = CoreSight.CortexM.CORE_REGISTER;
             *  ////     UInt32 pc = w.readCoreRegister("pc");
             *  ////     //Trace.TraceInformation("pc: {0:X8}", pc);
             *  ////     w.step(true);
             *  //// }
             *  double totalBytes = 0;
             *  for (int i = 0; i < 10; i++)
             *  {
             *      List<UInt32> z = w.readBlockMemoryAligned32(0x20000000, 0x1000);
             *      totalBytes += z.Count * 4;
             *  }
             *  sw.Stop();
             *  Trace.TraceInformation("Reading speed is {0:0.000} bytes/s", totalBytes / sw.Elapsed.TotalSeconds);
             * }
             * //var i = w.isRunning();
             */
        }