Перейти к содержанию

Ошибка near initialization for.... и initializer element is not constant


Рекомендуемые сообщения

При компиляции выдается следующее сообщение:

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

Ссылка на комментарий
Поделиться на другие сайты

/home/Nikolai/mydrv.c:24: error: `mydrv_open' undeclared here (not in a function)

Как Вы думаете, что это означает? Smile

Вынесите объявления функций перед инициализацией структуры mydrv_fops, как компилятор может понять, о чем речь, если он раньше этих функций не видел никогда? Smile

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...