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:
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:
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.
Scroll down to lp group and click Properties.
Choose users to be added into lp group.
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 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:
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:
E800
or
E800
See also avreal and LPT in Windows
Зараз використовую AVReal із Ubuntu. Працює, але весь час показує десятки помилок синхронізації. А іноді зовсім не синхронізується ( див. лог: http://www.xsnippet.org/147001# )
Раніше працювало на WinXP, таких помилок майже не було. Якщо з’являлись – ставив опцію “-3”, і все працювало. Тепер не хоче.
Можна ще якісь налаштування спробувати?
UPD:
Перезавантажив комп’ютер, позупиняв решту програм, запрацювало.
Можливо, інші програми не дають нормально працювати комунікації через LPT.
Працює, хоча все одно пише “% Synchronised after 33 try”. Чи не може це бути просто якась софтова витримка (наприклад, довгий RESET)?
Дивно.
Синхронізація з 33-ї спроби, якщо вона все ж таки проходить, це нормально. Таке може бути, якщо програма на старті перемикає лінію SCK як вихід «1». Але тоді після стирання контролера вже синхронізуватиметься з першої спроби. Та й відповідь на неуспішну команду входу в програмування буде FF FF FF FF.
Але ж тут так само і після стирання, причому не синхронізується взагалі.
Живлення мікроконтролера точно в нормі?
Живлення від К142ЕН5В, тестер показує 5,01 В. Осцилографом перевірити не можу. Зовнішній вигляд конструкції: http://www.divshare.com/download/16324110-2e9 Лоґ AVReal після вдалої спроби програмування: http://www.xsnippet.org/144008
Знайшов у себе 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
І далі все нормально, за іншим разом «сміття» по дорозі інше, потім зовсім не синхронізується.
При нормальному живленні синхронізується завжди з першої спроби.
Ваша плата доволі «наповнена», на паразитному вона навряд чи піднялася б взагалі. Аж цікаво, що це може бути. Сам би глянув.
Що в схемі на виводах мікроконтролера, відповідальних за програмування?
Що з цими виводами робить програма?
Є можливість спробувати цю ж мікросхему у «чистих» умовах — лише живлення, вона та програматор?
Ой, я знайшов. Дійсно, в мене на MISO, SCK зараз дещо зайве підключено.
Моя плата для макетів, схеме приблизно така: http://www.divshare.com/download/16326220-e92 Зараз на ній увімкнено лише контролер та MAX232.
До виводів 18, 19, 23, 24 зараз прєднано мої “фірмові схеми захисту від перенапруги”, я про них забув, вони ще й вимкнені. Я думав, що до SPI нічого зайвого не підключено.
Виправлю схему та спробую ще раз. Окремо мікросхему без нічого також спробую, подивлюсь яка різниця.
Тепер усе гаразд, дякую за підказку. Від’єднав зайве від MOSI, SCK. Ось новий лог: http://www.xsnippet.org/144010
Ффууххх… Можна спокійно спати 🙂
Вам теж дякую, за зворотній зв’язок. Бо досить часто спілкування обривається і я не знаю — чи, зрештою, щось вийшло, чи людина взяла інший програматор і ним вийшло, чи закинула плату подалі і пішла в чисті програмісти.
До речі, Ви наскільки далеко від Києва/Броварів?
У мене дещо завалялося з комплектації, крім того ще є кілька непотрібних atmega8515 в tqfp44, жменька К53-21Б 10мк-16В, …
Сам я їх точно нікуди вже не використаю.
Бачу – на сторінці вже не пропонується “Reply” для останнього коментаря, відповім тут.
Я з Києва, точніше – Печерськ. В мене є кілька незавершених пристроїв на мікроконтролерах, краще мені буде їх доробити, ніж нове щось конструювати. Тобто, ще контролери зараз не потрібні, дякую.
Спробував сьогодні ту саму мікросхему запрограмувати окремо ( http://www.divshare.com/download/16331626-dad )
У схемі лише сам чип, кварц, програматор, джерело 5 В.
Усе працює. Запрограмував два рази, кілька разів зробив верифікацію – жодної помилки не бачив. Лог програмування: http://www.xsnippet.org/145007
Якщо дозволити більшу глибину вкладення коментарів, то дуже швидко текст стає вузьким, як газетний стовпчик.
Ну тепер все гарно програмується.
Якщо ж між захистом (спільна точка діода та емітера транзистора) та входом мікрокнотролера поставити резистор 1..2 кілооми, а програматор підключати безпосередньо до мікроконтролера, то і вимкнений захист не заважатиме.
Якщо раптом з «переліку неліквідів» щось зацікавить — звертайтеся.
Чомусь, під 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
Не підкажете в чому може бути проблема?
Важко сказати.
Якщо вже “ByteBlaster found”, то робота з LPT пішла нормально (на перемички автодетекту сигнал видано і назад прийнято) і проблеми мають бути десь між адаптером та контроллером. Чи reset не дійшов до контроллера, чи вихід контроллера не дійшов до адаптера або через нього до LPT.
Спробуйте закоротити MOSI-MISO на адаптері, має бути PgmOn reply AC 53 00 00
Закоротив MOSI+MISO і отримав:
Adapter enabled
% Reset
% PgmOn reply AC 53 00 00
% Try 1 to resync by SCK pulse % PgmOn reply AC 53 00 00
….
Тобто шлях avreal → LPT → ByteBlaster-out → ByteBlaster-in → LPT → avreal сигнал даних проходить нормально.
LPT читається-пишеться.
Зазвичай в таких випадках щось не так біля самого мікроконтроллера. Чи reset підкорочено, чи генератор у мікроонтроллера не працює.
Якщо саме цей комплект плата з мікроконтроллером + ByteBlaster + кабель до LPT на іншому комп’ютері працюють, то крім відсутності контакту безпосередньо в з’єднувачі LPT на лініях RESET або SCK (не перевірених цим тестом) і уявити щось важко.
Дякую, буду шукати…
Ну от якраз вчора ввечері було — дві однакові плати з ATmega162.
З першою працював ранше, програмується. Друга довго лежала, знадобилася для експерименту. Пробую зашити — вперто не хоче.
Програматор на FT2232H, живлення від програматора (зрештою, від USB). З’ясувалося, що в гнізді на кінці шлейфа програматора послабився контакт VCC. На старій платі відповідний штир був трохи зігнутий і контакт був нормальний. На новій платі контакту не було.
Подав зовнішнє живлення — почало шитися.
А так наче все однакове — той же комп, той же програматор, однаковісінькі плати…
> Для того, щоб програма отримала такий дозвіл, вона на момент виклику функції ioperm() має виконуватися з правами адміністратора системи (root).
на самом деле, для этого ей нужен не root а capability CAP_SYS_RAWIO. Но я сходу не нашёл способа дать программе этот capability, но не давать рута. Может через selinux как-то можно.
«Так отож». Виходить простіше з рутовими і скрізь саме такі рекомендації.
То від гріха подалі я після
ioperm()
просто роблюsetuid( getuid() );
Хоча і цікаво було б розібратися з «ідеологічно витриманими» способами, але…
Якщо десь надибаєш інформацію — напиши.
Наскільки я помітив – зараз всі так і роблять, захоплюють необхідні ресурси системи, потім викидають зайві права.