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
- ogfは、Opcode Group Fieldの略で、コマンドのグループを指す
- 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似合わせたいときは、
- 16000(=80000-64000) => 0x3E80
- BCM4325_I2C_FM_FREQ0 に 0x80 を、
- BCM4325_I2C_FM_FREQ1 に 0x3E を、
- 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; }