アドテック8815デバイスドライバ仕様(暫定版) 外部仕様  イントロダクション   目的 アナログ信号を取り込む。   ハード アドテック製12ビットADCボード。 差動8チャンネル、シングルエンド16チャンネル 入力レンジ及び入力方式により8種類の型番が存在する。しかしスイッチの 設定で変更することが可能。但し、出荷時には製品型番にあった校正がされ ている。入力レンジは、0 ~ +1[V], 0 ~ +2.5[V], 0 ~ 5[V], 0 ~ +10[V], -1 ~ +1[V], -2.5 ~ +2.5[V], -5 ~ +5[V], -10 ~ +10[V]。 入力方式は、差動入力およびシングルエンド入力。   ソフト ?(何を書く)  インストレーション   入手方法    下記より入手する。     http://xxxxx   設置・設定    ハードウエア AD変換の終了割り込みのみを使用するのでJ3スイッチの1番と4番を短 絡する。 データの最上位ビットの反転設定を必要に応じて行う(取説P28) 今回使用したボードは入力レンジ 0 ~ +5[V]または -10 ~ +10[V]の作動入 力ボードである。    ソフトウエア  デバイスドライバユーザインタフェース詳細 int adtek_8815_open(struct inode *inode, struct file *file) ADCボードをオープンし使用できるようにする。 単一オープンで他のプロセスが使用中は-EBUSYを返し、デバイスが 存在しない場合は-NODEVを返す。    int adtek_8815_close (struct inode *inode, struct file *file) ADCボードをクローズする。使用中を解除。 int adtek_8815_read ( struct file *file, char *buf, size_t count, loff_t *ppos) ADCボードからデータを取得する。 buf adtek_8815_write()で設定した容量のデータを取り込む。     1つのデータは2バイトからなり連続している。 データの上位12ビットがAD変換された値で、下位4ビットに はチャンネル番号が入る。 int adtel_8815_write ( struct file *file, const char *buf, size_t count, loff_t *ppos) ADCボードの設定をする。 下記4つの値を変数buf に順番に設定する。 mode:SINGLE_SINGLECHN 固定チャンネル計測、chn: 計測チャンネル chn は0から7までを指定する。 mode:AUTO_INCRIMENT オートインクリメンタル計測。 chn:終了計測チャンネル chn は0から7までを指定する。 count 計測回数 interval 計測間隔。計測時間はinterval * 計測チャンネル数となる。 設定できる値は、12[usec]から1[msec]までは4[usec]単位。 1[msec]から250[msec]までは1[msec]単位。250[msec]から 64[sec]までは250[msec]単位である。  デバイスドライバの使用方法  パフォーマンス   ボードにハード的なバグが存在するため測定していない。現在メーカの修正待ち。  参考文献   http://www-online.kek.jp/~yasu/Kenshu/ http://130.34.89.3/~kumagai/linux/drivers/indexw.html LINUXデバイスドライバ オライリージャパン PCIバスによるI/O制御 オーム社 TECHI Vol5 技術者のためのUNIX系OS入門 CQ出版社 ボード取り扱い説明書 内部仕様  イントロダクション   目的 アナログ信号を取り込む。   ハード アドテック製12ビットADCボード。 差動8チャンネル、シングルエンド16チャンネル 入力レンジ及び入力方式により8種類の型番が存在する。しかしスイッチの 設定で変更することが可能。但し、出荷時には製品型番にあった校正がされ ている。入力レンジは、0 ~ +1[V], 0 ~ +2.5[V], 0 ~ 5[V], 0 ~ +10[V], -1 ~ +1[V], -2.5 ~ +2.5[V], -5 ~ +5[V], -10 ~ +10[V]。 入力方式は、差動入力およびシングルエンド入力。   ソフト ?(何を書く)  デバイスドライバユーザインタフェース詳細 int adtek_8815_open (struct inode *inode, struct file *file) ADCボードをオープンし使用できるようにする。正常終了時はファイル 識別番号を返す。それ以外はエラーを返す。 デバイスが存在しない -ENODEV 他のプロセスが使用中のときは-EBUSY 割り込みハンドラを設定する。 int adtek_8815_close (struct inode *inode, struct file *file) ADCボードをクローズする。使用中を解除し割り込みハンドラも解除す る。 int adtek_8815_read ( struct file *file, char *buf, size_t count, loff_t *ppos) ADCボードの変換スタートのフラグを1にしてスリープする。 割り込みルーチンからの変換終了でウエークアップし、計測されたデータ を取得する。 データは2バイトで変換された順に連続して書き込まれる。 データの上位12ビットがAD変換された値で、下位4ビットにはチャン ネルアドレスが入る。チャンネルアドレス0がチャンネル1である。 ボードのハードウエア設定によってデータの換算式がことなるのでデータ の換算はユーザープログラムで実行する。 データは adtek_8815_writeで確保されたメモリに順次書き込む。 adtek_8815_writeで設定された計測回数(オートインクリメンタル設定時 は終了チャンネル数X計測回数)に達した時にADCボードの変換スター トフラグを0にする。 計測終了時にデータをユーザ空間のメモリにコピーする。 int adtel_8815_write( struct file *file, const char *buf, size_t count, loff_t *ppos) ADCボードの設定をする。データ取得の為の必要メモリを確保する。 下記4つの値を変数buf に順番に設定する。 mode:SINGLE_SINGLECHN 固定チャンネル計測、chn: 計測チャンネル chn は0から7までを指定する。 mode:AUTO_INCRIMENT オートインクリメンタル計測。 chn:終了計測チャンネル chn は0から7までを指定する。 count 計測回数 interval 計測間隔。計測時間はinterval X 計測チャンネル数となる。 設定できる値は、12[usec]から1[msec]までは4[usec]単位。 1[msec]から250[msec]までは 1[msec]単位。 250[msec]から 64[sec]までは 250[msec]単位である。 int adtek_8815_interrupt(int irq, void *dev_id, struct pt_regs *regs)) ADCボードから変換終了毎に割り込まれる。 adtek_8815_read をウエークアップする。  パフォーマンス詳細   未測定  アペンディクス  参考文献   外部仕様を参照 ----------------------------------------------------------------------------------- アドバネット製 A3pci2610 アナログ入力ボード(暫定版) 外部仕様  イントロダクション   目的 アナログ信号を取り込む。   ハード アドバネット製16ビットADCボード。 差動入力8チャンネル、シングルエンド入力16チャンネル 入力レンジは、0 ~ 5[V], 0 ~ +10[V], -10 ~ +10[V], 0 ~ 20[mA]。   ソフト  インストレーション   入手方法   設置・設定    ハードウエア ボードIDを0にする。アナログ入力レンジをジャンパ線で設定する。 現在複数枚のボード使用を考慮していない。    ソフトウエア  デバイスドライバユーザインタフェース詳細 int advanet_2610_open(struct inode *inode, struct file *file) ADCボードをオープンし使用できるようにする。 単一オープンで他のプロセスが使用中は-EBUSYを返し、デバイスが存在しな い場合は-NODEVを返す。     int aadvanet_2610_close (struct inode *inode, struct file *file) ADCボードをクローズする。使用中を解除。 int adtek_8815_read ( struct file *file, char *buf, size_t count, loff_t *ppos) ADCボードからデータを取得する。 buf advanet_2610_write()で設定した容量のデータを取り込む。 1つのデータは2バイト*8(差動8チャンネル)からなり連続し ている。 int advanet_2610_write ( struct file *file, const char *buf, size_t count, loff_t *ppos) ADCボードの設定をする。 下記4つの値を変数buf に順番に設定する。 mode:SINGLE_MULTICHN 1回のみサンプリングする。 データは2バイト*8 mode:MULTI_MULTICHN 指定回数サンプリングする。 データは2バイト*8*回数。 mode:CONTINUAS_MULTICHN プログラム停止まで無限回数サンプリングする。 count 計測回数。 interval 計測間隔。計測時間はinterval X 計測回数となる。 設定できる値は、500[usec]から32768[msec]までで 0.5[msec] ステップである。 int advanet_2610_ioctl ( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) EEPROMのデータを呼び出しているが、全てゼロが返ってくる。(間違ってい るかも?)  デバイスドライバの使用方法 # mknod -m 666 /dev/advanet_2610 c 252 0(252はmajor番号で、システムの空き番 号を指定する) # insmod advanet_2610.o (major番号を自動割り付けする時。この 場合、mknodで必要なデバイスファイルが ないとエラーとなる。) # insmod advanet_2610.o major=252 (major番号を指定するとき)  パフォーマンス [tadano@pfmon16 evaluate_pro]$ ./cputime Measurement elapsed time : 0.020000 microsec. cpu time : 0.020000 microsec. [tadano@pfmon16 evaluate_pro]$ ./gettimeofday elapse time of 'for (i = 0; i < 1000; {}' = 4 in microsec. overhead of gettimeofday = 6 in microsec. [tadano@pfmon16 evaluate_pro]$ ./precision elapsed time for usleep(1000) = 11761 in microsec. elapsed time for nanosleep(1000000) = 19622 in microsec. [tadano@pfmon16 evaluate_pro]$ ./rdtsctest current clock is 7bfea751d5be count in hex. No instruction took 27 count in dec. for ( i = 0; i < 10; i++) statement took 73 count for ( i = 0; i < 100; i++) statement took 252 count for ( i = 0; i < 1000; i++) statement took 2054 count usleep (1000000) tool 234355264 count. usleep (1000) tool 4599602 count. [tadano@pfmon16 evaluate_pro]$ ./time-precision times: utime defference = 0 times: stime difference = 1 gettimeofday : sec diffence = 0 gettimeofday : usec diffence = 2 [tadano@pfmon16 evalute_pro]$ ./single_measure program start get memory size 16 mode = 2 count 1 interval = 1000 Advanet 2610 ADC single read takes 187 microsec. overhead 1 microsec. chn = 0 data:446d 17517 -4.765937 chn = 1 data:800b 32779 0.003438 chn = 2 data:446c 17516 -4.766250 chn = 3 data:800c 32780 0.003750 chn = 4 data:4469 17513 -4.767188 chn = 5 data:8009 32777 0.002812 chn = 6 data:446b 17515 -4.766563 chn = 7 data:800b 32779 0.003438  デバイスドライバの使用方法  パフォーマンス   ボードにハード的なバグが存在するため測定していない。現在メーカの修正待ち。  参考文献   http://www-online.kek.jp/~yasu/Kenshu/ http://130.34.89.3/~kumagai/linux/drivers/indexw.html LINUXデバイスドライバ オライリージャパン PCIバスによるI/O制御 オーム社 TECHI Vol5 技術者のためのUNIX系OS入門 CQ出版社 ボード取り扱い説明書 内部仕様  イントロダクション   目的 アナログ信号を取り込む。   ハード アドバネット製16ビットADCボード。 差動8チャンネル、シングルエンド16チャンネル   ソフト  デバイスドライバユーザインタフェース詳細 init_module (void) insmodの時に呼ばれる。デバイスの登録。/proc/devicesファイルに追 加される。 ADCボードのIOアドレス、割り込み番号のセット。major番号をゼ ロにしておくとシステムで空いている番号を取得する。 cleanup_module (void) rmmodで呼ばれる。デバイスの削除。/proc/devicesファイルから削除さ れる。 int advanet_2610_open (struct inode *inode, struct file *file) init_2610_boardを呼び出し、ボードを初期化し使用できるようにする。正常 終了時はファイル識 別番号を返す。それ以外はエラーを返す。 デバイスが存在しない -ENODEV 他のプロセスが使用中のときは-EBUSY 割り込みハンドラを設定する。/proc/interruptsファイルに追加される。 int advanet_2610_close (struct inode *inode, struct file *file) ADCボードをクローズする。使用中を解除し、割り込みハンドラも解除す る。/proc/interruptsファイルから削除される。 int advanet_2610_read ( struct file *file, char *buf, size_t count, loff_t *ppos) ADCボードの変換データを読み込む。 データの取得が完了していない場合、スリープしているというフラグを立て てスリープする。割り込みルーチンからの変換終了でウエークアップし、計 測されたデータを取得する。asvanet_2610_writeで指定されたmodeで計測が 終了していなければ再度スリープする。計測が終了していればデータを取り 込みADCボードの変換スタートフラグを0にしユーザプログラムに戻る。 データは2バイトで変換された順に連続して書き込まれる。 データ16ビットのAD変換された値が8チャンネル連続で入る。 ボードのハードウエア設定によってデータの換算式がことなるのでデータ の換算はユーザープログラムで実行する。 データは advanet_2610_writeで確保されたメモリに順次書き込む。 計測終了時にデータをユーザ空間のメモリにコピーする。 int advanet_2610_write( struct file *file, const char *buf, size_t count, loff_t *ppos) ADCボードの設定をする。データ取得の為の必要メモリを確保する。 下記4つの値を変数buf (構造体)に順番に設定する。 mode:SINGLE_MULTICHN 1回だけサンプリング。 mode:MULTI_MULTICHN 設定回数計測。 mode:CONTINUAS_MULTICHN 無限回数計測。 count 計測回数 interval 計測間隔。計測時間はinterval x 計測回数数となる。 設定できる値は、500[usec]から32768[msec]まで。0.5[msec] ステップ。 int advanet_2610_interrupt(int irq, void *dev_id, struct pt_regs *regs)) ADCボードから変換終了毎に割り込まれる。 advanet_2610_read が割り込み待ちになっていたら起こす。 int eeprom_read (unsigned int cmd) ボード搭載のeepromからADCのオフセット、ゲイン補正係数を読み出す。 advanet_2610_ioctlからcmd をセットして呼び出される。 呼び出した値が何故か0。呼び出し方に問題ありか? int init_2610_board() ADCボードを初期化する。 割り込みの禁止。トリガーモードをソフトトリガーにする。 ADCが停止しているのをチェック。 FIFOバッファが空でなかったらゼロクリアする。 全ての割り込み要因をクリアする。 ファイルテーブル read: advanet_2610_read write: advanet_2610_write ioctl: advanet_2610_ioctl open: advanet_2610_open close: asvanet_2610_close 他: NULL  パフォーマンス詳細   未測定  アペンディクス  参考文献   外部仕様を参照 ----------------------------------------------------------------------------------- アドテック製 8132 デジタル入力ボード仕様(暫定版) 外部仕様  イントロダクション   目的 デジタル入力信号を取り込む。   ハード アドテック製デジタル入力ボード。 入力は64点(8ビットx8ポート)。 割り込みは64点のうち4点(固定)のみ。 16枚まで同時使用が可能。   ソフト  インストレーション   入手方法   設置・設定    ハードウエア ボードIDを0にする。アナログ入力レンジをジャンパ線で設定する。 現在複数枚のボード使用を考慮していない。    ソフトウエア  デバイスドライバユーザインタフェース詳細 init_module(void) ボードの登録をする デバイスドライバは複数枚の同時使用を現在はサポートしていない。 int advanet_2610_open(struct inode *inode, struct file *file) 入力割り込みをサポートする。 割り込みの使用はモジュールを組み込む時に指定する。 割り込みはポート1及びポート2のビット0とビット1の4点のみである。 adtek_8132_open(struct inode *inode, struct file *file) DIボードをオープンし使用できるようにする。 単一オープンで他のプロセスが使用中は-EBUSYを返し、デバイスが存在しな い場合は-NODEVを返す。    adtek_8132_close (struct inode *inode, struct file *file) DIボードをクローズする。使用中を解除。 adtek_8132_read ( struct file *file, char *buf, size_t count, loff_t *ppos) DIボードからデータを取得する。 buf 8ボート(1ポート当たり8ビット)のデータを取り込む。 adtek_8132_interrupt (int irq, void *dev_id, struct pt_regs *regs) 割り込み許可フラグで許可されている入力からの割り込みを受け付ける。 現在割り込みがあったということしかサポートしていない。  デバイスドライバの使用方法 # mknod -m 666 /dev/adtek_8132 c 252 0 # insmod adtek_8132.o major=252 irq=0x01 デバイスのメジャー番号を指定。割り込みを使用する。 majorはデバイスファイルの番号 irq は0x01, 0x02, 0x10, 0x20のand/orで4つまで。 # insmod adtek_8132.o major番号は自動割り付け。但し、デバイスファイルと番号があっていない と動作しない。割り込みを使用しない。  パフォーマンス   未測定。  参考文献   http://www-online.kek.jp/~yasu/Kenshu/ http://130.34.89.3/~kumagai/linux/drivers/indexw.html LINUXデバイスドライバ オライリージャパン PCIバスによるI/O制御 オーム社 TECHI Vol5 技術者のためのUNIX系OS入門 CQ出版社 ボード取り扱い説明書 内部仕様 adtek_8132_open (struct inode *inode, struct file *file) ボードをオープンし使用できるようにする。正常終了時はファイル識別番号 を返す。それ以外はエラーを返す。 デバイスが存在しない -ENODEV 他のプロセスが使用中のときは-EBUSY 割り込みハンドラを設定する。 adtek_8132_close (struct inode *inode, struct file *file) ボードをクローズする。使用中を解除し割り込みハンドラも解除する。 adtek_8815_read ( struct file *file, char *buf, size_t count, loff_t *ppos) 全入力ポート(8ビットx8ポート)の状態を読み込む。 adtek_8815_interrupt(int irq, void *dev_id, struct pt_regs *regs)) 割り込みはポート1およびポート2の入力1と2に限定される。 マスクを設定することで4つのうちどれを割り込みにするかも 指定できる。  パフォーマンス詳細   未測定  アペンディクス  参考文献   外部仕様を参照 ----------------------------------------------------------------------------------- アドテック製 8133デジタル出力デバイスドライバ仕様(暫定版) 外部仕様 adtek_8133_open(struct inode *inode, struct file *file) ボードをオープンし使用できるようにする。 単一オープンで他のプロセスが使用中は-EBUSYを返し、デバイスが 存在しない場合は-NODEVを返す。    adtek_8133_close (struct inode *inode, struct file *file) ボードをクローズする。使用中を解除。 adtel_8133_write ( struct file *file, const char *buf, size_t count, loff_t *ppos) データを出力する。 下記2つの値を変数buf に順番に設定する。 data 出力データ port 出力ポート  デバイスドライバの使用方法  パフォーマンス   ボードにハード的なバグが存在するため測定していない。現在メーカの修正待ち。  参考文献   http://www-online.kek.jp/~yasu/Kenshu/ http://130.34.89.3/~kumagai/linux/drivers/indexw.html LINUXデバイスドライバ オライリージャパン PCIバスによるI/O制御 オーム社 TECHI Vol5 技術者のためのUNIX系OS入門 CQ出版社 ボード取り扱い説明書 内部仕様 adtek_8133_open (struct inode *inode, struct file *file) ボードをオープンし使用できるようにする。正常終了時はファイル 識別番号を返す。それ以外はエラーを返す。 デバイスが存在しない -ENODEV 他のプロセスが使用中のときは-EBUSY adtek_8133_close (struct inode *inode, struct file *file) ボードをクローズする。使用中を解除し割り込みハンドラも解除する。 adtel_8133_write( struct file *file, const char *buf, size_t count, loff_t *ppos) データを出力する。 下記4つの値を変数buf に順番に設定する。 data 出力データ port 出力ポート  パフォーマンス詳細   未測定  アペンディクス  参考文献   外部仕様を参照 ----------------------------------------------------------------------------------- アドバネット A6pci1108 cPCI/VMEブリッジボード デバイスドライバ仕様(暫定版) 外部仕様  イントロダクション   目的 コンパクトPCIバスからVMEバスのボードをアクセスする為に使用する VMEボードのスケーラ(RPV−100)とインプットレジスター (RPV−130)をアクセスする。VMEボードのデバイスドライバとい う形式にはなっていない。   ハード アドバネット製A6pci1108 cPCI/VMEブリッジボード 共有メモリ256Kビット ボード占有メモリ空間16Mバイト。16Mバイト全てにはアクセスできな い。 VMEバスのA24及びA16に対応。 入力は64点(8ビットx8ポート)。 割り込みは64点のうち4点(固定)のみ。 16枚まで同時使用が可能。   ソフト 現在メモリのアクセスが出来ることだけを確認した程度。  インストレーション   入手方法 http://xxxx   設置・設定    ハードウエア 共有メモリアドレスを設定する。 VME特設レジスタアドレスを設定する。 複数枚のボード使用はありえない。    ソフトウエア  デバイスドライバユーザインタフェース詳細 init_module (void) insmodの時に呼ばれる。デバイスの登録。/proc/devicesファイルに追 加される。 IOアドレス、割り込み番号のセット。major番号をゼロにしておくと システムで空いている番号を取得する。 cleanup_module (void) rmmodで呼ばれる。デバイスの削除。/proc/devicesファイルから削除さ れる。 advanet_1108_open(struct inode *inode, struct file *file) ボードをオープンし使用できるようにする。 単一オープンで他のプロセスが使用中は-EBUSYを返し、デバイスが 存在しない場合は-NODEVを返す。    advanet_1108_close (struct inode *inode, struct file *file) ボードをクローズする。使用中を解除。 advanet_1108_read ( struct file *file, char *buf, size_t count, loff_t *ppos) スケーラボードからデータを取得する。 bufにデータをコピーする。 advanet_1108_write ( struct file *file, const char *buf, size_t count, loff_t *ppos) I/Oレジスタボードにアクセスする。bufを構造体にし書き込むデータを セットする。構造体は下記のようになっており、modeとw_bitをセットすれ ばよい。modeはWRITE_BITだけである。 typedef struct { short mode; short number; int interval_sec; int interval_usec; unsigned char w_bit; unsigned char r_bit; } set_up_t; advanet_1108_interrupt(int irq, void *dev_id, struct pt_regs *regs)) ボードのアクセスを試したのみなので、割り込み等必要な機能のチェックは していない。 advanet_1108_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) この機能を多分多様するであろうがまだ何もしていない。  デバイスドライバの使用方法 # mknod -m 666 /dev/advanet_1108 c 253 0 # /sbin/insmod advanet_1108.o major=253 (major番号指定) # /sbin/insmod advanet_1108.o (major番号の自動割り付け)  パフォーマンス   パフォーマンスを測定できるようなデバイスドライバには至っていない。  参考文献   http://www-online.kek.jp/~yasu/Kenshu/ http://130.34.89.3/~kumagai/linux/drivers/indexw.html LINUXデバイスドライバ オライリージャパン PCIバスによるI/O制御 オーム社 TECHI Vol5 技術者のためのUNIX系OS入門 CQ出版社 ボード取り扱い説明書 内部仕様 advanet_1108_open(struct inode *inode, struct file *file) ボードをオープンし使用できるようにする。 単一オープンで他のプロセスが使用中は-EBUSYを返し、デバイスが 存在しない場合は-NODEVを返す。    advanet_1108_close (struct inode *inode, struct file *file) ボードをクローズする。使用中を解除。 advanet_1108_read ( struct file *file, char *buf, size_t count, loff_t *ppos) ボードからデータを取得する。 buf advanet_1108_write ( struct file *file, const char *buf, size_t count, loff_t *ppos) advanet_1108_interrupt(int irq, void *dev_id, struct pt_regs *regs))  パフォーマンス詳細   未測定  アペンディクス  参考文献   外部仕様を参照