HV への印加が起こす libftd2xx の seg fault
FTDI 社製の FT245RL という USB 用の chip と、libftd2xx という純正の library を組み合わせて使用しています。操作は ROOT で class を書いて、libftd2xx の wrapper を走らせています。
FT245RL と同じ基板上に HV (高圧) を載せているのですが、こいつの動作確認をしようと思い、HV の on/off を繰り返すと、libftd2xx が死ぬという現象が起きました。
ROOT の CINT 上で走らせていたのですが、FT_Open と FT_Close、および HV の on/off を繰り返すと、以下のような GDB の error を吐き、seg fault で ROOT ごと落ちます*1。
#6 0x00002affc2fa250a in ProcessBulkInData (fd=0x1e8917f0, Buffer=0x1ebc3000 <Address 0x1ebc3000 out of bounds>, BufSiz=-2772883) at bulk_in.c:309 #7 0x00002affc2fa2fa1 in reader_thread (in_data=0x1e8917f0) at bulk_in.c:709 #8 0x000000339fc0673d in start_thread () from /lib64/libpthread.so.0 #9 0x000000339f0d3d1d in clone () from /lib64/libc.so.6
libpthread のところで死んでいたので、Snow Leopard の問題と同様かと思っていたのですが、どうやら、HV の on/off をするときに FT245RL が何か誤作動するようです。FT_Write のところで、書き込んだ char の長さを unsigned long で返すのですが、この長さが 18446744073709551597 という、とんでもない長さになったりしていました。
HV の on/off の動作部分を ROOT script の中から削除すると、この問題は発生しなくなりました。その後、HV の電圧を急激に上昇させず、徐々に上げるように書き換えたところ、やはり問題は生じませんでした。
したがって、同一基板上の HV への急激な印加が、FT245RL の誤作動を引き起こし、software の seg fault へ繋がったと見て間違いなさそうです。
Software ばかりやっていると、こういう hardware と密接に絡んだ問題の対処がすぐに分からなかったので、勉強というか良い経験になりました。
*1:ProcessBulkInData と bulk_in.c は、libftd2xx の中に含まれています。Source code はは公開されていないので、中身は読むことができません。