1

LinuxでCP2102チップを搭載したUSBコンバーターとの通信を書き込もうとしています。なぜこれが機能しないのですか?

ondra@ondra-notebook:~$ lsusb
バス 001 デバイス 002: ID 1bcf:2805 Sunplus Innovation Technology Inc.
バス 003 デバイス 006: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
バス 004 デバイス 025: ID 0cf3:3005 Atheros Communications, Inc. AR3011 Bluetooth
バス 008 デバイス 004: ID 09da:0080 A4 Tech Co., Ltd
バス 001 デバイス 001: ID 1d6b:0002 Linux Foundation 2.0 ルート ハブ
バス 002 デバイス 001: ID 1d6b:0002 Linux Foundation 2.0 ルート ハブ
バス 003 デバイス 001: ID 1d6b:0001 Linux Foundation 1.1 ルート ハブ
バス 004 デバイス 001: ID 1d6b:0001 Linux Foundation 1.1 ルート ハブ
バス 005 デバイス 001: ID 1d6b:0001 Linux Foundation 1.1 ルート ハブ
バス 006 デバイス 001: ID 1d6b:0002 Linux Foundation 2.0 ルート ハブ
バス 007 デバイス 001: ID 1d6b:0003 Linux Foundation 3.0 ルート ハブ
バス 008 デバイス 001: ID 1d6b:0002 Linux Foundation 2.0 ルート ハブ
バス 009 デバイス 001: ID 1d6b: 0003 Linux Foundation 3.0 ルート ハブ


Java コードは次のとおりです。

import ch.ntb.usb.*;

public class libUSB_example2 {

/**
 * @param args
 */

static long handle = 0;         //Device-Handle
int retval = 0;                 //used for return values
byte[] dummybyte = new byte[1]; //used by specific write-functions as value to write (empty)

final int I2C_M_RD = 0x01;  
final int STATUS_IDLE        = 0;
final int STATUS_ADDRESS_ACK = 1;
final int STATUS_ADDRESS_NAK = 2;  
final int I2C_TINY_USB_VID = 0x0403;
final int I2C_TINY_USB_PID = 0xc631;
final int USB_TYPE_CLASS = (0x01 << 5);
final int USB_TYPE_VENDOR = (0x02 << 5); 
final int USB_ENDPOINT_IN = 0x80;
final int USB_ENDPOINT_OUT  = 0x00;    
final int USB_CTRL_IN = (USB_TYPE_CLASS | USB_ENDPOINT_IN);
final int USB_CTRL_OUT = (USB_TYPE_CLASS);  
final int CMD_GET_FUNC   = 1;
final int CMD_SET_DELAY  = 2;
final int CMD_GET_STATUS = 3;
final int CMD_I2C_IO     = 4;
final int CMD_I2C_BEGIN  = 1;  
final int CMD_I2C_END    = 2; 



public static void main(String[] args) throws USBException{
    // TODO Auto-generated method stub

    int result = 0;

    libUSB_example2 ex = new libUSB_example2();
    result = ex.UsbInitLinux();

    System.out.println("\n" + "*******************************************************");
    if (result == 0) System.out.println("success");
    if (result == -1) System.out.println("usb-error");
    if (result == -2) System.out.println("write command status failed");
    if (result == -3) System.out.println("read data status failed");
    if (result == -4) System.out.println("cannot open device");
    if (result == -5) System.out.println("no converter found");
    if (result == -6) System.out.println("tiny-usb-Error");
    if (result == -7) System.out.println("parameter-Error");
    if (result == -8) System.out.println("usb claim/release-error");
    System.out.println("*******************************************************" + "\n");


}

    public int UsbInitLinux()  { 

        LibusbJava.usb_init();
        LibusbJava.usb_find_busses();
        LibusbJava.usb_find_devices();
        Usb_Bus bus = LibusbJava.usb_get_busses();
        Usb_Device dev = bus.getDevices();

        for(bus = LibusbJava.usb_get_busses(); bus != null; bus = bus.getNext()){
            for(dev = bus.getDevices(); dev != null; dev = dev.getNext()){
                if(dev.getDescriptor().getIdVendor() == 0x10c4 && dev.getDescriptor().getIdProduct() == -5536){
                    handle = LibusbJava.usb_open(dev);
                    System.out.println("device found");
                    System.out.println(dev.getDescriptor());
                    System.out.println("handle : " + handle + "\n");
                    if(handle == 0)
                          return -4;    
                }
            }
        }
        if(handle <= 0)
            return -5;
        retval = UsbSet(CMD_SET_DELAY, 10);
        if(retval != 0)
            return retval;
        retval = LibusbJava.usb_claim_interface(handle, 0);
        if (retval != 1) 
            return -8;
        return 0;
    }

    public int UsbSet(int cmd, int value) {     
        if(LibusbJava.usb_control_msg(handle, 
               USB_CTRL_IN, CMD_GET_STATUS, 0, 0, dummybyte, 1, 1000)  < 0) {
          return -1;
        }
        return 0;
      }  

}

その出力は次のとおりです。

デバイスが見つかりました
Usb_Device_Descriptor idVendor: 0x10c4、idProduct: 0xea60
ハンドル: 140182634002272


USB エラー


4

1 に答える 1

1

使用している CP2102 は、カーネルの cp210x.ko を介して仮想シリアル ポートとしてアクセスできます。または、行っているように libusb を介して直接デバイスにアクセスできます。

cp210x.ko ドライバーを使用し、デバイスをシリアル ポート (/dev/ttyUSB0 など) として開くことをお勧めします。SerialPortその後、Javaオブジェクトなどを使用して、シリアル デバイスとして通信できます。その理由は、デバイスのプロトコルが抽象化されており、データを送受信するためのシリアル ポート コードの書き方を知っているだけでよいからです。

USB に直接アクセスできる libusb デバイスとしてデバイスに本当にアクセスしたい場合は、CP210x プロトコルに従う必要があります。これは、シリコン ラボの Web サイトの AN571 にあります。

http://www.silabs.com/Support%20Documents/TechnicalDocs/AN571.pdf

ダミーの制御メッセージは偽物である可能性が高いため、デバイスは要求を停止して、表示されるエラーを生成します。IFC_ENABLEデバイスとの通信を開始するには、インターフェース有効化要求 (AN571 にある)を発行する必要があります。これは、デバイスに接続しているかどうかを判断するための適切なテスト コントロール メッセージです。

于 2013-09-20T01:37:40.027 に答える