Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxキャラクタデバイスによって駆動される3つの重要なデータ構造

Linuxキャラクタデバイスによって駆動される3つの重要なデータ構造

  
 

Linuxキャラクタ型デバイスドライバの3つの重要なデータ構造は、次のとおりです。

structファイル

struct inode

strude file_operations

ここで、structファイルは、開いているファイルstruct inodeは、ファイルの物理情報を記録するために使用されます。

strude file_operationsは関数ポインタの集まりです以下はGPIOドライバとアプリケーションの例の説明です:

最初の部分はドライバです:

//------------------- OPEN ------------------------ ssize_t SIMPLE_GPIO_open(struct) iノード* inode、ファイル* file){#ifdef OURS_GPIO_DEBUG printk(" SIMPLE_GPIO_open [--kernel - ] \\ n"); #endif return 0;}

//------ ------------- RELEASE /CLOSE --------------- ssize_t SIMPLE_GPIO_release(inode * inode、struct file * file){#ifdef OURS_GPIO_DEBUG printk( " SIMPLE_GPIO_release [--kernel - ] \\ n"); #endif

return 0;}

//--------------- ---------------------------------- struct file_operations gpio_fops = {

.open = SIMPLE_GPIO_open、 .read = SIMPLE_GPIO_read、.write = SIMPLE_GPIO_write、.ioctl = SIMPLE_GPIO_ioctl、.release = SIMPLE_GPIO_release、};

gpio_fopsでstruct file_operationsとして定義されています。 = SIMPLE_GPIO_openは、実際にSIMPLE_GPIO_open関数を呼び出すためのアプリケーションのopen関数を定義します。

ドライバで定義されているssize_tを参照してください。SIMPLE_GPIO_open(struct inode * inode、struct file * file)
2つのデータ構造はここでは無視されます。 (パラメータなどを書き込まないでください)

アプリケーションで呼び出しを確認します。

#define DEVICE_NAME" /dev /gpio>

int main(void){int fd; int ret; char * i;

printf(" \\ n開始gpio_led_driver test \\ n \\ n");

fd = open(DEVICE_NAME、O_RDWR); printf(" fd = %d \\ n"、fd);

if(fd == -1){printf("オープンデバイス%sエラー\\ n"; DEVICE_NAME);}


アプリケーション呼び出しのopen関数の引数がopen(DEVICE_NAME、O_RDWR);

ここで#define DEVICE_NAME" /dev /gpio"、O_RDWRとは、開いて書き込むことを意味します。

ドライバでは、xxxopen関数は本に従って書くことができます、パラメータは完全に無視することができます(関数本体は内容を書くことができます、私は何をすべきかわかりません)

アプリケーションのopen関数パラメータLinuxアプリケーション本に書かれているパラメータによると、

Copyright © Windowsの知識 All Rights Reserved