2017-03-08 10 views
0

Android 휴대 전화에 연결하려는 복합 USB 가젯이 있습니다. 그것은 다음, 시리얼 MTP 및 대용량 저장 장치 인터페이스를 포함Android MTP 클라이언트가 단일 인터페이스가 아닌 전체 장치를 엽니 다.

interface :: id : 0, name : CDC Abstract Control Model (ACM), alt 0 [0002h:0002h:0001h] CDC Control 
interface :: id : 1, name : CDC ACM Data, alt 0 [000ah:0000h:0000h] CDC Data 
interface :: id : 2, name : MTP, alt 0 [00ffh:00ffh:0000h] Vendor Specific 
interface :: id : 3, name : Mass Storage, alt 0 [0008h:0006h:0050h] Mass Storage 

내 문제는 직렬 및 MTP 인터페이스 모두를 열려고 시도입니다. 여기 내 코드입니다 :

private class SetupInterfacesRunnable implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     synchronized(MyService.this) 
     { 
      usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
      usbConnection = usbManager.openDevice(usbDevice); 

      /* 
      interface :: id : 0, name : CDC Abstract Control Model (ACM), alt 0 [0002h:0002h:0001h] CDC Control 
      interface :: id : 1, name : CDC ACM Data, alt 0 [000ah:0000h:0000h] CDC Data 
      interface :: id : 2, name : MTP, alt 0 [00ffh:00ffh:0000h] Vendor Specific 
      interface :: id : 3, name : Mass Storage, alt 0 [0008h:0006h:0050h] Mass Storage 
      */ 

      // Interface 1 on the composite usb device is cdc acm data. 
      serialPort = UsbSerialDevice.createUsbSerialDevice(usbDevice, usbConnection, 1); 
      if(serialPort != null) 
      { 
       if(serialPort.open()) 
       { 
        serialPort.setBaudRate(115200); 
        serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); 
        serialPort.setParity(UsbSerialInterface.PARITY_NONE); 
        serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); 
        serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); 

        mUIHandler.post(notifyRadgetConnected); 

        // set the callback to catch serial data 
        serialPort.read(mCallback); 

        mUIHandler.post(handshake); 

       }else 
       { 
        // Serial port could not be opened, maybe an I/O error or it CDC driver was chosen it does not really fit 
        LoggerV2.e("Failed to open device serial port"); 
       } 
      }else 
      { 
       // No driver for given device, even generic CDC driver could not be loaded 
       LoggerV2.e("Failed to find driver for the serial device"); 
      } 

      // Interface 2 on the composite usb device is MTP. 
      MtpDevice mtpDevice = new MtpDevice(usbDevice); 
      if (!mtpDevice.open(usbConnection)) { 
       LoggerV2.e("Failed to obtain device mtp storage"); 
      } 

     } 
    } 
} 

내가 사용하고 일련의 구현 (felHR85/UsbSerial), 단일 인터페이스를 열 수 있지만, 나는이 방식으로 MTPDevice를 구현하는 쉬운 방법을 볼 수 없습니다 수 있습니다.

Android MTP API는 open 함수가 호출 될 때 전체 장치/연결이 열리길 원합니다.

native_open(mDevice.getDeviceName(), connection.getFileDescriptor()); 

API 문서 :https://developer.android.com/reference/android/mtp/MtpDevice.html

소스 코드 :https://android.googlesource.com/platform/frameworks/base/+/master/media/java/android/mtp/MtpDevice.java

내가 볼 수없는 단 하나의 인터페이스를 열 수있는 방법. 연결을 사용하여 동일한 장치에 여러 인터페이스를 여는 간단한 방법이 누락 되었습니까?

답변

0

짧은 대답/해결 방법은 인터페이스 0에서 MTP 응답기를 실행 한 다음 MTP 장치 다음에 직렬 포트를 여는 것입니다. 더 이상 대답은

... 코드를 통해 비트를 파고 후, 나는 발견 위치를 추적 소스 파일을 통해 native_open 호출 필터 :

  • MtpDevice.java
    • android_mtp_MtpDevice.cpp
      • MtpDevice.cpp

MtpDevice.cpp는 : MtpDevice.cpp에서 https://android.googlesource.com/platform/frameworks/av/+/master/media/mtp/MtpDevice.cpp

, 찾을 수 없습니다 것처럼 나는 "엔드 포인트를 찾을 수 없습니다 \ n"와 함께 로그에 인쇄 오류 메시지가 실패 할 것 같다 정확한 엔드 포인트.

private class SetupInterfacesRunnable implements Runnable 
{ 
    @Override 
    public void run() 
    { 
     synchronized(RadgetService.this) 
     { 
      usbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
      usbConnection = usbManager.openDevice(usbDevice); 

      /* 
      interface :: id : 0, name : MTP, alt 0 [00ffh:00ffh:0000h] Vendor Specific 
      interface :: id : 1, name : CDC Abstract Control Model (ACM), alt 0 [0002h:0002h:0001h] CDC Control 
      interface :: id : 2, name : CDC ACM Data, alt 0 [000ah:0000h:0000h] CDC Data 
      interface :: id : 3, name : Mass Storage, alt 0 [0008h:0006h:0050h] Mass Storage 
      */ 

      // Interface 0 on the composite device is MTP 
      MtpDevice mtpDevice = new MtpDevice(usbDevice); 
      if (!mtpDevice.open(usbConnection)) { 
       LoggerV2.e("Failed to obtain radget mtp storage"); 
      } 
      else 
      { 
       LoggerV2.i("Opened MTP storage: %s", mtpDevice.getDeviceName()); 

       int[] storageIds = mtpDevice.getStorageIds(); 
       if (storageIds == null) { 
        LoggerV2.i("No mtp storage id's found"); 
        return; 
       } 

       /* 
       * scan each storage 
       */ 
       for (int storageId : storageIds) { 
        LoggerV2.i("~~~~Storage id: %d~~~~", storageId); 
        scanObjectsInStorage(mtpDevice, storageId, 0, 0); 
       } 
      } 

      // Interface 2 on the composite usb device is cdc acm data. 
      serialPort = UsbSerialDevice.createUsbSerialDevice(usbDevice, usbConnection, 2); 
      if(serialPort != null) 
      { 
       if(serialPort.open()) 
       { 
        serialPort.setBaudRate(115200); 
        serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8); 
        serialPort.setParity(UsbSerialInterface.PARITY_NONE); 
        serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1); 
        serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF); 

        mUIHandler.post(notifyRadgetConnected); 

        // set the callback to catch serial data 
        serialPort.read(mCallback); 

        mUIHandler.post(handshake); 

       }else 
       { 
        // Serial port could not be opened, maybe an I/O error or it CDC driver was chosen it does not really fit 
        LoggerV2.e("Failed to open device serial port"); 
       } 
      }else 
      { 
       // No driver for given device, even generic CDC driver could not be loaded 
       LoggerV2.e("Failed to find driver for serial device"); 
      } 

     } 
    } 
} 
:이 날 먼저 MTP 장치를 열 수 있습니다

interface :: id : 0, name : MTP, alt 0 [00ffh:00ffh:0000h] Vendor Specific 
interface :: id : 1, name : CDC Abstract Control Model (ACM), alt 0 [0002h:0002h:0001h] CDC Control 
interface :: id : 2, name : CDC ACM Data, alt 0 [000ah:0000h:0000h] CDC Data 
interface :: id : 3, name : Mass Storage, alt 0 [0008h:0006h:0050h] Mass Storage 

, 다음 인터페이스에 의해 직렬를 엽니 지금은

내가 먼저 MTP와 인터페이스를 재정렬함으로써이 문제를 해결 작업 끝났다