2011年4月24日

Gentoo Linuxで python をアップデート (2.6 -> 2.7)

Gentoo LinuxのPortageでPythonが2.6から2.7にアップデートがありました。アップデートしたら見事に(案の定?)トラブったので、僕が対応した方法をメモしておきます。

現象
portageによるpythonのアップデート(python-2.7.1-r1)後、emergeコマンドが一切動作しなくなる。x86-stableパッケージ(x86)を利用しており、python-2.7はSlotでインストールされていた。

解決方法
僕の場合は以下の方法で解決することができました。
まず、eselectでpythonパッケージを2.7に変更する
  $ eselect python list   (python2.7の番号を確認。僕の環境では[1])
  $ eselect python set 1  (確認した番号[1]で設定する)
続いて python-updater コマンドで旧pythonに依存するパッケージの再ビルドを行う
  $ python-updater

これで解決しました。長らく使っていた2.6系はこれで不要に。--depcleanでアンインストール

NetBSDのUSBホストコントローラのドライバIF

NetBSDカーネル内部の話になります。

NetBSDのUSB(ホスト)ドライバでは各種ホストコントローラ(以下、HC)とUSBプロトコルドライバ間でIFが切られています。上位のプロトコルドライバからはHC種別(ehci, ohci, uhci)は意識せず、このIF関数をコールすることでホストコントローラを制御しています。今回、このIF形式と各IF関数で行う処理内容に関して簡単にまとめます。

なお今回、NetBSD-5.1を対象に記載しています。NetBSDでUSBホストドライバがサポートされてからIFは大きく変わっていません。

インタフェース形式
HCドライバのIFは、usbd_bus_methods構造体とusbd_pipe_methds構造体で宣言されています。本構造体は dev/usb/usbdivar.h で型宣言されており以下のような構造になります。



struct usbd_bus_methods {
    usbd_status         (*open_pipe)(struct usbd_pipe *pipe);
    void                (*soft_intr)(void *);
    void                (*do_poll)(struct usbd_bus *);
    usbd_status         (*allocm)(struct usbd_bus *, usb_dma_t *, u_int32_t bufsize);
    void                (*freem)(struct usbd_bus *, usb_dma_t *);
    struct usbd_xfer *  (*allocx)(struct usbd_bus *);
    void                (*freex)(struct usbd_bus *, struct usbd_xfer *);
};

struct usbd_pipe_methods {
    usbd_status      (*transfer)(usbd_xfer_handle xfer);
    usbd_status      (*start)(usbd_xfer_handle xfer);
    void              (*abort)(usbd_xfer_handle xfer);
    void              (*close)(usbd_pipe_handle pipe);
    void              (*cleartoggle)(usbd_pipe_handle pipe);
    void              (*done)(usbd_xfer_handle xfer);
};

構造体名から想像できますが、usbd_bus_methodsはHCに紐付けられたHCとして行うべき関数をまとめた構造体です。一方usbd_pipe_methodsはUSBの転送パイプ(コントロール転送とかバルク転送)として行うべき関数をまとめた構造体になります。

各関数で行うべき処理に関して、以下に記載します。

open_pipe
  USB転送パイプのオープンを行います。上位で転送パイプを用いてデータ転送する場合にはまず本IFで転送パイプの初期化処理を行います。HCごとに転送パイプの取扱いおよび必要なデータ構造が異なるため本IFが用意されています。また本関数内部でUSB転送パイプとusbd_pipe_methodsの紐付けを行います。

soft_intr
  割り込み処理を行う関数です。NetBSDのUSBホストドライバではUSB関連の割り込み処理はハード割り込みのコンテキストではなく、ソフト割り込みのコンテキストで実行することが設計ポリシーとなっており、ソフト割り込み実行時にも本関数が実行されます。各HCドライバ内での動きとしては、ハード割り込みが発生した際にソフト割り込みのスケジューリングを行い、そのソフト割り込み内で割り込み処理を行う流れになります。

do_poll
  割り込をソフト側でポーリングするためのIFです。割り込み禁止状態でハードからのイベント(=割り込み)待ちが必要となるような場合に利用するIFです。

allocm
  HCに渡す送受信用データ領域のメモリ確保を行う際のIFです。メモリ領域確保自体はHCに依存する部分は少なくNetBSD-5.1でも各HCでほとんど共通の処理を行っています。(HCによって送受信データのアライメントがある場合や特殊制御が必要な場合には本IFが意味を持ちます。)

freem
  allocmで確保したメモリ領域を解放する際のIFです。

allocx
  USB転送(usbd_xfer)を確保する際のIFです。HCでは転送単位で必要となる処理が多いたえめ、本IFは(allocmと異なり)HCごとに大きく異なるため、各HCごとに必要なデータ領域の確保等を行います。

freex
  allocxで確保したUSB転送データ構造を解放する際のIFです。

transfer
  上位USBプロトコルドライバからUSB転送を開始する際のIFです。

start
  実際にHCに対してUSB転送を行う際のIFです。上記transferとstartの差異について説明しますが、NetBSDのUSBドライバの作りとしてUSB転送はパイプごとにキューイングする作りになっています。transfer()はこのキューにデータをエンキューするためのIFで、start()はキューのデータを実際に転送するIFです。またNetBSDのUSBドライバはデータ転送が終了した際にコールバック内でstart()を実行することで次の転送を開始するような作りにもなっています。

abort
  転送中のUSB転送を中止する際のIFです。

close
  open_pipe()でオープンしたパイプをクローズするIFです。

cleartoggle
  USBプロトコルで定められているトグルをクリアするIFです。トグルの制御方法はHCごとに異なっておりHC(ハード)が完全制御するもののありますが、ソフト側で制御が必要なものもあるため本IFが存在します。

以上。

2011年4月23日

USB3.0とUSB2.0の差異 その1 (USBハブクラスのStatusフィールド)

今、USB3.0の仕様を色々と見ています。「プロトコル層より上位は互換性がある」といったことも聞きますが、実際には細かなところに差異があります。特にUSB3.0ではハブの仕様が大きく変更されておりクラスリクエストも見直されています。
その違いの1つとして、ハブクラス仕様で決められているPort Status Field(wPortStatus)とPort Change Fileld(wPortChange)を以下で比較してみます。

  • USB3.0:wPortStatus
    •   Bit 0 : Current Connect Status
    •   Bit 1 : Port Enabled/Disabled
    •   Bit 2 : Reserved
    •   Bit 3 : Over-current
    •   Bit 4 : Reset
    •   Bit 5-8 : Port Link State
    •   Bit 9 : Port Power
    •   Bit 10-12 : Negotiated speed
    •   Bit 13-15 : Reserved


  • USB3.0:wPortChange
    •   Bit 0 : Connect Status Change
    •   Bit 1-2 : Reserved
    •   Bit 3 : Over-Current Indicator Change
    •   Bit 4 : Reset Change
    •   Bit 5 : BH Reset Change
    •   Bit 6 : Port Link State Change
    •   Bit 7 : Port Config Error
    •   Bit 8-15 : Reserved
  • USB2.0:wPortStatus
    •   Bit 0 : Current Connect Status
    •   Bit 1 : Port Enabled/Disabled
    •   Bit 2 : Suspend
    •   Bit 3 : Over-current
    •   Bit 4 : Reset
    •   Bit 5-7 : Reserved
    •   Bit 8 : Port Power
    •   Bit 9 : Low-Speed Device Attached
    •   Bit 10 : High-Speed Device Attached
    •   Bit 11 : Port Test Mode
    •   Bit 12 : Port Indicator Control
    •   Bit 13-15 : Reserved
  • USB2.0:wPortChange
    •   Bit 0 : Connect Status Change
    •   Bit 1 : Port Enable/Disable Change
    •   Bit 2 : Suspend Change
    •   Bit 3 : Over-Current Indicator Change
    •   Bit 4 : Reset Change
    •   Bit 5-15 : Reserved


違いを明確化するために色付けしてみた。青字はUSB3.0で拡張あるいは無効になったフィールド、赤字が互換性の無いフィールド。この違いはUSB3.0でリンク層が追加され、リンク層制御をハブクラスで行わなければならないことに起因すると考えられます。