Я пытался портировать драйвер с версии 2.6 до 4.n без поддержки оригинального производителя платы (и очень ограниченный опыт работы с Linux).
Исходный драйвер использует init_timer () и передает указатель на структуру timer_list.Элемент 'data' этой структуры limer_list был установлен в качестве указателя на другую структуру памяти, а элемент 'function' - в обратный вызов.Внутри функции обратного вызова элемент 'data' использовался для доступа к другим частям.
Текущий метод инициализации таймера использует timer_setup (timer_list *, callback, (unsigned int) flags);и структура timer_list была изменена, чтобы исключить поле 'data'.
Я не уверен, каков наилучший / правильный способ сообщить функции обратного вызова эквивалентный элемент данных.Кто-нибудь может дать какое-нибудь руководство?
Вот фрагмент старого драйвера ...
myDevice * dev;
dev->getIntrTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
init_timer(dev->getIntrTimer);
dev->getIntrTimer->data = (unsigned long) dev;
dev->getIntrTimer->function = GetIntrTimerCallback;
Функция обратного вызова запускается так:
void GetIntrTimerCallback(unsigned long devAddr)
{
myDevice *dev = (myDevice *) devAddr;
dev->blahBlah++; // etc.
Итакстарый код получает указатель на myDevice, поэтому внутри функции обратного вызова можно получить доступ к этой структуре.
Но с помощью нового метода таймера доступно только int, равное 4 байта, а указатель 8 (или любой другой).
Я хотел бы сделать следующее:
dev->getIntrTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
timer_setup(dev->getIntrTimer, GetIntrTimerCallback, dev);
, но, конечно, это приводит к ошибкам компиляции, поскольку dev является указателем на тип myDevice, который не помещается в int.
Мне не хватает чего-то глупого, не так ли?