module_init, module_exit, probe - это реализовал и это работает.
Теперь хочу из программы пользователя писать в бары платы.
Стал описывать символьный драйвер, все вроде так же как у людей сделал, а в папке /dev/ мой девайс не добавляется.
Вот выдержки из кода:
функция инициализации, создания символьного драйвера:
Код
#define AG_DEF_DRIVER_NAME "ag_pcie_driver"
#define AG_DEF_BAR_NUM 6
struct ag_bookkeep {
struct pci_dev *pci_dev;
void * __iomem bar[AG_DEF_BAR_NUM];
size_t bar_length[AG_DEF_BAR_NUM];
dev_t cdevno;
struct cdev cdev;
};
static int __init init_chrdev (struct ag_bookkeep *bk_ptr)
{
int dev_minor = 0;
int dev_major = 0;
dev_t devno;
int result = alloc_chrdev_region(&bk_ptr->cdevno, dev_minor, 1, AG_DEF_DRIVER_NAME);
dev_major = MAJOR(bk_ptr->cdevno);
if (result < 0)
{
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: cannot get major ID %d", dev_major);
}
else
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: major ID %d", dev_major);
devno = MKDEV(dev_major, dev_minor);
cdev_init(&bk_ptr->cdev, &ag_user_fops);
bk_ptr->cdev.owner = THIS_MODULE;
bk_ptr->cdev.ops = &ag_user_fops;
result = cdev_add(&bk_ptr->cdev, devno, 1);
if (result)
{
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: cdev_add() fail");
return -1;
}
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: cdev_add() success");
return 0;
}
#define AG_DEF_BAR_NUM 6
struct ag_bookkeep {
struct pci_dev *pci_dev;
void * __iomem bar[AG_DEF_BAR_NUM];
size_t bar_length[AG_DEF_BAR_NUM];
dev_t cdevno;
struct cdev cdev;
};
static int __init init_chrdev (struct ag_bookkeep *bk_ptr)
{
int dev_minor = 0;
int dev_major = 0;
dev_t devno;
int result = alloc_chrdev_region(&bk_ptr->cdevno, dev_minor, 1, AG_DEF_DRIVER_NAME);
dev_major = MAJOR(bk_ptr->cdevno);
if (result < 0)
{
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: cannot get major ID %d", dev_major);
}
else
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: major ID %d", dev_major);
devno = MKDEV(dev_major, dev_minor);
cdev_init(&bk_ptr->cdev, &ag_user_fops);
bk_ptr->cdev.owner = THIS_MODULE;
bk_ptr->cdev.ops = &ag_user_fops;
result = cdev_add(&bk_ptr->cdev, devno, 1);
if (result)
{
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: cdev_add() fail");
return -1;
}
printk(KERN_INFO "[ag_pcie_driver]:[init_chrdev]: cdev_add() success");
return 0;
}
Эта функция вызывается в probe:
Код
static int ag_pciedr_probe( struct pci_dev *dev, const struct pci_device_id *id )
{
int res;
struct ag_bookkeep *bk_ptr = NULL;
bk_ptr = kzalloc(sizeof(struct ag_bookkeep), GFP_KERNEL);
if(!bk_ptr)
{
printk( KERN_INFO "[ag_pcie_driver]:[ag_pciedr_probe]: kzalloc() failed\n");
return 0;
}
bk_ptr->pci_dev = dev;
pci_set_drvdata(dev, bk_ptr); //зачем это????
// инициализация символьного драйвера
res = init_chrdev(bk_ptr);
if (res)
{
kfree(bk_ptr);
printk( KERN_INFO "[ag_pcie_driver]:[ag_pciedr_probe]: init_chrdev() failed\n");
return 0;
}
else
printk( KERN_INFO "[ag_pcie_driver]:[ag_pciedr_probe]: init_chrdev() success\n");
.........
{
int res;
struct ag_bookkeep *bk_ptr = NULL;
bk_ptr = kzalloc(sizeof(struct ag_bookkeep), GFP_KERNEL);
if(!bk_ptr)
{
printk( KERN_INFO "[ag_pcie_driver]:[ag_pciedr_probe]: kzalloc() failed\n");
return 0;
}
bk_ptr->pci_dev = dev;
pci_set_drvdata(dev, bk_ptr); //зачем это????
// инициализация символьного драйвера
res = init_chrdev(bk_ptr);
if (res)
{
kfree(bk_ptr);
printk( KERN_INFO "[ag_pcie_driver]:[ag_pciedr_probe]: init_chrdev() failed\n");
return 0;
}
else
printk( KERN_INFO "[ag_pcie_driver]:[ag_pciedr_probe]: init_chrdev() success\n");
.........
При загрузке модуля dmesg выдает, что
[ag_pcie_driver]:[init_chrdev]: major ID 245
[ag_pcie_driver]:[init_chrdev]: cdev_add() success
[ag_pcie_driver]:[ag_pciedr_probe]: init_chrdev() success
То есть мажор найден, cdev_add сработал.
Но когда смотрю в папку /dev/ там не вижу свой девайс.
В /proc/devices тоже его нет, а в /proc/modules мой модуль есть.
Что я сделал не так?
Прикрепил полные исходники
Нажмите для просмотра прикрепленного файла