2

JNI 経由で Android (Gingerbread) で I2C デバイスを使用しようとすると問題が発生します。

問題は I2C_SLAVE ioctl 呼び出しにあります。次のコードは、スタンドアロン プログラムにコンパイルすると機能します。

    int main(int argc, char *argv[])
{
    int fd = -1;
    long rc;
    int addr = 0x22;


  if ( fd  < 0 ) {
      fd = open(radio_device, O_RDWR);
  }

#define I2C_SLAVE 0x0703

  if ( (rc = ioctl(fd, I2C_SLAVE, addr)) < 0 ) {
      printf("RadioService: I2C slave addr failed! rc=%d errno= %d [%s]\n", rc, errno, strerror(errno));
  }
  else {
      printf("RadioService: I2C slave addr 0x%x set\n", addr);
  }

  return 0;

}

実行時の出力 (経由adb shell):

~ # testi2c
RadioService: I2C slave addr 0x22 set

ただし、同じコードは JNI ライブラリの一部としては機能しません。

void Java_biz_lectronix_android_radio_RadioService_nativeInit(JNIEnv* env, jclass clazz)
{
    long rc;
    int addr1 = 0x22;
    int addr2 = 0x18;

    if ( fd = open(radio_device, O_RDWR) < 0 ) {
        __android_log_print(ANDROID_LOG_ERROR, "RadioService", "I2C open failed! %s", strerror(errno));
    }
    else {
        __android_log_write(ANDROID_LOG_WARN, "RadioService", "Opened fd");
    }

    __android_log_print(ANDROID_LOG_ERROR, "RadioService", "I2C_SLAVE [0x%x], addr = %d (0x%x)", I2C_SLAVE, addr1, addr1 );

    if ( (rc = ioctl(fd, I2C_SLAVE, addr1)) < 0 ) {
        __android_log_print(ANDROID_LOG_ERROR, "RadioService", "I2C slave addr1 failed! rc=%d errno= %d [%s]", rc, errno, strerror(errno));
    }
    else {
        __android_log_print(ANDROID_LOG_WARN, "RadioService", "I2C slave addr1 %d set", addr1);
    }

    if ( (rc = ioctl(fd, I2C_SLAVE, addr2)) < 0 ) {
        __android_log_print(ANDROID_LOG_ERROR, "RadioService", "I2C slave addr2 failed! rc=%d errno= %d [%s]", rc, errno, strerror(errno));
    }
    else {
        __android_log_print(ANDROID_LOG_WARN, "RadioService", "I2C slave addr2 %d set", addr2);
    }

    return;
}

Logcat の出力:

01-02 03:03:10.904: E/RadioService(1602): I2C_SLAVE [0x703], addr = 34 (0x22)
01-02 03:03:10.904: E/RadioService(1602): I2C slave addr1 failed! rc=-1 errno= 25 [Not a typewriter]
01-02 03:03:10.904: E/RadioService(1602): I2C slave addr2 failed! rc=-1 errno= 25 [Not a typewriter]

ここで何が間違っているのか誰にもわかりませんか?

4

1 に答える 1

1

実際には I2C インターフェイスの問題ではありません。問題は次の行です。

if ( fd = open(radio_device, O_RDWR) < 0 ) {

これは次のようになります (括弧に注意してください):

if ( ( fd = open(radio_device, O_RDWR) ) < 0 ) {

したがって、I2C デバイスは開かれますが、比較は C での割り当てよりも優先度が高くなります。比較は失敗し、fd に 0 が割り当てられます。これはstdin. ioctl()I2C_SLAVE はデバイスに不適切な ioctl コマンドであるため、呼び出しは失敗します。

于 2013-07-19T03:43:02.747 に答える