"/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行目からの
if (strstr(modelstr, "BCM2708")) board_model = 1; else if (strstr(modelstr, "BCM2709")) board_model = 2; else fatal("servod: Cannot parse the hardware name string\n");ここを下のように書き換える。
char buffer[5]; FILE *file; file = fopen("/proc/device-tree/soc/ranges", "rb"); fread(buffer, 1, sizeof(buffer), file); fclose(file); if (buffer[4] == 0x20) board_model = 1; else if (buffer[4] == 0x3f) board_model = 2; else 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でファイル読込開始位置を指定し、配列への読み込みを限定してみた。
(特に意味は無い)
char buffer[1]; FILE *file; file = fopen("/proc/device-tree/soc/ranges", "rb"); if (!file) fatal("Unable to open /proc/device-tree/soc/ranges: %m\n"); fseek(file, 4, SEEK_SET); fread(buffer, 1, sizeof(buffer), file); fclose(file); if (buffer[0] == 0x20) board_model = 1; else if (buffer[0] == 0x3f) board_model = 2; else fatal("servod: Cannot parse the board model\n");
0 件のコメント :
コメントを投稿