秋月電子で入手できるMCP2221AのライブラリがgithubにあったのでMac OS X El Capitanで試してみた。
このライブラリをMac OS Xで使うには以下のHIDライブラリが必要です。
とりあえずmac/hid.cとhidapi/hidapi.hがあれば良いようです。
libmcp2221ディレクトリにファイルをコピーしてコンパイルしたところ問題なくコンパイル通りました。
以前作ったI2C赤外線リモコンを制御してみます。examples/i2c/main.cをちょっと修正しただけです。
main.c
/*
* Project: MCP2221 HID Library
* Author: Zak Kemble, contact@zakkemble.co.uk
* Copyright: (C) 2015 by Zak Kemble
* License: GNU GPL v3 (see License.txt)
* Web: http://blog.zakkemble.co.uk/mcp2221-hid-library/
*/
# ifndef _WIN32
#define _BSD_SOURCE
#include <unistd.h>
#define Sleep(ms) usleep(ms * 1000)
# endif
# include <stdio.h>
# include "../libmcp2221/win/win.h"
# include "../libmcp2221/libmcp2221.h"
# include "../libmcp2221/hidapi.h"
int main(void)
{
puts("Starting!");
mcp2221_init();
// Get list of MCP2221s
printf("Looking for devices... ");
int count = mcp2221_find(MCP2221_DEFAULT_VID, MCP2221_DEFAULT_PID, NULL, NULL, NULL);
printf("found %d devices\n", count);
// Open whatever device was found first
printf("Opening device... ");
mcp2221_t* myDev = mcp2221_open();
if(!myDev)
{
mcp2221_exit();
puts("No MCP2221s found");
getchar();
return 0;
}
puts("done");
mcp2221_error res;
while(1)
{
Sleep(500);
uint8_t buff[2];
mcp2221_i2c_state_t state = MCP2221_I2C_IDLE;
// Stop any transfers
mcp2221_i2cState(myDev, &state);
if(state != MCP2221_I2C_IDLE)
mcp2221_i2cCancel(myDev);
// Set divider from 12MHz
mcp2221_i2cDivider(myDev, 26);
// Write IR Pattern
puts("Writing...");
uint8_t tmp[3];
// Sony CD Play
tmp[0] = 0x33;
tmp[1] = 0x4d;
tmp[2] = 0x10;
mcp2221_i2cWrite(myDev, 4, &tmp, 3, MCP2221_I2CRW_NORMAL);
puts("Write complete");
// Wait for completion
while(1)
{
if(mcp2221_i2cState(myDev, &state) != MCP2221_SUCCESS)
puts("ERROR");
printf("State: %hhu\n", state);
if(state == MCP2221_I2C_IDLE)
break;
}
break;
}
switch(res)
{
case MCP2221_SUCCESS:
puts("No error");
break;
case MCP2221_ERROR:
puts("General error");
break;
case MCP2221_INVALID_ARG:
puts("Invalid argument, probably null pointer");
break;
case MCP2221_ERROR_HID:
printf("USB HID Error: %ls\n", hid_error(myDev->handle));
break;
default:
printf("Unknown error %d\n", res);
break;
}
mcp2221_exit();
return 0;
}
以下でビルドします。
cc -o main hid.c libmcp2221.c main.c -framework IOKit -framework CoreFoundation
信号でました。
MCP2221はシリアルでも使えるしI2Cでも使えて一粒で二度美味しいです。
以前はこういう類は、FTDIのチップが便利だったのだが、AppleがFTDI用の勝手kextを入れちゃって、そのままではBitBangが使えないので、こっちの方がいいかもしれない。これってAppleのFTDIへの嫌がらせなのでは。