При компиляции выдается следующее сообщение:
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);
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Сделай уже топик «поможем Злодею написать едрёный модуль» ;)
ну прочитай, приличия ради, K&R, прежде чем писать программы на C.
Народ, а вы читали Linux Device Driver 3-е или 4-е издание?
Если читали, то объясните где брать функцию scull_follow (3-я глава, Описание метода Read)?
4-ое издание говоришь?.. Интересно где ж ты его откопал?
Дык, я так понимаю, в описании метода write его брать, на пару страниц дальше…
Разве нет?
Good Luck,
UT
Да как бы нет…
ни в 3-м не в 4-м издании нет ни фига. Ни в одной главе….
Zlodei у этой книги всего три издания, где ты четвертое откопал? :)
Да ошибся малость…
Ну вообщем не нашел я ни фига где брать scull_foolow
и что в нем должно быть тоже не представляю…..
Че делать?
А есть у кого 3-е издание в переводе?
У меня есть в переводе на английский.
ДА мне бы в русском варианте….
Бугагага. Нерентабельно переводить. Аудитория маленькая…
А кто нибудь разрабатывал драйвер под Linux?
Помогите мне с этим пожайлуста.