avreal и LPT в Linux

В отличие от Windows линейки NT, для работы avreal с LPT-адаптерами в Linux/x86 (32- и 64-битных) не нужен специальный драйвер типа DLPortIO.sys. В отличие от Windows 98, в Linux любая программа не может просто так получить доступ к портам ввода-вывода, для этого нужно настроить разрешение на такую работу.

Есть два варианта работы — непосредственный доступ к портам ввода-вывода и работа с устройством параллельного порта parport. Непосредственный доступ к портам даёт несколько более высокую скорость программирования, но требует использования привилегий администратора системы во время запуска avreal, что не всегда удобно или возможно.

Работа с устройством параллельного порта parport

Программе avreal в ключе -p необходимо указывать имя соответствующего устройства, например, -p/dev/parport0. Для управления линиями порта и опроса их состояния используются системные вызовы ioctl().
Устройства parport принадлежат группе lp:

$ ls -l /dev/parport0
crw-rw---- 1 root lp 99, 0 2010-12-31 16:39 /dev/parport0

Поэтому для представления пользователю разрешения работать с устройством /dev/parport0 достаточно добавить пользователя в состав группы lp.

$ sudo usermod -a -G lp LOGIN

где LOGIN это логин пользователя, которого необходимо включить в группу.

Добавить пользователя в группу lp можно и через графический интерфейс, но это не будет быстрее 🙂
В Ubuntu это делается так:
Зайдите в меню Система / Администрирование и выберите позицию Пользователи и группы, нажмите кнопку Управлени группами.

изображение диалога управления группами

Прокрутите перечень групп вниз к группе lp и нажмите кнопку Свойства.

изображение диалога работы с группами

Поставьте метки напротив пользователей, которых необходимо включить в группу lp.

изображение диалога свойств группы lp

Нажмите кнопку OK, система попросит набрать пароль администратора для подтверджения полномочий на смену настроек.

Непосредственный доступ к портам ввода-вывода

Необходимо указывать номер LPT или базовый адрес порта в шестнадцатричном виде, например, -p1, -p378. Разрешение на доступ к портам ввоа-вывода avreal получает вызовом ioperm(base, 8, 1), указывая диапазон в 8 байт начиная с базового адреса. Для того, чтобы программа получила разрешение, она на момент вызова функции lang=”c” inline=”true”>ioperm() должна выполняться с правами администратора системы (root), иначе avreal не получит доступа к портам и завершит работу с ошибкой Can't get I/O permissions.

Конечно, её можно запускать через команду sudo, но в этом случае существует определённый риск повреждения системных файлов. Если в качестве файла для считанного из микроконтроллера кода в командной строке указать «что-то не то», то оно будет успешно перезаписано содержимым флеш-памяти.

Если же установить для программы идентификаторы пользователя и группы root и поднять ей SETUID/SETGID биты, то при запуске програмы от имени пользователя она будет стартовать с правами root. После получения разрешения работы с нужным диапазоном адресов ввода-вывода avreal возвращает свои «ефективные» идентификаторы с root-овых до тех, которые соответствуют параметрам пользователя. В дльнейшем программа уже не сможет открыть на запись системный файл.

Проще всего сделать это, скопировав avreal в каталог /usr/local/bin. Это также можно сделать тольо с правами администратор и копия avreal в /usr/local/bin автоматически получит соответствующи идентификаторы пользователя и группы. После этого следует поднять нужные биты. Например, так:

$ sudo cp avreal64-1.28r5 /usr/local/bin
$ sudo chmod +s /usr/local/bin/avreal64-1.28r5
-rwsr-sr-x 1 root root 117920 2010-10-11 22:18 /usr/local/bin/avreal64-1.28r5

Если порт LPT находится на нестандартных адресах, например, используется PCI-LPT плата, базовый адрес порта можно узнать командой

$ cat /proc/sys/dev/parport/parport0/base-addr
59392   0

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

$ cat /proc/sys/dev/parport/parport0/base-addr | gawk '{printf "%X\n", $1}'
E800


или так

$ cat /proc/sys/dev/parport/parport0/base-addr | dc -f - -e 16orp
E800

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


Смотрите также avreal и LPT в Windows

20 Responses to “avreal и LPT в Linux”

  1. alexey_laa says:

    Зараз використовую AVReal із Ubuntu. Працює, але весь час показує десятки помилок синхронізації. А іноді зовсім не синхронізується ( див. лог: http://www.xsnippet.org/147001# )

    Раніше працювало на WinXP, таких помилок майже не було. Якщо з’являлись – ставив опцію “-3”, і все працювало. Тепер не хоче.

    Можна ще якісь налаштування спробувати?

    • alexey_laa says:

      UPD:

      Перезавантажив комп’ютер, позупиняв решту програм, запрацювало.

      Можливо, інші програми не дають нормально працювати комунікації через LPT.

      Працює, хоча все одно пише “% Synchronised after 33 try”. Чи не може це бути просто якась софтова витримка (наприклад, довгий RESET)?

      • ReAl says:

        Дивно.
        Синхронізація з 33-ї спроби, якщо вона все ж таки проходить, це нормально. Таке може бути, якщо програма на старті перемикає лінію SCK як вихід «1». Але тоді після стирання контролера вже синхронізуватиметься з першої спроби. Та й відповідь на неуспішну команду входу в програмування буде FF FF FF FF.

        Але ж тут так само і після стирання, причому не синхронізується взагалі.

        Живлення мікроконтролера точно в нормі?

        • alexey_laa says:

          Живлення від К142ЕН5В, тестер показує 5,01 В. Осцилографом перевірити не можу. Зовнішній вигляд конструкції: http://www.divshare.com/download/16324110-2e9 Лоґ AVReal після вдалої спроби програмування: http://www.xsnippet.org/144008

          • ReAl says:

            Знайшов у себе AT90S4433-8PI, погрався на паразитному живленні через виходи байт-бластера. Синхронізація щораз різна, може бути щось таке:

            Adapter enabled
            % Reset
            % PgmOn reply 00 00 00 00
            % Try 1 to resync by SCK pulse % PgmOn reply 00 00 00 00

            % Try 15 to resync by SCK pulse % PgmOn reply 00 00 00 00
            % Try 16 to resync by SCK pulse % PgmOn reply A8 53 00 00
            % Try 17 to resync by SCK pulse % PgmOn reply AC 53 00 00
            % Try 26 to resync by SCK pulse % PgmOn reply AC 53 00 00

            % Try 27 to resync by SCK pulse % PgmOn reply AC 52 53 00
            % Synchronised after 28 try
            І далі все нормально, за іншим разом «сміття» по дорозі інше, потім зовсім не синхронізується.
            При нормальному живленні синхронізується завжди з першої спроби.

            Ваша плата доволі «наповнена», на паразитному вона навряд чи піднялася б взагалі. Аж цікаво, що це може бути. Сам би глянув.

            Що в схемі на виводах мікроконтролера, відповідальних за програмування?
            Що з цими виводами робить програма?
            Є можливість спробувати цю ж мікросхему у «чистих» умовах — лише живлення, вона та програматор?

            • alexey_laa says:

              Ой, я знайшов. Дійсно, в мене на MISO, SCK зараз дещо зайве підключено.

              Моя плата для макетів, схеме приблизно така: http://www.divshare.com/download/16326220-e92 Зараз на ній увімкнено лише контролер та MAX232.

              До виводів 18, 19, 23, 24 зараз прєднано мої “фірмові схеми захисту від перенапруги”, я про них забув, вони ще й вимкнені. Я думав, що до SPI нічого зайвого не підключено.

              Виправлю схему та спробую ще раз. Окремо мікросхему без нічого також спробую, подивлюсь яка різниця.

            • alexey_laa says:

              Тепер усе гаразд, дякую за підказку. Від’єднав зайве від MOSI, SCK. Ось новий лог: http://www.xsnippet.org/144010

              • ReAl says:

                Ффууххх… Можна спокійно спати 🙂
                Вам теж дякую, за зворотній зв’язок. Бо досить часто спілкування обривається і я не знаю — чи, зрештою, щось вийшло, чи людина взяла інший програматор і ним вийшло, чи закинула плату подалі і пішла в чисті програмісти.

                До речі, Ви наскільки далеко від Києва/Броварів?
                У мене дещо завалялося з комплектації, крім того ще є кілька непотрібних atmega8515 в tqfp44, жменька К53-21Б 10мк-16В, …
                Сам я їх точно нікуди вже не використаю.

            • alexey_laa says:

              Бачу – на сторінці вже не пропонується “Reply” для останнього коментаря, відповім тут.

              Я з Києва, точніше – Печерськ. В мене є кілька незавершених пристроїв на мікроконтролерах, краще мені буде їх доробити, ніж нове щось конструювати. Тобто, ще контролери зараз не потрібні, дякую.

            • alexey_laa says:

              Спробував сьогодні ту саму мікросхему запрограмувати окремо ( http://www.divshare.com/download/16331626-dad )

              У схемі лише сам чип, кварц, програматор, джерело 5 В.

              Усе працює. Запрограмував два рази, кілька разів зробив верифікацію – жодної помилки не бачив. Лог програмування: http://www.xsnippet.org/145007

            • ReAl says:

              Якщо дозволити більшу глибину вкладення коментарів, то дуже швидко текст стає вузьким, як газетний стовпчик.

              Ну тепер все гарно програмується.
              Якщо ж між захистом (спільна точка діода та емітера транзистора) та входом мікрокнотролера поставити резистор 1..2 кілооми, а програматор підключати безпосередньо до мікроконтролера, то і вимкнений захист не заважатиме.

              Якщо раптом з «переліку неліквідів» щось зацікавить — звертайтеся.

  2. Oleg says:

    Чомусь, під Linux Debian Lenny (5.0.7) 2.6.28-1-686 не можу ні зчитати, ні запрограмувати AT90S8515 (адаптер програмування “Altera ByteBlaster”)
    При тому, що на іншому комп’ютері з Windows XP все працює чудово.
    Ось вивід:

    avreal32 -p1 -ab +90S8515 -r out.hex -%

    avreal/LINUX – AVR controllers programmer by Redchuk Alexandr
    v1.28r5 (Oct 11 2010 22:16:43) http://real.kiev.ua/avreal
    bug-reports, suggestions and so on mail to avreal@real.kiev.ua
    Command:
    -p1 -ab +90S8515 -r out.hex -%
    % LPT port number 1
    % LPT base address 0x378
    % I/O permissions granted, direct I/O interface activated
    % LPT write cycle 1.25us
    % ByteBlaster found
    % ByteBlaster adapter mode
    % MCU oscillator frequency = 0.80MHz
    % setup 2.62us, hold 2.62us
    % actual SCK frequency 114kHz
    Adapter enabled
    % Reset
    % PgmOn reply FF FF FF FF
    % Try 1 to resync by SCK pulse % PgmOn reply FF FF FF FF
    % Try 2 to resync by SCK pulse % PgmOn reply FF FF FF FF

    % Try 31 to resync by SCK pulse % PgmOn reply FF FF FF FF
    % Try 32 to resync by SCK pulse % PgmOn reply FF FF FF FF
    Can’t resync

    Не підкажете в чому може бути проблема?

    • ReAl says:

      Важко сказати.
      Якщо вже “ByteBlaster found”, то робота з LPT пішла нормально (на перемички автодетекту сигнал видано і назад прийнято) і проблеми мають бути десь між адаптером та контроллером. Чи reset не дійшов до контроллера, чи вихід контроллера не дійшов до адаптера або через нього до LPT.
      Спробуйте закоротити MOSI-MISO на адаптері, має бути PgmOn reply AC 53 00 00

      • Oleg says:

        Закоротив MOSI+MISO і отримав:
        Adapter enabled
        % Reset
        % PgmOn reply AC 53 00 00
        % Try 1 to resync by SCK pulse % PgmOn reply AC 53 00 00
        ….

        • ReAl says:

          Тобто шлях avreal → LPT → ByteBlaster-out → ByteBlaster-in → LPT → avreal сигнал даних проходить нормально.
          LPT читається-пишеться.
          Зазвичай в таких випадках щось не так біля самого мікроконтроллера. Чи reset підкорочено, чи генератор у мікроонтроллера не працює.

          Якщо саме цей комплект плата з мікроконтроллером + ByteBlaster + кабель до LPT на іншому комп’ютері працюють, то крім відсутності контакту безпосередньо в з’єднувачі LPT на лініях RESET або SCK (не перевірених цим тестом) і уявити щось важко.

          • Oleg says:

            Дякую, буду шукати…

          • ReAl says:

            Ну от якраз вчора ввечері було — дві однакові плати з ATmega162.
            З першою працював ранше, програмується. Друга довго лежала, знадобилася для експерименту. Пробую зашити — вперто не хоче.
            Програматор на FT2232H, живлення від програматора (зрештою, від USB). З’ясувалося, що в гнізді на кінці шлейфа програматора послабився контакт VCC. На старій платі відповідний штир був трохи зігнутий і контакт був нормальний. На новій платі контакту не було.
            Подав зовнішнє живлення — почало шитися.
            А так наче все однакове — той же комп, той же програматор, однаковісінькі плати…

  3. smartly says:

    > Для того, щоб програма отримала такий дозвіл, вона на момент виклику функції ioperm() має виконуватися з правами адміністратора системи (root).

    на самом деле, для этого ей нужен не root а capability CAP_SYS_RAWIO. Но я сходу не нашёл способа дать программе этот capability, но не давать рута. Может через selinux как-то можно.

    • ReAl says:

      «Так отож». Виходить простіше з рутовими і скрізь саме такі рекомендації.

      То від гріха подалі я після ioperm() просто роблю

          setgid( getgid() );
          setuid( getuid() );

      Хоча і цікаво було б розібратися з «ідеологічно витриманими» способами, але…
      Якщо десь надибаєш інформацію — напиши.

      • smartly says:

        Наскільки я помітив – зараз всі так і роблять, захоплюють необхідні ресурси системи, потім викидають зайві права.

Leave a Reply

[flagcounter image]