読者です 読者をやめる 読者になる 読者になる

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 を繰り返すと、以下のような GDBerror を吐き、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 はは公開されていないので、中身は読むことができません。