реклама на сайте
подробности

 
 
> Проблема с созданием символьного драйвера., Девайс не появляется в /dev/
novartis
сообщение Nov 18 2015, 13:13
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 375
Регистрация: 9-10-09
Из: Свердловский регион
Пользователь №: 52 845



Добрый день, разбираюсь с драйвером под линукс для pcie устройства.

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


Эта функция вызывается в 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");
.........


При загрузке модуля 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 мой модуль есть.

Что я сделал не так?

Прикрепил полные исходники
Прикрепленный файл  code.zip ( 10.02 килобайт ) Кол-во скачиваний: 70

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 00:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01365 секунд с 7
ELECTRONIX ©2004-2016