Linux dev modul for Texas Instruments TMS320DM642
https://github.com/ze0n4ri0t/dm642_pci_e/tree/master
Linux dev modul for Texas Instruments TMS320DM642
Re: Linux dev modul for Texas Instruments TMS320DM642
https://sourceforge.net/code-snapshots/cvs/d/dm/dm642-pci.zip
Установить заголовочные файлы ядра
Скачать модуль драйвера
Сборка и установка драйвера
Драйвер успешно скомпилирован под Linux версии 2.6.15-1.2054_FC5
Проверьте, что модуль успешно загрузился
Установить заголовочные файлы ядра
Код: Выделить всё
apt-get install linux-headers-4.9.0-13-amd64Код: Выделить всё
git clone https://github.com/ze0n4ri0t/dm642_pci_eКод: Выделить всё
cd linux/driver
make
./dm642_load (load the dm642_pci.ko module and create correspondence devices, adapt from LDD3 examples)Проверьте, что модуль успешно загрузился
Код: Выделить всё
lsmod | grep dm642Re: Linux dev modul for Texas Instruments TMS320DM642
На будущее (исправление предупреждений компиляции):
Предупреждение -Wmisleading-indentation в файле pci.c на строке 67 указывает на то, что после if(dev->mmr_base); стоит лишняя точка с запятой, из-за чего функция iounmap выполняется всегда, а не только при выполнении условия.
Предупреждения -Wdeclaration-after-statement в task.c означают, что переменные объявлены после исполняемого кода (в старом стандарте C90 это запрещено [cite: ], нужно объявлять их в самом начале блока функции).
Предупреждение -Wmisleading-indentation в файле pci.c на строке 67 указывает на то, что после if(dev->mmr_base); стоит лишняя точка с запятой, из-за чего функция iounmap выполняется всегда, а не только при выполнении условия.
Предупреждения -Wdeclaration-after-statement в task.c означают, что переменные объявлены после исполняемого кода (в старом стандарте C90 это запрещено [cite: ], нужно объявлять их в самом начале блока функции).
Re: Linux dev modul for Texas Instruments TMS320DM642
выгрузить модуль
загрузить модуль
Проверить успешность загрузки:
Код: Выделить всё
rmmod dm642_pciКод: Выделить всё
insmod dm642_pci.koКод: Выделить всё
lsmod | grep dm642
dmesg | tail -n 20Re: Linux dev modul for Texas Instruments TMS320DM642
По стандарту C90 все переменные должны объявляться в самом начале блока или функции — до любых исполняемых инструкций или вызовов функций. В файле task.c в функциях task_open и task_release переменная struct iopacket p; объявляется после какого-то кода. Компилятор не считает это критической ошибкой (поэтому сборка успешна), но выдает предупреждение.
Как исправить
Чтобы избавиться от этих предупреждений, откройте файл /root/dm642_pci_e/task.c и переместите объявление переменной p в самый верх соответствующих функций (до любых вызовов и инструкций).
Пример для функции task_open:
Было:
Стало:
Аналогично поступите с функцией task_release на строке 361. После этого пересоберите модуль командой make.
Как исправить
Чтобы избавиться от этих предупреждений, откройте файл /root/dm642_pci_e/task.c и переместите объявление переменной p в самый верх соответствующих функций (до любых вызовов и инструкций).
Пример для функции task_open:
Было:
Код: Выделить всё
int task_open(struct inode *inode, struct file *file)
{
// Какой-то код или проверки
printk(KERN_INFO "task_open\n");
struct iopacket p; // Ошибка по стандартам C90 — объявление после кода
...
}Код: Выделить всё
int task_open(struct inode *inode, struct file *file)
{
struct iopacket p; // Перенесли наверх
// Какой-то код или проверки
printk(KERN_INFO "task_open\n");
...
}Re: Linux dev modul for Texas Instruments TMS320DM642
Драйвер регистрирует символьные устройства для взаимодействия с ними из пользовательских программ. Проверьте появление соответствующих файлов в системе:
Если файлы устройств не создались автоматически, их нужно создать вручную с помощью mknod, используя старший и младший номера, прописанные в коде драйвера (в файле mem.c или dm642.h).
Судя по исходному коду драйвера (proc.c), в системе должен быть доступен файл состояния или управления в виртуальной файловой системе /proc. Проверьте его содержимое:
Это позволит увидеть статус захвата кадров, адреса буферов и состояние связи с DSP.
3. Написание или использование пользовательского приложения
Поскольку это специализированный (и, судя по всему, кастомный или устаревший) драйвер для конкретной платы видеозахвата, стандартные утилиты вроде V4L2 (Video4Linux2) или ffmpeg «из коробки» с ним работать не будут, если в драйвере не была реализована соответствующая абстракция.
Для приёма изображений вам потребуется пользовательское приложение на C/C++, которое использует стандартные системные вызовы:
open() — открытие устройства (например, /dev/dm642_0).
mmap() — отображение кольцевого буфера памяти кадров (vm_area_struct, с которым мы работали в mmap.c) в адресное пространство вашего приложения для быстрого чтения видеокадров без лишнего копирования.
ioctl() или read() — управление захватом, переключение каналов аналоговых камер, запуск/остановка потока и синхронизация через структуры рукопожатия (pci_dsp_handshake).
Общая схема работы
Аналоговая камера подает сигнал на видеодекодер платы DM642.
Программа на DSP обрабатывает кадр и выкладывает его в общую память PCI (Shared RAM / DMA).
Ваша программа на ПК открывает файл устройства, делает mmap для доступа к этой памяти и забирает готовые массивы байтов (кадры изображения в форматах YUV или RGB) для дальнейшего отображения или сохранения.
Код: Выделить всё
ls -l /dev/dm642*Судя по исходному коду драйвера (proc.c), в системе должен быть доступен файл состояния или управления в виртуальной файловой системе /proc. Проверьте его содержимое:
Код: Выделить всё
cat /proc/dm642*
# или cat /proc/driver/dm642 (в зависимости от реализации)3. Написание или использование пользовательского приложения
Поскольку это специализированный (и, судя по всему, кастомный или устаревший) драйвер для конкретной платы видеозахвата, стандартные утилиты вроде V4L2 (Video4Linux2) или ffmpeg «из коробки» с ним работать не будут, если в драйвере не была реализована соответствующая абстракция.
Для приёма изображений вам потребуется пользовательское приложение на C/C++, которое использует стандартные системные вызовы:
open() — открытие устройства (например, /dev/dm642_0).
mmap() — отображение кольцевого буфера памяти кадров (vm_area_struct, с которым мы работали в mmap.c) в адресное пространство вашего приложения для быстрого чтения видеокадров без лишнего копирования.
ioctl() или read() — управление захватом, переключение каналов аналоговых камер, запуск/остановка потока и синхронизация через структуры рукопожатия (pci_dsp_handshake).
Общая схема работы
Аналоговая камера подает сигнал на видеодекодер платы DM642.
Программа на DSP обрабатывает кадр и выкладывает его в общую память PCI (Shared RAM / DMA).
Ваша программа на ПК открывает файл устройства, делает mmap для доступа к этой памяти и забирает готовые массивы байтов (кадры изображения в форматах YUV или RGB) для дальнейшего отображения или сохранения.