
Ubuntu日本語フォーラム

ログインしていません。
Ubuntu 9.10で USBパラレル変換チップのFT245BMが載った機材を使い
プログラムをしたのですが、
libFTDIを使用してアクセスしようとしているのですが
エラーが出てしまいます。
エラー内容を ftdi_get_error_string関数で見たところ、
「unable to open ftdi device: -8 (inappropriate permissions on device!)」
と言われていました。
ttyUSB0が
crw-rw---- 1 root dialout 188, 0 2010-03-17 16:19 ttyUSB0
となっていたので、
ttyUSB0をsudo chown user:user ttyUSB0 (userはグループとユーザー名)
としてユーザー用に権限を変えたり
chmodで666や777も試してみたのですが
結果は変わりませんでした。
これはどの権限を変更すれば通のでしょうか?
よろしくお願いいたします。
使用したサンプルソースは下記のソースです。
int main(void)
{
int ret;
struct ftdi_context ftdic;
if (ftdi_init(&ftdic) < 0) {
fprintf(stderr, "ftdi_init failed\n");
return EXIT_FAILURE;
}
if ((ret = ftdi_usb_open(&ftdic, 0x0403, 0x6001)) < 0) {
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
return EXIT_FAILURE;
}
if ((ret = ftdi_usb_close(&ftdic)) < 0) {
fprintf(stderr, "unable to close ftdi device: %d (%s)\n", ret, ftdi_get_error_string(&ftdic));
return EXIT_FAILURE;
}
ftdi_deinit(&ftdic);
return EXIT_SUCCESS;
}
オフライン
crw-rw---- 1 root dialout 188, 0 2010-03-17 16:19 ttyUSB0
$ cat /etc/group|grep dialout
を見ると、ユーザから読み書きできるようになっていますので、
権限の問題ではなさそうに見えます。
オフライン
Cはよく判らないのですが、ちょっと気になったのが、
http://www.intra2net.com/en/developer/libftdi/documentation/group__libftdi.html#ga95d4689db18fc1fd70011f6504ab8c40
によると、VendorIDとProductIDを渡すようですが、lsusbの結果と整合していますでしょうか。
オフライン
>si様
お返事ありがとうございます。
確かに、666に変えたり、777に変えたりしても無理だったので
権限ではないのか?とも考えたのですが、じゃあ何?と言うのがまったく分からなくて
途方に暮れてた次第なのです。orz
>hmatsue様
お返事ありがとうございます。
ulsubの結果ですが
####################################################
Bus 003 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x0403 Future Technology Devices International, Ltd
idProduct 0x6001 FT232 USB-Serial (UART) IC
bcdDevice 4.00
iManufacturer 1 FTDI
iProduct 2 USB <-> Serial
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 32
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 90mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 2 USB <-> Serial
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0000
(Bus Powered)
####################################################
以上なので、間違っては無いのかな?と思っていますが、よくわかっていません・・・。
オフライン
ソースをチラッと見る限りですと、間接的にはusb_detach_kernel_driver_np()での失敗時のerrornoのようです。
実際(?)には、usb_set_configuration()かusb_claim_interface()に失敗しないかぎり、usb_detach_kernel_driver_np()の失敗は無視されるようです。つまり、これらの2つのどちらかに失敗しているっぽいです(設定情報がなければ、usb_set_configuration()は呼び出されないっぽいですが・・・)
なので、usb_strerror()にて、元のほうのエラーの詳細がとれたりしないでしょうか?
オフライン
>weyk様
お返事ありがとうございます。
上記のソースを
if ((ret = ftdi_usb_open(&ftdic, 0x0403, 0x6001)) < 0) {
fprintf(stderr, "unable to open ftdi device: %d (%s) %s\n", ret, ftdi_get_error_string(&ftdic), usb_strerror());
return EXIT_FAILURE;
}
に書き換え実行してみました。
結果としては
###################################
unable to open ftdi device: -8 (inappropriate permissions on device!) could not claim interface 0: Operation not permitted
###################################
と表示されました。
やはりここでも not permittedって言われるんですね・・・
オフライン
とりえあず、デバイスファイルのパーミッション的な問題か切り分けるため、sudoでプログラムを実行してみてはいかがでしょう。
オフライン
とりあえず、ソースからわかる範囲で・・・
実際にopenされるデバイスファイル名を調べるのがよい気がします。その上で、あらためてパーミッションを付けてみる と。
実行する前に、実行する環境の環境変数で、「USB_DEBUG」に対して、「1」や「2」を設定すると、libusbからデバッグ用の情報をどこかに(?)出力するようです。
# どこか=(そのライブラリを使用しているプロセスと同じ)標準エラー出力?
その中で、「usb_os_init: Found USB VFS at %s」(1)として表示されるはずのところで、ベースとなるディレクトリを確認してみてください。
さらに、2以上を指定したときにいろいろと表示される中で、usbのデバイスを列挙しているときにずらずら表示される、「usb_os_find_devices: Found %s on %s」((3)と(2))というところから、どんなデバイス名が使用されていそうか見当をつけて、パーミッションを確認してみてください(どれがオープンしようとしていたものなのかは、見分けるのが大変かもしれません・・・おそらく、lsusbの「Bus 003 Device 002」に絡んでいるような気はします。)
# (1)/(2)/(3) というファイルがデバイスファイルとして実際にオープンされているようです。ひょっとして、「/dev/bus/usb/003/002」あたり?
オフライン
>hmatsue様
sudo で試したところopenは出来ました。
ただ今Eclipseでの開発をやっているのですが、これではデバッグが出来なくて・・・
weyk様
早速USB_DEBUGを入れてみました。
############################################################
usb_set_debug: Setting debugging level to 1 (on)
usb_os_init: Found USB VFS at /dev/bus/usb
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: couldn't get connect info
unable to open ftdi device: -8 (inappropriate permissions on device!) could not claim interface 0: Operation not permitted
############################################################
usb_set_debug: Setting debugging level to 2 (on)
usb_os_init: Found USB VFS at /dev/bus/usb
usb_os_find_busses: Found 002
usb_os_find_busses: Found 003
usb_os_find_busses: Found 004
usb_os_find_busses: Found 001
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: Found 001 on 002
error obtaining child information: Operation not permitted
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: Found 004 on 003
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: Found 001 on 003
error obtaining child information: Operation not permitted
error obtaining child information: Operation not permitted
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: Found 001 on 004
error obtaining child information: Operation not permitted
usb_os_find_devices: couldn't get connect info
usb_os_find_devices: Found 001 on 001
error obtaining child information: Operation not permitted
USB error: could not detach kernel driver from interface 0: Operation not permitted
USB error: could not claim interface 0: Operation not permitted
unable to open ftdi device: -8 (inappropriate permissions on device!) could not claim interface 0: Operation not permitted
############################################################
という結果です。
/dev/bus/のディレクトリがroot:rootなってるのがいけないのでしょうか?
オフライン
対象のデバイスファイルを見つける分には見つけることが出来ているようなので、ディレクトリにつおては、そのままでよいと思います。
この辺の、自動的に生成されるファイルのパーミッションが原因とすると、udevのスクリプト(*.rules)を変更してパーミッションを変えるか、今のパーミッションにあわせてユーザに権限をつける ということになると思います。
lsusbの結果の、
Bus 003 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC Device
のBusとDeviceの結果に基づいて(例えば、003と002なら。再起動したり指しなおした場合は再確認。)、
ls -l /dev/bus/usb/003/002
にて、owner/groupとpermitionを確認してみてください。
# 予想では(*.rulesを読んだ感じからすると)、root/dialout の、664あたりだったりしませんか?
オフライン
>weyk様
今USBを差し直してみて
Bus 003 Device 004:
となった状態なのですが、
ls -la /dev/usb/003/
をしてみたところ
##################################################
drwxr-xr-x 2 root root 80 2010-03-18 12:00 .
drwxr-xr-x 6 root root 120 2010-03-18 10:07 ..
crw-rw-r-- 1 root root 189, 256 2010-03-18 15:28 001
crw-rw-r-- 1 root root 189, 259 2010-03-18 15:28 004
##################################################
となっていました。
確かに004が664になっています。
こういった場合はrulesファイルで対応した方が良いのでしょうか?
(どう書いて良いのかわかりませんが・・・)
オフライン
大変申し訳ないのですが・・・ソースを参照することで、ほぼ唯一の回答が見つかるものについてはわかる(知らなくても調査できる)のですが、「本来どうするのがよいのか」という部分については、さっぱりわかりません。
基本的には・・・というところの考えの話とすると、
・そのデバイスが、一般ユーザが自由に使えるべきものであるなら、*.rulesファイルを追加/修正して、該当部分のファイルのパーミッションについては、666として生成されるようにする。
・そのデバイスが、抜き差しに(多人数の環境であっる場合には)管理者の権限を要するべきものということであれば、いま作成しているプログラムは実行の際にsudoをなりで昇格して実行することで対応する。
という感じになるのかなぁ と思うとことです。もっとも、デスクトップユースであれば、どちらの方法でも問題はない(シングルユーザなので)んですが・・・
*.rulesの記載については、/etc/udev/rules.d/READMEが参照してみてください。/lib/udev/rules.d に、システムがもつファイルがずらずらと存在するので、参考になるかと思います(productとvendor(とkernelかsubsystem?)を条件にして、MODEを指定する という感じになると思います)
※先に、該当のデバイスファイルのpermitionが666なら動くのかどうかを確認(とりあえずchmodしてみる)したほうが確実そうです。
オフライン
最終的には管理者の判断ということになるのだと思いますが、デフォルトの権限にもそれなりの理由があってのことだと思いますので、権限の変更はよく考えてされた方がよいのではないかと思います。
# プログラムの所有者をrootにしてset user IDして、グループを必要に応じて設定して
# 実行できるユーザを制限するか誰でも実行できる状態にするか選択するというのはいかが
# でしょうか。
## 逆に危険?とかご意見あればご教示いただきたく。
オフライン
>weyk様
>※先に、該当のデバイスファイルのpermitionが666なら動くのかどうかを確認(とりあえずchmodしてみる)したほうが確実そうです。
先程/dev/usb/003/の002(今回は002になっていました)をchmodで666にしたところ
問題無くOpenする事が出来ました!!
抜き差しした際にttyUSB0が消えたり、出てきたりしていたのでそれだと思っていたのですが
実体はこっちだったんですねorz
rulesファイルの書き方を調べて試行錯誤したいと思います。
ありがとうございました!! m(_ _)m
>hmatsue様
>最終的には管理者の判断ということになるのだと思いますが、デフォルトの権限にもそれなりの理由があってのことだと思いますので、権限の変更はよく考えてされた方がよいのではないかと思います。
確かにそれもあるのかもしれないですね。
開発中は権限を変えて実際に使う際はまた所有者等を考えた方がいいのかもしれないですね。
ご意見ありがとうございます!! m(_ _)m
オフライン