RedHawk Linux User's Guide version 6.3 æ¥æ¬èªç
RedHawk Linux User's Guide version 6.3 æ¥æ¬èªç
RedHawk Linux User's Guide version 6.3 æ¥æ¬èªç
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>RedHawk</strong> <strong>Linux</strong> User’s <strong>Guide</strong>カーネル・スケルトン・ドライバ 14デバイス・ドライバで 処 理 される 必 要 のある 割 り 込 みをデバイスが 出 すとき、<strong>Linux</strong>ではユーザー・レベル・ルーチンを 割 り 込 みに 結 合 する 方 法 がないため、 完 全 にユーザー・レベルでデバイス・ドライバを 構 築 することは 出 来 ません。しかしながら、ユーザー・レベル・ドライバを 実 行中 のユーザー・レベル・アプリケーションへデバイスの 割 り 込 みとシグナルの 発 行 を 処 理 する 簡易 カーネル・デバイス・ドライバを 構 築 することは 可 能 です。シグナルは 実 行 プログラムへ 非 同期 で 配郤 信 されるため、およびシグナルはコードがクリティカル・セクション 中 はブロックすることが 可 能 であるため、シグナルはユーザー・レベル 割 り 込 みのように 振 舞 います。後 述 のスケルトン・カーネルレベル・ドライバの 例 は、デバイス 割 り 込 みの 発 生 とシグナルをトリガにする 割 り 込 みサービス・ルーチン 用 のコードへシグナルを 結 合 する 方 法 を 示 します。このスケルトン・ドライバの 関 する 全 てのコードは、<strong>RedHawk</strong>がインストールされたシステムの/usr/share/doc/ccur/examples/driverディレクトリで 見 つけることが 可 能 です。 割 り 込 み 処 理 とユーザー・レベル・プロセスへのシグナル 送 信 を 行 う 簡 易 カーネルレベル・ドライバを 記 述 するためのテンプレートとしてサンプル・ドライバ(sample_mod)を 使 用 することが 可 能 です。サンプル・ドライバの 機 能 の 理 解 14サンプル・ドライバは、 割 り 込 みを 生 成 するハードウェア・デバイスとしてリアルタイム・クロック(rtc)0を 使 用 します。rtc0は、ConcurrentのReal-Time Clock and Interrupt Module (RCIM) 上 のリアルタイム・クロックの1つです。このクロックは、 所 定 の 分 解 能 で0までカウントダウンし、その後 初 めからやり 直 します。カウントが0に 到 遉 する 度 に 割 り 込 みが 生 成 されます。リアルタイム・クロック0 用 の 設 定 の 一 部邪 は、ドライバがデバイス・レジスタにアクセスする 可 能 性 があるため、それらのレジスタがメモリ 空 間 へマッピングされるモジュールの「 初 期 化 」ルーチン 内 で 実 行 されます。モジュールの「 初 期 化 」ルーチンとして 示 すコードの 最 後 の 部邪 分 は、 割 り 込 みベクタに割 り 込 みルーチンを 結 合 するコードです。********************************************************************************int sample_mod_init_module(void){...// find rcim board (look for RCIM II, RCIM I, and finally RCIM I old rev)dev = pci_find_device(PCI_VENDOR_ID_CONCURRENT, PCI_DEVICE_ID_RCIM_II,dev);if (dev == NULL) { //try another iddev = pci_find_device(PCI_VENDOR_ID_CONCURRENT_OLD, PCI_DEVICE_ID_RCIM, dev);}if (dev == NULL) { //try another iddev = pci_find_device(PCI_VENDOR_ID_CONCURRENT_OLD, PCI_DEVICE_ID_RCIM_OLD, dev);}if (dev == NULL) { //no rcim board, just clean up and exitunregister_chrdev(major_num,"sample_mod");return -ENODEV;}...if ((bd_regs = ioremap_nocache(plx_mem_base, plx_mem_size)) == NULL)return -ENOMEM;...if ((bd_rcim_regs = ioremap_nocache(rcim_mem_base, rcim_mem_size)) == NULL)...return -ENOMEM;sample_mod_irq = dev->irq;res = request_irq(sample_mod_irq, rcim_intr, SA_SHIRQ, "sample_mod", &rtc_info);14-6