2015-09-10 4 views
-1

Я начинаю изучать разработку драйверов Linux. Я пытаюсь создать простой драйвер, который опросит функцию, которая в конце будет считывать аппаратный регистр с постоянной скоростью (т. Е. 10 раз в секунду) и добавляет аппаратный вывод в очередь, к которой после этого может обращаться procfs.Опрос драйвера Linux?

Прежде всего. Мне нужно иметь возможность опроса по постоянной ставке. Я читал этот онлайн много, и это кажется очень простым (мой код ниже). Однако, когда я вставляю модуль, он, похоже, вообще не опросит !!

Может кто-нибудь, пожалуйста, помогите мне понять это и помочь мне выяснить, что мне нужно сделать, чтобы сделать опрос?

Я очень ценю вас, ребята, помощь!

#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); 

ответ

0

В hello_init() вы не подключаете к нему silly_fops. Он не может работать автоматически, если между ними нет никакой связи.

Для подключения, вероятно, вам необходимо инициализировать устройство с помощью silly_fops(), см. Ch3.4 от ldd3 по адресу http://www.makelinux.net/ldd3/, надеюсь, что это сработает.

Смежные вопросы