2017-12-06 9 views
0

私はLinuxカーネルモジュールのcharデバイス(SuSE 13.2 Kernel 3.16.6)と、このデバイスを使用するためのアプリケーションを作成しました。カーネルモジュールでのアクセス

原則として、ドライバ、アプリケーション、および通信が機能します。アプリケーションは、charデバイスを開いたり、読み書きしたり、閉じることができます。

しかし、アプリケーションがいつかモジュールの書き込み機能への参照を「失った」という散発的な問題があります。アプリケーションからモジュールへの3から4(たまにはるかに多くの)書き込みコマンドの後、モジュールの書き込み機能は実行されません。

私は減少し、モジュール内部の書き込み機能:

static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset) 
{ 
    printk(KERN_ERR "INSIDE\n"); 
    return 0; 
} 

そして、私はまたapplcationを削減:

int main (int argc, char **argv) 
{ 
    unsigned short buffer=0xffff; 
    fd = open ("/dev/MYPCI" , O_SYNC | O_RDWR); 
    OUTPW (0, buffer ,fd); 
    OUTPW (2, buffer,fd); 
    OUTPW (4, buffer,fd); 
    OUTPW (196, buffer,fd); 
    OUTPW (70000, buffer,fd); 
    OUTPW (400, buffer,fd); 

    printf("DEV-Handle: %d\n", fd); 
    close (fd); 
} 

int OUTPW (unsigned short ByteAddr, unsigned short value, int fd) 
{ 
    int x; 
    int size = (ByteAddr/2) <<16; 
    size +=2;    

    printf ("\nByteAddr:0x%08hX value:0x%08hX size:0x%08hX WRITE-Handle: 0x%04hX\n" , ByteAddr,value,size, &write); 

    x= write(fd, &value, size) ; 

    return x; 
} 

出力はこのロークになります。いつか私は3回読むことができます。いつかは4回読むことができます。 screenshoot of outputs

書き込み関数ハンドルは有効です。 1つの書き込みコマンドが失敗すると、それ以降のすべてのコマンドも失敗します。 &をもう一度開くと、(アプリケーション内で)書き込みが一時的に修正されます。

読み取りコマンドでも同じ動作があります。

アイデア?ドライバ機能FWRITE()戻り長

+0

ドライバコードは? –

+0

fWrite()で十分ですか?運転手はかなり長く、内部にはいくつかのノウハウ/商業的に敏感な部品があります。どの部分が必要ですか? – Tobias

+0

ファイルポインタを有効にしていますか?コード内のどこかの競合条件のために破損していますか? –

答えて

0

代わりに0

static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset) 
{ 
printk(KERN_ERR "INSIDE\n"); 
return length; 
} 
関連する問題