Страница 1 из 1

Linux dev modul for Texas Instruments TMS320DM642

Добавлено: 13 авг 2026, 12:22
ya
Linux dev modul for Texas Instruments TMS320DM642

https://github.com/ze0n4ri0t/dm642_pci_e/tree/master

Re: Linux dev modul for Texas Instruments TMS320DM642

Добавлено: 13 авг 2026, 14:26
ya
https://sourceforge.net/code-snapshots/cvs/d/dm/dm642-pci.zip

Установить заголовочные файлы ядра

Код: Выделить всё

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)
Драйвер успешно скомпилирован под Linux версии 2.6.15-1.2054_FC5

Проверьте, что модуль успешно загрузился

Код: Выделить всё

lsmod | grep dm642

Re: Linux dev modul for Texas Instruments TMS320DM642

Добавлено: 13 авг 2026, 21:09
ya
На будущее (исправление предупреждений компиляции):
Предупреждение -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

Добавлено: 13 авг 2026, 21:11
ya
выгрузить модуль

Код: Выделить всё

rmmod dm642_pci
загрузить модуль

Код: Выделить всё

insmod dm642_pci.ko
Проверить успешность загрузки:

Код: Выделить всё

lsmod | grep dm642
dmesg | tail -n 20

Re: Linux dev modul for Texas Instruments TMS320DM642

Добавлено: 13 авг 2026, 21:14
ya
По стандарту C90 все переменные должны объявляться в самом начале блока или функции — до любых исполняемых инструкций или вызовов функций. В файле task.c в функциях task_open и task_release переменная struct iopacket p; объявляется после какого-то кода. Компилятор не считает это критической ошибкой (поэтому сборка успешна), но выдает предупреждение.

Как исправить
Чтобы избавиться от этих предупреждений, откройте файл /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");
    ...
}
Аналогично поступите с функцией task_release на строке 361. После этого пересоберите модуль командой make.

Re: Linux dev modul for Texas Instruments TMS320DM642

Добавлено: 13 авг 2026, 21:24
ya
Драйвер регистрирует символьные устройства для взаимодействия с ними из пользовательских программ. Проверьте появление соответствующих файлов в системе:

Код: Выделить всё

ls -l /dev/dm642*
Если файлы устройств не создались автоматически, их нужно создать вручную с помощью mknod, используя старший и младший номера, прописанные в коде драйвера (в файле mem.c или dm642.h).

Судя по исходному коду драйвера (proc.c), в системе должен быть доступен файл состояния или управления в виртуальной файловой системе /proc. Проверьте его содержимое:

Код: Выделить всё

cat /proc/dm642* 
# или cat /proc/driver/dm642 (в зависимости от реализации)
Это позволит увидеть статус захвата кадров, адреса буферов и состояние связи с 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) для дальнейшего отображения или сохранения.