From patchwork Sat Nov 18 18:01:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: tgotic X-Patchwork-Id: 839361 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=flashrom.org (client-ip=80.81.252.135; helo=mail.coreboot.org; envelope-from=flashrom-bounces@flashrom.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="ugT6uzbZ"; dkim-atps=neutral Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yg5L316Nfz9s76 for ; Mon, 20 Nov 2017 08:57:15 +1100 (AEDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1eGXZZ-0002zq-Ce; Sun, 19 Nov 2017 22:56:17 +0100 Received: from mail-pg0-f46.google.com ([74.125.83.46]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.86_2) (envelope-from ) id 1eG7RB-0003fm-Li for flashrom@flashrom.org; Sat, 18 Nov 2017 19:02:08 +0100 Received: by mail-pg0-f46.google.com with SMTP id r12so4261508pgu.10 for ; Sat, 18 Nov 2017 10:01:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:message-id:date:user-agent:mime-version :content-language; bh=ezp+dciPrtfcWJqevmogLJ7lhMqMabYUXA1szYmZrdE=; b=ugT6uzbZYyxdREcNu7QaELf7D/kMwu8bmJ1WaIBpq/SHVg9O8oA9UlOAaCug9Cd46H mhGV4SiayECfYHkHsWF63W2bBsaoQmQqOUf1swGDJDvpzEIVTL2Nbh/iVqM0vR+pTDom iJwUqWlyk0sTHrH63SGHDFTp+I6en/H4JUzrnL6cCWshdEGxZfWiJbBq7CLA9UqHzDyA NkN0ZB2sr9xyWH0rjc5Cinm+Bd4juIVwLtfZvG+t1buFdUlYor973wk2Lf9GyA+r2sIc oE2+L2D6WH0eZZclej3r7VXrKCZntUTlubBnOZ1tWS8BaEmjj/6mD/lvBGh3UEg5qedo QTzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:message-id:date:user-agent :mime-version:content-language; bh=ezp+dciPrtfcWJqevmogLJ7lhMqMabYUXA1szYmZrdE=; b=Fdlsuuc5kM02ZHRKrb8pvXEW84cUPCApwqdRNwvzrxW775dORCsF9GHDuIaW4w+T9X ULWGnRyBqnONAwZoOYIwpOfNRt3CWmcQcdZfmTGYRQgbVkAHmb2EqO23ggQ6h/Fpn3V5 6uAdK8u74A9xCf5eDy1P6sOulivQEjdAe2JIQSKia5KOFtBzRwB2lgwrrJ4vlBN6LW7c 0LS0S4VkQMNgcMKhOnTX51qij1C6BUIAO8yqG5XwqzEJI8nZgtumA2WFYid2FlNzTYJ3 uGPQLROJmYPg8kg2qgFCnQ5RVYWmCNjIh/XRjVCMFITKtKx1GS/0nBeNB3muvo4MCZQS J3WQ== X-Gm-Message-State: AJaThX6IsHTN9QmfV8vPtQ6+S13vsFpHk3RNDfqehTsdRj72j7BhwdCe I9Of9r83SpxHxretNG68g2Fy0g== X-Google-Smtp-Source: AGs4zMZo0wyleopJQzIpsmAuIAnfhD4WxS4Z8mHmK4E0O7BHP2xkrqU4PveapX0gdOYEYlscu+0dVg== X-Received: by 10.84.128.197 with SMTP id a63mr9095956pla.340.1511028110884; Sat, 18 Nov 2017 10:01:50 -0800 (PST) Received: from [10.71.7.204] ([185.121.200.242]) by smtp.gmail.com with ESMTPSA id 15sm16706936pfm.158.2017.11.18.10.01.47 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 18 Nov 2017 10:01:50 -0800 (PST) From: tgotic To: flashrom@flashrom.org Message-ID: <77d8d24d-827f-3ffd-ecce-7488126a97b8@gmail.com> Date: Sat, 18 Nov 2017 19:01:41 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 Content-Language: en-US X-Spam-Score: -2.3 (--) X-Mailman-Approved-At: Sun, 19 Nov 2017 22:56:12 +0100 Subject: [flashrom] Move PicKit2 form libusb0 to libusb X-BeenThere: flashrom@flashrom.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: flashrom discussion and development mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: flashrom-bounces@flashrom.org Sender: "flashrom" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff Hi, Recently I tried to use flashrom with PicKit2 on Windows. I was unable to get it working with various libusb0 dll's, so I rewrote pickit2_spi.c to use libusb (form libusb.info). Since other external USB programmers use libusb, flashrom doesn't depend on obsolete libusb0 anymore. Please find attached new pickit2_spi.c, patch for Makefile, and a result of write operation. Signed-off-by: Tomislav Gotić /* * This file is part of the flashrom project. * * Copyright (C) 2010 Carl-Daniel Hailfinger * Copyright (C) 2014 Justin Chevrier * Copyright (C) 2017 Tomislav Gotic * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Connections are as follows: * * +------+-----+----------+ * | SPI | Pin | PICkit2 | * +------+-----+----------+ * | /CS | 1 | VPP/MCLR | * | VCC | 2 | VDD | * | GND | 3 | GND | * | MISO | 4 | PGD | * | SCLK | 5 | PDC | * | MOSI | 6 | AUX | * +------+-----+----------+ * * Inspiration and some specifics of the interface came via the AVRDude * PICkit2 code: https://github.com/steve-m/avrdude/blob/master/pickit2.c */ #include "platform.h" #include #include #include #include #include #include #include "flash.h" #include "chipdrivers.h" #include "programmer.h" #include "spi.h" const struct dev_entry devs_pickit2_spi[] = { {0x04D8, 0x0033, OK, "Microchip", "PICkit 2"}, {} }; struct libusb_context *usb_ctx; static libusb_device_handle *pickit2_handle; /* Default USB transaction timeout in ms */ #define DFLT_TIMEOUT 1000U #define MB1 1048576U #define KB8 8192U #define PICKIT2_SCLK_MAX_kHz 1000U #define PICKIT2_Vdd_MIN_mV 2500 #define PICKIT2_Vdd_MAX_mV 5000 #define PICKIT2_ERR_MASK_LO 0x30 #define PICKIT2_ERR_MASK_HI 0xFC #define ENDPOINT_OUT 0x01 #define ENDPOINT_IN 0x81 #define USB_PACKET_LENGTH 64U #define CMD_FIRMWARE_VERSION 0x76 #define CMD_SET_VDD 0xA0 #define CMD_SET_VPP 0xA1 #define CMD_READ_STATUS 0xA2 #define CMD_READ_VDD_VPP 0xA3 #define CMD_DOWNLOAD_SCRIPT 0xA4 #define CMD_RUN_SCRIPT 0xA5 #define CMD_EXEC_SCRIPT 0xA6 #define CMD_CLR_DOWNLOAD_BUFFER 0xA7 #define CMD_DOWNLOAD_DATA 0xA8 #define CMD_CLR_UPLOAD_BUFFER 0xA9 #define CMD_UPLOAD_DATA 0xAA #define CMD_CLR_SCRIPT_BUFFER 0xAB #define CMD_UPLOAD_DATA_NO_LEN 0xAC #define CMD_END_OF_BUFFER 0xAD #define SCR_SPI_READ_BUFFER 0xC5 #define SCR_SPI_WRITE_BUFFER 0xC6 #define SCR_SPI_WRITE_LIT 0xC7 #define SCR_SET_AUX 0xCF #define SCR_DELAY_LONG 0xE8 #define SCR_LOOP 0xE9 #define SCR_SET_ICSP_CLK_PERIOD 0xEA #define SCR_SET_PINS 0xF3 #define SCR_BUSY_LED_OFF 0xF4 #define SCR_BUSY_LED_ON 0xF5 #define SCR_MCLR_GND_Q_OFF 0xF6 #define SCR_MCLR_GND_Q_ON 0xF7 #define SCR_VPP_PWM_OFF 0xF8 #define SCR_VPP_PWM_ON 0xF9 #define SCR_VPP_Q_OFF 0xFA #define SCR_VPP_Q_ON 0xFB #define SCR_VDD_OFF 0xFE #define SCR_VDD_ON 0xFF #define RUN_SCR_SPI_CS_HI 1U #define RUN_SCR_SPI_WRITE 2U #define RUN_SCR_SPI_READ 3U #define RUN_SCR_SPI_STATUS_REG 4U #define RUN_SCR_LED_ON 5U /* Might be useful for other USB devices as well. static for now. * device parameter allows user to specify one device of multiple installed */ static struct libusb_device_handle *get_device_by_vid_pid_number(uint16_t vid, uint16_t pid, unsigned int num) { struct libusb_device **list; ssize_t count = libusb_get_device_list(usb_ctx, &list); if (count < 0) { msg_perr("Getting the USB device list failed (%s)!\n", libusb_error_name(count)); return NULL; } struct libusb_device_handle *handle = NULL; ssize_t i = 0; for (i = 0; i < count; i++) { struct libusb_device *dev = list[i]; struct libusb_device_descriptor desc; int err = libusb_get_device_descriptor(dev, &desc); if (err != 0) { msg_perr("Reading the USB device descriptor failed (%s)!\n", libusb_error_name(err)); libusb_free_device_list(list, 1); return NULL; } if ((desc.idVendor == vid) && (desc.idProduct == pid)) { msg_pinfo("Found USB device %04"PRIx16":%04"PRIx16" at address %d-%d.\n", desc.idVendor, desc.idProduct, libusb_get_bus_number(dev), libusb_get_device_address(dev)); if (num == 0) { err = libusb_open(dev, &handle); if (err != 0) { msg_perr("Opening the USB device failed (%s)!\n", libusb_error_name(err)); libusb_free_device_list(list, 1); return NULL; } break; } num--; } } libusb_free_device_list(list, 1); return handle; } static int pickit2_get_firmware_version(void) { int ret, transferred = 0; uint8_t command[USB_PACKET_LENGTH] = {CMD_FIRMWARE_VERSION, CMD_END_OF_BUFFER}; ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret == 0) { ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret == 0) { msg_pinfo("PICkit2 Firmware Version: %"PRIu8".%"PRIu8".%"PRIu8"\n", command[0], command[1], command[2]); return 0; } } msg_perr("PicKit2 Get Firmware Version Command failed (%s)!\n", libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } static int pickit2_get_status() { int ret, transferred = 0; uint8_t command[USB_PACKET_LENGTH] = {CMD_READ_STATUS, CMD_END_OF_BUFFER}; ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret == 0) { ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret == 0) { msg_pinfo("PICkit2 status(0x%"PRIx8" 0x%"PRIx8"):", command[0], command[1]); if (command[0] & 0x40) msg_pinfo("BTN,"); if (command[0] & 0x20) msg_perr("VPP ERR,"); if (command[0] & 0x10) msg_perr("VDD ERR,"); if (command[0] & 0x08) msg_pinfo("/CS Hi,"); if (command[0] & 0x04) msg_pinfo("/CS Low"); if (command[0] & 0x02) msg_pinfo("VDD OFF,"); if (command[0] & 0x01) msg_pinfo("VDD GND,"); if (command[1] & 0x80) msg_perr("DL FULL ERR,"); if (command[1] & 0x40) msg_perr("SCR ERR,"); if (command[1] & 0x20) msg_perr("SCR EMPTY ERR,"); if (command[1] & 0x10) msg_perr("SCR DL EMPTY ERR,"); if (command[1] & 0x08) msg_perr("SCR UL FULL ERR,"); if (command[1] & 0x04) msg_perr("ICD TOUT ERR"); if (command[1] & 0x02) msg_pinfo("UART On,"); if (command[1] & 0x01) msg_pinfo("RESET"); msg_pinfo("\n"); return 0; } } msg_perr("PicKit2 Read Status Command failed (%s)!\n", libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } static int pickit2_check_errors() { int ret, transferred = 0; uint8_t command[USB_PACKET_LENGTH] = { CMD_READ_STATUS, CMD_RUN_SCRIPT, RUN_SCR_LED_ON, 1, CMD_END_OF_BUFFER }; ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret == 0) { ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret == 0) { if ((command[0] & PICKIT2_ERR_MASK_LO) || (command[1] & PICKIT2_ERR_MASK_HI)) { msg_perr("PicKit Status Errors: 0x%"PRIx8" 0x%"PRIx8"!\n", (command[0] & PICKIT2_ERR_MASK_LO), (command[1] & PICKIT2_ERR_MASK_HI)); return SPI_PROGRAMMER_ERROR; } return 0; } } msg_perr("PicKit2 Read Status Command failed (%s)!\n", libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } static int pickit2_set_spi_voltage(int millivolt) { double voltage_selector = millivolt / 1000.0; if ((millivolt < PICKIT2_Vdd_MIN_mV) || (millivolt > PICKIT2_Vdd_MAX_mV)) { msg_perr("Cannot set Vdd to %.3fV! Aborting.\n", voltage_selector); return SPI_PROGRAMMER_ERROR; } msg_pdbg("Setting Vdd voltage to %.3f V\n", voltage_selector); uint8_t command[USB_PACKET_LENGTH] = { CMD_SET_VDD, voltage_selector * 2048 + 672, (voltage_selector * 2048 + 672) / 256, voltage_selector * 36, CMD_SET_VPP, 0x40, voltage_selector * 18.61, voltage_selector * 13, CMD_END_OF_BUFFER }; int transferred = 0; int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("PicKit2 Set SPI Vdd Command failed (%s)!\n", libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } return 0; } static int pickit2_set_spi_speed(unsigned int spispeed) { uint8_t command[USB_PACKET_LENGTH] = { CMD_EXEC_SCRIPT, 2, SCR_SET_ICSP_CLK_PERIOD, (uint8_t)(PICKIT2_SCLK_MAX_kHz / spispeed), CMD_END_OF_BUFFER }; int transferred = 0; int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("PicKit2 Set SPI Speed Command failed (%s)!\n", libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } msg_pdbg("SPI CLK frequency %0.3f kHz\n", (1.0f / (int)(PICKIT2_SCLK_MAX_kHz / spispeed)) * 1000.0f); return 0; } static int pickit2_spi_send_command(struct flashctx __attribute__((unused))*flash, unsigned int writecnt, unsigned int readcnt, const unsigned char *writearr, unsigned char *readarr) { int ret, transferred = 0; unsigned int i = 0, n, cnt8k = 0, cnt1M = 0; uint8_t buf[USB_PACKET_LENGTH] = { 0 }; /* Write Flash instruction and data to PicKit2's Download buffer (256B). * Write Instruction (02b xx xx xx) and Flash data can be larger than download buffer. * Instruction and data are sent in 64B USB packets and executed when received. * SCLK must be > 10kHz to avoid download buffer overflow. * Each USB interrupt packet is sent in 1ms time slots. * At 1MHz SCLK, USB transfer is slower than PicKit2 to chip transfer. * Try to minimize number of USB transfers and maximize USB payload. */ if (writecnt > 1) { do { n = (writecnt > 52) ? 52 : writecnt; /* 256 / 5 + 1 */ buf[i++] = CMD_DOWNLOAD_DATA; buf[i++] = n; memcpy(buf + i, writearr, n); i += n; buf[i++] = CMD_RUN_SCRIPT; buf[i++] = RUN_SCR_SPI_WRITE; buf[i++] = n; /* Number of times to run SPI_WRITE script */ /* 3 = CS# Hi, 4 = READ_DATA */ if ((writecnt > 52) || (USB_PACKET_LENGTH < i + 3 + (readcnt ? 4 : 0))) { if (i < USB_PACKET_LENGTH) buf[i] = CMD_END_OF_BUFFER; /* msg_pdbg2("pickit2_spi_send_command!w%u/%u!%ub\n", n, writecnt, i); */ ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("PicKit2 Send Write Script failed, sent %d %s!\n", transferred, libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } i = 0; } writecnt -= n; writearr += n; } while (writecnt); } else if (writecnt == 1) { /* while checking status register, don't change data in the DOWNLOAD buffer*/ if (writearr[0] == JEDEC_RDSR) { buf[i++] = CMD_RUN_SCRIPT; buf[i++] = RUN_SCR_SPI_STATUS_REG; buf[i++] = 1; } else { buf[i++] = CMD_EXEC_SCRIPT; buf[i++] = 4; /* CS# Low */ buf[i++] = SCR_VPP_Q_OFF; buf[i++] = SCR_MCLR_GND_Q_ON; buf[i++] = SCR_SPI_WRITE_LIT; buf[i++] = writearr[0]; } } do { if (readcnt) { n = (readcnt > USB_PACKET_LENGTH) ? USB_PACKET_LENGTH : readcnt; /* max 64B in one packet */ buf[i++] = CMD_RUN_SCRIPT; buf[i++] = RUN_SCR_SPI_READ; buf[i++] = n; /* Number of times to run SPI_READ script / bytes to read */ buf[i++] = CMD_UPLOAD_DATA_NO_LEN; /* Fetch data from Upload Buffer */ } /* last USB packet/no packets to read, set CS# Hi */ if (readcnt <= USB_PACKET_LENGTH) { /* CS# High */ buf[i++] = CMD_RUN_SCRIPT; buf[i++] = RUN_SCR_SPI_CS_HI; buf[i++] = 1; } /* mark end of commands */ if (i < USB_PACKET_LENGTH) buf[i] = CMD_END_OF_BUFFER; //msg_pdbg2("pickit2_spi_send_command!w63!%ub\n", i); /* send commands to PicKit2 and Flash */ ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("PicKit2 Send Read Script failed, sent %d %s!\n", transferred, libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } i = 0; if (readcnt) { /* Get data from PicKit2 or from Flash */ ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_IN, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("PicKit2 Read Data failed, expected %u, got %d %s!\n", n, transferred, libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } if (USB_PACKET_LENGTH == transferred) { memcpy(readarr, buf, n); readcnt -= n; readarr += n; cnt8k += n; cnt1M += n; } else { msg_perr("PicKit2 Data error, expected %u/%u, got %d %s!\n", n, USB_PACKET_LENGTH, transferred, libusb_error_name(ret)); return SPI_INVALID_LENGTH; } if (cnt1M / MB1) { msg_pdbg2("*\n"); cnt1M -= MB1; cnt8k = cnt1M; } if (cnt8k / KB8) { msg_pdbg2("."); cnt8k -= KB8; } } } while (readcnt); return pickit2_check_errors(); } /* Copied from dediprog.c */ /* Might be useful for other USB devices as well. static for now. */ static int parse_voltage(char *voltage) { char *tmp = NULL; int i; int millivolt = 0, fraction = 0; if (!(voltage && *voltage)) { msg_perr("Empty voltage= specified.\n"); return -1; } millivolt = (int)strtol(voltage, &tmp, 0); voltage = tmp; /* Handle "," and "." as decimal point. Everything after it is assumed * to be in decimal notation. */ if ((*voltage == '.') || (*voltage == ',')) { voltage++; for (i = 0; i < 3; i++) { fraction *= 10; /* Don't advance if the current character is invalid, * but continue multiplying. */ if ((*voltage < '0') || (*voltage > '9')) continue; fraction += *voltage - '0'; voltage++; } /* Throw away remaining digits. */ voltage += strspn(voltage, "0123456789"); } /* The remaining string must be empty or "mV" or "V". */ tolower_string(voltage); /* No unit or "V". */ if ((*voltage == '\0') || !strncmp(voltage, "v", 1)) { millivolt *= 1000; millivolt += fraction; } else if (!strncmp(voltage, "mv", 2) || !strncmp(voltage, "millivolt", 9)) { /* No adjustment. fraction is discarded. */ } else { /* Garbage at the end of the string. */ msg_perr("Garbage voltage= specified.\n"); return -1; } return millivolt; } static const struct spi_master spi_master_pickit2 = { .type = SPI_CONTROLLER_PICKIT2, .max_data_read = 0xFFFFFF, /* 16MB, read complete chip with one instruction */ .max_data_write = 256, .command = pickit2_spi_send_command, .multicommand = default_spi_send_multicommand, .read = default_spi_read, .write_256 = default_spi_write_256, .write_aai = default_spi_write_aai, }; static int pickit2_shutdown(void __attribute__((unused))*data) { /* Set all pins to float and turn voltages off */ uint8_t command[USB_PACKET_LENGTH] = { CMD_EXEC_SCRIPT, 8, /* CS# float */ SCR_VPP_Q_OFF, SCR_MCLR_GND_Q_OFF, SCR_SET_PINS, 3, /* Bit-0=1(PDC In), Bit-1=1(PGD In), Bit-2=0(PDC LL), Bit-3=0(PGD LL) */ SCR_SET_AUX, 1, /* Bit-0=1(Aux In), Bit-1=0(Aux LL) */ /*SCR_VPP_PWM_OFF,*/ SCR_VDD_OFF, /* Power OFF Vdd */ SCR_BUSY_LED_OFF, /* Turn OFF Busy LED */ CMD_END_OF_BUFFER }; int transferred = 0; int ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, command, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("SPI Shutdown Script failed (%s)!\n", libusb_error_name(ret)); } ret = libusb_release_interface(pickit2_handle, 0); if (ret != 0) { msg_perr("Could not release USB interface (%s)!\n", libusb_error_name(ret)); ret = SPI_GENERIC_ERROR; } libusb_close(pickit2_handle); libusb_exit(usb_ctx); msg_pinfo("Shutdown succeeded\n"); return ret; } int pickit2_spi_init(void) { int usedevice = 0; uint8_t buf[USB_PACKET_LENGTH] = { CMD_EXEC_SCRIPT, 8, /* Script length */ SCR_SET_PINS, 2, /* Bit-0=0(PDC Out), Bit-1=1(PGD In), Bit-2=0(PDC LL), Bit-3=0(PGD LL) */ SCR_SET_AUX, 0, /* Bit-0=0(Aux Out), Bit-1=0(Aux LL) */ SCR_VDD_ON, /* Power ON Vdd */ SCR_MCLR_GND_Q_OFF, /* Let CS# float */ SCR_VPP_Q_ON, /* Pull CS# high */ /*SCR_VPP_PWM_ON,*/ /* no need to Power ON Vpp, CS# is internaly connected to Vdd */ SCR_BUSY_LED_ON, /* Busy LED ON*/ CMD_CLR_DOWNLOAD_BUFFER, CMD_CLR_UPLOAD_BUFFER, CMD_CLR_SCRIPT_BUFFER, CMD_DOWNLOAD_SCRIPT, RUN_SCR_SPI_CS_HI, 2, SCR_MCLR_GND_Q_OFF, SCR_VPP_Q_ON, CMD_DOWNLOAD_SCRIPT, RUN_SCR_SPI_WRITE, 3, SCR_VPP_Q_OFF, SCR_MCLR_GND_Q_ON, SCR_SPI_WRITE_BUFFER, CMD_DOWNLOAD_SCRIPT, RUN_SCR_SPI_READ, 3, SCR_VPP_Q_OFF, SCR_MCLR_GND_Q_ON, SCR_SPI_READ_BUFFER, CMD_DOWNLOAD_SCRIPT, RUN_SCR_SPI_STATUS_REG, 4, SCR_VPP_Q_OFF, SCR_MCLR_GND_Q_ON, SCR_SPI_WRITE_LIT, JEDEC_RDSR, CMD_DOWNLOAD_SCRIPT, RUN_SCR_LED_ON, 1, SCR_BUSY_LED_ON, CMD_END_OF_BUFFER }; unsigned int spispeed = PICKIT2_SCLK_MAX_kHz; /* 1 MHz */ char *spispeed_str = extract_programmer_param("spispeed"); if (spispeed_str != NULL) { char* end_ptr = NULL; errno = 0; spispeed = strtoul(spispeed_str, &end_ptr, 10); if ((errno != 0) || (spispeed_str == end_ptr)) { msg_perr("Error: Could not convert 'spispeed'.\n"); free(spispeed_str); return SPI_GENERIC_ERROR; } if (end_ptr && *end_ptr == 'M') spispeed *= 1000; if ((spispeed == 0) || (spispeed > PICKIT2_SCLK_MAX_kHz) || (spispeed < 10)) { msg_perr("Error: Value for 'spispeed' is out of range.\n"); free(spispeed_str); return SPI_GENERIC_ERROR; } free(spispeed_str); } int millivolt = 3000; char *voltage = extract_programmer_param("voltage"); if (voltage != NULL) { millivolt = parse_voltage(voltage); free(voltage); if (millivolt < 0) return SPI_GENERIC_ERROR; } /* from dediproc.c */ char *device = extract_programmer_param("device"); if (device) { char *dev_suffix = NULL; errno = 0; usedevice = strtol(device, &dev_suffix, 10); if ((errno != 0) || (device == dev_suffix)) { msg_perr("Error: Could not convert 'device'.\n"); free(device); return SPI_GENERIC_ERROR; } if (usedevice < 0) { msg_perr("Error: Value for 'device' is out of range.\n"); free(device); return SPI_GENERIC_ERROR; } if (*dev_suffix) { msg_perr("Error: Garbage following 'device' value.\n"); free(device); return SPI_GENERIC_ERROR; } msg_pinfo("Using device %d.\n", usedevice); } free(device); /* Here comes the USB stuff */ libusb_init(&usb_ctx); if (!usb_ctx) { msg_perr("Could not initialize libusb!\n"); return SPI_PROGRAMMER_ERROR; } const uint16_t vid = devs_pickit2_spi[0].vendor_id; const uint16_t pid = devs_pickit2_spi[0].device_id; pickit2_handle = get_device_by_vid_pid_number(vid, pid, (unsigned int) usedevice); if (pickit2_handle == NULL) { msg_perr("Could not find a PICkit2 on USB!\n"); libusb_exit(usb_ctx); return SPI_PROGRAMMER_ERROR; } int ret = libusb_set_configuration(pickit2_handle, 1); if (ret != 0) { msg_perr("Could not set USB device configuration: %d %s\n", ret, libusb_error_name(ret)); libusb_close(pickit2_handle); libusb_exit(usb_ctx); return SPI_PROGRAMMER_ERROR; } ret = libusb_claim_interface(pickit2_handle, 0); if (ret != 0) { msg_perr("Could not claim USB device interface %d: %d %s\n", 0, ret, libusb_error_name(ret)); libusb_close(pickit2_handle); libusb_exit(usb_ctx); return SPI_PROGRAMMER_ERROR; } if (register_shutdown(pickit2_shutdown, NULL)) { return SPI_PROGRAMMER_ERROR; } if (pickit2_get_status()) return SPI_PROGRAMMER_ERROR; if (pickit2_get_firmware_version()) { return SPI_PROGRAMMER_ERROR; } if (pickit2_set_spi_speed(spispeed)) { return SPI_PROGRAMMER_ERROR; } if (pickit2_set_spi_voltage(millivolt) != 0) { return SPI_PROGRAMMER_ERROR; } /* Perform basic setup. * Configure pin directions and logic levels, turn Vdd on, turn busy LED on, clear buffers and download canned scripts. */ int transferred = 0; ret = libusb_interrupt_transfer(pickit2_handle, ENDPOINT_OUT, buf, USB_PACKET_LENGTH, &transferred, DFLT_TIMEOUT); if (ret != 0) { msg_perr("PicKit2 Setup Command failed (%s)!\n", libusb_error_name(ret)); return SPI_PROGRAMMER_ERROR; } register_spi_master(&spi_master_pickit2); return 0; } $ ./flashrom -VVV -p pickit2_spi -c W25Q64.V -w 64M_8.bin flashrom on Windows 10.0 (x86_64) flashrom is free software, get the source code at https://flashrom.org flashrom was built with GCC 7.2.0, little endian Command line (7 args): D:\dev\src\flashrom\flashrom-1.0-rc1\flashrom.exe -VVV -p pickit2_spi -c W25Q64.V -w 64M_8.bin Calibrating delay loop... OS timer resolution is 15621 usecs, 3729M loops per second, 10 myus = 0 us, 100 myus = 0 us, 1000 myus = 0 us, 10000 myus = 15625 us, 62484 myus = 62483 us, OK. Initializing pickit2_spi programmer Found USB device 04d8:0033 at address 4-25. PICkit2 status(0x0 0x0): PICkit2 Firmware Version: 2.32.0 SPI CLK frequency 1000.000 kHz Setting Vdd voltage to 3.000 V The following protocols are supported: SPI. Probing for Winbond W25Q64.V, 8192 kB: programmer_map_flash_region: mapping W25Q64.V from 0x00000000ff800000 to 0x0000000000000000 RDID returned 0xef 0x40 0x17. probe_spi_rdid_generic: id1 0xef, id2 0x4017 Found Winbond flash chip "W25Q64.V" (8192 kB, SPI) on pickit2_spi. Chip status register is 0x00. programmer_unmap_flash_region: unmapped 0x0000000000000000 This chip may contain one-time programmable memory. flashrom cannot read and may never be able to write it, hence it may not be able to completely clone the contents of this chip (see man page for details). programmer_map_flash_region: mapping W25Q64.V from 0x00000000ff800000 to 0x0000000000000000 Block protection is disabled. Reading old flash chip contents... ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* done. Erasing and writing flash chip... Trying erase function 0... 0x000000-0x000fff:W, 0x001000-0x001fff:W, 0x002000-0x002fff:W, 0x003000-0x003fff:W, 0x004000-0x004fff:W, 0x005000-0x005fff:W, 0x006000-0x006fff:W, 0x007000-0x007fff:W, 0x008000-0x008fff:W, 0x009000-0x009fff:W, 0x00a000-0x00afff:W, 0x00b000-0x00bfff:W, 0x00c000-0x00cfff:W, 0x00d000-0x00dfff:W, 0x00e000-0x00efff:W, 0x00f000-0x00ffff:W, 0x010000-0x010fff:W, 0x011000-0x011fff:W, 0x012000-0x012fff:W, 0x013000-0x013fff:W, 0x014000-0x014fff:W, 0x015000-0x015fff:W, 0x016000-0x016fff:W, 0x017000-0x017fff:W, 0x018000-0x018fff:W, 0x019000-0x019fff:W, 0x01a000-0x01afff:W, 0x01b000-0x01bfff:W, 0x01c000-0x01cfff:W, 0x01d000-0x01dfff:W, 0x01e000-0x01efff:W, 0x01f000-0x01ffff:W, 0x020000-0x020fff:W, 0x021000-0x021fff:W, 0x022000-0x022fff:W, 0x023000-0x023fff:W, 0x024000-0x024fff:W, 0x025000-0x025fff:W, 0x026000-0x026fff:W, 0x027000-0x027fff:W, 0x028000-0x028fff:W, 0x029000-0x029fff:W, 0x02a000-0x02afff:W, 0x02b000-0x02bfff:W, 0x02c000-0x02cfff:W, 0x02d000-0x02dfff:W, 0x02e000-0x02efff:W, 0x02f000-0x02ffff:W, 0x030000-0x030fff:W, 0x031000-0x031fff:W, 0x032000-0x032fff:W, 0x033000-0x033fff:W, 0x034000-0x034fff:W, 0x035000-0x035fff:W, 0x036000-0x036fff:W, 0x037000-0x037fff:W, 0x038000-0x038fff:W, 0x039000-0x039fff:W, 0x03a000-0x03afff:W, 0x03b000-0x03bfff:W, 0x03c000-0x03cfff:W, 0x03d000-0x03dfff:W, 0x03e000-0x03efff:W, 0x03f000-0x03ffff:W, 0x040000-0x040fff:W, 0x041000-0x041fff:W, 0x042000-0x042fff:W, 0x043000-0x043fff:W, 0x044000-0x044fff:W, 0x045000-0x045fff:W, 0x046000-0x046fff:W, 0x047000-0x047fff:W, 0x048000-0x048fff:W, 0x049000-0x049fff:W, 0x04a000-0x04afff:W, 0x04b000-0x04bfff:W, 0x04c000-0x04cfff:W, 0x04d000-0x04dfff:W, 0x04e000-0x04efff:W, 0x04f000-0x04ffff:W, 0x050000-0x050fff:W, 0x051000-0x051fff:W, 0x052000-0x052fff:W, 0x053000-0x053fff:W, 0x054000-0x054fff:W, 0x055000-0x055fff:W, 0x056000-0x056fff:W, 0x057000-0x057fff:W, 0x058000-0x058fff:W, 0x059000-0x059fff:W, 0x05a000-0x05afff:W, 0x05b000-0x05bfff:W, 0x05c000-0x05cfff:W, 0x05d000-0x05dfff:W, 0x05e000-0x05efff:W, 0x05f000-0x05ffff:W, 0x060000-0x060fff:W, 0x061000-0x061fff:W, 0x062000-0x062fff:W, 0x063000-0x063fff:W, 0x064000-0x064fff:W, 0x065000-0x065fff:W, 0x066000-0x066fff:W, 0x067000-0x067fff:W, 0x068000-0x068fff:W, 0x069000-0x069fff:W, 0x06a000-0x06afff:W, 0x06b000-0x06bfff:W, 0x06c000-0x06cfff:W, 0x06d000-0x06dfff:W, 0x06e000-0x06efff:W, 0x06f000-0x06ffff:W, 0x070000-0x070fff:W, 0x071000-0x071fff:W, 0x072000-0x072fff:W, 0x073000-0x073fff:W, 0x074000-0x074fff:W, 0x075000-0x075fff:W, 0x076000-0x076fff:W, 0x077000-0x077fff:W, 0x078000-0x078fff:W, 0x079000-0x079fff:W, 0x07a000-0x07afff:W, 0x07b000-0x07bfff:W, 0x07c000-0x07cfff:W, 0x07d000-0x07dfff:W, 0x07e000-0x07efff:W, 0x07f000-0x07ffff:W, 0x080000-0x080fff:W, 0x081000-0x081fff:W, 0x082000-0x082fff:W, 0x083000-0x083fff:W, 0x084000-0x084fff:W, 0x085000-0x085fff:W, 0x086000-0x086fff:W, 0x087000-0x087fff:W, 0x088000-0x088fff:W, 0x089000-0x089fff:W, 0x08a000-0x08afff:W, 0x08b000-0x08bfff:W, 0x08c000-0x08cfff:W, 0x08d000-0x08dfff:W, 0x08e000-0x08efff:W, 0x08f000-0x08ffff:W, 0x090000-0x090fff:W, 0x091000-0x091fff:W, 0x092000-0x092fff:W, 0x093000-0x093fff:W, 0x094000-0x094fff:W, 0x095000-0x095fff:W, 0x096000-0x096fff:W, 0x097000-0x097fff:W, 0x098000-0x098fff:W, 0x099000-0x099fff:W, 0x09a000-0x09afff:W, 0x09b000-0x09bfff:W, 0x09c000-0x09cfff:W, 0x09d000-0x09dfff:W, 0x09e000-0x09efff:W, 0x09f000-0x09ffff:W, 0x0a0000-0x0a0fff:W, 0x0a1000-0x0a1fff:W, 0x0a2000-0x0a2fff:W, 0x0a3000-0x0a3fff:W, 0x0a4000-0x0a4fff:W, 0x0a5000-0x0a5fff:W, 0x0a6000-0x0a6fff:W, 0x0a7000-0x0a7fff:W, 0x0a8000-0x0a8fff:W, 0x0a9000-0x0a9fff:W, 0x0aa000-0x0aafff:W, 0x0ab000-0x0abfff:W, 0x0ac000-0x0acfff:W, 0x0ad000-0x0adfff:W, 0x0ae000-0x0aefff:W, 0x0af000-0x0affff:W, 0x0b0000-0x0b0fff:W, 0x0b1000-0x0b1fff:W, 0x0b2000-0x0b2fff:W, 0x0b3000-0x0b3fff:W, 0x0b4000-0x0b4fff:W, 0x0b5000-0x0b5fff:W, 0x0b6000-0x0b6fff:W, 0x0b7000-0x0b7fff:W, 0x0b8000-0x0b8fff:W, 0x0b9000-0x0b9fff:W, 0x0ba000-0x0bafff:W, 0x0bb000-0x0bbfff:W, 0x0bc000-0x0bcfff:W, 0x0bd000-0x0bdfff:W, 0x0be000-0x0befff:W, 0x0bf000-0x0bffff:W, 0x0c0000-0x0c0fff:W, 0x0c1000-0x0c1fff:W, 0x0c2000-0x0c2fff:W, 0x0c3000-0x0c3fff:W, 0x0c4000-0x0c4fff:W, 0x0c5000-0x0c5fff:W, 0x0c6000-0x0c6fff:W, 0x0c7000-0x0c7fff:W, 0x0c8000-0x0c8fff:W, 0x0c9000-0x0c9fff:W, 0x0ca000-0x0cafff:W, 0x0cb000-0x0cbfff:W, 0x0cc000-0x0ccfff:W, 0x0cd000-0x0cdfff:W, 0x0ce000-0x0cefff:W, 0x0cf000-0x0cffff:W, 0x0d0000-0x0d0fff:W, 0x0d1000-0x0d1fff:W, 0x0d2000-0x0d2fff:W, 0x0d3000-0x0d3fff:W, 0x0d4000-0x0d4fff:W, 0x0d5000-0x0d5fff:W, 0x0d6000-0x0d6fff:W, 0x0d7000-0x0d7fff:W, 0x0d8000-0x0d8fff:W, 0x0d9000-0x0d9fff:W, 0x0da000-0x0dafff:W, 0x0db000-0x0dbfff:W, 0x0dc000-0x0dcfff:W, 0x0dd000-0x0ddfff:W, 0x0de000-0x0defff:W, 0x0df000-0x0dffff:W, 0x0e0000-0x0e0fff:W, 0x0e1000-0x0e1fff:W, 0x0e2000-0x0e2fff:W, 0x0e3000-0x0e3fff:W, 0x0e4000-0x0e4fff:W, 0x0e5000-0x0e5fff:W, 0x0e6000-0x0e6fff:W, 0x0e7000-0x0e7fff:W, 0x0e8000-0x0e8fff:W, 0x0e9000-0x0e9fff:W, 0x0ea000-0x0eafff:W, 0x0eb000-0x0ebfff:W, 0x0ec000-0x0ecfff:W, 0x0ed000-0x0edfff:W, 0x0ee000-0x0eefff:W, 0x0ef000-0x0effff:W, 0x0f0000-0x0f0fff:W, 0x0f1000-0x0f1fff:W, 0x0f2000-0x0f2fff:W, 0x0f3000-0x0f3fff:W, 0x0f4000-0x0f4fff:W, 0x0f5000-0x0f5fff:W, 0x0f6000-0x0f6fff:W, 0x0f7000-0x0f7fff:W, 0x0f8000-0x0f8fff:W, 0x0f9000-0x0f9fff:W, 0x0fa000-0x0fafff:W, 0x0fb000-0x0fbfff:W, 0x0fc000-0x0fcfff:W, 0x0fd000-0x0fdfff:W, 0x0fe000-0x0fefff:W, 0x0ff000-0x0fffff:W, 0x100000-0x100fff:W, 0x101000-0x101fff:W, 0x102000-0x102fff:W, 0x103000-0x103fff:W, 0x104000-0x104fff:W, 0x105000-0x105fff:W, 0x106000-0x106fff:W, 0x107000-0x107fff:W, 0x108000-0x108fff:W, 0x109000-0x109fff:W, 0x10a000-0x10afff:W, 0x10b000-0x10bfff:W, 0x10c000-0x10cfff:W, 0x10d000-0x10dfff:W, 0x10e000-0x10efff:W, 0x10f000-0x10ffff:W, 0x110000-0x110fff:W, 0x111000-0x111fff:W, 0x112000-0x112fff:W, 0x113000-0x113fff:W, 0x114000-0x114fff:W, 0x115000-0x115fff:W, 0x116000-0x116fff:W, 0x117000-0x117fff:W, 0x118000-0x118fff:W, 0x119000-0x119fff:W, 0x11a000-0x11afff:W, 0x11b000-0x11bfff:W, 0x11c000-0x11cfff:W, 0x11d000-0x11dfff:W, 0x11e000-0x11efff:W, 0x11f000-0x11ffff:W, 0x120000-0x120fff:W, 0x121000-0x121fff:W, 0x122000-0x122fff:W, 0x123000-0x123fff:W, 0x124000-0x124fff:W, 0x125000-0x125fff:W, 0x126000-0x126fff:W, 0x127000-0x127fff:W, 0x128000-0x128fff:W, 0x129000-0x129fff:W, 0x12a000-0x12afff:W, 0x12b000-0x12bfff:W, 0x12c000-0x12cfff:W, 0x12d000-0x12dfff:W, 0x12e000-0x12efff:W, 0x12f000-0x12ffff:W, 0x130000-0x130fff:W, 0x131000-0x131fff:W, 0x132000-0x132fff:W, 0x133000-0x133fff:W, 0x134000-0x134fff:W, 0x135000-0x135fff:W, 0x136000-0x136fff:W, 0x137000-0x137fff:W, 0x138000-0x138fff:W, 0x139000-0x139fff:W, 0x13a000-0x13afff:W, 0x13b000-0x13bfff:W, 0x13c000-0x13cfff:W, 0x13d000-0x13dfff:W, 0x13e000-0x13efff:W, 0x13f000-0x13ffff:W, 0x140000-0x140fff:W, 0x141000-0x141fff:W, 0x142000-0x142fff:W, 0x143000-0x143fff:W, 0x144000-0x144fff:W, 0x145000-0x145fff:W, 0x146000-0x146fff:W, 0x147000-0x147fff:W, 0x148000-0x148fff:W, 0x149000-0x149fff:W, 0x14a000-0x14afff:W, 0x14b000-0x14bfff:W, 0x14c000-0x14cfff:W, 0x14d000-0x14dfff:W, 0x14e000-0x14efff:W, 0x14f000-0x14ffff:W, 0x150000-0x150fff:W, 0x151000-0x151fff:W, 0x152000-0x152fff:W, 0x153000-0x153fff:W, 0x154000-0x154fff:W, 0x155000-0x155fff:W, 0x156000-0x156fff:W, 0x157000-0x157fff:W, 0x158000-0x158fff:W, 0x159000-0x159fff:W, 0x15a000-0x15afff:W, 0x15b000-0x15bfff:W, 0x15c000-0x15cfff:W, 0x15d000-0x15dfff:W, 0x15e000-0x15efff:W, 0x15f000-0x15ffff:W, 0x160000-0x160fff:W, 0x161000-0x161fff:W, 0x162000-0x162fff:W, 0x163000-0x163fff:W, 0x164000-0x164fff:W, 0x165000-0x165fff:W, 0x166000-0x166fff:W, 0x167000-0x167fff:W, 0x168000-0x168fff:W, 0x169000-0x169fff:W, 0x16a000-0x16afff:W, 0x16b000-0x16bfff:W, 0x16c000-0x16cfff:W, 0x16d000-0x16dfff:W, 0x16e000-0x16efff:W, 0x16f000-0x16ffff:W, 0x170000-0x170fff:W, 0x171000-0x171fff:W, 0x172000-0x172fff:W, 0x173000-0x173fff:W, 0x174000-0x174fff:W, 0x175000-0x175fff:W, 0x176000-0x176fff:W, 0x177000-0x177fff:W, 0x178000-0x178fff:W, 0x179000-0x179fff:W, 0x17a000-0x17afff:W, 0x17b000-0x17bfff:W, 0x17c000-0x17cfff:W, 0x17d000-0x17dfff:W, 0x17e000-0x17efff:W, 0x17f000-0x17ffff:W, 0x180000-0x180fff:W, 0x181000-0x181fff:W, 0x182000-0x182fff:W, 0x183000-0x183fff:W, 0x184000-0x184fff:W, 0x185000-0x185fff:W, 0x186000-0x186fff:W, 0x187000-0x187fff:W, 0x188000-0x188fff:W, 0x189000-0x189fff:W, 0x18a000-0x18afff:W, 0x18b000-0x18bfff:W, 0x18c000-0x18cfff:W, 0x18d000-0x18dfff:W, 0x18e000-0x18efff:W, 0x18f000-0x18ffff:W, 0x190000-0x190fff:W, 0x191000-0x191fff:W, 0x192000-0x192fff:W, 0x193000-0x193fff:W, 0x194000-0x194fff:W, 0x195000-0x195fff:W, 0x196000-0x196fff:W, 0x197000-0x197fff:W, 0x198000-0x198fff:W, 0x199000-0x199fff:W, 0x19a000-0x19afff:W, 0x19b000-0x19bfff:W, 0x19c000-0x19cfff:W, 0x19d000-0x19dfff:W, 0x19e000-0x19efff:W, 0x19f000-0x19ffff:W, 0x1a0000-0x1a0fff:W, 0x1a1000-0x1a1fff:W, 0x1a2000-0x1a2fff:W, 0x1a3000-0x1a3fff:W, 0x1a4000-0x1a4fff:W, 0x1a5000-0x1a5fff:W, 0x1a6000-0x1a6fff:W, 0x1a7000-0x1a7fff:W, 0x1a8000-0x1a8fff:W, 0x1a9000-0x1a9fff:W, 0x1aa000-0x1aafff:W, 0x1ab000-0x1abfff:W, 0x1ac000-0x1acfff:W, 0x1ad000-0x1adfff:W, 0x1ae000-0x1aefff:W, 0x1af000-0x1affff:W, 0x1b0000-0x1b0fff:W, 0x1b1000-0x1b1fff:W, 0x1b2000-0x1b2fff:W, 0x1b3000-0x1b3fff:W, 0x1b4000-0x1b4fff:W, 0x1b5000-0x1b5fff:W, 0x1b6000-0x1b6fff:W, 0x1b7000-0x1b7fff:W, 0x1b8000-0x1b8fff:W, 0x1b9000-0x1b9fff:W, 0x1ba000-0x1bafff:W, 0x1bb000-0x1bbfff:W, 0x1bc000-0x1bcfff:W, 0x1bd000-0x1bdfff:W, 0x1be000-0x1befff:W, 0x1bf000-0x1bffff:W, 0x1c0000-0x1c0fff:W, 0x1c1000-0x1c1fff:W, 0x1c2000-0x1c2fff:W, 0x1c3000-0x1c3fff:W, 0x1c4000-0x1c4fff:W, 0x1c5000-0x1c5fff:W, 0x1c6000-0x1c6fff:W, 0x1c7000-0x1c7fff:W, 0x1c8000-0x1c8fff:W, 0x1c9000-0x1c9fff:W, 0x1ca000-0x1cafff:W, 0x1cb000-0x1cbfff:W, 0x1cc000-0x1ccfff:W, 0x1cd000-0x1cdfff:W, 0x1ce000-0x1cefff:W, 0x1cf000-0x1cffff:W, 0x1d0000-0x1d0fff:W, 0x1d1000-0x1d1fff:W, 0x1d2000-0x1d2fff:W, 0x1d3000-0x1d3fff:W, 0x1d4000-0x1d4fff:W, 0x1d5000-0x1d5fff:W, 0x1d6000-0x1d6fff:W, 0x1d7000-0x1d7fff:W, 0x1d8000-0x1d8fff:W, 0x1d9000-0x1d9fff:W, 0x1da000-0x1dafff:W, 0x1db000-0x1dbfff:W, 0x1dc000-0x1dcfff:W, 0x1dd000-0x1ddfff:W, 0x1de000-0x1defff:W, 0x1df000-0x1dffff:W, 0x1e0000-0x1e0fff:W, 0x1e1000-0x1e1fff:W, 0x1e2000-0x1e2fff:W, 0x1e3000-0x1e3fff:W, 0x1e4000-0x1e4fff:W, 0x1e5000-0x1e5fff:W, 0x1e6000-0x1e6fff:W, 0x1e7000-0x1e7fff:W, 0x1e8000-0x1e8fff:W, 0x1e9000-0x1e9fff:W, 0x1ea000-0x1eafff:W, 0x1eb000-0x1ebfff:W, 0x1ec000-0x1ecfff:W, 0x1ed000-0x1edfff:W, 0x1ee000-0x1eefff:W, 0x1ef000-0x1effff:W, 0x1f0000-0x1f0fff:W, 0x1f1000-0x1f1fff:W, 0x1f2000-0x1f2fff:W, 0x1f3000-0x1f3fff:W, 0x1f4000-0x1f4fff:W, 0x1f5000-0x1f5fff:W, 0x1f6000-0x1f6fff:W, 0x1f7000-0x1f7fff:W, 0x1f8000-0x1f8fff:W, 0x1f9000-0x1f9fff:W, 0x1fa000-0x1fafff:W, 0x1fb000-0x1fbfff:W, 0x1fc000-0x1fcfff:W, 0x1fd000-0x1fdfff:W, 0x1fe000-0x1fefff:W, 0x1ff000-0x1fffff:W, 0x200000-0x200fff:W, 0x201000-0x201fff:W, 0x202000-0x202fff:W, 0x203000-0x203fff:W, 0x204000-0x204fff:W, 0x205000-0x205fff:W, 0x206000-0x206fff:W, 0x207000-0x207fff:W, 0x208000-0x208fff:W, 0x209000-0x209fff:W, 0x20a000-0x20afff:W, 0x20b000-0x20bfff:W, 0x20c000-0x20cfff:W, 0x20d000-0x20dfff:W, 0x20e000-0x20efff:W, 0x20f000-0x20ffff:W, 0x210000-0x210fff:W, 0x211000-0x211fff:W, 0x212000-0x212fff:W, 0x213000-0x213fff:W, 0x214000-0x214fff:W, 0x215000-0x215fff:W, 0x216000-0x216fff:W, 0x217000-0x217fff:W, 0x218000-0x218fff:W, 0x219000-0x219fff:W, 0x21a000-0x21afff:W, 0x21b000-0x21bfff:W, 0x21c000-0x21cfff:W, 0x21d000-0x21dfff:W, 0x21e000-0x21efff:W, 0x21f000-0x21ffff:W, 0x220000-0x220fff:W, 0x221000-0x221fff:W, 0x222000-0x222fff:W, 0x223000-0x223fff:W, 0x224000-0x224fff:W, 0x225000-0x225fff:W, 0x226000-0x226fff:W, 0x227000-0x227fff:W, 0x228000-0x228fff:W, 0x229000-0x229fff:W, 0x22a000-0x22afff:W, 0x22b000-0x22bfff:W, 0x22c000-0x22cfff:W, 0x22d000-0x22dfff:W, 0x22e000-0x22efff:W, 0x22f000-0x22ffff:W, 0x230000-0x230fff:W, 0x231000-0x231fff:W, 0x232000-0x232fff:W, 0x233000-0x233fff:W, 0x234000-0x234fff:W, 0x235000-0x235fff:W, 0x236000-0x236fff:W, 0x237000-0x237fff:W, 0x238000-0x238fff:W, 0x239000-0x239fff:W, 0x23a000-0x23afff:W, 0x23b000-0x23bfff:W, 0x23c000-0x23cfff:W, 0x23d000-0x23dfff:W, 0x23e000-0x23efff:W, 0x23f000-0x23ffff:W, 0x240000-0x240fff:W, 0x241000-0x241fff:W, 0x242000-0x242fff:W, 0x243000-0x243fff:W, 0x244000-0x244fff:W, 0x245000-0x245fff:W, 0x246000-0x246fff:W, 0x247000-0x247fff:W, 0x248000-0x248fff:W, 0x249000-0x249fff:W, 0x24a000-0x24afff:W, 0x24b000-0x24bfff:W, 0x24c000-0x24cfff:W, 0x24d000-0x24dfff:W, 0x24e000-0x24efff:W, 0x24f000-0x24ffff:W, 0x250000-0x250fff:W, 0x251000-0x251fff:W, 0x252000-0x252fff:W, 0x253000-0x253fff:W, 0x254000-0x254fff:W, 0x255000-0x255fff:W, 0x256000-0x256fff:W, 0x257000-0x257fff:W, 0x258000-0x258fff:W, 0x259000-0x259fff:W, 0x25a000-0x25afff:W, 0x25b000-0x25bfff:W, 0x25c000-0x25cfff:W, 0x25d000-0x25dfff:W, 0x25e000-0x25efff:W, 0x25f000-0x25ffff:W, 0x260000-0x260fff:W, 0x261000-0x261fff:W, 0x262000-0x262fff:W, 0x263000-0x263fff:W, 0x264000-0x264fff:W, 0x265000-0x265fff:W, 0x266000-0x266fff:W, 0x267000-0x267fff:W, 0x268000-0x268fff:W, 0x269000-0x269fff:W, 0x26a000-0x26afff:W, 0x26b000-0x26bfff:W, 0x26c000-0x26cfff:W, 0x26d000-0x26dfff:W, 0x26e000-0x26efff:W, 0x26f000-0x26ffff:W, 0x270000-0x270fff:W, 0x271000-0x271fff:W, 0x272000-0x272fff:W, 0x273000-0x273fff:W, 0x274000-0x274fff:W, 0x275000-0x275fff:W, 0x276000-0x276fff:W, 0x277000-0x277fff:W, 0x278000-0x278fff:W, 0x279000-0x279fff:W, 0x27a000-0x27afff:W, 0x27b000-0x27bfff:W, 0x27c000-0x27cfff:W, 0x27d000-0x27dfff:W, 0x27e000-0x27efff:W, 0x27f000-0x27ffff:W, 0x280000-0x280fff:W, 0x281000-0x281fff:W, 0x282000-0x282fff:W, 0x283000-0x283fff:W, 0x284000-0x284fff:W, 0x285000-0x285fff:W, 0x286000-0x286fff:W, 0x287000-0x287fff:W, 0x288000-0x288fff:W, 0x289000-0x289fff:W, 0x28a000-0x28afff:W, 0x28b000-0x28bfff:W, 0x28c000-0x28cfff:W, 0x28d000-0x28dfff:W, 0x28e000-0x28efff:W, 0x28f000-0x28ffff:W, 0x290000-0x290fff:W, 0x291000-0x291fff:W, 0x292000-0x292fff:W, 0x293000-0x293fff:W, 0x294000-0x294fff:W, 0x295000-0x295fff:W, 0x296000-0x296fff:W, 0x297000-0x297fff:W, 0x298000-0x298fff:W, 0x299000-0x299fff:W, 0x29a000-0x29afff:W, 0x29b000-0x29bfff:W, 0x29c000-0x29cfff:W, 0x29d000-0x29dfff:W, 0x29e000-0x29efff:W, 0x29f000-0x29ffff:W, 0x2a0000-0x2a0fff:W, 0x2a1000-0x2a1fff:W, 0x2a2000-0x2a2fff:W, 0x2a3000-0x2a3fff:W, 0x2a4000-0x2a4fff:W, 0x2a5000-0x2a5fff:W, 0x2a6000-0x2a6fff:W, 0x2a7000-0x2a7fff:W, 0x2a8000-0x2a8fff:W, 0x2a9000-0x2a9fff:W, 0x2aa000-0x2aafff:W, 0x2ab000-0x2abfff:W, 0x2ac000-0x2acfff:W, 0x2ad000-0x2adfff:W, 0x2ae000-0x2aefff:W, 0x2af000-0x2affff:W, 0x2b0000-0x2b0fff:W, 0x2b1000-0x2b1fff:W, 0x2b2000-0x2b2fff:W, 0x2b3000-0x2b3fff:W, 0x2b4000-0x2b4fff:W, 0x2b5000-0x2b5fff:W, 0x2b6000-0x2b6fff:W, 0x2b7000-0x2b7fff:W, 0x2b8000-0x2b8fff:W, 0x2b9000-0x2b9fff:W, 0x2ba000-0x2bafff:W, 0x2bb000-0x2bbfff:W, 0x2bc000-0x2bcfff:W, 0x2bd000-0x2bdfff:W, 0x2be000-0x2befff:W, 0x2bf000-0x2bffff:W, 0x2c0000-0x2c0fff:W, 0x2c1000-0x2c1fff:W, 0x2c2000-0x2c2fff:W, 0x2c3000-0x2c3fff:W, 0x2c4000-0x2c4fff:W, 0x2c5000-0x2c5fff:W, 0x2c6000-0x2c6fff:W, 0x2c7000-0x2c7fff:W, 0x2c8000-0x2c8fff:W, 0x2c9000-0x2c9fff:W, 0x2ca000-0x2cafff:W, 0x2cb000-0x2cbfff:W, 0x2cc000-0x2ccfff:W, 0x2cd000-0x2cdfff:W, 0x2ce000-0x2cefff:W, 0x2cf000-0x2cffff:W, 0x2d0000-0x2d0fff:W, 0x2d1000-0x2d1fff:W, 0x2d2000-0x2d2fff:W, 0x2d3000-0x2d3fff:W, 0x2d4000-0x2d4fff:W, 0x2d5000-0x2d5fff:W, 0x2d6000-0x2d6fff:W, 0x2d7000-0x2d7fff:W, 0x2d8000-0x2d8fff:W, 0x2d9000-0x2d9fff:W, 0x2da000-0x2dafff:W, 0x2db000-0x2dbfff:W, 0x2dc000-0x2dcfff:W, 0x2dd000-0x2ddfff:W, 0x2de000-0x2defff:W, 0x2df000-0x2dffff:W, 0x2e0000-0x2e0fff:W, 0x2e1000-0x2e1fff:W, 0x2e2000-0x2e2fff:W, 0x2e3000-0x2e3fff:W, 0x2e4000-0x2e4fff:W, 0x2e5000-0x2e5fff:W, 0x2e6000-0x2e6fff:W, 0x2e7000-0x2e7fff:W, 0x2e8000-0x2e8fff:W, 0x2e9000-0x2e9fff:W, 0x2ea000-0x2eafff:W, 0x2eb000-0x2ebfff:W, 0x2ec000-0x2ecfff:W, 0x2ed000-0x2edfff:W, 0x2ee000-0x2eefff:W, 0x2ef000-0x2effff:W, 0x2f0000-0x2f0fff:W, 0x2f1000-0x2f1fff:W, 0x2f2000-0x2f2fff:W, 0x2f3000-0x2f3fff:W, 0x2f4000-0x2f4fff:W, 0x2f5000-0x2f5fff:W, 0x2f6000-0x2f6fff:W, 0x2f7000-0x2f7fff:W, 0x2f8000-0x2f8fff:W, 0x2f9000-0x2f9fff:W, 0x2fa000-0x2fafff:W, 0x2fb000-0x2fbfff:W, 0x2fc000-0x2fcfff:W, 0x2fd000-0x2fdfff:W, 0x2fe000-0x2fefff:W, 0x2ff000-0x2fffff:W, 0x300000-0x300fff:W, 0x301000-0x301fff:W, 0x302000-0x302fff:W, 0x303000-0x303fff:W, 0x304000-0x304fff:W, 0x305000-0x305fff:W, 0x306000-0x306fff:W, 0x307000-0x307fff:W, 0x308000-0x308fff:W, 0x309000-0x309fff:W, 0x30a000-0x30afff:W, 0x30b000-0x30bfff:W, 0x30c000-0x30cfff:W, 0x30d000-0x30dfff:W, 0x30e000-0x30efff:W, 0x30f000-0x30ffff:W, 0x310000-0x310fff:W, 0x311000-0x311fff:W, 0x312000-0x312fff:W, 0x313000-0x313fff:W, 0x314000-0x314fff:W, 0x315000-0x315fff:W, 0x316000-0x316fff:W, 0x317000-0x317fff:W, 0x318000-0x318fff:W, 0x319000-0x319fff:W, 0x31a000-0x31afff:W, 0x31b000-0x31bfff:W, 0x31c000-0x31cfff:W, 0x31d000-0x31dfff:W, 0x31e000-0x31efff:W, 0x31f000-0x31ffff:W, 0x320000-0x320fff:W, 0x321000-0x321fff:W, 0x322000-0x322fff:W, 0x323000-0x323fff:W, 0x324000-0x324fff:W, 0x325000-0x325fff:W, 0x326000-0x326fff:W, 0x327000-0x327fff:W, 0x328000-0x328fff:W, 0x329000-0x329fff:W, 0x32a000-0x32afff:W, 0x32b000-0x32bfff:W, 0x32c000-0x32cfff:W, 0x32d000-0x32dfff:W, 0x32e000-0x32efff:W, 0x32f000-0x32ffff:W, 0x330000-0x330fff:W, 0x331000-0x331fff:W, 0x332000-0x332fff:W, 0x333000-0x333fff:W, 0x334000-0x334fff:W, 0x335000-0x335fff:W, 0x336000-0x336fff:W, 0x337000-0x337fff:W, 0x338000-0x338fff:W, 0x339000-0x339fff:W, 0x33a000-0x33afff:W, 0x33b000-0x33bfff:W, 0x33c000-0x33cfff:W, 0x33d000-0x33dfff:W, 0x33e000-0x33efff:W, 0x33f000-0x33ffff:W, 0x340000-0x340fff:W, 0x341000-0x341fff:W, 0x342000-0x342fff:W, 0x343000-0x343fff:W, 0x344000-0x344fff:W, 0x345000-0x345fff:W, 0x346000-0x346fff:W, 0x347000-0x347fff:W, 0x348000-0x348fff:W, 0x349000-0x349fff:W, 0x34a000-0x34afff:W, 0x34b000-0x34bfff:W, 0x34c000-0x34cfff:W, 0x34d000-0x34dfff:W, 0x34e000-0x34efff:W, 0x34f000-0x34ffff:W, 0x350000-0x350fff:W, 0x351000-0x351fff:W, 0x352000-0x352fff:W, 0x353000-0x353fff:W, 0x354000-0x354fff:W, 0x355000-0x355fff:W, 0x356000-0x356fff:W, 0x357000-0x357fff:W, 0x358000-0x358fff:W, 0x359000-0x359fff:W, 0x35a000-0x35afff:W, 0x35b000-0x35bfff:W, 0x35c000-0x35cfff:W, 0x35d000-0x35dfff:W, 0x35e000-0x35efff:W, 0x35f000-0x35ffff:W, 0x360000-0x360fff:W, 0x361000-0x361fff:W, 0x362000-0x362fff:W, 0x363000-0x363fff:W, 0x364000-0x364fff:W, 0x365000-0x365fff:W, 0x366000-0x366fff:W, 0x367000-0x367fff:W, 0x368000-0x368fff:W, 0x369000-0x369fff:W, 0x36a000-0x36afff:W, 0x36b000-0x36bfff:W, 0x36c000-0x36cfff:W, 0x36d000-0x36dfff:W, 0x36e000-0x36efff:W, 0x36f000-0x36ffff:W, 0x370000-0x370fff:W, 0x371000-0x371fff:W, 0x372000-0x372fff:W, 0x373000-0x373fff:W, 0x374000-0x374fff:W, 0x375000-0x375fff:W, 0x376000-0x376fff:W, 0x377000-0x377fff:W, 0x378000-0x378fff:W, 0x379000-0x379fff:W, 0x37a000-0x37afff:W, 0x37b000-0x37bfff:W, 0x37c000-0x37cfff:W, 0x37d000-0x37dfff:W, 0x37e000-0x37efff:W, 0x37f000-0x37ffff:W, 0x380000-0x380fff:W, 0x381000-0x381fff:W, 0x382000-0x382fff:W, 0x383000-0x383fff:W, 0x384000-0x384fff:W, 0x385000-0x385fff:W, 0x386000-0x386fff:W, 0x387000-0x387fff:W, 0x388000-0x388fff:W, 0x389000-0x389fff:W, 0x38a000-0x38afff:W, 0x38b000-0x38bfff:W, 0x38c000-0x38cfff:W, 0x38d000-0x38dfff:W, 0x38e000-0x38efff:W, 0x38f000-0x38ffff:W, 0x390000-0x390fff:W, 0x391000-0x391fff:W, 0x392000-0x392fff:W, 0x393000-0x393fff:W, 0x394000-0x394fff:W, 0x395000-0x395fff:W, 0x396000-0x396fff:W, 0x397000-0x397fff:W, 0x398000-0x398fff:W, 0x399000-0x399fff:W, 0x39a000-0x39afff:W, 0x39b000-0x39bfff:W, 0x39c000-0x39cfff:W, 0x39d000-0x39dfff:W, 0x39e000-0x39efff:W, 0x39f000-0x39ffff:W, 0x3a0000-0x3a0fff:W, 0x3a1000-0x3a1fff:W, 0x3a2000-0x3a2fff:W, 0x3a3000-0x3a3fff:W, 0x3a4000-0x3a4fff:W, 0x3a5000-0x3a5fff:W, 0x3a6000-0x3a6fff:W, 0x3a7000-0x3a7fff:W, 0x3a8000-0x3a8fff:W, 0x3a9000-0x3a9fff:W, 0x3aa000-0x3aafff:W, 0x3ab000-0x3abfff:W, 0x3ac000-0x3acfff:W, 0x3ad000-0x3adfff:W, 0x3ae000-0x3aefff:W, 0x3af000-0x3affff:W, 0x3b0000-0x3b0fff:W, 0x3b1000-0x3b1fff:W, 0x3b2000-0x3b2fff:W, 0x3b3000-0x3b3fff:W, 0x3b4000-0x3b4fff:W, 0x3b5000-0x3b5fff:W, 0x3b6000-0x3b6fff:W, 0x3b7000-0x3b7fff:W, 0x3b8000-0x3b8fff:W, 0x3b9000-0x3b9fff:W, 0x3ba000-0x3bafff:W, 0x3bb000-0x3bbfff:W, 0x3bc000-0x3bcfff:W, 0x3bd000-0x3bdfff:W, 0x3be000-0x3befff:W, 0x3bf000-0x3bffff:W, 0x3c0000-0x3c0fff:W, 0x3c1000-0x3c1fff:W, 0x3c2000-0x3c2fff:W, 0x3c3000-0x3c3fff:W, 0x3c4000-0x3c4fff:W, 0x3c5000-0x3c5fff:W, 0x3c6000-0x3c6fff:W, 0x3c7000-0x3c7fff:W, 0x3c8000-0x3c8fff:W, 0x3c9000-0x3c9fff:W, 0x3ca000-0x3cafff:W, 0x3cb000-0x3cbfff:W, 0x3cc000-0x3ccfff:W, 0x3cd000-0x3cdfff:W, 0x3ce000-0x3cefff:W, 0x3cf000-0x3cffff:W, 0x3d0000-0x3d0fff:W, 0x3d1000-0x3d1fff:W, 0x3d2000-0x3d2fff:W, 0x3d3000-0x3d3fff:W, 0x3d4000-0x3d4fff:W, 0x3d5000-0x3d5fff:W, 0x3d6000-0x3d6fff:W, 0x3d7000-0x3d7fff:W, 0x3d8000-0x3d8fff:W, 0x3d9000-0x3d9fff:W, 0x3da000-0x3dafff:W, 0x3db000-0x3dbfff:W, 0x3dc000-0x3dcfff:W, 0x3dd000-0x3ddfff:W, 0x3de000-0x3defff:W, 0x3df000-0x3dffff:W, 0x3e0000-0x3e0fff:W, 0x3e1000-0x3e1fff:W, 0x3e2000-0x3e2fff:W, 0x3e3000-0x3e3fff:W, 0x3e4000-0x3e4fff:W, 0x3e5000-0x3e5fff:W, 0x3e6000-0x3e6fff:W, 0x3e7000-0x3e7fff:W, 0x3e8000-0x3e8fff:W, 0x3e9000-0x3e9fff:W, 0x3ea000-0x3eafff:W, 0x3eb000-0x3ebfff:W, 0x3ec000-0x3ecfff:W, 0x3ed000-0x3edfff:W, 0x3ee000-0x3eefff:W, 0x3ef000-0x3effff:W, 0x3f0000-0x3f0fff:W, 0x3f1000-0x3f1fff:W, 0x3f2000-0x3f2fff:W, 0x3f3000-0x3f3fff:W, 0x3f4000-0x3f4fff:W, 0x3f5000-0x3f5fff:W, 0x3f6000-0x3f6fff:W, 0x3f7000-0x3f7fff:W, 0x3f8000-0x3f8fff:W, 0x3f9000-0x3f9fff:W, 0x3fa000-0x3fafff:W, 0x3fb000-0x3fbfff:W, 0x3fc000-0x3fcfff:W, 0x3fd000-0x3fdfff:W, 0x3fe000-0x3fefff:W, 0x3ff000-0x3fffff:W, 0x400000-0x400fff:W, 0x401000-0x401fff:W, 0x402000-0x402fff:W, 0x403000-0x403fff:W, 0x404000-0x404fff:W, 0x405000-0x405fff:W, 0x406000-0x406fff:W, 0x407000-0x407fff:W, 0x408000-0x408fff:W, 0x409000-0x409fff:W, 0x40a000-0x40afff:W, 0x40b000-0x40bfff:W, 0x40c000-0x40cfff:W, 0x40d000-0x40dfff:W, 0x40e000-0x40efff:W, 0x40f000-0x40ffff:W, 0x410000-0x410fff:W, 0x411000-0x411fff:W, 0x412000-0x412fff:W, 0x413000-0x413fff:W, 0x414000-0x414fff:W, 0x415000-0x415fff:W, 0x416000-0x416fff:W, 0x417000-0x417fff:W, 0x418000-0x418fff:W, 0x419000-0x419fff:W, 0x41a000-0x41afff:W, 0x41b000-0x41bfff:W, 0x41c000-0x41cfff:W, 0x41d000-0x41dfff:W, 0x41e000-0x41efff:W, 0x41f000-0x41ffff:W, 0x420000-0x420fff:W, 0x421000-0x421fff:W, 0x422000-0x422fff:W, 0x423000-0x423fff:W, 0x424000-0x424fff:W, 0x425000-0x425fff:W, 0x426000-0x426fff:W, 0x427000-0x427fff:W, 0x428000-0x428fff:W, 0x429000-0x429fff:W, 0x42a000-0x42afff:W, 0x42b000-0x42bfff:W, 0x42c000-0x42cfff:W, 0x42d000-0x42dfff:W, 0x42e000-0x42efff:W, 0x42f000-0x42ffff:W, 0x430000-0x430fff:W, 0x431000-0x431fff:W, 0x432000-0x432fff:W, 0x433000-0x433fff:W, 0x434000-0x434fff:W, 0x435000-0x435fff:W, 0x436000-0x436fff:W, 0x437000-0x437fff:W, 0x438000-0x438fff:W, 0x439000-0x439fff:W, 0x43a000-0x43afff:W, 0x43b000-0x43bfff:W, 0x43c000-0x43cfff:W, 0x43d000-0x43dfff:W, 0x43e000-0x43efff:W, 0x43f000-0x43ffff:W, 0x440000-0x440fff:W, 0x441000-0x441fff:W, 0x442000-0x442fff:W, 0x443000-0x443fff:W, 0x444000-0x444fff:W, 0x445000-0x445fff:W, 0x446000-0x446fff:W, 0x447000-0x447fff:W, 0x448000-0x448fff:W, 0x449000-0x449fff:W, 0x44a000-0x44afff:W, 0x44b000-0x44bfff:W, 0x44c000-0x44cfff:W, 0x44d000-0x44dfff:W, 0x44e000-0x44efff:W, 0x44f000-0x44ffff:W, 0x450000-0x450fff:W, 0x451000-0x451fff:W, 0x452000-0x452fff:W, 0x453000-0x453fff:W, 0x454000-0x454fff:W, 0x455000-0x455fff:W, 0x456000-0x456fff:W, 0x457000-0x457fff:W, 0x458000-0x458fff:W, 0x459000-0x459fff:W, 0x45a000-0x45afff:W, 0x45b000-0x45bfff:W, 0x45c000-0x45cfff:W, 0x45d000-0x45dfff:W, 0x45e000-0x45efff:W, 0x45f000-0x45ffff:W, 0x460000-0x460fff:W, 0x461000-0x461fff:W, 0x462000-0x462fff:W, 0x463000-0x463fff:W, 0x464000-0x464fff:W, 0x465000-0x465fff:W, 0x466000-0x466fff:W, 0x467000-0x467fff:W, 0x468000-0x468fff:W, 0x469000-0x469fff:W, 0x46a000-0x46afff:W, 0x46b000-0x46bfff:W, 0x46c000-0x46cfff:W, 0x46d000-0x46dfff:W, 0x46e000-0x46efff:W, 0x46f000-0x46ffff:W, 0x470000-0x470fff:W, 0x471000-0x471fff:W, 0x472000-0x472fff:W, 0x473000-0x473fff:W, 0x474000-0x474fff:W, 0x475000-0x475fff:W, 0x476000-0x476fff:W, 0x477000-0x477fff:W, 0x478000-0x478fff:W, 0x479000-0x479fff:W, 0x47a000-0x47afff:W, 0x47b000-0x47bfff:W, 0x47c000-0x47cfff:W, 0x47d000-0x47dfff:W, 0x47e000-0x47efff:W, 0x47f000-0x47ffff:W, 0x480000-0x480fff:W, 0x481000-0x481fff:W, 0x482000-0x482fff:W, 0x483000-0x483fff:W, 0x484000-0x484fff:W, 0x485000-0x485fff:W, 0x486000-0x486fff:W, 0x487000-0x487fff:W, 0x488000-0x488fff:W, 0x489000-0x489fff:W, 0x48a000-0x48afff:W, 0x48b000-0x48bfff:W, 0x48c000-0x48cfff:W, 0x48d000-0x48dfff:W, 0x48e000-0x48efff:W, 0x48f000-0x48ffff:W, 0x490000-0x490fff:W, 0x491000-0x491fff:W, 0x492000-0x492fff:W, 0x493000-0x493fff:W, 0x494000-0x494fff:W, 0x495000-0x495fff:W, 0x496000-0x496fff:W, 0x497000-0x497fff:W, 0x498000-0x498fff:W, 0x499000-0x499fff:W, 0x49a000-0x49afff:W, 0x49b000-0x49bfff:W, 0x49c000-0x49cfff:W, 0x49d000-0x49dfff:W, 0x49e000-0x49efff:W, 0x49f000-0x49ffff:W, 0x4a0000-0x4a0fff:W, 0x4a1000-0x4a1fff:W, 0x4a2000-0x4a2fff:W, 0x4a3000-0x4a3fff:W, 0x4a4000-0x4a4fff:W, 0x4a5000-0x4a5fff:W, 0x4a6000-0x4a6fff:W, 0x4a7000-0x4a7fff:W, 0x4a8000-0x4a8fff:W, 0x4a9000-0x4a9fff:W, 0x4aa000-0x4aafff:W, 0x4ab000-0x4abfff:W, 0x4ac000-0x4acfff:W, 0x4ad000-0x4adfff:W, 0x4ae000-0x4aefff:W, 0x4af000-0x4affff:W, 0x4b0000-0x4b0fff:W, 0x4b1000-0x4b1fff:W, 0x4b2000-0x4b2fff:W, 0x4b3000-0x4b3fff:W, 0x4b4000-0x4b4fff:W, 0x4b5000-0x4b5fff:W, 0x4b6000-0x4b6fff:W, 0x4b7000-0x4b7fff:W, 0x4b8000-0x4b8fff:W, 0x4b9000-0x4b9fff:W, 0x4ba000-0x4bafff:W, 0x4bb000-0x4bbfff:W, 0x4bc000-0x4bcfff:W, 0x4bd000-0x4bdfff:W, 0x4be000-0x4befff:W, 0x4bf000-0x4bffff:W, 0x4c0000-0x4c0fff:W, 0x4c1000-0x4c1fff:W, 0x4c2000-0x4c2fff:W, 0x4c3000-0x4c3fff:W, 0x4c4000-0x4c4fff:W, 0x4c5000-0x4c5fff:W, 0x4c6000-0x4c6fff:W, 0x4c7000-0x4c7fff:W, 0x4c8000-0x4c8fff:W, 0x4c9000-0x4c9fff:W, 0x4ca000-0x4cafff:W, 0x4cb000-0x4cbfff:W, 0x4cc000-0x4ccfff:W, 0x4cd000-0x4cdfff:W, 0x4ce000-0x4cefff:W, 0x4cf000-0x4cffff:W, 0x4d0000-0x4d0fff:W, 0x4d1000-0x4d1fff:W, 0x4d2000-0x4d2fff:W, 0x4d3000-0x4d3fff:W, 0x4d4000-0x4d4fff:W, 0x4d5000-0x4d5fff:W, 0x4d6000-0x4d6fff:W, 0x4d7000-0x4d7fff:W, 0x4d8000-0x4d8fff:W, 0x4d9000-0x4d9fff:W, 0x4da000-0x4dafff:W, 0x4db000-0x4dbfff:W, 0x4dc000-0x4dcfff:W, 0x4dd000-0x4ddfff:W, 0x4de000-0x4defff:W, 0x4df000-0x4dffff:W, 0x4e0000-0x4e0fff:W, 0x4e1000-0x4e1fff:W, 0x4e2000-0x4e2fff:W, 0x4e3000-0x4e3fff:W, 0x4e4000-0x4e4fff:W, 0x4e5000-0x4e5fff:W, 0x4e6000-0x4e6fff:W, 0x4e7000-0x4e7fff:W, 0x4e8000-0x4e8fff:W, 0x4e9000-0x4e9fff:W, 0x4ea000-0x4eafff:W, 0x4eb000-0x4ebfff:W, 0x4ec000-0x4ecfff:W, 0x4ed000-0x4edfff:W, 0x4ee000-0x4eefff:W, 0x4ef000-0x4effff:W, 0x4f0000-0x4f0fff:W, 0x4f1000-0x4f1fff:W, 0x4f2000-0x4f2fff:W, 0x4f3000-0x4f3fff:W, 0x4f4000-0x4f4fff:W, 0x4f5000-0x4f5fff:W, 0x4f6000-0x4f6fff:W, 0x4f7000-0x4f7fff:W, 0x4f8000-0x4f8fff:W, 0x4f9000-0x4f9fff:W, 0x4fa000-0x4fafff:W, 0x4fb000-0x4fbfff:W, 0x4fc000-0x4fcfff:W, 0x4fd000-0x4fdfff:W, 0x4fe000-0x4fefff:W, 0x4ff000-0x4fffff:W, 0x500000-0x500fff:W, 0x501000-0x501fff:W, 0x502000-0x502fff:W, 0x503000-0x503fff:W, 0x504000-0x504fff:W, 0x505000-0x505fff:W, 0x506000-0x506fff:W, 0x507000-0x507fff:W, 0x508000-0x508fff:W, 0x509000-0x509fff:W, 0x50a000-0x50afff:W, 0x50b000-0x50bfff:W, 0x50c000-0x50cfff:W, 0x50d000-0x50dfff:W, 0x50e000-0x50efff:W, 0x50f000-0x50ffff:W, 0x510000-0x510fff:W, 0x511000-0x511fff:W, 0x512000-0x512fff:W, 0x513000-0x513fff:W, 0x514000-0x514fff:W, 0x515000-0x515fff:W, 0x516000-0x516fff:W, 0x517000-0x517fff:W, 0x518000-0x518fff:W, 0x519000-0x519fff:W, 0x51a000-0x51afff:W, 0x51b000-0x51bfff:W, 0x51c000-0x51cfff:W, 0x51d000-0x51dfff:W, 0x51e000-0x51efff:W, 0x51f000-0x51ffff:W, 0x520000-0x520fff:W, 0x521000-0x521fff:W, 0x522000-0x522fff:W, 0x523000-0x523fff:W, 0x524000-0x524fff:W, 0x525000-0x525fff:W, 0x526000-0x526fff:W, 0x527000-0x527fff:W, 0x528000-0x528fff:W, 0x529000-0x529fff:W, 0x52a000-0x52afff:W, 0x52b000-0x52bfff:W, 0x52c000-0x52cfff:W, 0x52d000-0x52dfff:W, 0x52e000-0x52efff:W, 0x52f000-0x52ffff:W, 0x530000-0x530fff:W, 0x531000-0x531fff:W, 0x532000-0x532fff:W, 0x533000-0x533fff:W, 0x534000-0x534fff:W, 0x535000-0x535fff:W, 0x536000-0x536fff:W, 0x537000-0x537fff:W, 0x538000-0x538fff:W, 0x539000-0x539fff:W, 0x53a000-0x53afff:W, 0x53b000-0x53bfff:W, 0x53c000-0x53cfff:W, 0x53d000-0x53dfff:W, 0x53e000-0x53efff:W, 0x53f000-0x53ffff:W, 0x540000-0x540fff:W, 0x541000-0x541fff:W, 0x542000-0x542fff:W, 0x543000-0x543fff:W, 0x544000-0x544fff:W, 0x545000-0x545fff:W, 0x546000-0x546fff:W, 0x547000-0x547fff:W, 0x548000-0x548fff:W, 0x549000-0x549fff:W, 0x54a000-0x54afff:W, 0x54b000-0x54bfff:W, 0x54c000-0x54cfff:W, 0x54d000-0x54dfff:W, 0x54e000-0x54efff:W, 0x54f000-0x54ffff:W, 0x550000-0x550fff:W, 0x551000-0x551fff:W, 0x552000-0x552fff:W, 0x553000-0x553fff:W, 0x554000-0x554fff:W, 0x555000-0x555fff:W, 0x556000-0x556fff:W, 0x557000-0x557fff:W, 0x558000-0x558fff:W, 0x559000-0x559fff:W, 0x55a000-0x55afff:W, 0x55b000-0x55bfff:W, 0x55c000-0x55cfff:W, 0x55d000-0x55dfff:W, 0x55e000-0x55efff:W, 0x55f000-0x55ffff:W, 0x560000-0x560fff:W, 0x561000-0x561fff:W, 0x562000-0x562fff:W, 0x563000-0x563fff:W, 0x564000-0x564fff:W, 0x565000-0x565fff:W, 0x566000-0x566fff:W, 0x567000-0x567fff:W, 0x568000-0x568fff:W, 0x569000-0x569fff:W, 0x56a000-0x56afff:W, 0x56b000-0x56bfff:W, 0x56c000-0x56cfff:W, 0x56d000-0x56dfff:W, 0x56e000-0x56efff:W, 0x56f000-0x56ffff:W, 0x570000-0x570fff:W, 0x571000-0x571fff:W, 0x572000-0x572fff:W, 0x573000-0x573fff:W, 0x574000-0x574fff:W, 0x575000-0x575fff:W, 0x576000-0x576fff:W, 0x577000-0x577fff:W, 0x578000-0x578fff:W, 0x579000-0x579fff:W, 0x57a000-0x57afff:W, 0x57b000-0x57bfff:W, 0x57c000-0x57cfff:W, 0x57d000-0x57dfff:W, 0x57e000-0x57efff:W, 0x57f000-0x57ffff:W, 0x580000-0x580fff:W, 0x581000-0x581fff:W, 0x582000-0x582fff:W, 0x583000-0x583fff:W, 0x584000-0x584fff:W, 0x585000-0x585fff:W, 0x586000-0x586fff:W, 0x587000-0x587fff:W, 0x588000-0x588fff:W, 0x589000-0x589fff:W, 0x58a000-0x58afff:W, 0x58b000-0x58bfff:W, 0x58c000-0x58cfff:W, 0x58d000-0x58dfff:W, 0x58e000-0x58efff:W, 0x58f000-0x58ffff:W, 0x590000-0x590fff:W, 0x591000-0x591fff:W, 0x592000-0x592fff:W, 0x593000-0x593fff:W, 0x594000-0x594fff:W, 0x595000-0x595fff:W, 0x596000-0x596fff:W, 0x597000-0x597fff:W, 0x598000-0x598fff:W, 0x599000-0x599fff:W, 0x59a000-0x59afff:W, 0x59b000-0x59bfff:W, 0x59c000-0x59cfff:W, 0x59d000-0x59dfff:W, 0x59e000-0x59efff:W, 0x59f000-0x59ffff:W, 0x5a0000-0x5a0fff:W, 0x5a1000-0x5a1fff:W, 0x5a2000-0x5a2fff:W, 0x5a3000-0x5a3fff:W, 0x5a4000-0x5a4fff:W, 0x5a5000-0x5a5fff:W, 0x5a6000-0x5a6fff:W, 0x5a7000-0x5a7fff:W, 0x5a8000-0x5a8fff:W, 0x5a9000-0x5a9fff:W, 0x5aa000-0x5aafff:W, 0x5ab000-0x5abfff:W, 0x5ac000-0x5acfff:W, 0x5ad000-0x5adfff:W, 0x5ae000-0x5aefff:W, 0x5af000-0x5affff:W, 0x5b0000-0x5b0fff:W, 0x5b1000-0x5b1fff:W, 0x5b2000-0x5b2fff:W, 0x5b3000-0x5b3fff:W, 0x5b4000-0x5b4fff:W, 0x5b5000-0x5b5fff:W, 0x5b6000-0x5b6fff:W, 0x5b7000-0x5b7fff:W, 0x5b8000-0x5b8fff:W, 0x5b9000-0x5b9fff:W, 0x5ba000-0x5bafff:W, 0x5bb000-0x5bbfff:W, 0x5bc000-0x5bcfff:W, 0x5bd000-0x5bdfff:W, 0x5be000-0x5befff:W, 0x5bf000-0x5bffff:W, 0x5c0000-0x5c0fff:W, 0x5c1000-0x5c1fff:W, 0x5c2000-0x5c2fff:W, 0x5c3000-0x5c3fff:W, 0x5c4000-0x5c4fff:W, 0x5c5000-0x5c5fff:W, 0x5c6000-0x5c6fff:W, 0x5c7000-0x5c7fff:W, 0x5c8000-0x5c8fff:W, 0x5c9000-0x5c9fff:W, 0x5ca000-0x5cafff:W, 0x5cb000-0x5cbfff:W, 0x5cc000-0x5ccfff:W, 0x5cd000-0x5cdfff:W, 0x5ce000-0x5cefff:W, 0x5cf000-0x5cffff:W, 0x5d0000-0x5d0fff:W, 0x5d1000-0x5d1fff:W, 0x5d2000-0x5d2fff:W, 0x5d3000-0x5d3fff:W, 0x5d4000-0x5d4fff:W, 0x5d5000-0x5d5fff:W, 0x5d6000-0x5d6fff:W, 0x5d7000-0x5d7fff:W, 0x5d8000-0x5d8fff:W, 0x5d9000-0x5d9fff:W, 0x5da000-0x5dafff:W, 0x5db000-0x5dbfff:W, 0x5dc000-0x5dcfff:W, 0x5dd000-0x5ddfff:W, 0x5de000-0x5defff:W, 0x5df000-0x5dffff:W, 0x5e0000-0x5e0fff:W, 0x5e1000-0x5e1fff:W, 0x5e2000-0x5e2fff:W, 0x5e3000-0x5e3fff:W, 0x5e4000-0x5e4fff:W, 0x5e5000-0x5e5fff:W, 0x5e6000-0x5e6fff:W, 0x5e7000-0x5e7fff:W, 0x5e8000-0x5e8fff:W, 0x5e9000-0x5e9fff:W, 0x5ea000-0x5eafff:W, 0x5eb000-0x5ebfff:W, 0x5ec000-0x5ecfff:W, 0x5ed000-0x5edfff:W, 0x5ee000-0x5eefff:W, 0x5ef000-0x5effff:W, 0x5f0000-0x5f0fff:W, 0x5f1000-0x5f1fff:W, 0x5f2000-0x5f2fff:W, 0x5f3000-0x5f3fff:W, 0x5f4000-0x5f4fff:W, 0x5f5000-0x5f5fff:W, 0x5f6000-0x5f6fff:W, 0x5f7000-0x5f7fff:W, 0x5f8000-0x5f8fff:W, 0x5f9000-0x5f9fff:W, 0x5fa000-0x5fafff:W, 0x5fb000-0x5fbfff:W, 0x5fc000-0x5fcfff:W, 0x5fd000-0x5fdfff:W, 0x5fe000-0x5fefff:W, 0x5ff000-0x5fffff:W, 0x600000-0x600fff:W, 0x601000-0x601fff:W, 0x602000-0x602fff:W, 0x603000-0x603fff:W, 0x604000-0x604fff:W, 0x605000-0x605fff:W, 0x606000-0x606fff:W, 0x607000-0x607fff:W, 0x608000-0x608fff:W, 0x609000-0x609fff:W, 0x60a000-0x60afff:W, 0x60b000-0x60bfff:W, 0x60c000-0x60cfff:W, 0x60d000-0x60dfff:W, 0x60e000-0x60efff:W, 0x60f000-0x60ffff:W, 0x610000-0x610fff:W, 0x611000-0x611fff:W, 0x612000-0x612fff:W, 0x613000-0x613fff:W, 0x614000-0x614fff:W, 0x615000-0x615fff:W, 0x616000-0x616fff:W, 0x617000-0x617fff:W, 0x618000-0x618fff:W, 0x619000-0x619fff:W, 0x61a000-0x61afff:W, 0x61b000-0x61bfff:W, 0x61c000-0x61cfff:W, 0x61d000-0x61dfff:W, 0x61e000-0x61efff:W, 0x61f000-0x61ffff:W, 0x620000-0x620fff:W, 0x621000-0x621fff:W, 0x622000-0x622fff:W, 0x623000-0x623fff:W, 0x624000-0x624fff:W, 0x625000-0x625fff:W, 0x626000-0x626fff:W, 0x627000-0x627fff:W, 0x628000-0x628fff:W, 0x629000-0x629fff:W, 0x62a000-0x62afff:W, 0x62b000-0x62bfff:W, 0x62c000-0x62cfff:W, 0x62d000-0x62dfff:W, 0x62e000-0x62efff:W, 0x62f000-0x62ffff:W, 0x630000-0x630fff:W, 0x631000-0x631fff:W, 0x632000-0x632fff:W, 0x633000-0x633fff:W, 0x634000-0x634fff:W, 0x635000-0x635fff:W, 0x636000-0x636fff:W, 0x637000-0x637fff:W, 0x638000-0x638fff:W, 0x639000-0x639fff:W, 0x63a000-0x63afff:W, 0x63b000-0x63bfff:W, 0x63c000-0x63cfff:W, 0x63d000-0x63dfff:W, 0x63e000-0x63efff:W, 0x63f000-0x63ffff:W, 0x640000-0x640fff:W, 0x641000-0x641fff:W, 0x642000-0x642fff:W, 0x643000-0x643fff:W, 0x644000-0x644fff:W, 0x645000-0x645fff:W, 0x646000-0x646fff:W, 0x647000-0x647fff:W, 0x648000-0x648fff:W, 0x649000-0x649fff:W, 0x64a000-0x64afff:W, 0x64b000-0x64bfff:W, 0x64c000-0x64cfff:W, 0x64d000-0x64dfff:W, 0x64e000-0x64efff:W, 0x64f000-0x64ffff:W, 0x650000-0x650fff:W, 0x651000-0x651fff:W, 0x652000-0x652fff:W, 0x653000-0x653fff:W, 0x654000-0x654fff:W, 0x655000-0x655fff:W, 0x656000-0x656fff:W, 0x657000-0x657fff:W, 0x658000-0x658fff:W, 0x659000-0x659fff:W, 0x65a000-0x65afff:W, 0x65b000-0x65bfff:W, 0x65c000-0x65cfff:W, 0x65d000-0x65dfff:W, 0x65e000-0x65efff:W, 0x65f000-0x65ffff:W, 0x660000-0x660fff:W, 0x661000-0x661fff:W, 0x662000-0x662fff:W, 0x663000-0x663fff:W, 0x664000-0x664fff:W, 0x665000-0x665fff:W, 0x666000-0x666fff:W, 0x667000-0x667fff:W, 0x668000-0x668fff:W, 0x669000-0x669fff:W, 0x66a000-0x66afff:W, 0x66b000-0x66bfff:W, 0x66c000-0x66cfff:W, 0x66d000-0x66dfff:W, 0x66e000-0x66efff:W, 0x66f000-0x66ffff:W, 0x670000-0x670fff:W, 0x671000-0x671fff:W, 0x672000-0x672fff:W, 0x673000-0x673fff:W, 0x674000-0x674fff:W, 0x675000-0x675fff:W, 0x676000-0x676fff:W, 0x677000-0x677fff:W, 0x678000-0x678fff:W, 0x679000-0x679fff:W, 0x67a000-0x67afff:W, 0x67b000-0x67bfff:W, 0x67c000-0x67cfff:W, 0x67d000-0x67dfff:W, 0x67e000-0x67efff:W, 0x67f000-0x67ffff:W, 0x680000-0x680fff:W, 0x681000-0x681fff:W, 0x682000-0x682fff:W, 0x683000-0x683fff:W, 0x684000-0x684fff:W, 0x685000-0x685fff:W, 0x686000-0x686fff:W, 0x687000-0x687fff:W, 0x688000-0x688fff:W, 0x689000-0x689fff:W, 0x68a000-0x68afff:W, 0x68b000-0x68bfff:W, 0x68c000-0x68cfff:W, 0x68d000-0x68dfff:W, 0x68e000-0x68efff:W, 0x68f000-0x68ffff:W, 0x690000-0x690fff:W, 0x691000-0x691fff:W, 0x692000-0x692fff:W, 0x693000-0x693fff:W, 0x694000-0x694fff:W, 0x695000-0x695fff:W, 0x696000-0x696fff:W, 0x697000-0x697fff:W, 0x698000-0x698fff:W, 0x699000-0x699fff:W, 0x69a000-0x69afff:W, 0x69b000-0x69bfff:W, 0x69c000-0x69cfff:W, 0x69d000-0x69dfff:W, 0x69e000-0x69efff:W, 0x69f000-0x69ffff:W, 0x6a0000-0x6a0fff:W, 0x6a1000-0x6a1fff:W, 0x6a2000-0x6a2fff:W, 0x6a3000-0x6a3fff:W, 0x6a4000-0x6a4fff:W, 0x6a5000-0x6a5fff:W, 0x6a6000-0x6a6fff:W, 0x6a7000-0x6a7fff:W, 0x6a8000-0x6a8fff:W, 0x6a9000-0x6a9fff:W, 0x6aa000-0x6aafff:W, 0x6ab000-0x6abfff:W, 0x6ac000-0x6acfff:W, 0x6ad000-0x6adfff:W, 0x6ae000-0x6aefff:W, 0x6af000-0x6affff:W, 0x6b0000-0x6b0fff:W, 0x6b1000-0x6b1fff:W, 0x6b2000-0x6b2fff:W, 0x6b3000-0x6b3fff:W, 0x6b4000-0x6b4fff:W, 0x6b5000-0x6b5fff:W, 0x6b6000-0x6b6fff:W, 0x6b7000-0x6b7fff:W, 0x6b8000-0x6b8fff:W, 0x6b9000-0x6b9fff:W, 0x6ba000-0x6bafff:W, 0x6bb000-0x6bbfff:W, 0x6bc000-0x6bcfff:W, 0x6bd000-0x6bdfff:W, 0x6be000-0x6befff:W, 0x6bf000-0x6bffff:W, 0x6c0000-0x6c0fff:W, 0x6c1000-0x6c1fff:W, 0x6c2000-0x6c2fff:W, 0x6c3000-0x6c3fff:W, 0x6c4000-0x6c4fff:W, 0x6c5000-0x6c5fff:W, 0x6c6000-0x6c6fff:W, 0x6c7000-0x6c7fff:W, 0x6c8000-0x6c8fff:W, 0x6c9000-0x6c9fff:W, 0x6ca000-0x6cafff:W, 0x6cb000-0x6cbfff:W, 0x6cc000-0x6ccfff:W, 0x6cd000-0x6cdfff:W, 0x6ce000-0x6cefff:W, 0x6cf000-0x6cffff:W, 0x6d0000-0x6d0fff:W, 0x6d1000-0x6d1fff:W, 0x6d2000-0x6d2fff:W, 0x6d3000-0x6d3fff:W, 0x6d4000-0x6d4fff:W, 0x6d5000-0x6d5fff:W, 0x6d6000-0x6d6fff:W, 0x6d7000-0x6d7fff:W, 0x6d8000-0x6d8fff:W, 0x6d9000-0x6d9fff:W, 0x6da000-0x6dafff:W, 0x6db000-0x6dbfff:W, 0x6dc000-0x6dcfff:W, 0x6dd000-0x6ddfff:W, 0x6de000-0x6defff:W, 0x6df000-0x6dffff:W, 0x6e0000-0x6e0fff:W, 0x6e1000-0x6e1fff:W, 0x6e2000-0x6e2fff:W, 0x6e3000-0x6e3fff:W, 0x6e4000-0x6e4fff:W, 0x6e5000-0x6e5fff:W, 0x6e6000-0x6e6fff:W, 0x6e7000-0x6e7fff:W, 0x6e8000-0x6e8fff:W, 0x6e9000-0x6e9fff:W, 0x6ea000-0x6eafff:W, 0x6eb000-0x6ebfff:W, 0x6ec000-0x6ecfff:W, 0x6ed000-0x6edfff:W, 0x6ee000-0x6eefff:W, 0x6ef000-0x6effff:W, 0x6f0000-0x6f0fff:W, 0x6f1000-0x6f1fff:W, 0x6f2000-0x6f2fff:W, 0x6f3000-0x6f3fff:W, 0x6f4000-0x6f4fff:W, 0x6f5000-0x6f5fff:W, 0x6f6000-0x6f6fff:W, 0x6f7000-0x6f7fff:W, 0x6f8000-0x6f8fff:W, 0x6f9000-0x6f9fff:W, 0x6fa000-0x6fafff:W, 0x6fb000-0x6fbfff:W, 0x6fc000-0x6fcfff:W, 0x6fd000-0x6fdfff:W, 0x6fe000-0x6fefff:W, 0x6ff000-0x6fffff:W, 0x700000-0x700fff:W, 0x701000-0x701fff:W, 0x702000-0x702fff:W, 0x703000-0x703fff:W, 0x704000-0x704fff:W, 0x705000-0x705fff:W, 0x706000-0x706fff:W, 0x707000-0x707fff:W, 0x708000-0x708fff:W, 0x709000-0x709fff:W, 0x70a000-0x70afff:W, 0x70b000-0x70bfff:W, 0x70c000-0x70cfff:W, 0x70d000-0x70dfff:W, 0x70e000-0x70efff:W, 0x70f000-0x70ffff:W, 0x710000-0x710fff:W, 0x711000-0x711fff:W, 0x712000-0x712fff:W, 0x713000-0x713fff:W, 0x714000-0x714fff:W, 0x715000-0x715fff:W, 0x716000-0x716fff:W, 0x717000-0x717fff:W, 0x718000-0x718fff:W, 0x719000-0x719fff:W, 0x71a000-0x71afff:W, 0x71b000-0x71bfff:W, 0x71c000-0x71cfff:W, 0x71d000-0x71dfff:W, 0x71e000-0x71efff:W, 0x71f000-0x71ffff:W, 0x720000-0x720fff:W, 0x721000-0x721fff:W, 0x722000-0x722fff:W, 0x723000-0x723fff:W, 0x724000-0x724fff:W, 0x725000-0x725fff:W, 0x726000-0x726fff:W, 0x727000-0x727fff:W, 0x728000-0x728fff:W, 0x729000-0x729fff:W, 0x72a000-0x72afff:W, 0x72b000-0x72bfff:W, 0x72c000-0x72cfff:W, 0x72d000-0x72dfff:W, 0x72e000-0x72efff:W, 0x72f000-0x72ffff:W, 0x730000-0x730fff:W, 0x731000-0x731fff:W, 0x732000-0x732fff:W, 0x733000-0x733fff:W, 0x734000-0x734fff:W, 0x735000-0x735fff:W, 0x736000-0x736fff:W, 0x737000-0x737fff:W, 0x738000-0x738fff:W, 0x739000-0x739fff:W, 0x73a000-0x73afff:W, 0x73b000-0x73bfff:W, 0x73c000-0x73cfff:W, 0x73d000-0x73dfff:W, 0x73e000-0x73efff:W, 0x73f000-0x73ffff:W, 0x740000-0x740fff:W, 0x741000-0x741fff:W, 0x742000-0x742fff:W, 0x743000-0x743fff:W, 0x744000-0x744fff:W, 0x745000-0x745fff:W, 0x746000-0x746fff:W, 0x747000-0x747fff:W, 0x748000-0x748fff:W, 0x749000-0x749fff:W, 0x74a000-0x74afff:W, 0x74b000-0x74bfff:W, 0x74c000-0x74cfff:W, 0x74d000-0x74dfff:W, 0x74e000-0x74efff:W, 0x74f000-0x74ffff:W, 0x750000-0x750fff:W, 0x751000-0x751fff:W, 0x752000-0x752fff:W, 0x753000-0x753fff:W, 0x754000-0x754fff:W, 0x755000-0x755fff:W, 0x756000-0x756fff:W, 0x757000-0x757fff:W, 0x758000-0x758fff:W, 0x759000-0x759fff:W, 0x75a000-0x75afff:W, 0x75b000-0x75bfff:W, 0x75c000-0x75cfff:W, 0x75d000-0x75dfff:W, 0x75e000-0x75efff:W, 0x75f000-0x75ffff:W, 0x760000-0x760fff:W, 0x761000-0x761fff:W, 0x762000-0x762fff:W, 0x763000-0x763fff:W, 0x764000-0x764fff:W, 0x765000-0x765fff:W, 0x766000-0x766fff:W, 0x767000-0x767fff:W, 0x768000-0x768fff:W, 0x769000-0x769fff:W, 0x76a000-0x76afff:W, 0x76b000-0x76bfff:W, 0x76c000-0x76cfff:W, 0x76d000-0x76dfff:W, 0x76e000-0x76efff:W, 0x76f000-0x76ffff:W, 0x770000-0x770fff:W, 0x771000-0x771fff:W, 0x772000-0x772fff:W, 0x773000-0x773fff:W, 0x774000-0x774fff:W, 0x775000-0x775fff:W, 0x776000-0x776fff:W, 0x777000-0x777fff:W, 0x778000-0x778fff:W, 0x779000-0x779fff:W, 0x77a000-0x77afff:W, 0x77b000-0x77bfff:W, 0x77c000-0x77cfff:W, 0x77d000-0x77dfff:W, 0x77e000-0x77efff:W, 0x77f000-0x77ffff:W, 0x780000-0x780fff:W, 0x781000-0x781fff:W, 0x782000-0x782fff:W, 0x783000-0x783fff:W, 0x784000-0x784fff:W, 0x785000-0x785fff:W, 0x786000-0x786fff:W, 0x787000-0x787fff:W, 0x788000-0x788fff:W, 0x789000-0x789fff:W, 0x78a000-0x78afff:W, 0x78b000-0x78bfff:W, 0x78c000-0x78cfff:W, 0x78d000-0x78dfff:W, 0x78e000-0x78efff:W, 0x78f000-0x78ffff:W, 0x790000-0x790fff:W, 0x791000-0x791fff:W, 0x792000-0x792fff:W, 0x793000-0x793fff:W, 0x794000-0x794fff:W, 0x795000-0x795fff:W, 0x796000-0x796fff:W, 0x797000-0x797fff:W, 0x798000-0x798fff:W, 0x799000-0x799fff:W, 0x79a000-0x79afff:W, 0x79b000-0x79bfff:W, 0x79c000-0x79cfff:W, 0x79d000-0x79dfff:W, 0x79e000-0x79efff:W, 0x79f000-0x79ffff:W, 0x7a0000-0x7a0fff:W, 0x7a1000-0x7a1fff:W, 0x7a2000-0x7a2fff:W, 0x7a3000-0x7a3fff:W, 0x7a4000-0x7a4fff:W, 0x7a5000-0x7a5fff:W, 0x7a6000-0x7a6fff:W, 0x7a7000-0x7a7fff:W, 0x7a8000-0x7a8fff:W, 0x7a9000-0x7a9fff:W, 0x7aa000-0x7aafff:W, 0x7ab000-0x7abfff:W, 0x7ac000-0x7acfff:W, 0x7ad000-0x7adfff:W, 0x7ae000-0x7aefff:W, 0x7af000-0x7affff:W, 0x7b0000-0x7b0fff:W, 0x7b1000-0x7b1fff:W, 0x7b2000-0x7b2fff:W, 0x7b3000-0x7b3fff:W, 0x7b4000-0x7b4fff:W, 0x7b5000-0x7b5fff:W, 0x7b6000-0x7b6fff:W, 0x7b7000-0x7b7fff:W, 0x7b8000-0x7b8fff:W, 0x7b9000-0x7b9fff:W, 0x7ba000-0x7bafff:W, 0x7bb000-0x7bbfff:W, 0x7bc000-0x7bcfff:W, 0x7bd000-0x7bdfff:W, 0x7be000-0x7befff:W, 0x7bf000-0x7bffff:W, 0x7c0000-0x7c0fff:W, 0x7c1000-0x7c1fff:W, 0x7c2000-0x7c2fff:W, 0x7c3000-0x7c3fff:W, 0x7c4000-0x7c4fff:W, 0x7c5000-0x7c5fff:W, 0x7c6000-0x7c6fff:W, 0x7c7000-0x7c7fff:W, 0x7c8000-0x7c8fff:W, 0x7c9000-0x7c9fff:W, 0x7ca000-0x7cafff:W, 0x7cb000-0x7cbfff:W, 0x7cc000-0x7ccfff:W, 0x7cd000-0x7cdfff:W, 0x7ce000-0x7cefff:W, 0x7cf000-0x7cffff:W, 0x7d0000-0x7d0fff:W, 0x7d1000-0x7d1fff:W, 0x7d2000-0x7d2fff:W, 0x7d3000-0x7d3fff:W, 0x7d4000-0x7d4fff:W, 0x7d5000-0x7d5fff:W, 0x7d6000-0x7d6fff:W, 0x7d7000-0x7d7fff:W, 0x7d8000-0x7d8fff:W, 0x7d9000-0x7d9fff:W, 0x7da000-0x7dafff:W, 0x7db000-0x7dbfff:W, 0x7dc000-0x7dcfff:W, 0x7dd000-0x7ddfff:W, 0x7de000-0x7defff:W, 0x7df000-0x7dffff:W, 0x7e0000-0x7e0fff:W, 0x7e1000-0x7e1fff:W, 0x7e2000-0x7e2fff:W, 0x7e3000-0x7e3fff:W, 0x7e4000-0x7e4fff:W, 0x7e5000-0x7e5fff:W, 0x7e6000-0x7e6fff:W, 0x7e7000-0x7e7fff:W, 0x7e8000-0x7e8fff:W, 0x7e9000-0x7e9fff:W, 0x7ea000-0x7eafff:W, 0x7eb000-0x7ebfff:W, 0x7ec000-0x7ecfff:W, 0x7ed000-0x7edfff:W, 0x7ee000-0x7eefff:W, 0x7ef000-0x7effff:W, 0x7f0000-0x7f0fff:W, 0x7f1000-0x7f1fff:W, 0x7f2000-0x7f2fff:W, 0x7f3000-0x7f3fff:W, 0x7f4000-0x7f4fff:W, 0x7f5000-0x7f5fff:W, 0x7f6000-0x7f6fff:W, 0x7f7000-0x7f7fff:W, 0x7f8000-0x7f8fff:W, 0x7f9000-0x7f9fff:W, 0x7fa000-0x7fafff:W, 0x7fb000-0x7fbfff:W, 0x7fc000-0x7fcfff:W, 0x7fd000-0x7fdfff:W, 0x7fe000-0x7fefff:W, 0x7ff000-0x7fffff:W Erase/write done. Verifying flash... ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* ...............................................................................................................................* VERIFIED. programmer_unmap_flash_region: unmapped 0x0000000000000000 Shutdown succeeded --- D:/dev/src/flashrom/flashrom-1.0-rc1/Makefile_old Sun Nov 5 22:35:34 2017 +++ D:/dev/src/flashrom/flashrom-1.0-rc1/Makefile Sat Nov 18 17:32:54 2017 @@ -97,7 +97,7 @@ # HOST_OS is only used to work around local toolchain issues. HOST_OS ?= $(shell uname) -ifeq ($(HOST_OS), MINGW32_NT-5.1) +ifeq ($(findstring MINGW, $(HOST_OS)), MINGW) # Explicitly set CC = gcc on MinGW, otherwise: "cc: command not found". CC = gcc endif @@ -189,7 +189,7 @@ ifeq ($(TARGET_OS), MinGW) EXEC_SUFFIX := .exe # MinGW doesn't have the ffs() function, but we can use gcc's __builtin_ffs(). -FLASHROM_CFLAGS += -Dffs=__builtin_ffs +FLASHROM_CFLAGS += -Dffs=__builtin_ffs -D_CRT_SECURE_NO_WARNINGS # Some functions provided by Microsoft do not work as described in C99 specifications. This macro fixes that # for MinGW. See http://sourceforge.net/p/mingw-w64/wiki2/printf%20and%20scanf%20family/ */ FLASHROM_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1 @@ -653,10 +653,8 @@ endif # Disable feature groups -ifeq ($(CONFIG_ENABLE_LIBUSB0_PROGRAMMERS), no) -override CONFIG_PICKIT2_SPI = no -endif ifeq ($(CONFIG_ENABLE_LIBUSB1_PROGRAMMERS), no) +override CONFIG_PICKIT2_SPI = no override CONFIG_CH341A_SPI = no override CONFIG_DEDIPROG = no endif @@ -823,7 +821,7 @@ ifeq ($(CONFIG_PICKIT2_SPI), yes) FEATURE_CFLAGS += -D'CONFIG_PICKIT2_SPI=1' PROGRAMMER_OBJS += pickit2_spi.o -NEED_LIBUSB0 += CONFIG_PICKIT2_SPI +NEED_LIBUSB1 += CONFIG_PICKIT2_SPI endif ifneq ($(NEED_LIBFTDI), ) @@ -970,11 +968,6 @@ endif -ifneq ($(NEED_LIBUSB0), ) -CHECK_LIBUSB0 = yes -FEATURE_CFLAGS += -D'NEED_LIBUSB0=1' -USBLIBS := $(call debug_shell,[ -n "$(PKG_CONFIG_LIBDIR)" ] && export PKG_CONFIG_LIBDIR="$(PKG_CONFIG_LIBDIR)" ; $(PKG_CONFIG) --libs libusb || printf "%s" "-lusb") -endif ifneq ($(NEED_LIBUSB1), ) CHECK_LIBUSB1 = yes @@ -1015,7 +1008,7 @@ endif $(PROGRAM)$(EXEC_SUFFIX): $(OBJS) - $(CC) $(LDFLAGS) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(LIBS) $(PCILIBS) $(FEATURE_LIBS) $(USBLIBS) $(USB1LIBS) + $(CC) -o $(PROGRAM)$(EXEC_SUFFIX) $(OBJS) $(LIBS) $(PCILIBS) $(FEATURE_LIBS) $(USBLIBS) $(USB1LIBS) $(LDFLAGS) libflashrom.a: $(LIBFLASHROM_OBJS) $(AR) rcs $@ $^ @@ -1119,23 +1112,6 @@ endef export PCI_GET_DEV_TEST -define LIBUSB0_TEST -#include "platform.h" -#if IS_WINDOWS -#include -#else -#include -#endif -int main(int argc, char **argv) -{ - (void) argc; - (void) argv; - usb_init(); - return 0; -} -endef -export LIBUSB0_TEST - define LIBUSB1_TEST #include #include @@ -1181,28 +1157,6 @@ echo "mentioned above by specifying make CONFIG_ENABLE_LIBPCI_PROGRAMMERS=no"; \ echo "See README for more information."; echo; \ rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1 - @rm -f .test.c .test.o .test$(EXEC_SUFFIX) -endif -ifeq ($(CHECK_LIBUSB0), yes) - @printf "Checking for libusb-0.1/libusb-compat headers... " | tee -a $(BUILD_DETAILS_FILE) - @echo "$$LIBUSB0_TEST" > .test.c - @printf "\nexec: %s\n" "$(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o" >>$(BUILD_DETAILS_FILE) - @{ { { { { $(CC) -c $(CPPFLAGS) $(CFLAGS) .test.c -o .test.o >&2 && \ - echo "found." || { echo "not found."; echo; \ - echo "The following features require libusb-0.1/libusb-compat: $(NEED_LIBUSB0)."; \ - echo "Please install libusb-0.1 headers or libusb-compat headers or disable all features"; \ - echo "mentioned above by specifying make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no"; \ - echo "See README for more information."; echo; \ - rm -f .test.c .test.o; exit 1; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1 - @printf "Checking if libusb-0.1 is usable... " | tee -a $(BUILD_DETAILS_FILE) - @printf "\nexec: %s\n" "$(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(USBLIBS)" >>$(BUILD_DETAILS_FILE) - @{ { { { { $(CC) $(LDFLAGS) .test.o -o .test$(EXEC_SUFFIX) $(LIBS) $(USBLIBS) >&2 && \ - echo "yes." || { echo "no."; \ - echo "The following features require libusb-0.1/libusb-compat: $(NEED_LIBUSB0)."; \ - echo "Please install libusb-0.1 or libusb-compat or disable all features"; \ - echo "mentioned above by specifying make CONFIG_ENABLE_LIBUSB0_PROGRAMMERS=no"; \ - echo "See README for more information."; echo; \ - rm -f .test.c .test.o .test$(EXEC_SUFFIX); exit 1; }; } 2>>$(BUILD_DETAILS_FILE); echo $? >&3 ; } | tee -a $(BUILD_DETAILS_FILE) >&4; } 3>&1;} | { read rc ; exit ${rc}; } } 4>&1 @rm -f .test.c .test.o .test$(EXEC_SUFFIX) endif ifeq ($(CHECK_LIBUSB1), yes)