旧フォーラム投稿日:2009.05.29 (この記事は旧サポートフォーラムより転載されたものです)
USB-013をLinuxにて接続する場合、FTDI社のドライバD2XXを使っているのですが、rootユーザ権限でなければ、ドライバがOpen出来ません。root(スーパーユーザ)以外の任意のユーザ権限では動作しないのでしょうか?
root以外の場合は、FT_Open()の戻り値は、FT_DEVICE_NOT_OPENED(3)が返ります。
たいへん申し訳ございません。
当社では、Windows以外での使用経験もノウハウも無いのです。
また、USB-013は、FTDI社のベンダーIDでなく、ヒューマンデータのベンダーIDとプロダクトIDが書かれていますので、
FTDI社の提供するLinuxドライバ環境が動作しましたでしょうか?
また、USB-013は特にD2XXドライバを用いる必要は無いかと考えるのですがいかがでしょうか。
検索しますと、下記のようなページがヒットいたしました。
http://nabe.blog.abk.nu/0149
この件のご質問は、FTDI社に直接投げていただくほか無いかと存じます。
お役にたてず申し訳ありません。
即効のご返事ありがとございました。
LinuxのD2XXドライバには、ftdi_table.cというソースがあり、そのソースのstatic int id_table[][2]に
USB-013のVIDとPIDを追加して、Makeし直し、libd2xx_table.soを更新すれば、Linuxでも使用可能に
なります。但し、問題としております、root(スーパーユーザ)でしか今のところ動作しません。
お教え頂いた、URL先、参考にさせて頂きます。
ご説明をありがとうございます。Linuxに精通されている方なら比較的簡単に対応できるということなのですね。
参考になります。
ただ、前の投稿でも述べさせていただきましたが、USB-013はRS-232C専用タイプですので、D2XXドライバを選択されることは無いようにも思います。
(疑問は疑問として残りますが)
よろしくお願いします。
USB-013のRS232C側にはパソコン(WinXP)を接続しCOMポートとしてデータを送信します。
USB側にもパソコン(Linux)を接続し、RS232C側から送ってくるデータを受信してデータ処理を
します。
そのLinux側でデータを受信するのに、D2XX Driversを使っています。
※Linux側ソフトウェアの評価用の装置として、USB-013を使っています。
D2XXドライバといいますのは、特殊な操作を行いたいときに用いるドライバですので、シリアルポートとして使う場合は通常必要無いと思うしだいです。
一般のコンソールドライバ(WindowsでいえばCOMポートドライバ)をお使いになれば良いと考えました。
当方が理解出来ていない可能性はございます。
守秘義務があり、詳しくご説明出来ないのですが、その「特殊な操作」を行っておりまして、
通常のシリアルポートとして使っているのではございません。説明不足で申し訳有りません。
すみません。もう一点困っている現象が有りますので、記録として報告させて頂きます。
rootユーザでは、FT_Open()もFT_OK(0)が返り、期待する処理は問題なく実行できます。
その状態で、USB-013とLinuxマシンのUSBポートを接続しているケーブルを引き抜くと、
セグメンテーション違反が発生し、処理は異常終了してしまいます。
処理をデバッグして追跡したところ、FT_Open()で、FT_OK(0)が帰った後、何も処理を
せずに、待機させている状態だけでもUSBケーブルを引き抜くと、セグメンテーション違反
となりました。セグメンテーション違反が発生するのは、ケーブルを引き抜いた後約5秒後
です。また、USBケーブルを一瞬だけ引き抜いた(直にまた接続)場合も同様で、約5秒後
にセグメンテーション違反となります。
もちろん、FT_Close()後には、USBケーブルを引き抜いてもセグメンテーション違反は発生
致しません。
Openしたまま、USBケーブルを抜くことは出来ないと思っております。
言葉足らずで、申し訳有りません。
フェイルセーフなシステムを開発する必要がありまして、通常はありえないのですが、もしもシステム稼動中に
USBケーブルが抜けてしまったり、断線した場合に、システムが異常終了してしまうのは困るのです。
データの受信処理としては、FT_GetStatus()で受信データが有るかどうかを事前にチェックしてから、
受信データが有る場合にFT_Read()をする処理としていますが、USBケーブルを引き抜いた状態でも
FT_GetStatus()は、戻り値が正常FT_OK(0)であり、USBケーブルが抜けた異常事態を検知して
くれません。
処理としては、周期的に、データを受信するまで、FT_GetStatus()を呼び出す処理としていますの
でUSBケーブルが抜けても何度かFT_GetStatus()を呼び出しますが、常に正常(FT_OK(0))で
あり、そのうちに、5秒が経過すると、セグメンテーション違反で異常終了してしまいます。
USBケーブルが抜けたのに、FT_GetStatus()を何度も呼び出すのが問題なのかと思いデバッグ
した結果、単純にFT_Open()をした状態だけでも5秒経過すると、セグメンテーション違反となりま
した。
詳しいことは判りかねますが、難しいように思います。
WindowsでもOpenしたままケーブルを抜きますと、最悪ブルー画面になることがございます。
D2XXドライバをお使いになりたい意味がわかったような気がいたしますが、当方にはたぶんお手伝いは出来ない高度な内容かと存じます。
お待たせしております。
本件について、回答がありましたので、メールにてご回答させていただきます。
基本的には、rootでの使用が原則とのことです。
どうぞご了承くださいませ。
(root以外での使用も可能とのことです)
メールの内容で、一番問題としていた件(root以外での使用)は解決することが出来ました。
ありがとうございました。
D2XXドライバにて、不意にUSBケーブルが抜かれた場合の動作について、確認いたいました。
Windowsの場合:不意にUSBケーブルが抜かれてもエラーを報告しシステムのダウンになりません
Linuxのばあ:不意にUSBケーブルが抜かれたときの対応はまだ出来ていません
とのことでした。
[kw] FTDI LINUX FAQ-FA
[]