avreal and LPT in Linux

Unlike in NT-line Windows a DLPortIO.sys driver is not required for LPT port access in Linux/x86 (both 32- and 64-bit). Unlike in Windows 98 any program in Linux can’t access ports without permissions.

There are two ways — direct IO-port access and parport device usage. Direct access provides faster programming but requires root privileges when avreal is started.

Using of parallel port device “parport”

Parallel port device name must be set in -p switch, e.g. -p/dev/parport0. System call ioctl() is used for LPT pins access.
parport devices belong to the lp group:

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

So it is enough to add yourself into lp group to permit /dev/parport0 access:

$ sudo usermod -a -G lp $USER

Users can be added into the group lp with GUI, but this way is not faster 🙂
In Ubuntu:
Enter System / Administration menu and select Users and Groups position. Click Manage Groups button.

users and groups dialogue screenshot

Scroll down to lp group and click Properties.

group manage dialogue screenshot

Choose users to be added into lp group.

lp group properties dialogue screenshot

Click OK and the system will prompt for root password for authentification.

Direct IO-ports access

Parallel port number or base address must be set in -p switch in hexadecimal form, for example -p1, -p378. avreal requests IO-port access by ioperm(base, 8, 1) call. The call reserves 8-byte range starting from base address. The program must have root privileges at ioperm() call. Otherwise IO port acces will not be granted and avreal will finish with Can't get I/O permissions error.

Of course, it can be run via command sudo but there is a risk of system files corruption. If a system file is set as avreal output file for data read from a microcontroller the file will be overwritten with the microcontroller flash content.

If user id and group id for the program are set to root and SETUID/SETGID bits are set the programm will start with root privileges even it is run by a plain user. After getting access rights avreal drops own privileges from root level to the user level and therefore it can’t open a system file for writing anymore.

It’d better to copy avreal into /usr/local/bin directory. It is able only with root privileges and the avreal copy will get root group and user identificators. Then you should set SETUID/SETGID bits. For example:

$ 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

If PCI-LPT add-on card is used the base address can be obtained by the command:

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

The first number is the base address in decimal form. For using with avreal it must be converted in hexadecimal form for example by calculator. Or use another commands:

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


or

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

See also avreal and LPT in Windows

20 Responses to “avreal and LPT in 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 to ReAl

[flagcounter image]