Zlodei Опубликовано 21 апреля, 2006 Жалоба Поделиться Опубликовано 21 апреля, 2006 При компиляции выдается следующее сообщение: make -C /lib/modules/2.6.9-1.667asp/build M=/home/Nikolai modules make[1]: Entering directory `/lib/modules/2.6.9-1.667asp/build' CC [M] /home/Nikolai/mydrv.o /home/Nikolai/mydrv.c:24: error: `mydrv_open' undeclared here (not in a function) /home/Nikolai/mydrv.c:24: error: initializer element is not constant /home/Nikolai/mydrv.c:24: error: (near initialization for `mydrv_fops.open') /home/Nikolai/mydrv.c:25: error: `mydrv_release' undeclared here (not in a function) /home/Nikolai/mydrv.c:25: error: initializer element is not constant /home/Nikolai/mydrv.c:25: error: (near initialization for `mydrv_fops.release') /home/Nikolai/mydrv.c: In function `mydrv_open': /home/Nikolai/mydrv.c:92: warning: implicit declaration of function `mydrv_trim' /home/Nikolai/mydrv.c: At top level: /home/Nikolai/mydrv.c:77: warning: `mydrv_setup_cdev' defined but not used make[2]: *** [/home/Nikolai/mydrv.o] Ошибка 1 make[1]: *** [_module_/home/Nikolai] Ошибка 2 make[1]: Leaving directory `/lib/modules/2.6.9-1.667asp/build' make: *** [default] Ошибка 2 Исходник mydrv.c #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/ioport.h> #include <linux/errno.h> #include <linux/fs.h> #include <linux/kdev_t.h> #include <linux/types.h> #include "mydirect.h" #include <linux/cdev.h> #include <linux/slab.h> MODULE_LICENSE("DUAL BSD/GPL"); MODULE_AUTHOR ("Dorofeev Nikolai Viktorovich"); MODULE_SUPPORTED_DEVICE ("ADC card"); struct file_operations mydrv_fops = { .owner = THIS_MODULE, /* .llseek = mydrv_llseek, .read = mydrv_read, .write = mydrv_write, .ioctl = mydrv_ioctl, */ .open = mydrv_open, .release = mydrv_release, }; struct mydrv_dev { //POinter to first quantum set struct mydrv_qset *data; //the current quantum size int quantum; //the current array size int qset; //amount of data stored here unsigned long size; //user by sculluid and mydrvpriv unsigned int access_key; //mutual exclusion semaphore struct semaphore sem; //Char device structure struct cdev cdev; }; struct mydrv_qset {void **data; struct mydrv_qset *next; }; int mydrv_major = MYDRV_MAJOR; int mydrv_minor = MYDRV_MINOR; int dev; int result; int mydrv_nr_devs = 1; static int my_init(void) { if (mydrv_major) {dev=MKDEV(mydrv_major,mydrv_minor); result=register_chrdev_region(dev,mydrv_nr_devs,"mydrv"); } else {result=alloc_chrdev_region(&dev,mydrv_minor,mydrv_nr_de vs, "mydrv"); mydrv_major=MAJOR(dev); } if (result<0) {printk(KERN_WARNING "mydrv: can't get major %d\n",mydrv_major); return result; } printk(KERN_ALERT "mydrv: Insert driver\n"); return 0; }; static void mydrv_setup_cdev(struct mydrv_dev *dev,int index) {int err, devno = MKDEV(mydrv_major,mydrv_minor+index); cdev_init(&dev->cdev,&mydrv_fops); dev->cdev.owner = THIS_MODULE; dev->cdev.ops = &mydrv_fops; err = cdev_add(&dev->cdev,devno,1); //Fail gracefully if need be if (err) printk(KERN_NOTICE "Error %d adding mydrv%d",err, index); }; int mydrv_open(struct inode *inode, struct file *filp) {struct mydrv_dev *dev; //device information dev=container_of(inode->i_cdev,struct mydrv_dev,cdev); filp->private_data = dev; //for other methods //now trim to 0 the length of the device if open was write-only if ((filp->f_flags & O_ACCMODE) == O_WRONLY) {mydrv_trim(dev); //ignore errors } return 0;//success }; int mydrv_release(struct inode *inode, struct file *filp) {return 0; }; int mydrv_trim(struct mydrv_dev *dev) {struct mydrv_qset *next, *dptr; int qset = dev->qset; //*"dev" is not-null int i; int mydrv_quantum = MYDRV_QUANTUM; int mydrv_qset = MYDRV_QSET; for (dptr = dev->data; dptr; dptr = next) //all the list items {if (dptr->data) {for (i = 0; i < qset; i++) kfree(dptr->data); kfree(dptr->data); dptr->data = NULL; } next = dptr->next; kfree(dptr); } dev->size = 0; dev->quantum = mydrv_quantum; dev->qset = mydrv_qset; dev->data = NULL; return 0; }; static void my_cleanup(void) { unregister_chrdev_region(dev,mydrv_nr_devs); //unregister_chrdev(mydrv_major,"mydrv"); //if (result<0) //{printk(KERN_WARNING "mydrv: can't unregister dev\n"); //return result; //} printk(KERN_ALERT "mydrv: Remove driver\n"); }; module_init(my_init); module_exit(my_cleanup); Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 21 апреля, 2006 Жалоба Поделиться Опубликовано 21 апреля, 2006 /home/Nikolai/mydrv.c:24: error: `mydrv_open' undeclared here (not in a function) Как Вы думаете, что это означает? Вынесите объявления функций перед инициализацией структуры mydrv_fops, как компилятор может понять, о чем речь, если он раньше этих функций не видел никогда? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.