2013-05-07 3 views
0

SYNC FIFO FT245 모드에서 FT2232H를 사용하고 있으며 리눅스에서 작동하지 않습니다. 내 코드는 Mac OS X에서 완벽하게 작동합니다. 하지만 리눅스에서는 그렇지 않습니다.ftdi_usb_open()은 Linux에서 -8을 반환하지만 Mac에서 동일한 코드가 작동합니다

libftdi1 패키지와 libftdi-dev 패키지를 모두 설치했습니다. 코드의

관련 부품 :

여기
#define PID 0x6010 

. 
. 
. 

if(vftdic == NULL) 
{ 
    this->ftdic = static_cast<struct ftdi_context*>(malloc(sizeof(struct ftdi_context))); 
} 
else 
{ 
    this->ftdic = vftdic; 
} 
int f; 
// Init 1. channel 
if (ftdi_init(ftdic) < 0) 
{ 
    throw DeviceException("ftdi_init failure\n", FTDI_ERROR); 
} 
ftdi_set_interface(ftdic, INTERFACE_A); 
f = ftdi_usb_open(ftdic, 0x0403, PID); 
if (f < 0 && (f != -5)) 
{ 
    //here f is equal to -8 only on Linux 
    throw DeviceException("Unable to open FTDI device, channel A\n", FTDI_ERROR); 
} 

는 lsusb에서 나열되어

Bus 001 Device 005: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC 

사용되는 모든 하드웨어가 동일 (ft2232h와 맥북 프로 2010 + 내 USB 장치)입니다.

+0

1) 장치 노드에 대한 권한이 있습니까? Linux 시스템은 일반적으로 인식 된 USB 장치를 일반 사용자가 사용할 수 있도록 udev 규칙을 사용합니다. OSX는 기본적으로 그것을 부여하는 것 같다. 2) 분리해야 할 USB 직렬 드라이버에 의해 이미 주장 된 것입니까? 리눅스는 배포판의 일부로 이러한 경향이 있으며, OSX에서는 특별히 설치해야합니다. 즉 우발적으로 간섭 할 가능성이 적습니다. –

+0

좋아, 알았다. 커널에서 rmmod-ed ftdi_sio (이유 2) 및 루트로 내 응용 프로그램을 runned (또한 이유 1) 어떻게 이러한 작업을 자동으로 만들 수 있습니까? 아마도 루트 권한, 특히 ftdi_sio의 rmmoding을 요구하지 않을 수 있습니까? 몇 가지 udev 블랙리스트가 있다는 것을 알고 있습니다. 그러나 제 장치의 모든 사용자가 일부 모듈을 블랙리스트 할 필요가 없다는 것을 더 일반적인 것으로하고 싶습니다. –

+0

일류 접근법은 사용자 정의 VID/PID를 사용하여 일반적인 리눅스 드라이버는 USB 시리얼 장치로 인식하지 못합니다. 하지만 udev 규칙에 대한 지침이나 스크립트를 제공하여 권한을 부여해야하므로 USB 직렬에서도 무시 무시한 방식으로이를 고려할 수 있습니다. –

답변

1

장치 노드에 대한 권한이 있는지 확인하는 것 외에도 다른 드라이버 (예 : 일반적으로 Linux 배포판과 함께 제공되는 USB 직렬 드라이버)가 인터페이스를 요구하지 않았는지 확인해야합니다.

1

사용중인 사용자 계정에 원시 USB 버스에 대한 액세스 권한이 있습니까? /dev/bus/usb 이하의 FTDI에 해당하는 장치 파일의 사용 권한을 확인하십시오. 액세스 권한이없는 경우가 대부분입니다.

그런 경우 일부 전용 그룹의 소유권에 장치 파일을 배치하고이 그룹의 구성원에 자신을 추가하는 일부 UDev 규칙을 추가하십시오.

+0

오 사용 권한, 나는 그 중 하나를 놓쳤습니다 ... USB 장치가 그 제약이 없다고 생각했습니다. 오래 전부터 리눅스를 사용하고 있었기 때문에 오랜 시간이 걸렸습니다. –

+0

실제로 사용 권한 문제인지, 루트 권한으로 내 프로그램을 실행했는지 확인했는데 모두 똑같습니다. 오류 코드 -8. –