2017年3月26日日曜日

Raspberry Pi kernel 4.9でServoBlaster(その2 非推奨)

前回の暫定的な処置を少し変更。
"/proc/cpuinfo"の"Hardware"情報を元にする方法はkernel 4.9では通用しないので、
"/proc/device-tree/soc/ranges"を読み込んで、"board_model"を判定するように変更してみた。

参考:下のリンク、pelwellさんのコメントを参考にしました。
https://github.com/raspberrypi/linux/issues/1902#issuecomment-287365600

 ※以下は非推奨です!! Raspberry Pi 2 Model Bでしか確認していません!※

"servod.c"をエディタで開き、958行目からの
  1. if (strstr(modelstr, "BCM2708"))
  2. board_model = 1;
  3. else if (strstr(modelstr, "BCM2709"))
  4. board_model = 2;
  5. else
  6. fatal("servod: Cannot parse the hardware name string\n");
ここを下のように書き換える。
  1. char buffer[5];
  2. FILE *file;
  3. file = fopen("/proc/device-tree/soc/ranges", "rb");
  4. fread(buffer, 1, sizeof(buffer), file);
  5. fclose(file);
  6.  
  7. if (buffer[4] == 0x20)
  8. board_model = 1;
  9. else if (buffer[4] == 0x3f)
  10. board_model = 2;
  11. else
  12. fatal("servod: Cannot parse the board model\n");
※追記1(2017/04/22 20:20)※
本当は"hardware name"を読んでいる訳ではないので、最後のメーッセージは
"servod: Cannot parse the board model\n"
 とでもすれば良いですかね

※追記2(2017/04/27 20:25)※
"char buffer[8]"から"char buffer[5] "へ変更

以前の"servod"を削除して、改めて"make"し、"servod"を起動する。



※追記3(2017/05/03 21:40)※
下記にて、"/proc/device-tree/soc/ranges"を開けなかった場合の処理を追加。
fseekでファイル読込開始位置を指定し、配列への読み込みを限定してみた。
(特に意味は無い)

  1. char buffer[1];
  2. FILE *file;
  3. file = fopen("/proc/device-tree/soc/ranges", "rb");
  4. if (!file)
  5. fatal("Unable to open /proc/device-tree/soc/ranges: %m\n");
  6. fseek(file, 4, SEEK_SET);
  7. fread(buffer, 1, sizeof(buffer), file);
  8. fclose(file);
  9.  
  10. if (buffer[0] == 0x20)
  11. board_model = 1;
  12. else if (buffer[0] == 0x3f)
  13. board_model = 2;
  14. else
  15. fatal("servod: Cannot parse the board model\n");

0 件のコメント :

コメントを投稿