Ошибка при перераспределении gptimer OMAP3730 из модуля ядра Linux

Я довольно новичок в разработке модулей ядра Linux, поэтому заранее прошу прощения, если мне не хватает чего-то действительно очевидного здесь. Я пытаюсь написать простой модуль, использующий таймер GP OMAP3730, чтобы тестировать отметку времени на Beagleboard-xm с большим разрешением.

Соответствующий код выглядит так:

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 их несколько. Есть идеи? Нужна дополнительная информация? Спасибо!

0 ответов

Другие вопросы по тегам