Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxカーネルのキャラクタデバイスインタフェースは、

Linuxカーネルのキャラクタデバイスインタフェースは、

  

キャラクタデバイスは、そのようなので、上の一般的なタッチスクリーン、LCD及びとして最大のハードウェアデバイス、です。

一般的キャラクタデバイスに属しているシーケンシャルアクセスデータを必要とすると考えられ、カードは、ネットワークプロトコルスタックに関連した処理の多くを必要とすることを除いて、キャラクタデバイスと見なすことができます。ブロックにデータの読み書きが、より重要なことに、すぐにアクセスすることができる:ブロックデバイス特性があります。不要な問題を避けるために、より複雑な、しかし、構造や原則から、より操作する2.4カーネルより

2.6カーネル、科学的な強化。以下は、精巧または2を期待して、ドライブの最近の例の著者です。我々は、実行時にカーネル空間で実行されるドライバを必要と上位のソフトウェアアプリケーション、
オペレーティングシステムを提供するために駆動する必要がある最後に、私たちが使用する必要があるため

駆動開発は、モジュール形式で行われますカーネルへの我々のドライバーの固定方法は、モジュールは、私たちのために、このような方法を提供します。次のように、モジュール内の特定の実装を必要とし、名前の関数として

tdm_initとtdm_exit module_init(dvr_tdm_init);;; module_exit(dvr_tdm_exit)MODULE_LICENSE(; GPL""):

静的構造体file_operations dvr_tdm_fops = {読み取り:dvr_tdm_readを、書き込み:dvr_tdm_writeを、オープン:dvr_tdm_open、放出:dvr_tdm_releaseを}; 0 #IFこのような構成は、これらの機能の実装は、多くの高度な機能を実装することができる増加、関数ポインタを多く含みます、以下のような:1、ブロッキングデバイス(主に使用DECLARE_WAIT_QUEUE_HEAD(名前)で、非ブロッキングを達成するために、init_waitqueue_head(wait_queue_head_t *名); wait_event_interruptible(キュー、条件)のボイドwake_up_interruptible(wait_queue_head_t *キュー);参照:同時競争2、同時で大会3、0.4がコントロールIOハードウェア、mmap.5のカーネル空間を実現するために選択機能のサポートを実装する。

#E NDIF

静的構造体CDEVの*のdvr_tdm_cdev、静的のdev_t tdm_dev_t;

静的int型__init dvr_tdm_init(無効){RET = alloc_chrdev_region(& tdm_dev_t、0、DVR_TDM_COUNT、DRV_NAME);場合(RET! = 0){のprintk(KERN_ERR" alloc_chrdev_reginが\\を失敗N");ジャンプアウト;} dvr_tdm_cdev = cdev_alloc(); dvr_tdm_cdev-> OPS =& dvr_tdm_fops; dvr_tdm_cdev->所有者= THIS_MODULE; //INITドライバinterfacescdev_init( dvr_tdm_cdev、& dvr_tdm_fops);デバッグ(" \\ n"を初期化dvr_tdm_init :! CHR装置;);

RET = cdev_add(dvr_tdm_cdev、tdm_dev_t、DVR_TDM_COUNT); dvr_tdm_init;(RET){のprintk("場合: CHR装置は\\ N"を加え;);}他{のprintk(" dvr_tdm_init:CHRデバイス\\ N"を追加することはできません;);}アウト:復帰RET;}

静的ボイド__exitのdvr_tdm_exit(ボイド){unregister_chrdev_region(tdm_dev_t 、DVR_TDM_COUNT); cdev_del(dvr_tdm_cdev);}関数の前と__exitの__initロール名:__出口は、カーネルの初期化領域でのコードの開始を宣言し、エリアコードは一度だけ実行され、実行の終了後に、コードがあります廃棄されました。標識__exitコードを廃棄しました。これらの2つのステートメントは、スタンドアロンモジュールでは、上記の文は意味がない場合、モジュールは、準備のときにカーネルに追加されます。ここでは、読み取りの基本的な実現はオープン放出機能ドライブを作成しています。静的int型dvr_tdm_open(構造体のinode * iノード、構造体ファイル*の財投){モジュールがカーネルに挿入された場合は、モジュールが参照カウントをインクリメント//もし(try_module_get(THIS_MODULEを)!);モジュールがカーネルに挿入されていない場合、それは0を返します。エラーが発生しました。 printk(" try_module_getエラー\\ n個");デバッグ(" dvr_tdm_open:ドライバーランOK \\ n個");

の戻り0;}

静的はssize_tのdvr_tdm_write(構造体ファイル*ファイル、 CONSTチャー__user * bufは、size_tのカウント、loff_t *オフセット){短いINT pcm_buffer [TDM_FRAME_LENGTH]署名され; INT RET; RET = copy_from_user(pcm_buffer、BUF、カウント); dvr_tdm_write;(RET)のprintk("場合:%Xあります、RET); //...戻り0;}

静的int型dvr_tdm_release(構造体iノード* iノード、構造体のファイル*の財投){module_put(THIS_MODULEバイトは、ユーザ\\ N"から読み取ることができません);デバッグ(" dvr_tdm_release:ドライバのリリースOK \\ n個");

の戻り0;}

静的はssize_tのdvr_tdm_read(構造体ファイル*ファイル、char型の__user * bufは、size_tの数、loff_t * POS){短いINT pcm_buffer [TDM_FRAME_LENGTH]署名され; INT RET; //...データRET = copy_to_user(BUF、pcm_buffer、TDM_FRAME_LENGTH)を得る;(RET)のprintk("場合、dvr_tdm_read:%xバイトが存在することができます「tは、ユーザ\\ N"ため読み取る; RET); 0を返す;}

のMakefile:ifneq($(KERNELREASE))OBJ-M + = Mpc8315_tdm.oelseKERNELDIR = /ホーム/ウィルソン/LTIB /回転数/BUILD /linuxの/buildobj-M + = dvr_tdm.odvr_tdm-OBJS :? = Tdm_driver.oPWD:= $(シェルPWD)ALL:$(MAKE)ARCH = PowerPCのCROSS_COMPILE =のpowerpc-e300c3-linuxの-gnu- O =構築-C $(KERNELDIR)M = $(PWD)modulescleanます。rm * .oの* .koendif

デバイスノードを作成:!#/binに/SH

モジュール=" dvr_tdm"デバイス=" dvr_tdm"モード= 664error ="エラー:dvrのTDMデバイス"を見つけることができません。

insmodの./$module.ko $ * | |  終了1major = `猫の/proc /デバイス|  グレップの$デバイス|  AWK [-z $主要]ならば、$エラーをエコー ` '{$ 1印刷}';出口1fi

RM -fは/dev /$ {デバイス}

Copyright © Windowsの知識 All Rights Reserved