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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.