12.07.2015 Views

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

RedHawk Linux User's Guide version 6.3 日本語版

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!