Драйвер Dma
Драйвер SPI для Blackfin, работающий через DMA Добавил(а) microsin Здесь приведен перевод документации по библиотеке компании Analog Devices, реализующей физический драйвер устройства SPI (ADISPIDMA) с использованием каналов DMA (документация в файле Blackfin docs drivers spi adispidma.pdf, находящемся в каталоге установки системы VisualDSP). У драйвера нет никаких аппаратных привязок к определенному типу процессора (поскольку большинство, если не все процессоры Blackfin имеют на борту встроенный интерфейс SPI и систему прямого доступа к памяти - DMA).
Когда возникает ошибка — crc или тайм-аута, не имеет значения драйвер в конце концов снижает. Такая проблема. При записи cd-rw и dvd-rw nero выдает сообщение 'ошибка драйвера DMA. Привод optiarc DVD-RW AD-5170A.
Примечание: имеется аналогичный драйвер SPI, не использующий DMA, см. Файл Blackfin docs drivers spi adispiint.pdf (а также см.
Соответствующий перевод документации 6). Примеры кода, использующие драйвер SPI с прерываниями и драйвером SPI с DMA, можно найти в поддиректориях Blackfin Examples каталога установки VisualDSP (ищите файлы.c и.cpp, в которых подключается заголовочный файл adispi.h). Драйвер устройства SPI был разработан для предоставления простого интерфейса к периферийным устройствам SPI процессора Blackfin.
Команды, события и коды возврата в драйвере устройств могут быть использованы в программах приложений с целью установки обмена данными через SPI. Драйвер устройства SPI поддержан версиями как с использованием DMA, так и с использованием прерываний. Предоставляются два модуля исходного кода adispidma.c и adispiint.c, где находятся соответственно версии драйвера SPI с поддержкой DMA и с поддержкой прерываний. В этом документе описывается только та версия драйвера SPI, которая работает с DMA. Чтобы выбрать версию драйвера SPI с поддержкой DMA, код приложения должен: Подключить файл кода adispidma.c к списку файлов проекта. Использовать точку входа драйвера с прерываниями ADISPIDmaEntryPoint для открытия драйвера SPI. Используемые файлы Все упомянутые здесь файлы находятся в поддиректориях каталога установки системы программирования VisualDSP.
Указанные пути для подключаемых файлов начинаются с директории%ProgramFiles% Analog Devices VisualDSP 5.0 Blackfin include, а для файлов исходного кода с директории%ProgramFiles% Analog Devices VisualDSP 5.0. Подключаемые файлы.
Исходный код драйвера подключает следующие заголовочные файлы: services/services.h. Здесь содержатся все определения, прототипы функций и т. Для всей библиотеки Системных Служб (System Services Library, SSL). Здесь содержатся все определения, прототипы функций и т. Для Менеджера Устройств (Device Manager) и общая информация по модели Драйвера Устройства.
Здесь содержатся коды всех команд, событий и значений возврата для API драйвера устройства SPI. Исходный код. Исходный код драйвера SPI содержится в файлах Blackfin/lib/src/drivers/spi/adispi.c и adispidma.c (файл adispidma.c по сути только заглушка, он только подключает код модуля adispi.c). Весь код написан на языке C. Для драйвера не используется никаких функций, написанных на ассемблере. Код драйвера SPI не использует никакие низкоуровневые физические драйверы устройств, он сам фактически является таким драйвером.
Ресурсы, требуемые для драйвера SPI Драйверы устройств обычно требуют для своей работы некоторое количество системных ресурсов (уровни прерываний IVG, каналы DMA, память). В этом разделе описаны ресурсы, которые требует для себя драйвер SPI. За исключением специально указанных ниже случаев, этот драйвер использует Системные Службы для доступа к любой требуемой аппаратуре процессора и управления этой аппаратурой. Информация в этой секции может быть полезна в определении ресурсов, которые нужно выделить для драйвера SPI со стороны Системных Служб, наподобие количества обработчиков прерывания или количества используемых каналов DMA и т. По той причине, что в Драйверах Устройств и Системных Службах не используется динамическое выделение памяти, вся память для Драйверов Устройств и Системных Служб должна быть явно предоставлена приложением. Библиотека Драйверов Устройств и Системных Служб предоставляет специальные макросы, которые можно использовать в приложении для вычисления необходимого количества базовой памяти и/или количества дополнительной памяти, которая требуется для поддержки нужного функционала служб. Память для Менеджера Устройств и Системных Служб предоставляется специальными функциями инициализации соответствующего API (adixxxInit, где вместо xxx указывается мнемонический идентификатор службы.
Например для Менеджера Устройств это будет функция adidevInit). Этот драйвер SPI не использует прерывания. Эта версия драйвера SPI использует один канал DMA, который может быть сконфигурирован либо для поддержки канала передачи SPI, либо канала приема SPI.
Версию с DMA удобно использовать для пересылки больших массивов данных в одном направлении. Версию без DMA целесообразно использовать для коротких пересылок блоков данных неопределенной длины и одиночных байт, когда не ведется интенсивный обмен с устройством SPI, с возможностью передачи данных в обоих направлениях (передача данных в двух направлениях не поддерживается). Если нужна передача данных в двух направлениях, то используйте драйвер SPI, работающий по прерываниям 6. Драйвер SPI не требует использования таймера. Часы реального времени (RTC). Драйвер устройства SPI не требует использования часов реального времени.
Программируемые флаги. Драйвер SPI не использует явно какие-либо выводы процессора (GPIO, компания Analog Devices почему-то называет их программируемыми флагами). Однако, на процессоре вход и выход SPI может быть мультиплексирован с программируемыми выводами GPIO. Пользователь должен сам убедиться в том, что эти выводы, используемые для SPI, не конфликтовали с использованием выводов GPIO, и наоборот.
Используемые выводы. Всего интерфейс SPI для соединения с внешним миром использует 4 сигнальных провода - 2 вывода данных MOSI и MISO, 1 вывод управления выборкой устройства SPISS и один вывод тактирования бит CLK. Подробнее про общее описание SPI и его сигналы см. Аппаратное описание периферийного устройства SPI и его используемые выводы в процессоре ADSP-BF538 см. В статье 4.
Функции, поддерживаемые драйвером SPI Направление потоков данных. Драйвер поддерживает приведенные в таблице ниже варианты настройки для направления потока данных. ADIDEVDIRECTION это тип перечисления enum, задающий варианты направления данных (определен в заголовочном файле Blackfin include drivers adidev.h). Поддерживаемые направления потока данных для устройства SPI (Dataflow Directions). ADIDEVDIRECTION Описание ADIDEVDIRECTIONINBOUND Поддерживает прием данных в устройство.
ADIDEVDIRECTIONOUTBOUND Поддерживает передачу данных из устройства. Методы поддержки потока данных. Поддерживаемые методы организации потока данных перечислены в таблице ниже. ADIDEVMODE это тип перечисления enum, задающий варианты предоставления буферов для данных (определен в заголовочном файле Blackfin include drivers adidev.h). Поддерживаемые методы организации потока данных.
ADIDEVMODE Описание ADIDEVMODECHAINED Поддерживает метод цепочек буферов. ADIDEVMODECHAINEDLOOPBACK Поддерживает метод цепочек буферов с переходом на начало цепочки.
Эта версия драйвера поддерживает только один тип буфера - одномерный линейный ADIDEV1DBUFFER. Поле pAdditionalInfo структуры буфера игнорируется. Идентификаторы команд.
В этой секции перечислены команды, поддерживаемые драйвером. Команды делятся на 3 секции. Первая описывает команды, поддерживаемые напрямую Менеджером Устройств (Device Manager, см.
Следующая секция описывает общие поддерживаемые драйвером команды (относящиеся ко всем драйверам, не только к SPI). Последняя секция описывает специфические для драйвера SPI команды. Команды посылаются в драйвер устройства через функцию adidevControl. Она принимает 3 аргумента: DeviceHandle.
Этот параметр типа ADIDEVDEVICEHANDLE, который уникально идентифицирует драйвер устройства. Это хендл, предоставленный клиенту при вызове функции adidevOpen. Этот параметр типа u32, он задает идентификатор команды. Этот параметр типа void., смысл которого зависит от значения идентификатора команды. Ниже будут перечислены идентификаторы команд, поддерживаемые драйвером, и будет объяснено значение команды и описание соответствующего каждой команде параметра Value. Команды, перечисленные ниже, поддерживаются напрямую Менеджером Устройств, и не передаются драйверу для обработки.
Таким образом, все драйверы устройств поддерживают эти команды. Команда предоставляет таблицу пар команд, которые будут переданы драйверу.
Value это указатель на таблицу пар команд (ADIDEVCMDVALUEPAIR.). Обозначает конец таблицы пар команд. Value игнорируется. Команда передает одну пару команда-значение.
Value это указатель на одну пару команда-значение (ADIDEVCMDPAIR.). Эта команда разрешает/запрещает синхронный режим работы драйвера. Value – TRUE/FALSE. Идентификаторы команд, описанные в этой секции, являются общими для многих драйверов устройств. Ниже в списке перечислены всех общие идентификаторы команд (command ID), которые поддерживаются драйвером SPI.
Вам предоставляется возможность купить Call of Duty: Ghosts и вступить в легендарный отряд, который готов вести бои в самых необычных условиях, сражаясь на слабой стороне, сражаясь не за высокие идеалы, а ради собственного выживания. И в этом вам поможет верный друг и помощник – пёс Райли! Патч для call of duty ghosts pc download.
Позволяет определить, поддерживает ли драйвер буферы 2D (двумерный буфер). Value - u32. (указывает на ячейку памяти, где будет сохранено значение TRUE/FALSE). Задает используемый метод потока данных устройства. Value – одно из поддерживаемых значений перечисления ADIDEVMODE (таблица 3).
Разрешает/запрещает режим стриминга драйвера. Valie - TRUE/FALSE. Возвратит идентификатор канала DMA для входящего канала DMA. Value - u32. (указывает на ячейку памяти, где будет сохранено значение идентификатора канала). Возвратит идентификатор канала DMA для исходящего канала DMA.
Value - u32. (указывает на ячейку памяти, где будет сохранено значение идентификатора канала). Установит идентификатор канала DMA для входящего канала DMA. Value - u32 (значение идентификатора канала).
Установит идентификатор канала DMA для исходящего канала DMA. Value - u32 (значение идентификатора канала). Возвратит PMAP ID - идентификатор периферийного устройства, привязанного к входящему каналу DMA. Value - u32. (указывает на ячейку памяти, где будет сохранено значение PMAP ID). Возвратит PMAP ID - идентификатор периферийного устройства, привязанного к исходящему каналу DMA.
Value - u32. (указывает на ячейку памяти, где будет сохранено значение PMAP ID). Разрешает/запрещает поток данных через устройство.
Value – TRUE/FALSE. Позволяет вызывающему коду определить, поддерживается ли драйвер периферийным DMA. В ответ на эту команду драйвер всегда вернет TRUE. Value – u32., указывает на ячейку, куда помещается ответ (TRUE/FALSE). Разрешает/запрещает сообщения от ошибках со стороны драйвера устройства. Value – TRUE/FALSE.
Идентификаторы команд, перечисленные ниже, поддерживаются и обрабатываются драйвером SPI, они уникальны именно для этого драйвера устройства. Устанавливает скорость обмена (baud rate). Value = частота следования тактов в Гц. Устанавливает регистр флагов подчиненного устройства (SPI slave flag register). Value = значение для регистра.
Напрямую устанавливает значение регистра управления SPI (SPIxCTL). Value = значение для регистра. Напрямую устанавливает значение регистра скорости.
Value = значение для регистра. Разрешает сигнал выборки подчиненного устройства. Value = номер подчиненного устройства. Запрещает сигнал выборки подчиненного устройства. Value = номер подчиненного устройства. Делает выборку подчиненного устройства. Value = номер подчиненного устройства.
Снимает выборку подчиненного устройства. Value = номер подчиненного устройства. Предотвращает постороннее использование этого устройства SPI. Value = TRUE означает эксклюзивный доступ, FALSE означает разрешение общего доступа. Устанавливает значение TIMOD (принцип запуска процедуры переноса данных).
Value = 0 - запуск при чтении ядром регистра SPIRDBR (приходящие данные под управлением прерываний). Value = 1 - запуск при записи ядром регистра SPITDBR (исходящие данные под управлением прерываний). Value = 2 - запуск чтением DMA регистра SPIRDBR (приходящие данные под управлением DMA). Value = 3 - запуск записью DMA регистра SPITDBR (исходящие данные под управлением DMA).
Настраивает отправку нулей, когда регистр передачи SPITDBR пуст. Value =TRUE означает отправку нулей, FALSE означает отправку последних данных, записанных в регистр. Устанавливает режим получения данных, когда предыдущие данные еще не прочитаны. Value = TRUE означает, что старые данные будут перезаписываться новыми (gets more date), FALSE - новые приходящие данные будут отбрасываться. Устанавливает управляющий бит PSSE.
Value = TRUE означает, что SPISS разрешен, FALSE - SPISS запрещен. Разрешает/запрещает MISO. Value = TRUE - MISO разрешен, FALSE - MISO запрещен. Устанавливает размер слова фрейма в битах. Команда настраивает очередность следования бит по старшинству (MSB/LSB). Value = TRUE - младший бит слова (LSB) будет отправлен первым, FALSE - первым будет отправлен MSB. Устанавливает формат передачи (фаза тактов).
Value = TRUE - начало с переключением, FALSE - переключение посередине. Устанавливает полярность тактов. Value = TRUE - активный уровень лог.
0, FALSE - активный уровень лог. Устанавливает режим работы в качестве главного (master) или подчиненного устройства (slave). Value = TRUE - master, FALSE – slave. Управляет битом WOM в регистре управления SPIxCTL. Value = TRUE - открытый сток (open drain) выходов master, FALSE - обычные выходы.
Драйвер Dma
Выполняет фиктивное чтение SPI. Value = 8 - 8-битное чтение, 16 - 16 битное чтение. Ставит на паузу или снимает с паузы поток данных. Value = TRUE - пауза, FALSE - снятие с паузы. Устанавливает специфичный для процессора режим мультиплексирования выводов. Value = значение из перечисления типа ADISPIPINMUXMODE. Семейство процессоров Значение перечисления ADISPIPINMUXMODE Комментарии ADSP - BF50x ADISPIPINMUXMODE0 Режим mode 0 (по умолчанию) мультиплексирования выводов SPI.
Для SPI0 порт PF15 используется как выборка подчиненного устройства 3 (SPI0 SSEL3). Для SP1 порт PG1 используется как выборка подчиненного устройства 2 (SPI1 SSEL2), PG0 как выборка подчиненного устройства 3 (SPI1 SSEL3). ADISPIPINMUXMODE1 Режим mode 1 мультиплексирования выводов SPI. Для SPI0 порт PH0 используется как выборка подчиненного устройства 3 (SPI0 SSEL3).
Для SP1 порт PG1 используется как выборка подчиненного устройства 2 (SPI1 SSEL2), PH1 как выборка подчиненного устройства 3 (SPI1 SSEL3). ADISPIPINMUXMODE2 Режим mode 2 мультиплексирования выводов SPI. Для SPI0 порт PF15 используется как выборка подчиненного устройства 3 (SPI0 SSEL3). Для SP1 порт PH2 используется как выборка подчиненного устройства 2 (SPI1 SSEL2), PG0 как выборка подчиненного устройства 3 (SPI1 SSEL3).
ADISPIPINMUXMODE3 Режим mode 3 мультиплексирования выводов SPI. Для SPI0 порт PH0 используется как выборка подчиненного устройства 3 (SPI0 SSEL3). Для SP1 порт PH2 используется как выборка подчиненного устройства 2 (SPI1 SSEL2), PH1 как выборка подчиненного устройства 3 (SPI1 SSEL3). Другие процессоры - Команда не поддерживается. События callback.
Ниже перечислены события для вызовов callback, когда они разрешены для генерации драйвером. События поделены на 2 врезки - общие события и события драйвера SPI. Первая описывает события, которые являются общими для многих драйверов устройств. Другая секция описывает идентификаторы событий (event ID), специфичных именно для драйвера SPI.
Функция callback приложения должна быть подготовлена для обработки каждого из событий в этих врезках. Callback-функция имеет тип ADIDCBCALLBACKFN. В неё передается 3 параметра: ClientHandle. Этот параметр имеет тип void., его значение было передано драйверу устройства как параметр функции adidevOpen. Это значение типа u32, которое указывает идентификатор события (event ID).
У этого параметра тип void., и смысл этого значения зависит от контекста события (от специфического значения event ID). Во врезках ниже перечислены идентификаторы event ID, которые может генерировать драйвер устройства, и значение параметра Value для каждого event ID. У этой версии драйвера есть особенность, о которой ни полслова не говорится в документации: callback-функция будет вызвана только в том случае, если в цепочке буферов будет не меньше 2 буферов. Если будет добавлена цепочка, состоящая только из одного буфера, то callback не будет вызван, хотя драйвер будет исправно работать. В этой секции описаны события, которые являются общими для многих драйверов устройств. Ниже перечислены те общие события, которые поддерживаются драйвером SPI с использованием DMA.
Оно оповещает callback-функцию, что буфер I/O цепочки был обработан драйвером устройства. Это событие также используется для оповещения о том, что весь кольцевой буфер был обработан, если драйверу было указано генерировать вызов callback при завершении обработки всего кольцевого буфера.
Value – для цепочечного метода потока данных это значение параметра CallbackParameter, которое было предоставлено в буфере, который был передан в API-функцию adidevRead или adidevWrite. Для кольцевого метода это значение адреса буфера, предоставленного в API-функцию adidevRead или adidevWrite. Оповещает callback-функцию, что произошла ошибка DMA. Value - NULL (не используется). Идентификаторы команд, перечисленные ниже, поддерживаются и обрабатываются драйвером SPI, они уникальны именно для этого драйвера устройства.
Означает, что произошло детектирование события TXE. Value не используется. Было детектировано событие RBSY. Value не используется. Было детектировано событие MODF.
Value не используется. Было детектировано событие TXCOL. Value не используется. Была сгенерирована ошибка SPI. ВНИМАНИЕ: это событие больше не используется и заменено индивидуальными событиями, которые были описаны выше. Value не используется.
Коды возврата Все API-функции драйвера устройства возвращают статус, показывающий успешное выполнение функции или показывающий, какая произошла ошибка. Эта секция перечисляет коды возврата, которые драйвер SPI может возвратить приложению. Значение возврата ADIDEVRESULTSUCCESS показывает успешное завершение, в то время как другое значение показывает ошибку или какой-то другой информативный результат. ADIDEVRESULTSUCCESS всегда соответствует нулевому значению кода возврата. Все другие коды возврата соответственно будут ненулевые. Коды возврата бывают двух разновидностей, приведенных в отдельных врезках - общие коды возврата и коды возврата, специфические для драйвера SPI.
Первая врезка описывает коды возврата, которые возвращают многие драйверы, не только драйвер SPI. Следующая врезка описывает коды возврата, относящиеся только к драйверу SPI. С какой бы ни было API-функцией драйвера приложение должно обработать все эти коды возврата. Обычно приложение должно проверить код возврата на ADIDEVRESULTSUCCESS, предпринимая соответствующие действия, когда код возврата не равен ADIDEVRESULTSUCCESS. Описанные здесь коды возврата API-функций драйвера являются общими для многих драйверов устройств. Список ниже перечисляет все общие коды возврата, поддерживаемые драйвером SPI.
Выполнение функции было успешным. Эта функция не поддерживается драйвером. Запрошенное устройство уже используется. Недостаточное количество доступной памяти.
Недопустимый номер устройства. Устройство не может быть открыто в заданном направлении. Недопустимый хендл для драйвера устройства. Недопустимый хендл для Менеджера Устройств. Недопустимый хендл для физического драйвера устройства.
Запрошенное действие не находится в допустимой последовательности. Приложение сделало попытку предоставить входящий буфер для устройства, открытого только для исходящего трафика. Приложение сделало попытку предоставить исходящий буфер для устройства, открытого только для входящего трафика. Еще не был декларирован метод поддержки потока данных. Этот метод поддержки потока данных несовместим с запрошенным действием. Устройство не поддерживает этот тип предоставленного буфера. Менеджер Прерываний 1 не смог подцепить обработчик прерывания.
Менеджер Прерываний 1 не смог отцепить обработчик прерывания. Предоставленная цепочка буферов не завершена NULL. Потребовалась, но не была предоставлена callback-функция. Требуется, чтобы устройство было открыто только для одного направления трафика - либо только входящего, либо только для исходящего трафика. Требуется, чтобы устройство было открыто только для двунаправленного трафика - и входящего, и исходящего. Приведенные ниже коды возврата поддерживаются драйвером SPI, они уникальны для этого драйвера. Эксклюзивный доступ не предоставлен.
Ошибочный номер подчиненного устройства (slave number), ожидается значение номера в диапазоне 1. Ошибочное значение режима инициализации передачи. Ошибочное значение размера фрейма данных (ожидается 8 или 16). Передано ошибочное значение (ожидалось TRUE или FALSE). Недопустимо, потому что поток данных уже активен. Нет буфера для перемещения данных.
Ошибочное значение для определения скорости передачи. Открытие и конфигурирование драйвера SPI В этом разделе описаны настройки конфигурации по умолчанию драйвера, и любые требуемые для приложения дополнительные настройки. Когда драйвер устройства SPI открывается вызовом функции adidevOpen, клиент передает в эту функцию параметр, идентифицирующий определенный открываемый драйвер устройства. Этот параметр называется точкой входа (entry point).
Для драйвера SPI с управлением по прерыванием точку входа определяет глобальная переменная - структура ADISPIDMAEntryPoint типа ADIDEVPDDENTRYPOINT, которая находится в исходном коде драйвера SPI (Blackfin lib src drivers spi adispi.c). Настройки по умолчанию. В таблице 4 описаны настройки по умолчанию и их возможные значения для драйвера SPI. Если настройки по умолчанию не подходят для имеющейся системы, клиент должен использовать соответствующие идентификаторы команд (command ID), чтобы правильно сконфигурировать драйвер. Настройки, не перечисленные в таблице, не определены по умолчанию.
Драйвер Dma860h
Настройки по умолчанию. Пример кода ниже показывает, как использовать DMA-версию драйвера SPI для организации исходящего потока данных из процессора Blackfin. Этот пример идентичен предыдущему, разница лишь в том, что вместо функции adidevRead для предоставления буферов здесь используется функция adidevWrite. Как и в предыдущем примере, здесь используется метод пока данных с цепочками буферов и переходом на начало цепочки (chained with loopback dataflow method).
С использованием такого метода достаточно предоставить буферы только один раз, и они будут передаваться циклически по кругу снова и снова, без необходимости их повторного предоставления.