У меня устройство файл /dev/mydev , я хочу чтобы в него можно было писать через перенаправление ввода и вывода ls >> /dev/mydev. В том примере из книги данные берутся из портов ввода и вывода там имеет место функция request_region которая резервирует диапазон портов, у меня самого устройства нету есть только файл и драйвер модуль ядра, и я хочу чтоб например при ls >> /dev/mydev записало в файл и при cat /dev/mydev выдало всё что я записал при использовании моих функций read и write заданных через структуру file_operations указанных при регистрации символьного устройства в ядре. Вот мои функции:
Код: Выделить всё
static char dev_buffer[MAX_FILE_SIZE];
ssize_t mydev_read(struct file *filp, const char *buff,ssize_t len,loff_t pos)
{
printk(KERN_INFO DEV_NAME "read");
struct inode *in;
int count=len;
struct dev_state *devst;
printk("Kernel: try to read %d bytes \n",len);
in=filp->f_dentry->d_inode;
printk("Kernel: minor number is %d",MINOR(in->i_rdev));
devst=&STATE[MINOR(in->i_rdev)];
char tmp_buffer[100];
strcpy(tmp_buffer,&dev_buffer[pos+poss]);
unsigned long nlen=copy_to_user(&dev_buffer[pos+poss],buff,len);
devst->dev_read+=nlen;
strcat(dev_buffer,tmp_buffer);
printk(KERN_INFO"Kernel: read "DEV_NAME" %d bytes",nlen);
printk(KERN_INFO"kernel %s\n",dev_buffer);
return nlen;
};
ssize_t mydev_write(struct file *filp, char *buff, ssize_t len,loff_t pos)
{
printk(KERN_INFO DEV_NAME "write");
struct inode *in;
int count=len;
unsigned char byte;
struct dev_state *devst;
printk(KERN_INFO"Kernel: try to write %d bytes\n",len);
in=filp->f_dentry->d_inode;
printk(KERN_INFO"Kernel: minor number %d\n",MINOR(in->i_rdev));
devst=&STATE[MINOR(in->i_rdev)];
unsigned long nlen=copy_from_user(&dev_buffer[pos+poss],buff,len);
devst->dev_write +=len;
poss+=len;
printk(KERN_INFO"Kernel: "DEV_NAME " written %d bytes\n",len);
return len;
};
STATE это массив где хранятся статистика использования устройства, тоесть открыто ли стройство и количество записанных и прочитанных данных индексом в массиве является минор данного устройства. Что у меня не так? У меня есть предположение что можно использовать внутренний буффер драйвера при записи писать туда при чтении возвращать пользователю.
Написал пользовательскую програмку чтения и записи в файл устройства вроде работает, но когда просматриваю лог файл через dmesg нет обращения к функциям моего драйвера как при использовании команды cat /dev/mydev или записи при перенаправлении потоков. Почему так может быть?