hcitoolについて

サブコマンドの cmd だけ覚書として載せておく。
hcitoolのコードは、external/bluetooth/bluez/tools/ にある.
FMラジオモジュールへ読書の説明は、探した限りでは
frameworks/base/core/jni/android_hardware_fm.cpp にしかなかった

 Usage:
	cmd   [parameters]
 Example:
	cmd 0x03 0x0013 0x41 0x42 0x43 0x44
  1. ogfは、Opcode Group Fieldの略で、コマンドのグループを指す
  2. ocfは、Opcode Command Filedの略で、コマンドを指す

らしいが、コードを見ても 0x3f 0x15 が何を意味するのかはわからなかった
おそらく、FMモジュールにパラメータを渡す命令ではないだろうか。
HCI Commands(1/15 追記)


上で書いたhcitoolのマジックナンバーをdefine,enumどおりに書くと下記になる

 hcitool cmd 0x3f 0x15 BCM4325_I2C_FM_RDS_SYSTEM 0x00 BCM4325_FM_RDS_SYSTEM_FM
 hcitool cmd 0x3f 0x15 BCM4325_I2C_FM_CTRL 0x00 BCM4325_FM_CTRL_BAND_JAPAN

4番目の引数は、I2Cでおくるコマンド?を指していると思う
やっていることは読み書きなので、チップのレジスタを指しているのかもしれない
5番目が0x00なら書き込み、0x01なら読み込み
6番目が書き込む値で、読み込む場合は0x01で固定のようだ。


 int hci_w(int reg, int val)
 {
    int returnval = 0;

    char s1[100] = "hcitool cmd 0x3f 0x15 ";
    char stemp[10] = "";
    char starget[100] = "";
    char *pstarget = starget;

    sprintf(stemp, "0x%x ", reg);
    pstarget = strcat(s1, stemp);

    sprintf(stemp, "0x%x ", 0);
    pstarget = strcat(pstarget, stemp);

    sprintf(stemp, "0x%x ", val);
    pstarget = strcat(pstarget, stemp);
    returnval = system(pstarget);
    return returnval;
 }

 int hci_r(int reg)
 {
    int returnval = 0;

    char s1[100] = "hcitool cmd 0x3f 0x15 ";
    char stemp[10] = "";
    char starget[100] = "";
    char *pstarget = starget;

    sprintf(stemp, "0x%x ", reg);
    pstarget=strcat(s1, stemp);

    sprintf(stemp, "0x%x ", 1);
    pstarget=strcat(pstarget, stemp);

    sprintf(stemp, "0x%x ", 1);
    pstarget = strcat(pstarget, stemp);
    returnval = system(pstarget);
    returnval /= 0x100;
    LOGD("hci_r 0x%x \n", returnval);

    return returnval;
 }

hcitoolで周波数を変える

android_hardware_fm.cpp:setControlNativeにあるが、
hcitoolで周波数を変えることができる。
80MHz似合わせたいときは、

  1. 16000(=80000-64000) => 0x3E80
  2. BCM4325_I2C_FM_FREQ0 に 0x80 を、
  3. BCM4325_I2C_FM_FREQ1 に 0x3E を、
  4. BCM4325_I2C_FM_SEARCH_TUNE_MODE に BCM4325_FM_PRE_SET_MODE を書き込む
 hcitool cmd 0x3f 0x15 0x0a 0x00 0x80
 hcitool cmd 0x3f 0x15 0x0b 0x00 0x3e
 hcitool cmd 0x3f 0x15 0x09 0x00 0x01
 /*native interface */
 static jint android_hardware_fmradio_FmReceiverJNI_setFreqNative
    (JNIEnv * env, jobject thiz, jint fd, jint freq)
 {
    /* Adjust frequency to be an offset from 64MHz */
    freq -= BCM4325_FREQ_64MHZ;

    /* Write the FREQ0 register */
    hci_w(BCM4325_I2C_FM_FREQ0, freq & 0xFF);

    /* Write the FREQ1 register */
    hci_w(BCM4325_I2C_FM_FREQ1, freq >> 8);

    /* Write the TUNER_MODE register to PRESET to actually start tuning */
    if ( hci_w(BCM4325_I2C_FM_SEARCH_TUNE_MODE, BCM4325_FM_PRE_SET_MODE) < 0){
        LOGE("fail \n");
    }

    return 0;
 }