Преобразование старого init_timer в новое ядро ​​Linux - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь собрать драйвер SDK (без документации или поддержки от производителя). Исходный драйвер использует init_timer () и передает указатель на структуру timer_list. И он использует элемент данных. Теперь я знаю, что некоторые функции таймера устарели в новых ядрах Linux. В настоящее время я использую ядро ​​версии 4.15.

Каков наилучший способ доступа к элементу «данные»?

Текущая функция выглядит так -

OS_RESULT OS_TimerCreate(OS_DRV_CONTEXT* aContext, OS_TIMER* aTimer, OS_UINT32 aPeriodic, OS_TIMER_FNC aFunction, 
            OS_VOID* aData, OS_UINT32 aPeriod)
{
    struct timer_list* lTimer = (struct timer_list*) aTimer->Space;
    unsigned long lJiffies = jiffies;
    unsigned long lPeriod = msecs_to_jiffies(aPeriod);

    OS_UNREFERENCED_PARAMETER(aContext);
    OS_ASSERT( OS_TIMER_SIZE >= sizeof(timer_list));

    init_timer(lTimer);

    lTimer->expires = lJiffies + lPeriod;
    lTimer->data = (unsigned long) aTimer;
    aTimer->Function = aFunction;
    aTimer->Data = aData;   
    aTimer->Period = lPeriod;
    if (aPeriodic)
    {
        lTimer->function = OS_TimerPeriodicInternalFunc; 
    }
    else
    {
        lTimer->function = OS_TimerInternalFunc; 
    }

    add_timer(lTimer);

    return OS_RESULT_OK;
}

Декларация для справки -

typedef struct
{
    OS_UINT8      Space[OS_TIMER_SIZE];
    OS_TIMER_FNC  Function;
    OS_VOID*      Data;
    OS_UINT32     Period;
} OS_TIMER;

OS_DECL_EXTERN OS_RESULT OS_TimerCreate(OS_DRV_CONTEXT* aContext, OS_TIMER* aTimer, OS_UINT32 aPeriodic, OS_TIMER_FNC aFunction, OS_VOID* aData, OS_UINT32 aPeriod /* ms */);

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 июня 2019

Сначала нужно изменить элемент, в котором хранится struct timer_list, на правильный тип вместо использования массива байтов:

typedef struct
{
    struct timer_list Timer;
    OS_TIMER_FNC  Function;
    OS_VOID*      Data;
    OS_UINT32     Period;
} OS_TIMER;

lTimer просто установлено на &aTimer->Timer).

В старом коде элемент data просто установлен на указатель на структуру OS_TIMER, которая содержит таймер. В новом коде обратный вызов может вместо этого получить этот указатель с помощью макроса from_timer, например, если в старом обратном вызове у вас было это:

OS_TIMER *aTimer = lTimer->data;

тогда в новом коде вместо этого будет:

OS_TIMER *aTimer = from_timer(aTimer, lTimer, Timer);

(где последний параметр Timer - это имя поля struct timer_list в OS_TIMER).

...