トップ «前の日記(2007年03月02日) 最新 次の日記(2007年03月12日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2007年03月07日

USB HCD (HostControlDriver)メモ

Linux-2.6 で USBのホスト側ドライバを作るときの主な関数とデータの流れ えびめも
  俺_urb_enqueue(*urb)
     URBを受け取ってキューに入れる
     送信関数をたたく
  送信関数()
     キューから取り出してUSB送受信(SETUP,IN,OUT,ISO,ACK,NACK ... etc)
  割り込み   (top half)
     要因に応じて仕事終わり関数()やら(トランザクションが続くなら)送信関数()をたたく
  俺_urb_dequeue(*urb)
     キューからURBを削除して 仕事終わり関数を呼ぶ
  仕事終わり関数()
     処理が終わったURBはusb_hcd_giveback_urb(*urb) で上に返して一仕事終わり
こんな感じで動いている模様(たぶん)。
EK760

struct urb

struct urb
{
    spinlock_t lock;
    void *hcpriv;                   /* HCDが使うプライベートデータ。 *hep を保存する */
    int bandwidth;                  /* bandwidth for INT/ISO request */
    atomic_t use_count;             /* concurrent submissions counter */
    u8 reject;                      /* submissions will fail */
    struct list_head urb_list;      
    struct usb_device *dev;         /* (in) pointer to associated device */
    unsigned int pipe;              /* 送受信の方向、転送タイプ、
                                       デバイス番号、エンドポイント番号 など*/
    int status;                     /* HCDが値を設定する
                           0         URB転送成功
                           -ENOENT       usb_kill_urb()呼び出しによって URBが停止した
                           -ECONNRESET   usb_unlink_urb()呼び出しによってURBがアンリンクされた
                           -EINPROGRESS  まだ処理中(BUG)
                           -EPROTO       時間内にハードウェアが応答しなかった
                           -EILSEQ       CRC不一致
                           -EPIPE        STALL
                           -ECOMM        受信オーバーフロー
                           -ENOSR        送信アンダーフロー
                           -EOVERFLOW    バブル発生
                           -EREMOTEIO    transfer_flag に URB_SHORT_NOT_OK フラグがセットされていて
                                         受信したデータが指示より少なかった
                           -ENODEV       デバイスが無い
                           -EXDEV        ISOにて部分的にしか送受信できなかった
                           -EINVAL       ログオフして帰宅すること
                           -ESHUTDOWN    hcdにバグがあって無効化された */
    unsigned int transfer_flags;    /* トランスファフラグ */
    void *transfer_buffer;          /* 送受信データが置かれているバッファ */
    dma_addr_t transfer_dma;        /* 同上 DMA */
    int transfer_buffer_length;     /* 同上 バッファのバイト数 */
    int actual_length;              /* 実際に送信、受信したバイト数 */
    unsigned char *setup_packet;    /* コントロール伝送におけるセットアップパケット
                                       転送バッファのデータに先立って送信される  */
    dma_addr_t setup_dma;           /* 同上 DMA  */
    int start_frame;                /* ISO スタートフレーム番号 */
    int number_of_packets;          /* ISOパケット数 */
    int interval;                   /* INT,ISO のポーリング間隔(単位はフレーム) */
    int error_count;                /* (return) number of ISO errors */
    usb_complete_t complete;        /* 完了コールバック関数ハンドラ */
    void *context;                  /* 同上 引数 */
    struct usb_iso_packet_descriptor iso_frame_desc[0];   /* (in) ISO ONLY */
};

やはり、絶景というのは見下ろすものなのだろうか

アストロアーツ:土星探査機カッシーニ 昇りつめてとらえたリングの絶景
すげーなー。北極のすっんごい高いところから見下ろしてるんだろうな。幼い頃に小さな望遠鏡で土星を見せてもらって、クリーム色をした土星にちゃんと輪が見えたときに感動というか畏怖に近い思いをしたのだけど、見慣れた土星の形と全然違うんだな。人類が始めて目にするってこういうことか。遠い空のかなたでこんな写真が撮られているのか。すごいな。