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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
doom13
сообщение Aug 13 2015, 13:33
Сообщение #16


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

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



Посмотрел примеры драйверов, все, оказывается, пользуются read, write???
Go to the top of the page
 
+Quote Post
gerber
сообщение Aug 13 2015, 21:15
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088



"Нативными" методами работы с драйверами устройств являются open,read,write,close.
fopen,fread,fwrite,fclose - это уже функции библитеки libc, они удобны для работы с файлами, как с потоками данных (stream), поэтому читают из устройства (как бы файла) сразу большими блоками и буферизируют внутри себя данные. Это позволяет добиться существенного выиграша в скорости при работе с файловой системой, даже если верхний уровень читает по 16 байт, в "глубине души" чтение идёт блоками, удобными устройству и буферизируется, а когда юзер снова попросит следующие 16 байт, уже ничего читать не нужно, можно скопировать из буфера уже прочитанное...


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
doom13
сообщение Aug 14 2015, 06:28
Сообщение #18


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

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



Ясно, пользуемся open, read, write, close и всё будет работать.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Aug 17 2015, 13:08
Сообщение #19


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

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



Цитата(doom13 @ Aug 6 2015, 15:01) *
Откуда взялся номер 11 в конфигурационной области? Если его пишет система (или BIOS), то почему после переопределения номера линии прерывания он не переписывается на правильный?


Полагаю, что он задается в device tree.
Go to the top of the page
 
+Quote Post
doom13
сообщение Sep 30 2015, 11:27
Сообщение #20


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

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



Приветствую!
Возник вопрос, какой максимальный размер памяти с непрерывной адресацией можно выделить в ядре?
Посмотрел, что kmalloc, dma_alloc_coherent максимум дают 4МБ, что делать если хочу больше?
Спасибо.
Go to the top of the page
 
+Quote Post
doom13
сообщение Sep 30 2015, 12:33
Сообщение #21


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

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



Если использовать alloc_pages, то вообще выделяет только 8 страниц, далее выдаёт ошибку.
Go to the top of the page
 
+Quote Post
doom13
сообщение Dec 15 2015, 19:32
Сообщение #22


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

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



Приветствую.
В функции инициализации модуля pcievx7_init хочу добраться до struct pci_dev *pdev, вроде как должно помочь container_of, но получаются
разные значения для pdev и my_pdev. Может кто подскажет, что тут неправильно? Значения pdev->driver и &pcievx7_pci_driver одинаковы.
Код
static int pcievx7_probe(struct pci_dev *pdev , const struct pci_device_id *id)
{
    ...
    PINFO("pdev = %p\n", pdev);
    PINFO("pdev->driver = %p\n", pdev->driver); // выводит в syslog адрес pcievx7_pci_driver = DRIVER_ADDRESS
    ...
}

static struct pci_driver pcievx7_pci_driver =
{
    .name        = DRIVER_NAME,
    .probe        = pcievx7_probe,
    .remove        = pcievx7_remove,
    .id_table    = pcievx7_pci_driver_ids
};

static int __init pcievx7_init(void)
{
    struct pci_dev *my_pdev;
    ...
    pci_register_driver(&pcievx7_pci_driver);
    PINFO("&pcievx7_pci_driver = %p\n", &pcievx7_pci_driver); // выводит в syslog адрес pcievx7_pci_driver = DRIVER_ADDRESS
    my_pdev = container_of(&pcievx7_pci_driver, struct pci_dev, driver);
    PINFO("my_pdev = %p\n", my_pdev);
    ...
}
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 16 2015, 02:08
Сообщение #23


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

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



Я бы поле имени pdev->driver->name напечатал в консоль для обоих. Может помочь понять. Перед печатью проверьте если pdev->driver не равен нулю иначе система рухнет.
Go to the top of the page
 
+Quote Post
doom13
сообщение Dec 16 2015, 07:38
Сообщение #24


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

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



Цитата(Tarbal @ Dec 16 2015, 05:08) *
Я бы поле имени pdev->driver->name напечатал в консоль для обоих. Может помочь понять. Перед печатью проверьте если pdev->driver не равен нулю иначе система рухнет.

Если правильно Вас понял, то сделал это:
Код
static int pcievx7_probe(struct pci_dev *pdev , const struct pci_device_id *id)
{
    PINFO("%s\n", pdev->driver->name); // выводит в syslog имя драйвера "pcievx7"
}

static struct pci_driver pcievx7_pci_driver =
{
    .name        = DRIVER_NAME,
    .probe       = pcievx7_probe,
    .remove      = pcievx7_remove,
    .id_table    = pcievx7_pci_driver_ids
};

static int __init pcievx7_init(void)
{
    pci_register_driver(&pcievx7_pci_driver);
    PINFO("%s\n", (&pcievx7_pci_driver)->name); // выводит в syslog имя драйвера "pcievx7"
}

Имя драйвера в обоих случаях одинаково. Вопрос остался.

Попробовал сделать так:
Код
static int pcievx7_probe(struct pci_dev *pdev , const struct pci_device_id *id)
{
    struct pci_dev *test_pdev;

    test_pdev = container_of(pdev->driver, struct pci_dev, driver);

    PINFO("%p\n", test_pdev);
    PINFO("%p\n", pdev);
}

Получаю разные значения для test_pdev и pdev. Объясните, что тут неправильно?
Спасибо.
Go to the top of the page
 
+Quote Post
doom13
сообщение Dec 16 2015, 11:15
Сообщение #25


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

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



Надо было так:
Код
static int pcievx7_probe(struct pci_dev *pdev , const struct pci_device_id *id)
{
    struct pci_dev *test_pdev;

    test_pdev = container_of(&pdev->driver, struct pci_dev, driver);

    PINFO("%p\n", test_pdev);
    PINFO("%p\n", pdev);
}
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 16 2016, 14:39
Сообщение #26


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(doom13 @ Sep 30 2015, 15:33) *
Если использовать alloc_pages, то вообще выделяет только 8 страниц, далее выдаёт ошибку.

Так это же известнейшее ограничение что нельзя сразу много страниц вподряд выделить. Для этого надо использовать SG-DMA подход (LDD3, 15.4. Direct Memory Access). Я как раз сам в процессе освоения этого.

У Вас что-то получилось по этой теме? Куча вопросов, я пока только смог сделать запись и чтение регистров своего устройства через MMIO...


--------------------
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Jul 16 2016, 18:00
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 747
Регистрация: 11-04-07
Пользователь №: 26 933



Цитата(AVR @ Jul 16 2016, 17:39) *
Так это же известнейшее ограничение что нельзя сразу много страниц вподряд выделить.


В последних ядрах есть CMA (Contiguous Memory Allocator), в принципе можно выделить и подряд много, сам пробовал, получалось.


--------------------
Go to the top of the page
 
+Quote Post
AVR
сообщение Jul 16 2016, 18:21
Сообщение #28


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(dm.pogrebnoy @ Jul 16 2016, 21:00) *
В последних ядрах есть CMA (Contiguous Memory Allocator), в принципе можно выделить и подряд много, сам пробовал, получалось.

Я может что-то не понимаю, но меня искренне удивляет что работа устройства будет отдана воле случая, выделится а может нет - зачем такое делать?

Допустим в системе 16 гигабайт ОЗУ. CMA может выделить буфер 5 гигабайт? Я знаю что так делать не хорошо, но что если будет некоторое устройство, которому именно что требуется это, и пользователь будет предупрежден что именно столько надо для работы устройства.

Я сторонник исключительно 100% надежно работающих подходов.


--------------------
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Jul 16 2016, 19:15
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 747
Регистрация: 11-04-07
Пользователь №: 26 933



Цитата(AVR @ Jul 16 2016, 21:21) *
Я может что-то не понимаю, но меня искренне удивляет что работа устройства будет отдана воле случая, выделится а может нет - зачем такое делать?

Допустим в системе 16 гигабайт ОЗУ. CMA может выделить буфер 5 гигабайт? Я знаю что так делать не хорошо, но что если будет некоторое устройство, которому именно что требуется это, и пользователь будет предупрежден что именно столько надо для работы устройства.

Я сторонник исключительно 100% надежно работающих подходов.


Я так понимаю, если в системе только один драйвер использует подобный алгоритм выделения памяти, то вообще никаких проблем не будет, если несколько, то надо следить за суммарным размером области. В целом да, специфично, но зато можно без SGDMA обойтись. Да и производительность чуть-чуть будет повыше.


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 13:11
Рейтинг@Mail.ru


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