[C++] 312 FTDI FT-XシリーズをBit Bangモードで使う MacOS

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

FTDIの技術資料にあるサンプルコードをApple Silicon Macで動くようにしました。いつものように非IDE環境です。

AN_373 Bit-Bang Modes for the FT-X Series

D2XXドライバをダウンロードして、適当な所に配置します。今回は/usr/localディレクトリにしました。

Windows用のコードをApple Siliconにて非IDE環境で使えるようにする、といった類いの作業は自分なりの手法を確立させているので、比較的はかどります。やっていて楽しい作業です。今回はCocoaフレームワークとIOKitフレームワークのビルドオプションへの追加が肝でした。

FT231Xを使ってAVRマイコンに書き込みできるのか検証中です。

ただ、Bit Bangの解説資料ではあるもののフル機能を使えるわけではないような気がします。

// #include <Windows.h> 元はWindows用
#include <stdio.h>
#include <stdint.h>
#include "ftd2xx.h"

FT_STATUS ftStatus;
FT_HANDLE ftHandle;
DWORD w_data_len = 3; //write 3 bytes
DWORD data_written; // number of bytes written
UCHAR Mask = 0x0F;  //00001111 Set D7-D4 input, D3-D0 output [input (0) and output (1)]
UCHAR Mode = 0x04;  //0x04 = synchronous bit-bang
DWORD RxBytes; //number of bytes to be read from the device
DWORD BytesReceived; //number of bytes read from the device
uint8_t RxBuffer[8]; //buffer to receive data from FT-X device
uint8_t data_out[8]; //buffer for data to be sent to FT-X device
unsigned int i;

int main() 
{
    ftStatus = FT_Open(0, &ftHandle);
    ftStatus |= FT_SetUSBParameters(ftHandle, 4096, 4096); // Set USB transfer sizes
    ftStatus |= FT_SetChars(ftHandle, false, 0, false, 0); // Disable event characters
    ftStatus |= FT_SetTimeouts(ftHandle, 5000, 5000); // Set read/write timeouts to 5 sec
    ftStatus |= FT_SetLatencyTimer(ftHandle, 16); // Latency timer at default 16ms
    ftStatus |= FT_SetFlowControl(ftHandle, FT_FLOW_NONE, 0x11, 0x13);
    ftStatus |= FT_SetBaudRate(ftHandle, 62500); //bit rate is x16 this value = 1M

<以下略>
# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# オプション設定
CPPFLAGS = -std=c++20
LDFLAGS = -lc++ -framework Cocoa -framework IOKit

# includeパス(-I)
INCLUDE = -I./include \
-I/usr/local/D2XX

# ライブラリ(-l)
LIBRARY_l = /usr/local/D2XX/build/libftd2xx.a

# ライブラリパス(-L)
LIBRARY_L = -L/usr/local/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = test

# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app