libmcp2221을 사용해 보았습니다.

아키즈키 전자에서 입수할 수 있는 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, [email protected]
 * 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의 칩이 편리했지만, 애플이 FTDI용의 마음대로 kext를 넣어 버려, 그대로는 BitBang을 사용할 수 없기 때문에, 이쪽이 좋을지도 모른다. 이것은 애플의 FTDI에 대한 괴롭힘이 아니다.

좋은 웹페이지 즐겨찾기