nixp.ru v3.0

20 октября 2017,
пятница,
06:34:48 MSK

DevOps с компанией «Флант»
anonymous написал 21 апреля 2006 года в 10:38 (968 просмотров) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

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

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

#include

#include

#include

#include

#include

#include

#include

#include «mydirect.h»

#include

#include

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_devs,«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);

Longobard

Сделай уже топик «поможем Злодею написать едрёный модуль» ;)

rgo

ну прочитай, приличия ради, K&R, прежде чем писать программы на C.

anonymous

Народ, а вы читали Linux Device Driver 3-е или 4-е издание?

Если читали, то объясните где брать функцию scull_follow (3-я глава, Описание метода Read)?

myst

4-ое издание говоришь?.. Интересно где ж ты его откопал?

Uncle Theodore
Zlodei
Народ, а вы читали Linux Device Driver 3-е или 4-е издание?

Если читали, то объясните где брать функцию scull_follow (3-я глава, Описание метода Read)?

Дык, я так понимаю, в описании метода write его брать, на пару страниц дальше…

Разве нет?

Good Luck,

UT

anonymous
Uncle Theodore
Дык, я так понимаю, в описании метода write его брать, на пару страниц дальше…

Разве нет?

UT

Да как бы нет…

ни в 3-м не в 4-м издании нет ни фига. Ни в одной главе….

Longobard

Zlodei у этой книги всего три издания, где ты четвертое откопал? :)

anonymous

Да ошибся малость…

Ну вообщем не нашел я ни фига где брать scull_foolow

и что в нем должно быть тоже не представляю…..

Че делать?

anonymous

А есть у кого 3-е издание в переводе?

myst

У меня есть в переводе на английский.

anonymous
myst
У меня есть в переводе на английский.

ДА мне бы в русском варианте….

myst

Бугагага. Нерентабельно переводить. Аудитория маленькая…

anonymous

А кто нибудь разрабатывал драйвер под Linux?

Помогите мне с этим пожайлуста.