【发布时间】:2018-12-18 19:12:27
【问题描述】:
我一直在尝试将驱动程序从 2.6 移植到 4.X,而无需原始板制造商的支持(并且 Linux 经验非常有限)。
原始驱动程序使用init_timer() 并传入一个指向timer_list 结构的指针。 timer_list 结构的 data 元素被设置为指向另一个内存结构的指针,function 元素被设置为回调。在回调函数内部,data 元素用于访问其他内容。
当前定时器init-方法使用:
timer_setup( timer_list *, callback, (unsigned int) flags);
并且 timer_list 结构已更改以消除 data 字段。
我不确定通知等效data 元素的回调函数的最佳/正确方法是什么。谁能提供一些指导?
这是老司机的sn-p:
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,因此在回调中可以访问该结构。
但是对于新的计时器方法,只有 4 个字节的 int 可用,但指针为 8(或其他)。
我想做的是:
dev->getIntrTimer = kmalloc(sizeof(struct timer_list), GFP_KERNEL);
timer_setup(dev->getIntrTimer, GetIntrTimerCallback, dev);
但这当然会产生编译错误,因为 dev 是指向类型 myDevice 的指针,它不适合 int。
【问题讨论】:
标签: c linux timer linux-kernel linux-device-driver