2024年9月6日金曜日

NUCLEO の USB Storage 問題

STMicroelectronicsのNUCLEOボードを試作(または趣味)で使う。
開発環境は、Cross-gcc +Eclipse +OpenOCD で用意している。

NUCLEOボードは、ST-LinkというデバッグI/Fがあり便利だ。
しかし、JTAG I/Fのみならず、USB Storageデバイスが接続されたようになる。
害がないならそれも良いのだが、Linuxでは問題になる。

OpenOCD User's guide の USB ST-LINK based に/etc/modprobe.confを書き換えることが書いてある。この文書は少し古い。
最近のUbuntuなら、/etc/modprobe.dの下にそれぞれの設定ファイルを置く。
私は /etc/modprobe.d/stlink.conf を以下の内容で作った。
# Prevent ST-LINK from showing up as a USB disk
options usb-storage quirks=483:3744:i,483:374b:i,483:374e:i
これで、ST-Linkを接続しても、自動マウントされなくなる。

解決したと思っていたが、職場のPCではおかしなことになった。
上記、/etc/modprobe.d/stlink.conf を用意しても効かない。

起動時、initrdの段階で、usb-storage.ko が読まれているのでは?と、思った。

この設定は、モジュールロード時のパラメータだ。
initrdの段階では、/etc/modprobe.d/の設定は読めない。VAIO-C1で遊んでいるときに経験していた。
職場のPCにはUSBカードリーダが常時接続されている。
bootシーケンスのinitrdの段階でそれを検出すると、usb-storage.koがロードされる。
その時点では/etc/modprobe.d/の設定はアクセスできないので、結果的にパラメータなしでロードされる。

ルートファイルシステムマウント後(/etc/modprobe.dがアクセス可能になる)、ST-Linkを挿しても、すでにusb-storage.koが読み込まれているので、再ロードは行われない。
そのため、/etc/modprobe.d/stlink.conf が、無視されたように見える。
rmmodで、アンロード(uasを先にアンロード)してNUCLEOを挿すと、再ロードが行われる。
このとき、/etc/modprobe.d/stlink.conf が適用されるため、ST-LinkのUSB Storageがマウントされない。

わざわざrmmodするのは面倒だ。
何もせずとも、ST-Link の USB Storage はマウントしないでほしい。
initrdでのモジュールのパラメータを調整するには、VAIO-C1のときのように、/etc/initramfs-tools/modules を書き換える。以下のようになる。
# List of modules that you want to include in your initramfs.
# They will be loaded at boot time in the order below.
#
# Syntax:  module_name [args ...]
#
# You must run update-initramfs(8) to effect this change.
#
# Examples:
#
# raid1
# sd_mod
usb-storage quirks=483:3744:i,483:374b:i,483:374e:i
最後の行が追加したもの。
コメントを読めばわかるが、書き換え後initrdを作り直す必要があり、update-initramfs を実行しなければならない。以下のように:
$ sudo update-initramfs -u
[sudo] <ユーザ名> のパスワード: 
パスワードを入力すれば、initrdが更新される。

これをやれば、/etc/modprobe.d/stlink.confが不要というわけではない。
起動時にUSBメモリやUSBカードリーダが接続されていない場合は、initrd内でusb-storage.koは読み込まれない。
Linuxの起動が完了した後は、/etc/modprobe.d/stlink.confが必要になるので、両方用意しておく必要がある。

最初にSTM32を使ったのは、雑誌(CQ出版 Design Wave 2008年5月号)の付録のSTM32F103VBだった。
(さっき発掘してきた)

開発環境は、cross-gcc + eclipse + OLIMEXのJTAG(千石で購入) で揃えた。

最初に開発環境を自力で揃えてしまったので、未だにSTM-STUDIOを使わない(Cubeは利用するけど)。
もしかしたら、STM-STUDIOを使っている場合はこんな問題に遭遇しないのかもしれない。

最近ではarm-none-eabi用のgccを自分でビルドしなくても良くなり、OpenOCDもUbuntuのもので十分だ。
多少楽になったが、それでも自前で揃えるには何気に大変だ。
バカバカしいかもしれないけど、何かを開発するのは苦労の連続だ。
苦労と考えず、楽しむつもりでやるのが「馬鹿の道」。ついでに、問題解決力が鍛えられる。

0 件のコメント:

コメントを投稿