From 65e5cc77f66e8d5f6593a14a1973d5b85dd1eb99 Mon Sep 17 00:00:00 2001 From: Mark Linton Date: Mon, 9 Mar 2026 23:46:09 -0600 Subject: [PATCH 1/2] Add macOS compatibility and Makefile --- .gitignore | 3 +++ XLoad/FTDI/WinTypes.h | 60 ++++++++++++++++++++++++++++++++++++++++++ XLoad/FTDI/ftd2xx.h | 2 +- XLoad/Makefile | 20 ++++++++++++++ XLoad/XLoad.cpp | Bin 71244 -> 36694 bytes 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 XLoad/FTDI/WinTypes.h create mode 100644 XLoad/Makefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cda454f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +XLoad/xload +XLoad/*.o +XLoad/FTDI/*.dylib diff --git a/XLoad/FTDI/WinTypes.h b/XLoad/FTDI/WinTypes.h new file mode 100644 index 0000000..7742792 --- /dev/null +++ b/XLoad/FTDI/WinTypes.h @@ -0,0 +1,60 @@ +#ifndef _WINTYPES_H_ +#define _WINTYPES_H_ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned int UINT; +typedef unsigned long ULONG; +typedef void *PVOID; +typedef void *LPVOID; +typedef void *HANDLE; +typedef uint32_t DWORD; +typedef DWORD *LPDWORD; +typedef ULONG *PULONG; +typedef unsigned short WORD; +typedef WORD *LPWORD; +typedef unsigned char BYTE; +typedef uint8_t *PUCHAR; +typedef char *PCHAR; +typedef char *LPCTSTR; +typedef int *LPLONG; +typedef unsigned long ULONG_PTR; +typedef int BOOL; + +#define WINAPI +#define WINBASEAPI + +// Additional overrides for ftd2xx.h structures on non-windows +typedef struct _SECURITY_ATTRIBUTES { + DWORD nLength; + LPVOID lpSecurityDescriptor; + bool bInheritHandle; +} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; + +typedef struct _OVERLAPPED { + ULONG_PTR Internal; + ULONG_PTR InternalHigh; + union { + struct { + DWORD Offset; + DWORD OffsetHigh; + } DUMMYSTRUCTNAME; + PVOID Pointer; + } DUMMYUNIONNAME; + HANDLE hEvent; +} OVERLAPPED, *LPOVERLAPPED; + +#ifdef __cplusplus +} +#endif + +#endif // _WINTYPES_H_ diff --git a/XLoad/FTDI/ftd2xx.h b/XLoad/FTDI/ftd2xx.h index ec02ac6..58dd0c7 100644 --- a/XLoad/FTDI/ftd2xx.h +++ b/XLoad/FTDI/ftd2xx.h @@ -1,6 +1,6 @@ /*++ -Copyright © 2001-2011 Future Technology Devices International Limited +Copyright 2001-2011 Future Technology Devices International Limited THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES diff --git a/XLoad/Makefile b/XLoad/Makefile new file mode 100644 index 0000000..0e2f5b9 --- /dev/null +++ b/XLoad/Makefile @@ -0,0 +1,20 @@ +CXX = clang++ +CXXFLAGS = -std=c++11 -Wall -O2 -I. -I./FTDI +LDFLAGS = -L./FTDI -Wl,-rpath,./FTDI -lftd2xx + +TARGET = xload +SRCS = XLoad.cpp +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) $(OBJS) -o $(TARGET) $(LDFLAGS) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ + +clean: + rm -f $(OBJS) $(TARGET) + +.PHONY: all clean diff --git a/XLoad/XLoad.cpp b/XLoad/XLoad.cpp index 7fae752601403e75b9c9087b482baaaef4cca9e8..8c413e8dde86b12c3d829ad97f540657182ab390 100644 GIT binary patch literal 36694 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 literal 71244 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 LgKDwZZ_WP$FCD?R From b6caabe429aef901df73c882b752a84fcbcf3e1c Mon Sep 17 00:00:00 2001 From: Mark Linton Date: Mon, 9 Mar 2026 23:48:15 -0600 Subject: [PATCH 2/2] Add macOS documentation --- README-macOS.md | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 README-macOS.md diff --git a/README-macOS.md b/README-macOS.md new file mode 100644 index 0000000..fd37aec --- /dev/null +++ b/README-macOS.md @@ -0,0 +1,50 @@ +# XLoad for macOS + +This repository includes a port of the XLoad tool to macOS. The codebase has been modified to compile using `clang++` while maintaining compatibility. + +## Changes Made + +- **File Encodings:** The original `XLoad.cpp` and `ftd2xx.h` files were converted from UTF-16LE/Latin-1 to standard UTF-8. +- **POSIX API Alternatives:** The Windows-specific terminal APIs (``, `Sleep`, `GetAsyncKeyState`, and `SetConsoleTextAttribute`) were replaced with POSIX-compliant equivalents using ``, ``, and ``. +- **FTDI macOS Compatibility:** A missing `WinTypes.h` shim file was added to the `FTDI/` directory to define the required Windows types (`DWORD`, `HANDLE`, `BOOL`, etc.) on UNIX-like platforms. Path separators in `#include` directives were converted to forward slashes. +- **Compiler Warnings:** Addressed compiler warnings arising from mismatched types on macOS (such as `ULONG` format specifiers for `printf` and `std::min` parameter types). +- **Makefile:** A `Makefile` was included to simplify compilation via the command line. + +## How to Compile and Run on macOS + +### Prerequisites + +You need the official FTDI D2XX drivers for macOS: + +1. Download the latest **D2XX Drivers for macOS** from the [FTDI official website](https://ftdichip.com/drivers/d2xx-drivers/). +2. Mount the downloaded `.dmg` image. +3. Extract the `libftd2xx.X.X.X.dylib` file from the image (e.g., `release/build/libftd2xx.1.4.30.dylib`) and place it in the `XLoad/FTDI/` directory, renaming it to `libftd2xx.dylib`. + +*(Alternatively, you can install the library system-wide in `/usr/local/lib/` and update the `LDFLAGS` in the `Makefile` accordingly.)* + +### Compilation + +Open a terminal, navigate to the `XLoad` source folder, and run `make`: + +```bash +cd XLoad +make +``` + +### Running the Tool + +After a successful build, you can run the executable directly from the source directory: + +```bash +./xload +``` + +To view the available commands: +```bash +./xload -h +``` + +### Troubleshooting + +- **Library not loaded:** If you receive a `dyld: Library not loaded` error when trying to run `./xload`, ensure that `libftd2xx.dylib` is properly placed in the `XLoad/FTDI/` directory. The binary is configured to look for the library relative to its execution path using an `rpath`. +- **Permissions:** If your device is claimed by Apple's built-in serial port driver (preventing `xload` from accessing it), you may need to install the `D2xxHelper` tool, also available on the FTDI driver download page.