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 $USER

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

зображення діалогу налаштувань груп та користувачів в Ubuntu

Прокрутіть перелік вниз до групи lp і натисніть кнопку Властивості.

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

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

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

Натисніть кнопку Гаразд, система попросить набрати пароль адміністратора для підтвердження повноважень на зміну налаштувань.

До речі, Altera Quartus II для Linux працює з адаптером Altera Byte Blaster саме через parport. Тому для роботи з програмованою логікою від фірми Альтера немає потреби встановлювати додаткові драйвери. Що в 32-бітному, що в 64-бітному лінуксі Quartus сам знаходить байт-бластер і працює з ним.

Безпосередній доступ до портів вводу-виводу

Необхідно вказувати номер LPT або базову адресу порта в шістнадцятковому вигляді, наприклад, -p1, -p378. Дозвіл на доступ до портів вводу-виводу avreal отримує викликом ioperm(base, 8, 1), вказуючи діапазон у 8 байт починаючи з базової адреси. Для того, щоб програма отримала такий дозвіл, вона на момент виклику функції 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 ії слід перевeсти в шістнадцятковий вигляд, що можна зробити калькулятором. Можна також відразу набрати команду так

$ 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 коментарів to “avreal та LPT в Linux”

  1. alexey_laa сказав:

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

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

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

    • alexey_laa сказав:

      UPD:

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

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

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

      • ReAl сказав:

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

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

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

        • alexey_laa сказав:

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

          • ReAl сказав:

            Знайшов у себе 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 сказав:

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

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

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

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

            • alexey_laa сказав:

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

              • ReAl сказав:

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

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

            • alexey_laa сказав:

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

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

            • alexey_laa сказав:

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

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

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

            • ReAl сказав:

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

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

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

  2. Oleg сказав:

    Чомусь, під 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 сказав:

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

      • Oleg сказав:

        Закоротив 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 сказав:

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

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

          • Oleg сказав:

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

          • ReAl сказав:

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

  3. smartly сказав:

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

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

    • ReAl сказав:

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

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

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

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

      • smartly сказав:

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

Leave a Reply

[flagcounter image]