From b5223c4ac5a4eb42fe9283153376e8c3d16a4e71 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Sat, 16 Jul 2016 21:01:17 +1000 Subject: [PATCH] Fixed SCSI issues. It should now be stable on all systems. --- CHANGELOG | 3 + Makefile | 3 + STM32CubeMX/SCSI2SD-V6/Src/fsmc.c | 2 + STM32CubeMX/SCSI2SD-V6/Src/main.c | 6 +- rtl/fpga_bitmap.o | Bin 32724 -> 32724 bytes src/firmware/cdrom.c | 8 +-- src/firmware/config.c | 115 +----------------------------- src/firmware/debug.h | 26 ------- src/firmware/disk.c | 13 +++- src/firmware/main.c | 3 - src/firmware/mo.c | 6 +- src/firmware/scsi.c | 19 ++--- src/firmware/scsiPhy.c | 113 ++++++++++++++++++++++------- src/firmware/scsiPhy.h | 3 + src/firmware/sd.c | 2 +- src/firmware/tape.c | 4 -- src/scsi2sd-util6/Makefile | 47 ++++++++++-- src/scsi2sd-util6/SCSI2SD_HID.cc | 24 +------ src/scsi2sd-util6/scsi2sd-util.cc | 44 ++---------- 19 files changed, 177 insertions(+), 264 deletions(-) delete mode 100755 src/firmware/debug.h diff --git a/CHANGELOG b/CHANGELOG index 03414da6..1103a755 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +20160716 6.03 (BETA3) + - SCSI bug fixes. + 20160616 6.01 - Improved SD card compatibility - Fixed SCSI interfaces on slower SCSI controllers diff --git a/Makefile b/Makefile index fa963080..61c82263 100644 --- a/Makefile +++ b/Makefile @@ -131,6 +131,7 @@ USBCOMPOSITE_SRC= \ SRC = \ src/firmware/bootloader.c \ + src/firmware/cdrom.c \ src/firmware/config.c \ src/firmware/disk.c \ src/firmware/diagnostic.c \ @@ -140,10 +141,12 @@ SRC = \ src/firmware/inquiry.c \ src/firmware/led.c \ src/firmware/main.c \ + src/firmware/mo.c \ src/firmware/mode.c \ src/firmware/scsiPhy.c \ src/firmware/scsi.c \ src/firmware/sd.c \ + src/firmware/tape.c \ src/firmware/time.c \ src/firmware/trace.c \ ${USBCOMPOSITE_SRC} diff --git a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c index 51aa1a4e..de40c343 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/fsmc.c @@ -66,11 +66,13 @@ void MX_FSMC_Init(void) hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; /* Timing */ + /* Timing.AddressSetupTime = 3; Timing.AddressHoldTime = 2; Timing.DataSetupTime = 5; */ + Timing.AddressSetupTime = 2; Timing.AddressHoldTime = 1; Timing.DataSetupTime = 4; diff --git a/STM32CubeMX/SCSI2SD-V6/Src/main.c b/STM32CubeMX/SCSI2SD-V6/Src/main.c index 0150258c..bf352ace 100755 --- a/STM32CubeMX/SCSI2SD-V6/Src/main.c +++ b/STM32CubeMX/SCSI2SD-V6/Src/main.c @@ -92,8 +92,8 @@ int main(void) MX_SDIO_SD_Init(); MX_SPI1_Init(); MX_TIM4_Init(); - MX_USART3_UART_Init(); - MX_USB_HOST_Init(); + // TODO re-enable MX_USART3_UART_Init(); + // TODO re-enable MX_USB_HOST_Init(); /* USER CODE BEGIN 2 */ mainInit(); @@ -105,7 +105,7 @@ int main(void) while (1) { /* USER CODE END WHILE */ - MX_USB_HOST_Process(); + // TODO re-enable MX_USB_HOST_Process(); /* USER CODE BEGIN 3 */ mainLoop(); diff --git a/rtl/fpga_bitmap.o b/rtl/fpga_bitmap.o index 16130841bb44c71ff8a517f31a57d295dd13d880..b744be24ba1cd802cb23606f59abffae863d2cac 100644 GIT binary patch literal 32724 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 DprT{~ literal 32724 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

BGjQOueFo&|I~^sz1Q@;y3lIlg%i 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. -#pragma GCC push_options -#pragma GCC optimize("-flto") -#include "device.h" #include "scsi.h" #include "config.h" #include "cdrom.h" +#include + static const uint8_t SimpleTOC[] = { 0x00, // toc length, MSB @@ -276,7 +275,7 @@ int scsiCDRomCommand() { int commandHandled = 1; - uint8 command = scsiDev.cdb[0]; + uint8_t command = scsiDev.cdb[0]; if (command == 0x43) { // CD-ROM Read TOC @@ -323,4 +322,3 @@ int scsiCDRomCommand() return commandHandled; } -#pragma GCC pop_options diff --git a/src/firmware/config.c b/src/firmware/config.c index a19087d8..528eb0fc 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -16,7 +16,6 @@ // along with SCSI2SD. If not, see . #include "config.h" -#include "debug.h" #include "led.h" #include "scsi.h" @@ -38,7 +37,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x0601; +static const uint16_t FIRMWARE_VERSION = 0x0603; // 1 flash row static const uint8_t DEFAULT_CONFIG[128] = @@ -176,7 +175,7 @@ debugCommand() response[15] = scsiDev.lastSense; response[16] = scsiDev.phase; response[17] = scsiStatusBSY(); - response[18] = *SCSI_STS_SELECTED; + response[18] = scsiStatusSEL(); response[19] = scsiStatusATN(); response[20] = scsiStatusRST(); response[21] = scsiDev.rstCount; @@ -189,6 +188,7 @@ debugCommand() response[28] = scsiDev.lastSenseASC; response[29] = *SCSI_STS_DBX; response[30] = LastTrace; + response[31] = scsiStatusACK(); hidPacket_send(response, sizeof(response)); } @@ -330,116 +330,7 @@ void s2s_configPoll() } -void debugPoll() -{ -#if 0 - if (!usbReady) - { - return; - } - - if(USBFS_GetEPState(USB_EP_COMMAND) == USBFS_OUT_BUFFER_FULL) - { - // The host sent us some data! - int byteCount = USBFS_GetEPCount(USB_EP_COMMAND); - USBFS_ReadOutEP(USB_EP_COMMAND, (uint8 *)&hidBuffer, byteCount); - - if (byteCount >= 1 && - hidBuffer[0] == 0x01) - { - // Reboot command. - Bootloadable_1_Load(); - } - - // Allow the host to send us another command. - // (assuming we didn't reboot outselves) - USBFS_EnableOutEP(USB_EP_COMMAND); - } - - switch (usbDebugEpState) - { - case USB_IDLE: - memcpy(&hidBuffer, &scsiDev.cdb, 12); - hidBuffer[12] = scsiDev.msgIn; - hidBuffer[13] = scsiDev.msgOut; - hidBuffer[14] = scsiDev.lastStatus; - hidBuffer[15] = scsiDev.lastSense; - hidBuffer[16] = scsiDev.phase; - hidBuffer[17] = SCSI_ReadFilt(SCSI_Filt_BSY); - hidBuffer[18] = SCSI_ReadFilt(SCSI_Filt_SEL); - hidBuffer[19] = SCSI_ReadFilt(SCSI_Filt_ATN); - hidBuffer[20] = SCSI_ReadFilt(SCSI_Filt_RST); - hidBuffer[21] = scsiDev.rstCount; - hidBuffer[22] = scsiDev.selCount; - hidBuffer[23] = scsiDev.msgCount; - hidBuffer[24] = scsiDev.cmdCount; - hidBuffer[25] = scsiDev.watchdogTick; - hidBuffer[26] = blockDev.state; - hidBuffer[27] = scsiDev.lastSenseASC >> 8; - hidBuffer[28] = scsiDev.lastSenseASC; - hidBuffer[29] = scsiReadDBxPins(); - hidBuffer[30] = LastTrace; - - hidBuffer[58] = sdDev.capacity >> 24; - hidBuffer[59] = sdDev.capacity >> 16; - hidBuffer[60] = sdDev.capacity >> 8; - hidBuffer[61] = sdDev.capacity; - - hidBuffer[62] = FIRMWARE_VERSION >> 8; - hidBuffer[63] = FIRMWARE_VERSION; - - USBFS_LoadInEP(USB_EP_DEBUG, (uint8 *)&hidBuffer, sizeof(hidBuffer)); - usbDebugEpState = USB_DATA_SENT; - break; - - case USB_DATA_SENT: - if (USBFS_bGetEPAckState(USB_EP_DEBUG)) - { - // Data accepted. - usbDebugEpState = USB_IDLE; - } - break; - } -#endif -} - -#if 0 -CY_ISR(debugTimerISR) -{ - Debug_Timer_ReadStatusRegister(); - Debug_Timer_Interrupt_ClearPending(); - uint8 savedIntrStatus = CyEnterCriticalSection(); - debugPoll(); - CyExitCriticalSection(savedIntrStatus); -} -#endif - -void s2s_debugInit() -{ -#if 0 - Debug_Timer_Interrupt_StartEx(debugTimerISR); - Debug_Timer_Start(); -#endif -} -void debugPause() -{ -#if 0 - Debug_Timer_Stop(); -#endif -} - -void debugResume() -{ -#if 0 - Debug_Timer_Start(); -#endif -} - -int isDebugEnabled() -{ - return usbReady; -} // Public method for storing MODE SELECT results. void s2s_configSave(int scsiId, uint16_t bytesPerSector) diff --git a/src/firmware/debug.h b/src/firmware/debug.h deleted file mode 100755 index 683c75b2..00000000 --- a/src/firmware/debug.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2015 Michael McMaster -// -// This file is part of SCSI2SD. -// -// SCSI2SD 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, either version 3 of the License, or -// (at your option) any later version. -// -// SCSI2SD 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 SCSI2SD. If not, see . -#ifndef Debug_H -#define Debug_H - -void debugInit(void); -void debugPause(void); -void debugResume(void); -int isDebugEnabled(void); - -#endif - diff --git a/src/firmware/disk.c b/src/firmware/disk.c index d4c826b7..5a211faa 100755 --- a/src/firmware/disk.c +++ b/src/firmware/disk.c @@ -19,7 +19,6 @@ #include "scsi.h" #include "scsiPhy.h" #include "config.h" -#include "debug.h" #include "disk.h" #include "sd.h" #include "time.h" @@ -597,6 +596,15 @@ void scsiDiskPoll() } sdActive = 1; } +#endif +#if 0 + uint32_t maxSectors = sizeof(scsiDev.data) / SD_SECTOR_SIZE; + uint32_t rem = totalSDSectors - i; + uint32_t sectors = + rem < maxSectors ? rem : maxSectors; + sdTmpRead(&scsiDev.data[0], i + sdLBA, sectors); + scsiWrite(&scsiDev.data[0], sectors * SD_SECTOR_SIZE); + i += sectors; #endif if ((prep - i < buffers) && (prep < totalSDSectors)) @@ -673,8 +681,9 @@ void scsiDiskPoll() // do this in a half-duplex fashion. We need to write as much as // possible in each SD card transaction. uint32_t maxSectors = sizeof(scsiDev.data) / SD_SECTOR_SIZE; + uint32_t rem = totalSDSectors - i; uint32_t sectors = - totalSDSectors < maxSectors ? totalSDSectors : maxSectors; + rem < maxSectors ? rem : maxSectors; scsiRead(&scsiDev.data[0], sectors * SD_SECTOR_SIZE); sdTmpWrite(&scsiDev.data[0], i + sdLBA, sectors); i += sectors; diff --git a/src/firmware/main.c b/src/firmware/main.c index a2317626..6e4cd3f3 100755 --- a/src/firmware/main.c +++ b/src/firmware/main.c @@ -55,9 +55,6 @@ void mainInit() scsiPhyConfig(); scsiInit(); - s2s_debugInit(); - - MX_USB_DEVICE_Init(); // USB lun config now available. // Optional bootup delay diff --git a/src/firmware/mo.c b/src/firmware/mo.c index e13acc5d..a6962781 100644 --- a/src/firmware/mo.c +++ b/src/firmware/mo.c @@ -14,10 +14,7 @@ // // You should have received a copy of the GNU General Public License // along with SCSI2SD. If not, see . -#pragma GCC push_options -#pragma GCC optimize("-flto") -#include "device.h" #include "scsi.h" #include "config.h" #include "mo.h" @@ -28,7 +25,7 @@ int scsiMOCommand() { int commandHandled = 0; - uint8 command = scsiDev.cdb[0]; + uint8_t command = scsiDev.cdb[0]; if ((command == 0x2C) || // ERASE(10) (command == 0xAC)) // ERASE(12) { @@ -40,4 +37,3 @@ int scsiMOCommand() return commandHandled; } -#pragma GCC pop_options diff --git a/src/firmware/scsi.c b/src/firmware/scsi.c index c4b53a57..9e144a28 100755 --- a/src/firmware/scsi.c +++ b/src/firmware/scsi.c @@ -25,10 +25,10 @@ #include "mode.h" #include "time.h" #include "bsp.h" -//#include "cdrom.h" +#include "cdrom.h" //#include "debug.h" -//#include "tape.h" -//#include "mo.h" +#include "tape.h" +#include "mo.h" #include @@ -157,7 +157,6 @@ void process_Status() scsiDev.lastSense = scsiDev.target->sense.code; scsiDev.lastSenseASC = scsiDev.target->sense.asc; - // Command Complete occurs AFTER a valid status has been // sent. then we go bus-free. enter_MessageIn(message); @@ -263,7 +262,7 @@ static void process_Command() control = scsiDev.cdb[scsiDev.cdbLen - 1]; scsiDev.cmdCount++; - // TODO const S2S_TargetCfg* cfg = scsiDev.target->cfg; + const S2S_TargetCfg* cfg = scsiDev.target->cfg; if (unlikely(scsiDev.resetFlag)) { @@ -352,7 +351,6 @@ static void process_Command() { enter_Status(CONFLICT); } -#if 0 // Handle odd device types first that may override basic read and // write commands. Will fall-through to generic disk handling. else if (((cfg->deviceType == S2S_CFG_OPTICAL) && scsiCDRomCommand()) || @@ -361,7 +359,6 @@ static void process_Command() { // Already handled. } -#endif else if (scsiDiskCommand()) { // Already handled. @@ -605,13 +602,9 @@ static void process_SelectionPhase() // SCSI1/SASI initiators may not set their own ID. scsiDev.initiatorId = (selStatus >> 3) & 0x7; - // Wait until the end of the selection phase. - while (likely(!scsiDev.resetFlag)) + while (likely(!scsiDev.resetFlag) && scsiStatusSEL()) { - if ((*SCSI_STS_SELECTED & 0x40) == 0) - { - break; - } + // Wait until the end of the selection phase. } scsiDev.phase = COMMAND; diff --git a/src/firmware/scsiPhy.c b/src/firmware/scsiPhy.c index 1a8a6aea..cb9c2065 100755 --- a/src/firmware/scsiPhy.c +++ b/src/firmware/scsiPhy.c @@ -76,21 +76,16 @@ void EXTI4_IRQHandler() } } -#if 0 -uint8_t -scsiReadDBxPins() +static void assertFail() { - return - (SCSI_ReadPin(SCSI_In_DBx_DB7) << 7) | - (SCSI_ReadPin(SCSI_In_DBx_DB6) << 6) | - (SCSI_ReadPin(SCSI_In_DBx_DB5) << 5) | - (SCSI_ReadPin(SCSI_In_DBx_DB4) << 4) | - (SCSI_ReadPin(SCSI_In_DBx_DB3) << 3) | - (SCSI_ReadPin(SCSI_In_DBx_DB2) << 2) | - (SCSI_ReadPin(SCSI_In_DBx_DB1) << 1) | - SCSI_ReadPin(SCSI_In_DBx_DB0); + while (1) + { + s2s_ledOn(); + s2s_delay_ms(100); + s2s_ledOff(); + s2s_delay_ms(100); + } } -#endif static void startScsiRx(uint32_t count) @@ -103,6 +98,12 @@ startScsiRx(uint32_t count) uint8_t scsiReadByte(void) { +#if FIFODEBUG + if (!scsiPhyFifoAltEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif startScsiRx(1); trace(trace_spinPhyRxFifo); @@ -111,6 +112,16 @@ scsiReadByte(void) uint8_t val = scsiPhyRx(); // TODO scsiDev.parityError = scsiDev.parityError || SCSI_Parity_Error_Read(); +#if FIFODEBUG + if (!scsiPhyFifoEmpty()) { + int j = 0; + uint8_t k __attribute((unused)); + while (!scsiPhyFifoEmpty()) { k = scsiPhyRx(); ++j; } + + // Force a lock-up. + assertFail(); + } +#endif return val; } @@ -176,6 +187,13 @@ scsiRead(uint8_t* data, uint32_t count) chunk = chunk & 0xFFFFFFF8; } +#if FIFODEBUG + if (!scsiPhyFifoAltEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif + startScsiRx(chunk); // Wait for the next scsi interrupt (or the 1ms systick) __WFI(); @@ -208,6 +226,14 @@ scsiRead(uint8_t* data, uint32_t count) }; } +#if FIFODEBUG + if (!scsiPhyFifoEmpty()) { + int j = 0; + while (!scsiPhyFifoEmpty()) { scsiPhyRx(); ++j; } + // Force a lock-up. + assertFail(); + } +#endif i += chunk; } } @@ -215,12 +241,25 @@ scsiRead(uint8_t* data, uint32_t count) void scsiWriteByte(uint8_t value) { +#if FIFODEBUG + if (!scsiPhyFifoEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif trace(trace_spinPhyTxFifo); scsiPhyTx(value); scsiPhyFifoFlip(); trace(trace_spinTxComplete); while (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) {} + +#if FIFODEBUG + if (!scsiPhyFifoAltEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif } static void @@ -277,6 +316,13 @@ scsiWrite(const uint8_t* data, uint32_t count) uint32_t chunk = ((count - i) > SCSI_FIFO_DEPTH) ? SCSI_FIFO_DEPTH : (count - i); +#if FIFODEBUG + if (!scsiPhyFifoEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif + if (chunk < 16) { scsiWritePIO(data + i, chunk); @@ -305,6 +351,14 @@ scsiWrite(const uint8_t* data, uint32_t count) } while (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) {} + +#if FIFODEBUG + if (!scsiPhyFifoAltEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif + scsiPhyFifoFlip(); #if 0 // TODO NEED SCSI IRQs @@ -314,6 +368,13 @@ scsiWrite(const uint8_t* data, uint32_t count) i += chunk; } while (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) {} + +#if FIFODEBUG + if (!scsiPhyFifoAltEmpty()) { + // Force a lock-up. + assertFail(); + } +#endif } static inline void busSettleDelay(void) @@ -325,22 +386,25 @@ static inline void busSettleDelay(void) void scsiEnterBusFree() { - *SCSI_CTRL_PHASE = 0; *SCSI_CTRL_BSY = 0x00; + // We now have a Bus Clear Delay of 800ns to release remaining signals. + *SCSI_CTRL_PHASE = 0; } void scsiEnterPhase(int phase) { // ANSI INCITS 362-2002 SPI-3 10.7.1: // Phase changes are not allowed while REQ or ACK is asserted. -#if 0 - while (likely(!scsiDev.resetFlag) && - (SCSI_ReadPin(SCSI_In_REQ) || SCSI_ReadFilt(SCSI_Filt_ACK)) - ) {} -#endif + while (likely(!scsiDev.resetFlag) && scsiStatusACK()) {} int newPhase = phase > 0 ? phase : 0; - if (newPhase != *SCSI_CTRL_PHASE) + int oldPhase = *SCSI_CTRL_PHASE; + + if (!scsiPhyFifoEmpty() || !scsiPhyFifoAltEmpty()) { + // Force a lock-up. + assertFail(); + } + if (newPhase != oldPhase) { *SCSI_CTRL_PHASE = newPhase; busSettleDelay(); @@ -349,6 +413,7 @@ void scsiEnterPhase(int phase) { s2s_delay_us(100); } + } } @@ -466,13 +531,7 @@ void scsiPhyReset() { if (scsiDev.data[j] != (uint8_t) j) { - while (1) - { - s2s_ledOn(); - s2s_delay_ms(100); - s2s_ledOff(); - s2s_delay_ms(100); - } + assertFail(); } } diff --git a/src/firmware/scsiPhy.h b/src/firmware/scsiPhy.h index 6c72e415..353f1c06 100755 --- a/src/firmware/scsiPhy.h +++ b/src/firmware/scsiPhy.h @@ -38,6 +38,7 @@ #define scsiPhyFifoFull() ((*SCSI_STS_FIFO & 0x01) == 0x01) #define scsiPhyFifoEmpty() ((*SCSI_STS_FIFO & 0x02) == 0x02) +#define scsiPhyFifoAltEmpty() ((*SCSI_STS_ALTFIFO & 0x02) == 0x02) #define scsiPhyFifoFlip() \ {\ @@ -52,6 +53,8 @@ #define scsiStatusATN() ((*SCSI_STS_SCSI & 0x01) == 0x01) #define scsiStatusBSY() ((*SCSI_STS_SCSI & 0x02) == 0x02) #define scsiStatusRST() ((*SCSI_STS_SCSI & 0x04) == 0x04) +#define scsiStatusSEL() ((*SCSI_STS_SCSI & 0x08) == 0x08) +#define scsiStatusACK() ((*SCSI_STS_SCSI & 0x10) == 0x10) extern uint8_t scsiPhyFifoSel; diff --git a/src/firmware/sd.c b/src/firmware/sd.c index 8f0d5034..80a0c132 100755 --- a/src/firmware/sd.c +++ b/src/firmware/sd.c @@ -943,7 +943,7 @@ int sdInit() sdInitDMA(); } - if (scsiDev.phase == BUS_FREE) + if (firstInit || (scsiDev.phase == BUS_FREE)) { uint8_t cs = HAL_GPIO_ReadPin(nSD_CD_GPIO_Port, nSD_CD_Pin) ? 0 : 1; uint8_t wp = HAL_GPIO_ReadPin(nSD_WP_GPIO_Port, nSD_WP_Pin) ? 0 : 1; diff --git a/src/firmware/tape.c b/src/firmware/tape.c index 9416a95c..d108ab61 100644 --- a/src/firmware/tape.c +++ b/src/firmware/tape.c @@ -14,10 +14,7 @@ // // You should have received a copy of the GNU General Public License // along with SCSI2SD. If not, see . -#pragma GCC push_options -#pragma GCC optimize("-flto") -#include "device.h" #include "scsi.h" #include "config.h" #include "tape.h" @@ -30,4 +27,3 @@ int scsiTapeCommand() return 0; } -#pragma GCC pop_options diff --git a/src/scsi2sd-util6/Makefile b/src/scsi2sd-util6/Makefile index 3cd88aa0..9bc3b777 100755 --- a/src/scsi2sd-util6/Makefile +++ b/src/scsi2sd-util6/Makefile @@ -1,4 +1,4 @@ -VPATH=../firmware +VPATH=../firmware dfu-programmer/src VERSION=6.0 NAME=scsi2sd-util6 @@ -7,6 +7,15 @@ ifeq ($(USE_SYSTEM), Yes) USE_SYSTEM_HIDAPI = Yes USE_SYSTEM_ZLIB = Yes USE_SYSTEM_WX = Yes +USE_SYSTEM_LIBUSB = Yes +endif + +ifeq ($(USE_SYSTEM_LIBUSB), Yes) +CPPFLAGS_LIBUSB=$(shell pkg-config libusb-1.0 --cflags) +LDFLAGS_LIBUSB=$(shell pkg-config libusb-1.0 --libs) +else +CPPFLAGS_LIBUSB=-I libusb-1.0.9/libusb +LDFLAGS_LIBUSB=-L $(BUILD)/libusb/libusb/.libs -lusb-1.0 endif ifeq ($(USE_SYSTEM_HIDAPI), Yes) @@ -33,11 +42,20 @@ else LDFLAGS_WX=$(shell $(BUILD)/wx/wx-config --libs) endif -CPPFLAGS = $(CPPFLAGS_HIDAPI) -I. -I ../../include -Ilibzipper-1.0.4 $(CPPFLAGS_ZLIB) +CPPFLAGS = $(CPPFLAGS_HIDAPI) -I. -I ../../include -Idfu-programmer/src \ + -Ilibzipper-1.0.4 \ + $(CPPFLAGS_ZLIB) \ + $(CPPFLAGS_LIBUSB) \ + -DHAVE_LIBUSB_1_0 \ + + CFLAGS += -Wall -Wno-pointer-sign -O2 -g CXXFLAGS += -Wall -O2 -g -std=c++0x -LDFLAGS += -L$(BUILD)/libzipper/.libs -lzipper $(LDFLAGS_ZLIB) $(LDFLAGS_HIDAPI) +LDFLAGS += -L$(BUILD)/libzipper/.libs -lzipper \ + $(LDFLAGS_ZLIB) \ + $(LDFLAGS_HIDAPI) \ + $(LDFLAGS_LIBUSB) # wxWidgets 3.0.2 uses broken Webkit headers under OSX Yosemeti @@ -56,6 +74,7 @@ ifeq ($(TARGET),Win32) LIBZIPPER_CONFIG+=--host=i686-w64-mingw32 EXE=.exe WX_CONFIG+=--host=i686-w64-mingw32 + LIBUSB_CONFIG+=--host=i686-w64-mingw32 --disable-shared endif ifeq ($(TARGET),Win64) VPATH += hidapi/windows @@ -66,12 +85,13 @@ ifeq ($(TARGET),Win64) LIBZIPPER_CONFIG+=--host=x86_64-w64-mingw32 EXE=.exe WX_CONFIG+=--host=x86_64-w64-mingw32 + LIBUSB_CONFIG+=--host=x86_64-w64-mingw32 --disable-shared endif ifeq ($(TARGET),Linux) VPATH += hidapi/linux - CPPFLAGS += -DHAS_LIBUSB LDFLAGS += -ludev -lexpat -lusb-1.0 BUILD := $(PWD)/build/linux + LIBUSB_CONFIG+=--disable-shared endif ifeq ($(TARGET),Darwin) # Should match OSX @@ -80,6 +100,7 @@ ifeq ($(TARGET),Darwin) CC=clang -mmacosx-version-min=10.7 CXX=clang++ -stdlib=libc++ -mmacosx-version-min=10.7 WX_CONFIG += --with-macosx-version-min=10.7 + LIBUSB_CONFIG += --with-macosx-version-min=10.7 --disable-shared BUILD := $(PWD)/build/mac all: $(BUILD)/scsi2sd-util6.dmg @@ -109,11 +130,14 @@ OBJ = \ $(BUILD)/SCSI2SD_HID.o \ $(BUILD)/hidpacket.o \ +# $(BUILD)/Dfu.o \ +# $(BUILD)/dfu.o \ + + EXEOBJ = \ $(BUILD)/scsi2sd-util6.o \ - ifneq ($(USE_SYSTEM_ZLIB),Yes) $(OBJ): $(BUILD)/zlib/buildstamp $(EXEOBJ): $(BUILD)/zlib/buildstamp @@ -128,6 +152,19 @@ $(BUILD)/zlib/buildstamp: touch $@ endif +ifneq ($(USE_SYSTEM_LIBUSB),Yes) +$(OBJ): $(BUILD)/libusb/buildstamp +$(EXEOBJ): $(BUILD)/libusb/buildstamp +$(BUILD)/libusb/buildstamp: + mkdir -p $(dir $@) + ( \ + cd $(dir $@) && \ + $(CURDIR)/libusb-1.0.9/configure $(LIBUSB_CONFIG) && \ + $(MAKE) \ + ) && \ + touch $@ +endif + ifneq ($(USE_SYSTEM_WX),Yes) $(OBJ): $(BUILD)/wx/buildstamp $(EXEOBJ): $(BUILD)/wx/buildstamp diff --git a/src/scsi2sd-util6/SCSI2SD_HID.cc b/src/scsi2sd-util6/SCSI2SD_HID.cc index f70bfb7a..15c0d854 100644 --- a/src/scsi2sd-util6/SCSI2SD_HID.cc +++ b/src/scsi2sd-util6/SCSI2SD_HID.cc @@ -138,27 +138,9 @@ HID::writeSector(uint32_t sector, const std::vector& in) bool HID::readSCSIDebugInfo(std::vector& buf) { -#if 0 - buf[0] = 0; // report id - hid_set_nonblocking(myDebugHandle, 1); - int result = - hid_read_timeout( - myDebugHandle, - &buf[0], - HID_PACKET_SIZE, - HID_TIMEOUT_MS); - hid_set_nonblocking(myDebugHandle, 0); - - if (result <= 0) - { - const wchar_t* err = hid_error(myDebugHandle); - std::stringstream ss; - ss << "USB HID read failure: " << err; - throw std::runtime_error(ss.str()); - } - return result > 0; -#endif - return false; + std::vector cmd { S2S_CMD_DEBUG }; + sendHIDPacket(cmd, buf, 1); + return buf.size() > 0; } diff --git a/src/scsi2sd-util6/scsi2sd-util.cc b/src/scsi2sd-util6/scsi2sd-util.cc index 8f1d23f4..51b421ad 100644 --- a/src/scsi2sd-util6/scsi2sd-util.cc +++ b/src/scsi2sd-util6/scsi2sd-util.cc @@ -41,6 +41,7 @@ #include "BoardPanel.hh" #include "TargetPanel.hh" #include "SCSI2SD_HID.hh" +//#include "Dfu.hh" #include #include @@ -58,10 +59,6 @@ using std::shared_ptr; using std::tr1::shared_ptr; #endif -#ifdef HAS_LIBUSB -#include -#endif - using namespace SCSI2SD; class ProgressWrapper @@ -111,33 +108,6 @@ void ProgressUpdate(unsigned char arrayId, unsigned short rowNum) namespace { -bool hasDFUdevice() { -#ifdef HAS_LIBUSB - bool found = false; - - libusb_device **list; - ssize_t cnt = libusb_get_device_list(NULL, &list); - ssize_t i = 0; - if (cnt < 0) return false; - - for (i = 0; i < cnt; i++) { - libusb_device *device = list[i]; - libusb_device_descriptor desc; - libusb_get_device_descriptor(device, &desc); - if (desc.idVendor == 0x0483 && desc.idProduct == 0xdf11) { - found = true; - break; - } - } - - libusb_free_device_list(list, 1); - - return found; -#else - return false; -#endif -} - static uint8_t sdCrc7(uint8_t* chr, uint8_t cnt, uint8_t crc) { @@ -285,10 +255,11 @@ public: myLogWindow->PassMessages(false); // Prevent messagebox popups myTimer = new wxTimer(this, ID_Timer); - myTimer->Start(16); //ms, suitable for scsi debug logging + myTimer->Start(64); //ms, suitable for scsi debug logging } private: + //Dfu myDfu; wxLogWindow* myLogWindow; BoardPanel* myBoardPanel; std::vector myTargets; @@ -532,13 +503,15 @@ private: } - if (hasDFUdevice()) +/* + if (myDfu.hasDevice()) { mmLogStatus("STM DFU Bootloader found"); progress->Show(0); doDFUUpdate(filename); return; } +*/ } catch (std::exception& e) { @@ -606,7 +579,7 @@ private: } try { - std::vector info(HID::HID_PACKET_SIZE); + std::vector info; if (myHID->readSCSIDebugInfo(info)) { dumpSCSICommand(info); @@ -940,9 +913,6 @@ class App : public wxApp public: virtual bool OnInit() { -#ifdef HAS_LIBUSB - libusb_init(NULL); -#endif AppFrame* frame = new AppFrame(); frame->Show(true); SetTopWindow(frame); -- 2.38.5