[英]Linux driver polling?
我開始學習 Linux 驅動程序開發。 我正在嘗試創建一個簡單的驅動程序,該驅動程序輪詢一個函數,該函數最終將以恆定速率(即每秒 10 次)讀取硬件寄存器並將硬件輸出添加到隊列中,然后該隊列可由 procfs 訪問。
先說第一件事。 我需要能夠以一致的速度進行輪詢。 我一直在網上閱讀這個很多,它看起來很簡單(我的代碼如下)。 但是,當我插入我的模塊時,它似乎根本沒有輪詢!!
有人可以幫助我理解這一點並幫助我弄清楚我需要做什么才能進行投票嗎?
我真的很感謝你們的幫助!
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/version.h>
#include <linux/sched.h>
#include <linux/kernel.h> /* printk() */
#include <linux/fs.h> /* everything... */
#include <linux/errno.h> /* error codes */
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/poll.h>
MODULE_LICENSE("Dual BSD/GPL");
int silly_open(struct inode *inode, struct file *filp)
{
printk(KERN_ALERT "open\n");
return 0;
}
int silly_release(struct inode *inode, struct file *filp)
{
printk(KERN_ALERT "release\n");
return 0;
}
ssize_t silly_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
printk(KERN_ALERT "read\n");
return 0;
}
ssize_t silly_write(struct file *filp, const char __user *buf, size_t count,
loff_t *f_pos)
{
printk(KERN_ALERT "write\n");
return 0;
}
unsigned int silly_poll(struct file *filp, poll_table *wait)
{
printk(KERN_ALERT "poll\n");
return POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM;
}
struct file_operations silly_fops = {
.read = silly_read,
.write = silly_write,
.poll = silly_poll,
.open = silly_open,
.release = silly_release,
.owner = THIS_MODULE
};
int silly_init(void)
{ printk(KERN_ALERT "init\n");
return 0;
}
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
在 hello_init() 中,您沒有將 Silly_fops 連接到它。 如果它們之間沒有任何連接,它就不能自動工作。
為了連接,您可能需要使用silly_fops() 初始化設備,請參閱http://www.makelinux.net/ldd3/上ldd3 的ch3.4,希望這有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.