LINUX.ORG.RU

История изменений

Исправление I-Love-Microsoft, (текущая версия) :

Вокруг темы образовались три падавана :) как их принято нынче называть, хотя на магистра я пока что не тяну, но тем не менее )))

Вот код драйвера: http://paste.org.ru/?90xru5 Он далек от совершенства, однако дает результаты лучше чем 3 МБ/с ;)

У этого драйвера есть два способа работы: используя старый механизм DMA (через dma_alloc_coherent) и новый (dma_map_single). Старый подразумевает один большой постоянно задействованный буфер, который не всегда можно выделить. Новый механизм - динамический. В данном драйвере используется один буфер пока что (если таковых много, то если не ошибаюсь, это зовется Scatter Gather DMA).

Итак, init_module_mypci - вызывается при загрузке модуля в память и регистрирует в системе драйвер как со стороны шины PCI и со стороны пользователя ввиде character device (простейший интерфейс, позволяющий работать с устройством как с файлом). device_probe - выполняется при наличии устройств с подходящим VENDOR_ID и DEVICE_ID (для каждого экземпляра устройства) и тут же с каждым устройством связывается своя структура struct mypci_device которая хранит данные специфичные для каждого экземпляра устройства - эта структура доступна при каждом событии, будь то во время прерывания, или когда из пространства пользователя осуществляются действия типа открытия файла и чтения-записи. Создание файла устройства делается так: sudo mknod /dev/mypci c 200 0 и тут MYPCI_MAJOR=200 а 0 это говорит о том что это просто первое устройство (их может быть много, 1 будет у второй воткнутой карточки).

Тестовая программа: http://paste.org.ru/?t8bnjo Она позволяет открыть файл, выделяет буфер и осуществляет замер времени заполнения буфера, чтобы приблизительно оценить производительность реализации (не пропускную способность шины как таковую!).

Задачи, которые нужно решить:

1) Сделать динамическое получение major-номера
2) Разобраться с настройкой вывода в debugfs (мне удалось это лишь частично)
3) Разобраться с SG-DMA (работает как dma_map_single но со множеством страниц) - это позволит получить больше данных от устройства (скорость увеличится) прежде чем осуществлять копирование в user space и пробуждать пользовательский процесс
4) Распараллелить процесс получения данных от устройства и копирование в user-space - позволит поднять скорость
5) Хотелось бы реализовать V4L2-интерфейс устройства (как карта захвата видео, например).

Из того что почитать на тему:

1) Jackson M., Budruk R., PCI Express Technology. Comprehensive Guide to Generations 1.x, 2.x, 3.0 - идеальная книга, слабая сторона которой является отсутствие пояснения особенностей работы на стороне хоста, только затронута начальная инициализация

2) Linux Device Drivers (книга LDD), есть http://rus-linux.net/MyLDP/BOOKS/drivers/linux-device-drivers-00.html - однако самое нужное по части DMA и связывание с подсистемами, типа I2C/SPI - описано плохо или никак

Что касается аппаратной части - это ПЛИС любого производителя Altera/Lattice/Xilinx или ПЛИС + мостовая микросхема. У устройства должен быть задан PCI-E native режим, доступен один регион памяти (например 4К), поддерживаться режим прерываний MSI, VID/PID как в драйвере. Это отдельная тема, и если есть вопросы - пишите.

charodeus

Исправление I-Love-Microsoft, :

Вокруг темы образовались три падавана :) как их принято нынче называть, хотя на магистра я пока что не тяну, но тем не менее )))

Вот код драйвера: http://paste.org.ru/?90xru5 Он далек от совершенства, однако дает результаты лучше чем 3 МБ/с ;)

У этого драйвера есть два способа работы: используя старый механизм DMA (через dma_alloc_coherent) и новый (dma_map_single). Старый подразумевает один большой постоянно задействованный буфер, который не всегда можно выделить. Новый механизм - динамический. В данном драйвере используется один буфер пока что (если таковых много, то если не ошибаюсь, это зовется Scatter Gather DMA).

Итак, init_module_mypci - вызывается при загрузке модуля в память и регистрирует в системе драйвер как со стороны шины PCI и со стороны пользователя ввиде character device (простейший интерфейс, позволяющий работать с устройством как с файлом). device_probe - выполняется при наличии устройств с подходящим VENDOR_ID и DEVICE_ID (для каждого экземпляра устройства) и тут же с каждым устройством связывается своя структура struct mypci_device которая хранит данные специфичные для каждого экземпляра устройства - эта структура доступна при каждом событии, будь то во время прерывания, или когда из пространства пользователя осуществляются действия типа открытия файла и чтения-записи. Создание файла устройства делается так: sudo mknod /dev/mypci c 200 0 и тут MYPCI_MAJOR=200 а 0 это говорит о том что это просто первое устройство (их может быть много, 1 будет у второй воткнутой карточки).

Тестовая программа: http://paste.org.ru/?t8bnjo Она позволяет открыть файл, выделяет буфер и осуществляет замер времени заполнения буфера, чтобы приблизительно оценить производительность реализации (не пропускную способность шины как таковую!).

Задачи, которые нужно решить:

1) Сделать динамическое получение major-номера
2) Разобраться с настройкой вывода в debugfs (мне удалось это лишь частично)
3) Разобраться с SG-DMA (работает как dma_map_single но со множеством страниц) - это позволит получить больше данных от устройства (скорость увеличится) прежде чем осуществлять копирование в user space и пробуждать пользовательский процесс
4) Распараллелить процесс получения данных от устройства и копирование в user-space - позволит поднять скорость
5) Хотелось бы реализовать V4L2-интерфейс устройства (как карта захвата видео, например).

Из того что почитать на тему:

1) Jackson M., Budruk R., PCI Express Technology. Comprehensive Guide to Generations 1.x, 2.x, 3.0 - идеальная книга, слабая сторона которой является отсутствие пояснения особенностей работы на стороне хоста, только затронута начальная инициализация

2) Linux Device Drivers (книга LDD), есть http://rus-linux.net/MyLDP/BOOKS/drivers/linux-device-drivers-00.html - однако самое нужное по части DMA и связывание с подсистемами, типа I2C/SPI - описано плохо или никак

charodeus

Исходная версия I-Love-Microsoft, :

Вокруг темы образовались три падавана :) как их принято нынче называть, хотя на магистра я пока что не тяну, но тем не менее )))

Вот код драйвера: http://paste.org.ru/?90xru5 Он далек от совершенства, однако дает результаты лучше чем 3 МБ/с ;)

У этого драйвера есть два способа работы: используя старый механизм DMA (через dma_alloc_coherent) и новый (dma_map_single). Старый подразумевает один большой постоянно задействованный буфер, который не всегда можно выделить. Новый механизм - динамический. В данном драйвере используется один буфер пока что (если таковых много, то если не ошибаюсь, это зовется Scatter Gather DMA).

Итак, init_module_mypci - вызывается при загрузке модуля в память и регистрирует в системе драйвер как со стороны шины PCI и со стороны пользователя ввиде character device (простейший интерфейс, позволяющий работать с устройством как с файлом). device_probe - выполняется при наличии устройств с подходящим VENDOR_ID и DEVICE_ID (для каждого экземпляра устройства) и тут же с каждым устройством связывается своя структура struct mypci_device которая хранит данные специфичные для каждого экземпляра устройства - эта структура доступна при каждом событии, будь то во время прерывания, или когда из пространства пользователя осуществляются действия типа открытия файла и чтения-записи. Создание файла устройства делается так: sudo mknod /dev/mypci c 200 0 и тут MYPCI_MAJOR=200 а 0 это говорит о том что это просто первое устройство (их может быть много, 1 будет у второй воткнутой карточки).

Тестовая программа: http://paste.org.ru/?t8bnjo Она позволяет открыть файл, выделяет буфер и осуществляет замер времени заполнения буфера, чтобы приблизительно оценить производительность реализации (не пропускную способность шины как таковую!).

Задачи, которые нужно решить:

1) Сделать динамическое получение major-номера
2) Разобраться с настройкой вывода в debugfs (мне удалось это лишь частично)
3) Разобраться с SG-DMA (работает как dma_map_single но со множеством страниц) - это позволит получить больше данных от устройства (скорость увеличится) прежде чем осуществлять копирование в user space и пробуждать пользовательский процесс
4) Распараллелить процесс получения данных от устройства и копирование в user-space - позволит поднять скорость
5) Хотелось бы реализовать V4L2-интерфейс устройства (как карта захвата видео, например).

charodeus