Forum: Compiler & IDEs AVR32-Linux_Serial_Non-conform-Baudrate


von Peter P. (peter-p)


Lesenswert?

Ich möchte unter Linux 2.6.23.atmel.4 mit dem Avr32AP7000, die Baudrate 
von 1,25Mb einstellen. Mit termios stelle ich zuerst 38400Bd ein und 
dann versuche ich über ioctl den custom divisor einzustellen. Leider 
kommt im Kernel (serial_core.c) das Flag: ASYNC_SPD_CUST nicht an. Wenn 
ich die Struktur "struct serials" vom Kernel lesen will, dann werden mir 
ebenfalls nicht die richtigen Werte zurückgegeben. Dafür ist die 
Funktion im Kernel "copy_to_user" in der Funktion "static int 
uart_get_info" in serial_core.c" zuständig. Kennt jemand dieses 
Phänomen. Der Kerenel trägt die baud_base von 2500000 in seine Struktur 
im Kerenlbereich ein. Im Userbereich kommt dies aber leider nicht an. 
Zum Test habe ich den custom divisor von 260 gewählt, damit sich 9600Bd 
ergeben. Wenn das laufen würde, dann könnte ich meine Wunschbaudzahl 
(s.o.) setzten. Aber leider hakt es an der Übergabe vom Userbereich in 
den Kernel und umgedreht. Das merkwürdige ist, dass an anderer Stelle im 
Code das Kommando TIOCGSERIAL an den Kernel übergeben wird. Die 
Zielhardware ist dem STK1000 ähnlich.
Über zündende Ideen würde ich mich sehr freuen.



Hier  der kleine Code-Ausschnitt:
fd=open_port();

struct termios newtio;
struct serial_struct new_serdrvinfo;


// Set baudrate to 38400:
cfsetispeed(&newtio, B38400);
cfsetospeed(&newtio, B38400);
tcsetattr(fd, TCSANOW, &newtio );

// Change serial driver settings:
ioctl(fd, TIOCGSERIAL, &new_serdrvinfo);

// custom  Baudrate=9600
// set custom divisor (2,500,000Mhz/9600Bd = 260;
new_serdrvinfo.custom_divisor = 260;
new_serdrvinfo.flags |= ASYNC_SPD_CUST;
ioctl(fd, TIOCSSERIAL, &new_serdrvinfo);
close(fd);

printf("custom_divisor = %d \n", new_serdrvinfo.custom_divisor);
printf("baud_base = %d \n", new_serdrvinfo.baud_base);

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.