Hello, On 25 February 2012 17:42, Greg KH <greg@xxxxxxxxx> wrote: > On Sat, Feb 25, 2012 at 10:24:09AM +0100, Frank Danapfel wrote: >> Hello, >> >> for a project I'm working on I need to communicate with a device >> (Arduino Uno) at a custom baudrate via a USB serial connection. The >> device is accessed via the "cdc-acm" kernel module, which doesn't seem >> to allow the setting of serial port parameters: >> >> # lsmod|grep -i acm >> cdc_acm 27935 0 >> # dmesg >> ... >> [71475.837970] usbcore: registered new interface driver cdc_acm >> [71475.837972] cdc_acm: USB Abstract Control Model driver for USB modems and >> ISDN adapters >> (after plugging in the hardware (an Arduino Uno) >> [71731.773090] usb 6-2: new full-speed USB device number 5 using uhci_hcd >> [71731.958129] usb 6-2: New USB device found, idVendor=2341, idProduct=0001 >> [71731.958139] usb 6-2: New USB device strings: Mfr=1, Product=2, >> SerialNumber=220 >> [71731.958146] usb 6-2: Product: Arduino Uno >> [71731.958151] usb 6-2: Manufacturer: Arduino (www.arduino.cc) >> [71731.958157] usb 6-2: SerialNumber: 64932343638351A08180 >> [71731.963281] cdc_acm 6-2:1.0: ttyACM0: USB ACM device >> >> # setserial /dev/ttyACM0 spd_hi >> Cannot set serial info: Invalid argument >> >> # strace setserial /dev/ttyACM0 spd_hi >> execve("/bin/setserial", ["setserial", "/dev/ttyACM0", "spd_hi"], [/* 66 vars >> */]) = 0 >> brk(0) = 0x1ed1000 >> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >> 0x7fd9d311c000 >> access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) >> open("/etc/ld.so.cache", O_RDONLY) = 3 >> fstat(3, {st_mode=S_IFREG|0644, st_size=156038, ...}) = 0 >> mmap(NULL, 156038, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fd9d30f5000 >> close(3) = 0 >> open("/lib64/libc.so.6", O_RDONLY) = 3 >> read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\24B\2262\0\0\0"..., >> 832) = 832 >> fstat(3, {st_mode=S_IFREG|0755, st_size=1947608, ...}) = 0 >> mmap(0x3296400000, 3769592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, >> 0) = 0x3296400000 >> mprotect(0x329658e000, 2097152, PROT_NONE) = 0 >> mmap(0x329678e000, 20480, PROT_READ|PROT_WRITE, >> MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18e000) = 0x329678e000 >> mmap(0x3296793000, 21752, PROT_READ|PROT_WRITE, >> MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3296793000 >> close(3) = 0 >> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >> 0x7fd9d30f4000 >> mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >> 0x7fd9d30f2000 >> arch_prctl(ARCH_SET_FS, 0x7fd9d30f2720) = 0 >> mprotect(0x329678e000, 16384, PROT_READ) = 0 >> mprotect(0x329621e000, 4096, PROT_READ) = 0 >> munmap(0x7fd9d30f5000, 156038) = 0 >> open("/dev/ttyACM0", O_RDWR|O_NONBLOCK) = 3 >> ioctl(3, TIOCGSERIAL, 0x7fff692984e0) = 0 >> ioctl(3, TIOCSSERIAL, 0x7fff69298530) = -1 EINVAL (Invalid argument) >> dup(2) = 4 >> fcntl(4, F_GETFL) = 0x8002 (flags O_RDWR|O_LARGEFILE) >> brk(0) = 0x1ed1000 >> brk(0x1ef2000) = 0x1ef2000 >> brk(0) = 0x1ef2000 >> fstat(4, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 1), ...}) = 0 >> mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = >> 0x7fd9d311b000 >> lseek(4, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek) >> write(4, "Cannot set serial info: Invalid "..., 41Cannot set serial info: >> Invalid argument >> ) = 41 >> close(4) = 0 >> munmap(0x7fd9d311b000, 4096) = 0 >> exit_group(1) = ? >> >> I've tested this on Fedora 15 with kernel 2.6.42.3-2.fc15.x86_64. >> >> There was an old thread on this list about implementing TIOCGSERIAL in >> the cdc-acm module >> (http://permalink.gmane.org/gmane.linux.usb.general/9236). >> >> Would it be possible to add support for TIOCSSERIAL in cdc-acm as well? > > I just added that patch to the tree a few hours ago, it will show up in > the 3.4 kernel release. Thank you. But it looks like the patch only implements the function to read the serial port parameters. After applying it it is still not possible to set a parameter: # setserial /dev/ttyACM0 spd_hi Cannot set serial info: Invalid argument An strace shows that the TIOCSSERIAL ioctl isn't available: # strace setserial /dev/ttyACM0 spd_hi ... ioctl(3, TIOCGSERIAL, 0x7fff692984e0) = 0 ioctl(3, TIOCSSERIAL, 0x7fff69298530) = -1 EINVAL (Invalid argument) ... Any chance to get this added in cdc-acm? Thanks, Frank -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html