27 #define NULINK_READ_TIMEOUT  LIBUSB_TIMEOUT_MS 
   29 #define NULINK_HID_MAX_SIZE   (64) 
   30 #define NULINK2_HID_MAX_SIZE   (1024) 
   31 #define V6M_MAX_COMMAND_LENGTH (NULINK_HID_MAX_SIZE - 2) 
   32 #define V7M_MAX_COMMAND_LENGTH (NULINK_HID_MAX_SIZE - 3) 
   34 #define NULINK2_USB_PID1  (0x5200) 
   35 #define NULINK2_USB_PID2  (0x5201) 
   49     int (*
xfer)(
void *handle, uint8_t *buf, 
int size);
 
   54 #define CMD_READ_REG                0xB5UL 
   55 #define CMD_READ_RAM                0xB1UL 
   56 #define CMD_WRITE_REG               0xB8UL 
   57 #define CMD_WRITE_RAM               0xB9UL 
   58 #define CMD_CHECK_ID                0xA3UL 
   59 #define CMD_MCU_RESET               0xE2UL 
   60 #define CMD_CHECK_MCU_STOP          0xD8UL 
   61 #define CMD_MCU_STEP_RUN            0xD1UL 
   62 #define CMD_MCU_STOP_RUN            0xD2UL 
   63 #define CMD_MCU_FREE_RUN            0xD3UL 
   64 #define CMD_SET_CONFIG              0xA2UL 
   66 #define ARM_SRAM_BASE               0x20000000UL 
   68 #define HARDWARE_CONFIG_NULINKPRO   1 
   69 #define HARDWARE_CONFIG_NULINK2     2 
  202     LOG_INFO(
"Nu-Link firmware_version %" PRIu32 
", product_id (0x%08" PRIx32 
")",
 
  208         LOG_INFO(
"Adapter is Nu-Link-Pro, target_voltage_mv(%" PRIu16 
"), usb_voltage_mv(%" PRIu16 
")",
 
  239     LOG_INFO(
"IDCODE: 0x%08" PRIX32, *idcode);
 
  248     LOG_DEBUG(
"nulink_usb_write_debug_reg 0x%08" PRIX32 
" 0x%08" PRIX32, 
addr, val);
 
  485     uint32_t bytes_remaining = 12;
 
  488     LOG_DEBUG(
"nulink_usb_read_mem8: addr 0x%08" PRIx32 
", len %" PRId16, 
addr, len);
 
  494         uint32_t aligned_addr = 
addr / 4;
 
  495         aligned_addr = aligned_addr * 4;
 
  497         LOG_DEBUG(
"nulink_usb_read_mem8: unaligned address addr 0x%08" PRIx32
 
  498                 "/aligned addr 0x%08" PRIx32 
" offset %" PRIu32,
 
  507         if (len < bytes_remaining)
 
  508             bytes_remaining = len;
 
  532         for (
unsigned int i = 0; i < 
count; i++) {
 
  551         for (
unsigned int i = 0; i < 
count; i++) {
 
  555                 memcpy(
buffer + 2 * i, h->
databuf + 4 * (2 * i + 1), len - 2);
 
  558         if (len >= bytes_remaining)
 
  559             len -= bytes_remaining;
 
  570     uint32_t bytes_remaining = 12;
 
  573     LOG_DEBUG(
"nulink_usb_write_mem8: addr 0x%08" PRIx32 
", len %" PRIu16, 
addr, len);
 
  579         uint32_t aligned_addr = 
addr / 4;
 
  580         aligned_addr = aligned_addr * 4;
 
  582         LOG_DEBUG(
"nulink_usb_write_mem8: address not aligned. addr(0x%08" PRIx32
 
  583                 ")/aligned_addr(0x%08" PRIx32 
")/offset(%" PRIu32 
")",
 
  592         if (len < bytes_remaining)
 
  593             bytes_remaining = len;
 
  617         for (
unsigned int i = 0; i < 
count; i++) {
 
  623             u32buffer = (u32buffer << 
offset * 8);
 
  631                         LOG_DEBUG(
"nulink_usb_write_mem8: count(%u), mask: 0xFFFFFF00", i);
 
  634                         LOG_DEBUG(
"nulink_usb_write_mem8: count(%u), mask: 0xFFFF0000", i);
 
  639                         LOG_DEBUG(
"nulink_usb_write_mem8: count(%u), mask: 0xFF00FFFF", i);
 
  643                         LOG_DEBUG(
"nulink_usb_write_mem8: count(%u), mask: 0x0000FFFF", i);
 
  649                     LOG_DEBUG(
"nulink_usb_write_mem8: count(%u), mask: 0xFFFF0000", i);
 
  652                     LOG_DEBUG(
"nulink_usb_write_mem8: count(%u), mask: 0x00000000", i);
 
  666         if (len >= bytes_remaining)
 
  667             len -= bytes_remaining;
 
  677     uint32_t bytes_remaining = 12;
 
  683     if (len % 4 || 
addr % 4) {
 
  689         if (len < bytes_remaining)
 
  690             bytes_remaining = len;
 
  692         unsigned int count = bytes_remaining / 4;
 
  711         for (
unsigned int i = 0; i < 
count; i++) {
 
  728         for (
unsigned int i = 0; i < 
count; i++) {
 
  733         if (len >= bytes_remaining)
 
  734             len -= bytes_remaining;
 
  746     uint32_t bytes_remaining = 12;
 
  752     if (len % 4 || 
addr % 4) {
 
  758         if (len < bytes_remaining)
 
  759             bytes_remaining = len;
 
  761         unsigned int count = bytes_remaining / 4;
 
  780         for (
unsigned int i = 0; i < 
count; i++) {
 
  799         if (len >= bytes_remaining)
 
  800             len -= bytes_remaining;
 
  810     uint32_t max_tar_block = (tar_autoincr_block - ((tar_autoincr_block - 1) & address));
 
  812     if (max_tar_block == 0)
 
  815     return max_tar_block;
 
  830         if (
count < bytes_remaining)
 
  831             bytes_remaining = 
count;
 
  833         if (bytes_remaining >= 4)
 
  849                 uint32_t head_bytes = 4 - (
addr % 4);
 
  856                 bytes_remaining -= head_bytes;
 
  859             if (bytes_remaining % 4)
 
  870         buffer += bytes_remaining;
 
  871         addr += bytes_remaining;
 
  872         count -= bytes_remaining;
 
  885         LOG_DEBUG(
"nulink_usb_write_mem: address below ARM_SRAM_BASE, not supported.\n");
 
  895         if (
count < bytes_remaining)
 
  896             bytes_remaining = 
count;
 
  898         if (bytes_remaining >= 4)
 
  914                 uint32_t head_bytes = 4 - (
addr % 4);
 
  921                 bytes_remaining -= head_bytes;
 
  924             if (bytes_remaining % 4)
 
  936         buffer += bytes_remaining;
 
  937         addr += bytes_remaining;
 
  938         count -= bytes_remaining;
 
  948     return !strcmp(targetname, 
"cortex_m");
 
  954     unsigned long max_ice_clock = khz;
 
  956     LOG_DEBUG(
"nulink_speed: query %s", query ? 
"yes" : 
"no");
 
  958     if (max_ice_clock > 12000)
 
  959         max_ice_clock = 12000;
 
  960     else if ((max_ice_clock == 3 * 512) || (max_ice_clock == 1500))
 
  961         max_ice_clock = 1500;
 
  962     else if (max_ice_clock >= 1000)
 
  963         max_ice_clock = max_ice_clock / 1000 * 1000;
 
  965         max_ice_clock = max_ice_clock / 100 * 100;
 
  967     LOG_DEBUG(
"Nu-Link nulink_speed: %lu", max_ice_clock);
 
  994             LOG_INFO(
"Nu-Link target_voltage_mv[0](%04" PRIx16 
"), target_voltage_mv[1](%04" PRIx16
 
  995                 "), target_voltage_mv[2](%04" PRIx16 
"), if_target_power_supplied(%d)",
 
 1002     return max_ice_clock;
 
 1023     struct hid_device_info *
devs, *cur_dev;
 
 1024     uint16_t target_vid = 0;
 
 1025     uint16_t target_pid = 0;
 
 1026     wchar_t *target_serial = 
NULL;
 
 1038     if (hid_init() != 0) {
 
 1053         target_serial = calloc(len + 1, 
sizeof(
wchar_t));
 
 1054         if (!target_serial) {
 
 1059         if (mbstowcs(target_serial, 
serial, len + 1) == (
size_t)(-1)) {
 
 1061             free(target_serial);
 
 1062             target_serial = 
NULL;
 
 1066     devs = hid_enumerate(0, 0);
 
 1072             if (
param->
vid[i] == cur_dev->vendor_id && 
param->
pid[i] == cur_dev->product_id) {
 
 1081             if (cur_dev->serial_number && wcscmp(target_serial, cur_dev->serial_number) == 0)
 
 1085         cur_dev = cur_dev->next;
 
 1088         target_vid = cur_dev->vendor_id;
 
 1089         target_pid = cur_dev->product_id;
 
 1092     hid_free_enumeration(
devs);
 
 1094     if (target_vid == 0 && target_pid == 0) {
 
 1099     hid_device *dev = hid_open(target_vid, target_pid, target_serial);
 
 1101         LOG_ERROR(
"unable to open Nu-Link device 0x%" PRIx16 
":0x%" PRIx16, target_vid, target_pid);
 
 1108     switch (target_pid) {
 
 1128         LOG_DEBUG(
"nulink_usb_version failed with cmdSize(4 * 5)");
 
 1132             LOG_DEBUG(
"nulink_usb_version failed with cmdSize(4 * 6)");
 
 1142     LOG_DEBUG(
"nulink_usb_open: we manually perform nulink_usb_reset");
 
 1147     free(target_serial);
 
 1152     free(target_serial);
 
const char * adapter_get_required_serial(void)
Retrieves the serial number set with command 'adapter serial'.
 
static struct aice_port_param_s param
 
Support functions to access arbitrary bits in a byte array.
 
static uint32_t buf_get_u32(const uint8_t *_buffer, unsigned first, unsigned num)
Retrieves num bits from _buffer, starting at the first bit, returning the bits in a 32-bit word.
 
static struct libusb_device ** devs
The usb device list.
 
#define LOG_WARNING(expr ...)
 
#define LOG_ERROR(expr ...)
 
#define LOG_INFO(expr ...)
 
#define LOG_DEBUG(expr ...)
 
static int nulink_usb_write_debug_reg(void *handle, uint32_t addr, uint32_t val)
 
static int nulink_usb_assert_srst(void *handle, int srst)
 
static int nulink2_usb_xfer(void *handle, uint8_t *buf, int size)
 
#define CMD_CHECK_MCU_STOP
 
#define HARDWARE_CONFIG_NULINKPRO
 
static int nulink_usb_read_mem32(void *handle, uint32_t addr, uint16_t len, uint8_t *buffer)
 
struct hl_layout_api_s nulink_usb_layout_api
 
static int nulink_usb_version(void *handle)
 
static int nulink1_usb_xfer(void *handle, uint8_t *buf, int size)
 
#define NULINK_READ_TIMEOUT
 
static uint32_t nulink_max_block_size(uint32_t tar_autoincr_block, uint32_t address)
 
static int nulink_usb_xfer(void *handle, uint8_t *buf, int size)
 
#define NULINK_HID_MAX_SIZE
 
static int nulink_speed(void *handle, int khz, bool query)
 
static int nulink_usb_run(void *handle)
 
#define NULINK2_HID_MAX_SIZE
 
#define V6M_MAX_COMMAND_LENGTH
 
static int nulink_usb_reset(void *handle)
 
static void nulink2_usb_init_buffer(void *handle, uint32_t size)
 
static int nulink_usb_read_mem(void *handle, uint32_t addr, uint32_t size, uint32_t count, uint8_t *buffer)
 
static int nulink_usb_open(struct hl_interface_param_s *param, void **fd)
 
static void nulink_usb_init_buffer(void *handle, uint32_t size)
 
static int nulink_usb_idcode(void *handle, uint32_t *idcode)
 
static int nulink_usb_close(void *handle)
 
#define V7M_MAX_COMMAND_LENGTH
 
static int nulink_usb_write_reg(void *handle, unsigned int regsel, uint32_t val)
 
static int nulink_usb_read_mem8(void *handle, uint32_t addr, uint16_t len, uint8_t *buffer)
 
static int nulink_usb_halt(void *handle)
 
static int nulink_usb_override_target(const char *targetname)
 
static int nulink_usb_write_mem(void *handle, uint32_t addr, uint32_t size, uint32_t count, const uint8_t *buffer)
 
static int nulink_usb_write_mem8(void *handle, uint32_t addr, uint16_t len, const uint8_t *buffer)
 
static int nulink_usb_write_mem32(void *handle, uint32_t addr, uint16_t len, const uint8_t *buffer)
 
static void nulink1_usb_init_buffer(void *handle, uint32_t size)
 
static int nulink_usb_xfer_rw(void *handle, uint8_t *buf)
 
#define HARDWARE_CONFIG_NULINK2
 
static int nulink_usb_step(void *handle)
 
static enum target_state nulink_usb_state(void *handle)
 
static int nulink_usb_read_reg(void *handle, unsigned int regsel, uint32_t *val)
 
size_t size
Size of the control block search area.
 
int(* open)(struct hl_interface_param_s *param, void **handle)
 
uint8_t databuf[NULINK2_HID_MAX_SIZE]
 
void(* init_buffer)(void *handle, uint32_t size)
 
uint8_t tempbuf[NULINK2_HID_MAX_SIZE]
 
int(* xfer)(void *handle, uint8_t *buf, int size)
 
uint8_t cmdbuf[NULINK2_HID_MAX_SIZE+1]
 
#define ERROR_TARGET_UNALIGNED_ACCESS
 
static uint16_t le_to_h_u16(const uint8_t *buf)
 
static void h_u32_to_le(uint8_t *buf, uint32_t val)
 
static void h_u16_to_le(uint8_t *buf, uint16_t val)
 
static uint32_t le_to_h_u32(const uint8_t *buf)