Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как работать с GPIO под Linux?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
GeneralProger
Здравствуйте!
Заранее предупреждаю, что это первый раз когда я имею дело с микрокомпьютерами, раньше работал только с AVR и для меня тема программирования из под Linux темный лес, так что прошу сильно не бить, если я написал не туда или задаю очевидные/глупые/неправильно сформулированные вопросы.
Имеется плата http://wiki.embeddedarm.com/wiki/TS-5300, хочу использовать ее как Arduino (т.е. иметь возможность подавать и снимать питание с определенных ножек), почитав в интернете конкретно про такой тип микрокомпьютеров я примерно предположил что под мои цели на данной плате могут подойти выходы DIO1 и DIO2. Как вообще к ним обратиться из под Linux и задать им какое-то состояние? Нашел в интернете какие-то примеры обращения через файл /sys/dio, но в версии Linux которая стоит на этом микрокомпьютере не то что такого файла нету, папка sys вообще не существует.

Что мне делать что бы выполнить хотя бы такую задачу и вообще возможно ли это?

mantech
Цитата(GeneralProger @ Jul 16 2016, 06:15) *
Здравствуйте!
Заранее предупреждаю, что это первый раз когда я имею дело с микрокомпьютерами, раньше работал только с AVR и для меня тема программирования из под Linux темный лес, так что прошу сильно не бить, если я написал не туда или задаю очевидные/глупые/неправильно сформулированные вопросы.
Имеется плата http://wiki.embeddedarm.com/wiki/TS-5300, хочу использовать ее как Arduino (т.е. иметь возможность подавать и снимать питание с определенных ножек), почитав в интернете конкретно про такой тип микрокомпьютеров я примерно предположил что под мои цели на данной плате могут подойти выходы DIO1 и DIO2. Как вообще к ним обратиться из под Linux и задать им какое-то состояние? Нашел в интернете какие-то примеры обращения через файл /sys/dio, но в версии Linux которая стоит на этом микрокомпьютере не то что такого файла нету, папка sys вообще не существует.

Что мне делать что бы выполнить хотя бы такую задачу и вообще возможно ли это?



Первое - читайте документацию на ваш компьютер. Это не АРМ, а стандартный х86 процессор.
Второе - Линукс с "пол-оборота" не осваивается, это достаточно сложная система, по сравнению с АВР программированием.
Третье - Не вижу смысла в данной задаче вообще его использовать, у вас РС-совместимая машина, берете любой компилятор, на вроде Watcom C, под MS-DOS и пишите свою прогу. Если нужно много памяти, используйте dos-4gw.
Ну и напоследок - если уж все-таки хотите влезть в линукс - сначала почитайте о нем по-подробнее...
1113
какая версия ядра?
GeneralProger
Цитата(mantech @ Jul 16 2016, 08:14) *
Первое - читайте документацию на ваш компьютер. Это не АРМ, а стандартный х86 процессор.
Второе - Линукс с "пол-оборота" не осваивается, это достаточно сложная система, по сравнению с АВР программированием.
Третье - Не вижу смысла в данной задаче вообще его использовать, у вас РС-совместимая машина, берете любой компилятор, на вроде Watcom C, под MS-DOS и пишите свою прогу. Если нужно много памяти, используйте dos-4gw.
Ну и напоследок - если уж все-таки хотите влезть в линукс - сначала почитайте о нем по-подробнее...

Может я конечно чего-то не понимаю, но я почитал wiki по ссылке которая ведет на этот компьютер, а документации по разработке на них не увидел.
А относительно MS-DOS тема для меня еще менее ясная чем linux, туда мне лезть еще более страшней.
Я пытался найти какую-то информацию, но даже не знаю как мне составить поисковый вопрос, пытался запрашивать gpio linux example и подобного рода, но что-то все совсем не то, может подскажете как мне правильно сформулировать запрос поисковику для решения моей задачи?

Цитата(1113 @ Jul 16 2016, 09:40) *
какая версия ядра?

По команде uname -mrs выводит:
Linux 2.4.31 i486
1113
эта платформа оч древняя (> 10 лет), и ядро линукса - тоже.

можно предложить несколько вариантов:
1) пытаться искать сборку (openwrt, yocto и тд) для конкретно этой платы, или подбирать наиболее похожую плату, с этим же процессором. если получится - будете иметь современный линукс со всеми рабочими примерами использования GPIO и тд;
2) искать документацию на эту плату и этот линукс того времени;
3) забить на плату, и взять современное железо, которое поддержано современным софтом
AVR
Цитата(mantech @ Jul 16 2016, 10:14) *
Третье - Не вижу смысла в данной задаче вообще его использовать, у вас РС-совместимая машина, берете любой компилятор, на вроде Watcom C, под MS-DOS и пишите свою прогу. Если нужно много памяти, используйте dos-4gw.

MS-DOS категорически не рекомендую, нет смысла новичку осваивать программирование под архаичные платформы. Linux не так сложен, тем более для задачи дерганья GPIO.
А вместо той устаревшей железяки что есть у автора (с устаревшей поддержкой Linux и архаичной документацией), я посоветовал бы ему купить что-то современное типа rasbberry/banana pi и прочие odroid-ы с современным актуальным Linux и подходящей документацией.
Осваивать что-то новичку следует с чего-то актуального современного с хорошей документацией.

P.S. Тема совершенно не сюда, я бы ее перенес в раздел ОС.
Jury093
Цитата(GeneralProger @ Jul 16 2016, 13:19) *
А относительно MS-DOS тема для меня еще менее ясная чем linux, туда мне лезть еще более страшней.
Я пытался найти какую-то информацию, но даже не знаю как мне составить поисковый вопрос, пытался запрашивать gpio linux example и подобного рода, но что-то все совсем не то, может подскажете как мне правильно сформулировать запрос поисковику для решения моей задачи?

в идеальнов варианте, д.б. либа от производителя и документированное API..
если совсем все тухло, то опираясь на это
Код
The DIO1 port provides +5V, GND, and 14 digital I/O lines that may be used to interface the TS-5300 with a wide range of external devices. DIO lines DIO1_0 thru DIO1_7 are a byte-wide port accessed at I/O location Hex 7B, while the 6 other DIO lines DIO1_8 thru DIO1_13 are accessed in the lower 6 bits of I/O location Hex 7C. I/O location Hex 7A is a control port for DIO1. The direction of DIO lines DIO1_0 thru DIO1_3 is controlled by bit 0 of I/O location Hex 7A, and the direction of DIO1_4 thru DIO1_7 is controlled by bit 1 of I/O location Hex 7A

выписываете адреса портов ввода/вывода, ищете и ставите компилятор. например C под свой дистрибутив
далее ищете примеры программ "как обратиться к порту ввода в линукс" - удобнее смотреть в исходниках программ для x86, какого-нить софтового программатора или IrDA, любую хрень для работы с lpt портами (если вы понимаете что это)
и пишите свою аппликуху для работы со своими адресами

адреса по железу смотрите в разделах
21 Appendix D - System I/O Map
Table 12 - TS-5300 DIO and Control Registers

PS как уже вам написали - это х86 архитектура и врядли есть прямой доступ к gpio (типа /sys/class/gpio для ARM).. для интереса попробуйте
Код
find / | grep gpio
GeneralProger
Почитал в интернете по обращению к портам ввода вывода и нашел файл /proc/ioports
Со следующем содержимым:
Код
0000-000f : dma1
0020-0021 : pic1
0040-0043 : timer
0070-007f : rtc
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
01f0-01f7 : ide0
02f8-02ff : serial(auto)
0300-030f : eth0
03f6-03f6 : ide0
03f8-03ff : serial(auto)
0cf8-0cff : PCI conf1

По инструкции порты DIO висят на 074h - 07Fh, значит если я правильно понимаю к ним относится эта строчка:
Код
0070-007f : rtc

И выходит что на эти порты есть драйвер /dev/rtc через который можно будет с ними работать?
GeneralProger
Я в принципе уже сам понял что тупанул и rtc это совсем не то
Jury093
Цитата(GeneralProger @ Jul 17 2016, 03:51) *
Я в принципе уже сам понял что тупанул и rtc это совсем не то

конечно тупанули, по вашей ссылке есть область адресов:
Код
074h - 07Fh      DIO and Control registers

и ниже таблица описания..

прочитайте содержимое по адресу 0x74, должны считать значение 0x50:
Код
74h      Read      Product Code 50h = Product Code for TS-5300


если ваша система "знает" о наличии этих портов, то карта адресов будет видна
либо
Код
cat /proc/iomem

либо
Код
cat /proc/ioports
GeneralProger
Цитата(Jury093 @ Jul 17 2016, 08:50) *
конечно тупанули, по вашей ссылке есть область адресов:
Код
074h - 07Fh      DIO and Control registers

и ниже таблица описания..

прочитайте содержимое по адресу 0x74, должны считать значение 0x50:
Код
74h      Read      Product Code 50h = Product Code for TS-5300


если ваша система "знает" о наличии этих портов, то карта адресов будет видна
либо
Код
cat /proc/iomem

либо
Код
cat /proc/ioports

Файл /proc/ioports выше, а файл /proc/iomem вот:
Код
00000000-0009e3ff : System RAM
0009e400-0009ffff : reserved
000a0000-000bffff : Video RAM area
000f0000-000fffff : System ROM
00100000-01ffffff : System RAM
  00100000-0022aacd : Kernel code
  0022aace-002719c3 : Kernel data
fff00000-ffffffff : reserved


Вот вы говорите прочитать содержимое, а какой командой вообще обращения к портам ввода вывода по адресам такого вида осуществляется? Я смотрел в интернете как обращаться по этому байтному адресу надо, но там везде требуются какие-то пакеты которые вообще отказываются устанавливаться на эту версию Linux и все примеры разнятся.

Вы не могли бы привести пример?
Jury093
Цитата(GeneralProger @ Jul 18 2016, 11:48) *
Вы не могли бы привести пример?

я же писал ранее:
Цитата
далее ищете примеры программ "как обратиться к порту ввода в линукс" - удобнее смотреть в исходниках программ для x86, какого-нить софтового программатора или IrDA, любую хрень для работы с lpt портами (если вы понимаете что это)


мнэ.. а гугль уже не работает?
"как прочитать ioport linux", например
http://www.iakovlev.org/index.html?p=538&m=1
Tarbal
Цитата(1113 @ Jul 16 2016, 14:45) *
эта платформа оч древняя (> 10 лет), и ядро линукса - тоже.

можно предложить несколько вариантов:
1) пытаться искать сборку (openwrt, yocto и тд) для конкретно этой платы, или подбирать наиболее похожую плату, с этим же процессором. если получится - будете иметь современный линукс со всеми рабочими примерами использования GPIO и тд;
2) искать документацию на эту плату и этот линукс того времени;
3) забить на плату, и взять современное железо, которое поддержано современным софтом


Ядро линукса 2.4 в 2005 уже было устаревшим.

Если вы поставите современный линукс, то там доступ к ножкам очень простой даже для тех кто не имеет понятия ни о линуксе ни о программировании.
Jury093
Цитата(GeneralProger @ Jul 18 2016, 11:48) *
Вы не могли бы привести пример?

гугленье - свет, а негугленье - тьма..
вот вам пример (ссылка, параграф 4.2):
Код
#include <stdio.h>
#include <sys/io.h>
int main() {
if (ioperm(0x7A,4,1)<0){
printf(“Error\n”);
return -1;
}
//set pins0 to 3 to inputs
ioval=inb(0x7a);
ioval= ioval & 0xFE;
outb(ioval, 0x7A);
return 0;
}
GeneralProger
Цитата(Jury093 @ Jul 18 2016, 18:13) *
гугленье - свет, а негугленье - тьма..
вот вам пример (ссылка, параграф 4.2):
Код
#include <stdio.h>
#include <sys/io.h>
int main() {
if (ioperm(0x7A,4,1)<0){
printf(“Error\n”);
return -1;
}
//set pins0 to 3 to inputs
ioval=inb(0x7a);
ioval= ioval & 0xFE;
outb(ioval, 0x7A);
return 0;
}

Знаете, что самое интересное, я никак не могу установить компилятор gcc на свой linux, ни одна инструкция не подходит, нету make, пробовал использовать Java даже с горя, но ее как я понял на мою i486 архитектуру не существует в природе, пытался скомпилировать файл на Linux на компьютере, но он ругается на и работать не хочет (наверное из-за другой архитектуры ОС на которой был скомпилирован), вообщем даже это уже огромная проблема, не знаю даже что и делать.
Jury093
Цитата(GeneralProger @ Jul 19 2016, 21:08) *
Знаете, что самое интересное, я никак не могу установить компилятор gcc на свой linux, ни одна инструкция не подходит, нету make, пробовал использовать Java даже с горя, но ее как я понял на мою i486 архитектуру не существует в природе, пытался скомпилировать файл на Linux на компьютере, но он ругается на и работать не хочет (наверное из-за другой архитектуры ОС на которой был скомпилирован), вообщем даже это уже огромная проблема, не знаю даже что и делать.

судя по тексту в pdf, там все непросто для программирования, типа
One problem developers run into is missing libraries. The complete set of unstripped glibc 2.2.5
libraries used by all TSLinux SBCs, can be found on the Technologic Systems website. The file is named
entire.libs.dir.tar.bz2. Another common problem is mismatched library versions, between the developer's
desktop and the target SBC. In these cases, the problem can be solved by explicitly linking against the
unpacked entire.libs.dir.tar.bz2 tarball.
сходите на сайт производителя
https://www.embeddedarm.com/embedded-develo...t/downloads.php
там растет линк на фтп
ftp://ftp.embeddedarm.com/ts-x86-sbc
поищите там make и gcc
GeneralProger
Цитата(Jury093 @ Jul 19 2016, 19:29) *
судя по тексту в pdf, там все непросто для программирования, типа
One problem developers run into is missing libraries. The complete set of unstripped glibc 2.2.5
libraries used by all TSLinux SBCs, can be found on the Technologic Systems website. The file is named
entire.libs.dir.tar.bz2. Another common problem is mismatched library versions, between the developer's
desktop and the target SBC. In these cases, the problem can be solved by explicitly linking against the
unpacked entire.libs.dir.tar.bz2 tarball.
сходите на сайт производителя
https://www.embeddedarm.com/embedded-develo...t/downloads.php
там растет линк на фтп
ftp://ftp.embeddedarm.com/ts-x86-sbc
поищите там make и gcc

Нашел этот архив, распаковал, создалась папка /usr/lib/gcc-lib/i386-pc-linux-gnu/2.95.3 со следующим содержимым:

include/ cc1plus crtbeginS.o libgcc.a collect2 crtend.o libstdc++.a SYSCALLS.c.X cpp0 crtendS.olibstdc++.so cc1 crtbegin.o specs

Попытался скормить исходник C++ файлам выделенным выше, все, как один при скармливании hello.cc выдают на выходе hello.s с содержимым похожим на гибрид sh и ассемблера.
Я так понял это какие-то утилиты для самого gcc, только где его искать вопрос остается открытым. Да и библиотеку libc он не обновил, так 2.2.5 и осталась.
Поиски make успехом пока не увенчались, сам отдельно gcc есть вроде лежит на ftp в нескольких версиях, но вроде все это не под эту плату, искал разное по названию платы, но там только различные образы DOS, BIOS, Linux нашлись

Jury093
Цитата(GeneralProger @ Jul 20 2016, 13:42) *
Попытался скормить исходник C++ файлам выделенным выше, все, как один при скармливании hello.cc выдают на выходе hello.s с содержимым похожим на гибрид sh и ассемблера.

чем смотрели? что пишет в ответ:
Код
file hello.s


Цитата
Поиски make успехом пока не увенчались, сам отдельно gcc есть вроде лежит на ftp в нескольких версиях, но вроде все это не под эту плату, искал разное по названию платы, но там только различные образы DOS, BIOS, Linux нашлись

в корне фтп лежит файл ftp.catalog-6-27-8.txt
поищите в нем.. там мелькает типа
./tmp/gcc-3.2.3-glibc-2.2.5.tar.gz
вроде видел исходники ядра

у вас же х86 архитектура, в теории можно нативно собирать на обычном компе исполнимые бинарники, надо только с библиотеками внимательно разобраться..
GeneralProger
Цитата(Jury093 @ Jul 20 2016, 12:01) *
чем смотрели? что пишет в ответ:
Код
file hello.s



в корне фтп лежит файл ftp.catalog-6-27-8.txt
поищите в нем.. там мелькает типа
./tmp/gcc-3.2.3-glibc-2.2.5.tar.gz
вроде видел исходники ядра

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

Вообщем с gcc вроде решилось с помощью toolchain, а по поводу отрывка кода что вы мне скинули, я все-равно не понимаю:
ioperm(0x7A,4,1) это получение прав на работу или что? Описания атрибутов я не нашел, что значит from, num и turn_on? Я так предполагаю что from это начало, num количество после from, но как во всем это ориентироваться? В инструкции TS написано:
7Bh R/W DIO1_0 thru DIO1_7 (Bits 0-7)
7Ch R/W DIO1_8 thru DIO1_13 (Bits 0-5)

Значит получается, что мы получаем права на работу с ножками DIO от 0 до 7 при вызове ioperm(0x7B,1,1)?

А это что:
Код
ioval = inb(0x7a);
ioval = ioval & 0xFE;
outb(ioval, 0x7A);

Мы через inb(0x7B); в моем случае выбираем диапазон DIO от 0 до 7, потом приписав ioval = ioval & 0xFE; прыгаем на какую-то ножку из диапазона 0-7 задав ее номер 0xFE??
Что же тогда значит outb(ioval, 0x7A);, я совсем уже не догадываюсь
Jury093
Цитата(GeneralProger @ Jul 20 2016, 19:26) *
Вообщем с gcc вроде решилось с помощью toolchain, а по поводу отрывка кода что вы мне скинули, я все-равно не понимаю:
Значит получается, что мы получаем права на работу с ножками DIO от 0 до 7 при вызове ioperm(0x7B,1,1)?

в сообщение №14 треда есть слово "ссылка", она указывает на pdf
http://vigir.missouri.edu/~gdesouza/Resear..._Dev_Manual.pdf

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

update1 судя по опечаткам, в критичных местах сверяйтесь с инетом:
Код
can be read from the /pro/SBC/info. This proc entry is read only

вероятно все же /proc/SBC/info

update2 и вот об этом
Цитата
пытался скомпилировать файл на Linux на компьютере, но он ругается на и работать не хочет

полезно после слова "пытался" показать "как пытался" (строку для запуска компиляции)
и "ругался" - приводить строки вывода ошибок (часто по ним можно понять что происходит)
и для занудства - "работать не хочет", дак никто работать не хочет, а код должен выполниться на таргет-системе
впрочем не принимайте это всерьез..
Tarbal
Цитата(GeneralProger @ Jul 19 2016, 22:08) *
Знаете, что самое интересное, я никак не могу установить компилятор gcc на свой linux, ни одна инструкция не подходит, нету make, пробовал использовать Java даже с горя, но ее как я понял на мою i486 архитектуру не существует в природе, пытался скомпилировать файл на Linux на компьютере, но он ругается на и работать не хочет (наверное из-за другой архитектуры ОС на которой был скомпилирован), вообщем даже это уже огромная проблема, не знаю даже что и делать.


Работать на древнем ядре даже для опытного программиста непростая задача, а для начинающего она неподъемна. Вы неверно ставите задачу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.