| Autor |
Beitrag |
cbob
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 03.10.09 14:15
Allo!
Habe folgendes Problem:
Mein System hat 16 digtiale IO's (GPIO). Diese sind entweder abzufragen oder zu setzen, indem man eine bestimmte Adresse ausliest/beschreibt. Als Beispiel wurde einfacherweise ein kurzes C-Programm beigelegt:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| #include <stdio.h> #include <sys/io.h> #define outportb(a,b) outb(b,a) #define inportb(a) inb(a) void main(void) { iopl(3); /* set GPIO port0[7-0] as input mode */ outportb(0x98, 0x00); /* read data from GPIO port0 */ inportb(0x78); /* set GPIO port1[7-0] as output mode */ outportb(0x99, 0xff); /* write data to GPIO port1 */ outportb(0x79, 0x55); } |
Nachteil eins: es muß mit root Rechten ausgeführt werden, Nachteil zwei: Kein Lazarus/Pascal/Delphi!
Wie kann ich das nun mit Lazarus (unter Linux) realisieren? Habe da absolut keinen Anhaltspunkt, wie ich direkt auf den Speicher zugreifen kann. Hat hier unter Umständen jemand eine Idee dazu?
Danke und erstmal einen schönen Samstag!
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 03.10.09 14:43
Hallo und  im Forum!
Waren outportb usw. nicht einfach nur spezifische Funktionen für die Ansteuerung der seriellen Schnittstelle?
Dafür gibt es für Lazarus auch Bibliotheken, siehe Wiki:
wiki.lazarus.freepas...rielle_Kommunikation
|
|
cbob 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 03.10.09 22:05
Kenne mich leider mit der stdlib nicht aus, daher kann ich dazu leider nix sagen.
Die Frage steht halt immernoch: wie bekomme ich Zugriff auf das GPIO-Interace?
Im gewissen Sinne könnte man dort auch von einem seriellen Port ausgehen, aber ich muss halt ran kommen.
Wobei, wenn wir aber gerade von seriellen Ports sprechen: eine zweite Frage: welches Lazarus Package könnte man dazu empfehlen? Wohl gemerkt: unter Linux! Darüber aber bitte nicht die erste Frage vergessen
Grüß
-C-
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 03.10.09 22:13
|
|
cbob 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 03.10.09 22:19
Janein - doch hab ich! Habe dummerweise auf der synaser Seite bei den unterstützten Systemen bei Windows aufgehört zu lesen und dachte mir somit, dass das ja nun nix für Linux ist
Nun weiss ich's aber besser.
Allerdings hab ich da keinen Ansatz für mein erstes Problem finden können. Dachte da an sowas wie "Lege Speicheradresse für x-te Schnittstelle fest..." o.ä. .
Das geht da ja nun leider nicht.
-C-
|
|
cbob 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 05.10.09 09:33
Habe nun einen ersten ANsatz gefunden:
Mittels der Unit x86 kann man per fpIOperm auf Ports zugreifen. Das funktioniert schonmal ein wenig - muss für das Programm dann allerdings root-rechte haben.
Andere Lösungsvorschläge? Habe auch von einem GPIO-treiber gelesen, aber leider noch zu wenig, um das bei meinem Board einzusetzen.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 05.10.09 18:18
Unter Unix kannst du dir (wenn's nicht zeitkritisch ist) mit Domain-Sockets einen kleinen "IO-Treiber-Daemon" bauen, der auf die Schnittstelle zugreift bzw. von dieser Daten liest. Der Rest der Anwendung kann dann ohne Root-Rechte laufen.
Wo ich mir grad nicht ganz sicher bin, ist die Sache, ob man für die IO-Port-Zugriffe zum Zeitpunkt der Zugriffe die Rootrechte haben muss, oder ob ob man da ggf. sich die nötigen Resourcen vorab holen kann und dann diese mit gedroppten Rechten später einfach weiterverwendet (so macht das z.B. Postfix für die Mail-Sockets, die auf Port 25 eigentlich auch Root-Rechte brauchen).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|