Поиск по сайту:

Как управлять периферийными портами: доступ и запись на параллельном порту с помощью C в Linux. Часть I


На этой странице

  1. Определение терминов
    1. Параллельный порт:
    2. Веб-интерфейсы:
    3. Домашняя автоматизация:

    1. Вывод через параллельный порт
    2. Адресация
    3. Каналы прямого доступа к памяти

    1. Определение адреса памяти для параллельного порта
    2. Использование шины данных в качестве выходного порта
      1. Схема
      2. Настоящая трасса

      Одним из наиболее ярких и новых вариантов использования для управления периферийными портами на ПК является домашняя автоматизация. Эта технология предлагает бесконечное поле возможностей в наших домах. Домашняя автоматизация — это техническая дисциплина с социальной стороной. Наш подход заключается в том, чтобы, используя некоторые ключевые фразы, улучшить качество жизни, расширить коммуникацию и автоматизировать процессы. Все это кажется довольно простым, но сложность, присущая этому новому миру домашней автоматизации, захватывает, давайте посмотрим, почему.

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

      Значение терминов

      Параллельный порт:

      Параллельный порт — это интерфейс между компьютером и периферийным устройством, основная характеристика которого заключается в том, что биты данных передаются вместе, отправляя байт пакета за раз. Кабельный или физический путь для каждого бита данных реализуется путем формирования шины из 8 линий. Через параллельный порт мы также можем управлять периферийными устройствами, такими как освещение, двигатели и другие устройства.

      Веб-интерфейсы:

      Веб-интерфейс позволяет пользователям управлять своими устройствами и взаимодействовать с ними через веб-браузер. Это можно использовать для дистанционного управления, управления библиотекой, визуальной обратной связи и многого другого.

      Домашняя автоматизация:

      Это автоматизация всех систем, способных автоматизировать дом, предоставлять услуги по управлению энергопотреблением, безопасностью, благосостоянием и связью, и может быть интегрирована в проводные или беспроводные внутренние и наружные сети связи.

      Как работать с параллельными портами в C

      Для нашей основной цели, базовой домашней автоматизации, мы будем использовать параллельный порт, чтобы продемонстрировать, как мы можем записывать (или читать) некоторые байты для управления простыми устройствами. Параллельный порт ПК типа ECP имеет выходной разъем типа DB25, схема и сигналы которого показаны на следующем рисунке:

      Выход параллельного порта

      Параллельный порт ПК, согласно стандарту Centronics, состоит из двунаправленной 8-битной коммуникационной шины данных, а также набора линий для протокола. Линии связи имеют фиксатор, который удерживает последнее записанное в них значение до тех пор, пока не будут записаны новые данные, электрические характеристики таковы:

      •      Напряжение высокого уровня: от 3,3 до 5 В.
      •      Напряжение низкого уровня: 0 В.
      •      Максимальный выходной ток: 2,6 мА.
      •      Максимальный входной ток: 24 мА.

      Напряжение и ток могут питать набор управляющих устройств, таких как светодиоды, реле и полупроводниковые переключатели. Эти буферы необходимы для выключения или включения элементов с более высоким энергопотреблением.

      Адресация

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

      3BCh 3BDh 3BEh
      378h 379h 37Ah
      278h 279h 27Ah


      Первый адрес в диапазоне — это базовый адрес порта, также называемый регистром данных или просто адресом порта. Второй адрес — регистр состояния портов, а третий — регистр управления.

      EPP и ECP резервируют дополнительные адреса для каждого порта. EPP добавляет пять регистров от базового адреса + 3 до базового адреса + 7, а ECP добавляет три регистра от базового адреса + 400h до базового адреса + 402h. Для базового адреса 378h регистры EPP находятся с 37Bh по 37Fh, а регистры ECP — с 778h по 77Fh.

      Каналы прямого доступа к памяти

      ECP могут использовать прямой доступ к памяти (DMA) для передачи данных на параллельный порт. Во время передачи DMA процессор может заниматься другими делами, поэтому передача DMA может привести к повышению производительности в целом. Чтобы использовать DMA, порту должен быть назначен канал DMA в диапазоне от 0 до 3.

      Доступ к физическим портам в Linux

      Поскольку аппаратное обеспечение порта на ПК управляется непосредственно ядром Linux, мы должны получить доступ к определенным заголовкам, связанным с шиной параллельного порта. Компилятор GCC может получить доступ к этим заголовкам, всегда помня о том, что пользователь должен иметь привилегии root, чтобы избежать ошибок доступа. Эти заголовки:

      • stdio.h: «Стандартный заголовок ввода-вывода» (стандартный заголовок ввода-вывода) — это заголовочный файл, который содержит определения макросов, константы, объявления функций в стандартной библиотеке языка программирования C для выполнения операций. , стандартный ввод и вывод, а также определение типов, необходимых для таких операций. В целях совместимости язык программирования C++ (производный от C) также имеет собственную реализацию этих функций, которые объявляются в заголовке файла cstdio. Функция, которую я должен использовать, это fprintf, которая позволяет печатать в окне терминала, если есть какая-либо ошибка.
      • stdlib.h: файл заголовка для стандартной библиотеки языка программирования общего назначения C. Он содержит прототипы функций C для управления динамической памятью, управления процессами и т. д. Он поддерживает C++, где известен как cstdlib. Функция, которую я буду использовать, это выход, когда мы получаем сообщение об ошибке.
      • unistd.h: файл заголовка, обеспечивающий доступ к API операционной системы POSIX. В Unix-подобных системах интерфейс, определяемый unistd.h, обычно состоит в основном из функций-оболочек системных вызовов, таких как fork, pipe и примитивы ввода-вывода (чтение, запись, закрытие и т. д.).
      • sys/io.h: это семейство функций используется для выполнения низкоуровневого ввода и вывода порта. Функции out* выполняют вывод порта, функции in* выполняют ввод порта; функции b-суффикса имеют ширину в байтах, а функции w-суффикса — ширину слова; функции с суффиксом _p приостанавливаются до завершения ввода-вывода. Из этой семейной функции я буду использовать outb.

      #include <stdio.h>
      #include <stdlib.h>
      #include <unistd.h>
      #include <sys/io.h>

      В Linux легко получить доступ к параллельному порту и управлять им, однако необходимо очень внимательно относиться к корневому доступу. Вышеперечисленное — это все необходимые библиотеки для нашего сегодняшнего урока.

      Определение адреса памяти для параллельного порта

      После включения библиотек мы должны определить адрес памяти, назначенный параллельному порту, как упоминалось выше, адрес по умолчанию для первого параллельного порта — 0x378.

      #define base 0x378           /* parallel port base address */

      Если у вас возникли проблемы с этим адресом, попробуйте 0x278.

      Использование шины данных в качестве выходного порта

      В этой первой части урока я собираюсь использовать шину данных в качестве выходного порта. В следующей главе мы увидим, как использовать его в качестве порта для ввода данных или даже в качестве смешанного порта. На изображении ниже мы видим управление набором из 8 светодиодов, подключенных через токоограничивающие резисторы к параллельному порту, которые реагируют на значение, присвоенное адресу 0x378. Сопротивление резисторов может варьироваться от 100 Ом до 300 Ом, это важно, потому что мы можем повредить порт, если не ограничим ток.

      Схема

      Реальная схема

      Реализация программного обеспечения

      Для моих целей я покажу вам, как поместить некоторые значения в порт и как должна быть выполнена синхронизация этих значений, это очень простая процедура, чтобы показать вам, как это работает.

      Теперь я объясню все команды и слова, используемые в управляющем программном обеспечении:

      • Шаг 1. Условие, если у пользователя есть права root для доступа к порту. Аргументом этой условной команды является ioperm, который устанавливает биты разрешения доступа к порту для базы адресов порта.

      if (ioperm(base,1,1))

      • Шаг 2: Если у пользователя нет достаточных привилегий для доступа к параллельному порту, будет отображена ошибка доступа и выполнение программы будет остановлено.

      fprintf(stderr, "Access denied to %x\n", base), exit(1);

      • Шаг 3. Если доступ предоставлен, цикл for задает последовательность включения и выключения светодиодов с заданными значениями для отображения в порту. Функция синхронизации, которую я использовал, — это sleep(), которая переводит вызывающий поток в спящий режим до тех пор, пока не истечет количество секунд в аргументе.

            w=0;
            for (x=0; x=7; x++)  
                {        
                y=pow(2,w);
                outb(y, base);
                sleep(1);
                w=w+1;
                   }


        Когда обработка кода прошла строку разрешенного доступа, fprintf(stderr, \Доступ запрещен к % x\n\, base), выход (1);, в вашем распоряжении становятся выводы данных параллельного порта и воображение. В моем случае я беру только простую последовательность от первого до последнего с интервалом в одну секунду, используя степень основания 2 (см. ссылку на видео). Однако возможности безграничны, ведь без использования мультиплексирования можно контролировать до 8 независимых выходов, с мультиплексированием выходы могут вырасти до 255 возможностей. В зависимости от приложения, будь то с точки зрения домашней автоматизации, мы можем обрабатывать порт без мультиплексирования, размещая соответствующие буферы для обработки более высоких токовых нагрузок, которые будут рассмотрены позже в другом руководстве.

        Использованная литература:

        Мартин Х., Саес Ф. Домотика, Un Enfoque Sociotécnico. Июнь 2006 г. Fundación Rogelio Segovia para el Desarrollo de las Telecomunicaciones, Ciudad Universitaria, серийный номер 28040-Мадрид, ISBN: 84-7402-335-1.

        Аксельсон Дж. Параллельный порт завершен. Программирование, взаимодействие и использование параллельного порта принтера ПК. Amazon INC.  ISBN: 0-9650819-1-5

        Керриск М. Интерфейс программирования Linux. Проект справочных страниц Linux. ISBN 978-1-59327-220-3