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.