Forum: Mikrocontroller und Digitale Elektronik Kernelpatch NGW100 LInux


von Philipp H. (ennox)


Lesenswert?

Hoi,

wie in einem anderen Beitrag geschrieben, arbeite ich gerade an einer 
Umsetzung des DMX-Protokolls über USART. Ich arbeite derzeit noch mit 
dem BUildroot 2.3.0 von Atmel.

Es ist zwar veraltet aber produziert auch nicht ständig irgentwelche 
Fehler beim Compilieren.

Ich versuchte mit
1
stty -F /dev/ttyS2 speed 250000

die Baudrate auf 250000 kbit/s einzustellen. Diese nimmt er nicht an. 
Wie ich mittlerweile herausgefunden habe fehlt der passende Eintrag in 
der Termios.h.

Ich werde also einen Kernelpatch mit "quilt" bauen müssen. Ich kenne 
zwar die Befehle die ich dazu brauche, aber wie genau der Eintrag der 
termios.h aussehen soll und wie sich das mit den Verzeichnissen verhält 
ist mir leider noch unklar.
1
#ifdef __USE_MISC
2
# define CBAUDEX 0010000
3
#endif
4
#define  BOTHER   0010000
5
#define  B57600   0010001
6
#define  B115200  0010002
7
#define  B230400  0010003
8
#define  B460800  0010004
9
#define  B500000  0010005
10
#define  B576000  0010006
11
#define  B921600  0010007
12
#define  B1000000 0010010
13
#define  B1152000 0010011
14
#define  B1500000 0010012
15
#define  B2000000 0010013
16
#define  B2500000 0010014
17
#define  B3000000 0010015
18
#define  B3500000 0010016
19
#define  B4000000 0010017

Also wie das aussieht muss ich in diesem Bereich B250000 einfügen. Nur 
ob ich den beliebig platzieren ist die Frage?

Des weitern, wo muss ich den Patch erstellen und wo muss er hin habe ich 
irgendwie nicht verstanden.

von ... (Gast)


Lesenswert?

Philipp H. schrieb:
> die Baudrate auf 250000 *kbit/s*

? du meinst bit/s.

Philipp H. schrieb:
> Ich werde also einen Kernelpatch mit "quilt" bauen müssen.

sorry, was ist "quilt"?

Philipp H. schrieb:
> Nur
>
> ob ich den beliebig platzieren ist die Frage?

Ersetz doch einfach einen Wert, den du nicht brauchst durch dein 
B250000.

Zu USART nach RS485 war hier noch ein Beitrag:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=89720

von Philipp H. (ennox)


Lesenswert?

JO 250 kbit/s sollte das heißen, ist richtig :-)

Ersetzten, ok wenn das geht.

Das Problem was für mich dann dennoch weiterhin besteht ist, wie bekomme 
ich das Ganze in den Kernel.

Wie patche ich das mit "quilt" ?

Bin noch nicht ganz so dahinter, wo ich das Patchverzeichnis btw den 
fertigen Patch hinkopiere.

Den Patch zu erstellen ansich ist ja nicht schwer.

von Andreas F. (aferber)


Lesenswert?

Erstens: der Kernel hat kein integriertes Patchsystem, auch kein quilt. 
Wenn dann musst du dir selbst etwas zum Kompilieren eines gepatchten 
Kernels bauen, oder einfach Patch anwenden und kompilieren.

Zweitens: du müsstest nicht nur den Kernel, sondern auch die Libc 
ändern.

Drittens: das ganze ist garnicht nötig. Unter Linux kannst du beliebige 
Baudraten setzen, sofern die jeweilige Hardware und deren Treiber das 
kann. Beispielcode:
1
#include <linux/serial.h>
2
...
3
struct serial_struct ser_info; 
4
ioctl(ser_dev, TIOCGSERIAL, &ser_info); 
5
ser_info.flags = ASYNC_SPD_CUST | ASYNC_LOW_LATENCY; 
6
ser_info.custom_divisor = ser_info.baud_base / CUST_BAUD_RATE; 
7
ioctl(ser_dev, TIOCSSERIAL, &ser_info);
8
...

Andreas

von Philipp H. (ennox)


Lesenswert?

Das der Kernel  kein eigenes Patchsystem hat, ist mir bewust.

"stty" kann nur die Baudraten nutzen, die in der Termios.h eingetragen 
sind.

Die Baudrate die ich nutzen möchte, ist aber nicht eingetragen.

Was ich mit dem Patch meinte ist, wenn ich die Termios.h verändere, muss 
ich die Änderungen ja irgentwie in den Kernel bekommen. Ich verstehe 
halt nicht, wie ich das  bewerkstelligen soll?

Mit quilt erstellt man einen Patch für den Kernel. Nur wohin ich den 
fertigen patch packen muss, ist mir halt nicht klar. Alternativ könnte 
ich die termios.h verändern, das uImage löschen und den Kernel koplett 
neubauen. Nur dann ist "quilt" volkommen überflüssig. Und genau da weis 
ich auch nicht ganz weiter.

Bei deinem Code muss ich passen weil mir dazu derzeit die Befehle 
fehlen, zumindst habe ich noch keine quelle für die Befehle gefunden, 
btw sie dann irgentwie übersehen.

von ... (Gast)


Lesenswert?

Philipp H. schrieb:
> Alternativ könnte
> ich die termios.h verändern, das uImage löschen und den Kernel koplett
> neubauen.

Genau so.
Ob es allerdings reicht nur die .h zu ändern?

von Philipp H. (ennox)


Lesenswert?

Von der Seite ausgesehen könntest du recht haben, da die Baudrate ja 
über eine Formel errechnet. Ist nur die Frage wo ich noch eine Änderung 
ansetzten muss. Aus einem Beitrag von avrfreaks, geht hervor, dass ein 
Fehlerhafter Eintrag in termois.h verhindert hatte das baudrates >= 
30200 gehen.

Daraus hatte ich geschlossen das Dieses so gehen müsste. Nur wo du das 
jetzt sagst, bissel zweifeln tu ich da dann auch.

von Andreas F. (aferber)


Lesenswert?

Philipp H. schrieb:
>
> "stty" kann nur die Baudraten nutzen, die in der Termios.h eingetragen
> sind.

Dann benutz halt kein stty. Du musst doch eh ein Programm schreiben, das 
das DMX-Protokoll implementiert, dann kannst du auch gleich die 
Schnittstelle dort initialisieren, anstatt das über stty zu machen. 
Ist sowieso zuverlässiger.

Deine Änderung in der termios.h zieht einen Rattenschwanz an Problemen 
nach sich, die man sich mit ein paar einfachen Zeilen C im Userspace 
komplett ersparen kann.

Andreas

von Philipp H. (ennox)


Lesenswert?

Ja da hast du wohl Recht, Fehleranzahl könnte stark steigen etc.

Wie ich gerade sehe werden die Befehle wohl in der Serial.h stehen. Habe 
die ausch schon mal angeschaut, nur das war die für das UC3 Framework, 
wusste nicht ob ich die für Linux verwenden kann. Habe da wohl was 
überlesen. Nur a finde ich die verwendeten Befehle von dir auch nicht. 
Bin in der ganzen Sache leider noch nicht soweit drin das ich das ganze 
so angehen könnte.

von Philipp H. (ennox)


Lesenswert?

HM ok ich werde wohl nicht um die Gestaltung aus dem Userspace drum 
herum kommen.

von ... (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.