私は Linux カーネル モジュールの開発にかなり慣れていないので、ここで本当に明らかなことが抜けている場合は、あらかじめお詫び申し上げます。Beagleboard-xm でより高い解像度でベンチマーク/タイムスタンプを取得するために、OMAP3730 の GP タイマーを使用して簡単なモジュールを作成しようとしています。
関連するコードは次のようになります。
static struct omap_dm_timer *timer_ptr; // Global timer
EXPORT_SYMBOL(timer_ptr);
static int hrt_init(void)
{
int result = 0;
printk("hrt: inserting module\n");
/* Register device with our requested major */
result = register_chrdev(hrt_major, "hrt", &hrt_fops);
if (result < 0) {
printk("hrt: error: can't obtain major number %d\n", hrt_major);
return result;
}
/* Reserve a timer */
timer_ptr = omap_dm_timer_request();
if (timer_ptr == NULL){
printk("hrt: error: no timer is available\n");
return -1;
}
/* Set clock source to system clock, prescaler to 1:1, start the timer */
if (omap_dm_timer_set_source(timer_ptr, OMAP_TIMER_SRC_SYS_CLK) < 0)
{
printk("hrt: error setting OPMAP_TIMER_SRC_SYS_CLK\n");
return -1;
}
omap_dm_timer_set_prescaler(timer_ptr, 0);
omap_dm_timer_set_load_start(timer_ptr, 1, 0);
/* Success */
return 0;
}
static void hrt_exit(void)
{
printk("hrt: removing module\n");
/* Stop and release the timer */
omap_dm_timer_stop(timer_ptr);
omap_dm_timer_free(timer_ptr);
timer_ptr = 0;
/* Unregister the char device */
unregister_chrdev(hrt_major, "hrt");
}
オングストロームでコンパイルしています
Linux beagleboard 3.6.7+ #1 SMP armv7l GNU/Linux
モジュールを初めて挿入すると、正常に動作します。これを削除して、ログで hrt_exit() 関数が実行されていることを確認することもできます。再挿入しようとすると問題が発生し、その結果、タイマーが再割り当てされます。カーネルから次を取得します。
[ 2546.762268] hrt: inserting module
[ 2546.765960] omap_dm_timer_set_source: failed to set timer_32k_ck as parent
[ 2546.773345] hrt: error: no timer is available
insmod: error inserting 'HRT.ko': -1 Operation not permitted
この特定のエラーに関する情報をウェブ上で見つけることができませんでした。タイマーを割り当てた後まで set_source を試行していないため、少し混乱していますが、そのメッセージは割り当て失敗エラーの前に表示されます。いずれにせよ、特に SoC に複数のタイマーがあることを考えると、別のタイマーの割り当てに失敗する理由がわかりません。何か案は?さらに情報が必要ですか? ありがとうございました!