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

 
 
> Проблема с созданием символьного драйвера., Девайс не появляется в /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
 
Start new topic
Ответов
doom13
сообщение Nov 18 2015, 19:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Приветствую.
Не знаю, полезно будет или нет, есть такая штука LinK+ IDE, мне, как новичку в данном вопросе, очень даже понравилась. В начале пытался компилить из консоли, а исходники редактировать в текстовом редакторе, но как-то оно неудобно очень получается. Тут и шаблон драйвера сразу создаётся, куда только добавляем всё необходимое, и компилятор автоматом подтягивается.

Сам пока пользуюсь этим методом:
Цитата(Tarbal @ Nov 18 2015, 16:56) *
1. Легкий и устаревший -- команда mknod

, начинал эксперименты с изучения данной статьи , где он и описан.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 19 2015, 11:30
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(doom13 @ Nov 18 2015, 22:17) *
Приветствую.
Не знаю, полезно будет или нет, есть такая штука LinK+ IDE, мне, как новичку в данном вопросе, очень даже понравилась. В начале пытался компилить из консоли, а исходники редактировать в текстовом редакторе, но как-то оно неудобно очень получается. Тут и шаблон драйвера сразу создаётся, куда только добавляем всё необходимое, и компилятор автоматом подтягивается.

Сам пока пользуюсь этим методом:

, начинал эксперименты с изучения данной статьи , где он и описан.


Так в 2006 других способов и не было насколько мне известно. Ну mknod до сих пор имеется в наличии, только методы более удобными стали.
Go to the top of the page
 
+Quote Post



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

 


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


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