IOUSB 샘플 프로그램

Mac OS X의 IOUSBFamily 샘플 프로그램에는 USBNotification Example이 있습니다.

이 앱은 2003년 정도 만들어졌으며, EZ-USB(FX2가 아닌 오리지널)를 타겟으로 한 프로그램입니다.

EZ-USB는 초기의 USB 내장 8051계 원칩 마이크로컴퓨터로, 지금처럼 플래시는 없고, 기능시키기 위해서는 USB로부터 프로그램을 RAM에 다운로드해 실행하는지 I2C의 EEPROM에 프로그램을 넣어 두어 RAM 로로드 중 하나가되었습니다. RAM에 로드한 프로그램은 전원이 꺼지면 사라지므로 다시 다운로드해야 합니다.

이 샘플 프로그램은 USB 장치 인식 및 펌웨어 전송을 통해 펌웨어 장치를 다시 인식하여 펌웨어로 데이터 전송을 수행합니다.

수중에 방금 통신용 케이블로 사용되고 있던 EEPROM을 떼어낸 EZ-USB가 있었으므로 시험해 보았습니다.



Mac OS X의 유저랜드의 USB 어플리케이션은 libusb를 사용하고 있는 것이 많습니다만, 소의 IOUSB는 어떤 것인지 확인해 보고 싶은 것도 동기의 하나입니다.

그대로 움직이지 않았기 때문에 프로그램 수정은 다음과 같습니다.
  • kOurProductID를 8193에서 8497로 변경
  • RawDeviceAdded ()의 GetDeviceReleaseNumber ()를 체크 해제한다.

    이제 빌드하고 명령줄에서 실행하여 EZ-USB를 연결하면 다음과 같은 로그가 나옵니다.
    bash-3.2$ ./USBNotificationExample 
    Looking for devices matching vendor ID=1351 and product ID=8497
    Raw device added.
    Raw device removed.
    Bulk test device added.
    Interface found.
    Interface class 255, subclass 0
    Interface has 14 endpoints.
    pipeRef 1: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 2: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 3: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 4: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 5: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 6: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 7: direction out, transfer type bulk, maxPacketSize 64
    pipeRef 8: direction in, transfer type interrupt, maxPacketSize 64
    pipeRef 9: direction in, transfer type bulk, maxPacketSize 64
    pipeRef 10: direction in, transfer type bulk, maxPacketSize 64
    pipeRef 11: direction in, transfer type bulk, maxPacketSize 64
    pipeRef 12: direction in, transfer type bulk, maxPacketSize 64
    pipeRef 13: direction in, transfer type bulk, maxPacketSize 64
    pipeRef 14: direction in, transfer type bulk, maxPacketSize 64
    Async event source added to run loop.
    Async write complete.
    Wrote "Bulk I/O Test" (13 bytes) to bulk endpoint
    Async bulk read complete.
    Read "Bulk I/O Test" (13 bytes) from bulk endpoint
    

    EZ-USB의 펌웨어는 bulktest.c 안에 들어 있어 아마 Cypress의 SDK에 들어 있던 바이너리를 그대로 사용하고 있다고 생각됩니다. 이 펌웨어는 엔드포인트 0x02(pipeRef:2)에서 수신한 데이터를 바이트 단위로 비트 반전하고 엔드포인트 0x82(pipeRef:9)에서 반환합니다.

    USB Probe에서 팜이 기록되고 디스크립터가 변경되는 것을 확인할 수 있습니다.

    동기와 비동기의 bulk에의 기입 읽기 코드가 들어가 있어 USE_ASYNC_IO를 define 하면 비동기로의 처리가 됩니다.

    마찬가지로 EZ-USB를 타겟으로 한 팜 기입 코드도 샘플로 준비되어 있습니다만, 사용하기 쉬웠기 때문에, 조금 만져 여기에 두고 있습니다. FX2 대응도 들어 있습니다.

    FX2에 대한 유사한 테스트 프로그램은 Cypress에서 AN74505로 제공됩니다.

    AN74505를 libusb에서 IOUSB로 다시 작성해 보았습니다. 팜 다운로드 기능도 포함되어 있습니다. 설표로 확인했습니다.
  • 좋은 웹페이지 즐겨찾기