きっかけ
ラジコン制御のSBusを扱いたい…のだが、彼は100Kbpsという、16450非互換なbaud rateなのだ…。
使用機材
Raspberry Pi
こちらによると、/boot/config.txt
でクロックを変更できるらしい。
…いろいろやってみたのだが、Raspbianのkernelがバンバン新しくなっているのか、ちょっとうまくいかず、保留->実現。
USB-UART変換
kernelを読む
FTDIのチップ用ドライバである、ftdi_sio.cを読むと、なんかいいことが書いてある。
ftdi_sio.c
* 3. You can also set baud rate by setting custom divisor as follows
* - set tty->termios->c_cflag speed to B38400
* - call TIOCSSERIAL ioctl with (struct serial_struct) set as
* follows:
* o flags & ASYNC_SPD_MASK == ASYNC_SPD_CUST
* o custom_divisor set to baud_base / your_new_baudrate
もはやstty
コマンドだけではできない技だな…。
ググる
"non-standard baud rate linux" などでググると、ioctl()
などで頑張る技が出てくる。
もうちょっと頑張って、setserialコマンドを発見。ASYNC_SPD_CUST
なんかも設定できそうな予感。
実験
秋月電子通商で買っておいた、Adafruit FT232H Breakoutを使ってみる。
baud_baseのデフォルトはチップによって違ったりするようだが、FT232Hは12Mbps?
kernelを追うのが面倒なので、オシロ(LabTool)で見ながら成功した手順がこちら。
# stty -F /dev/ttyUSB0 38400
# setserial /dev/ttyUSB0 spd_cust divisor 240
# echo -n U > /dev/ttyUSB0
'U'は、0b01010101なので、波形を見るにはちょうどいい。
記念撮影
はい、チーズ。
ぴったり!