2016-11-22 15 views
2

私は加速度計用のSPIドライバを実装しています。 SPIの部分は完了しましたが、私はユーザー空間から値を読み取ることができません。Linuxの文字デバイスから読み取ることができません

static char charDevMessage[CD_BUFFER_SIZE] = { 0 }; 
... 
static ssize_t char_dev_read(struct file *filep, char *buffer, size_t len, loff_t *position) 
{ 

    int error_count = 0; 
    struct xyz_values xyz; 
    size_t size_requested; 

    xyz = adxl345_get_xyz(); 
    memset(charDevMessage, 0, CD_BUFFER_SIZE); 
    sprintf(charDevMessage, "%d,%d,%d", xyz.x, xyz.y, xyz.z); 
    printk(KERN_INFO "MOB: %s, requested size: %d\n", charDevMessage, len); 

    if (len >= CD_BUFFER_SIZE) 
    { 
     size_requested = CD_BUFFER_SIZE; 
    } 
    else 
    { 
     size_requested = len; 
    } 

    error_count = copy_to_user(buffer, charDevMessage, size_requested);  

    if (error_count == 0)   
    { 
     printk(KERN_INFO "MOB: Sent %d characters to the user\n", size_requested); 
     return (size_requested = 0);  

    } 
    else 
    { 
     printk(KERN_INFO "MOB: Failed to send %d characters to the user\n", error_count); 
     return -EFAULT;    

    } 
} 

ノードは、ドライバのインストール時に作成されました。しかし、catを試してみたり、pythonで読み込もうとすると、空の文字列が返されます。

dmesgは、正常にユーザ空間に送られてきたと言う:私は間違って何をやっている

[ 3094.495972] MOB: SPI Character device has been opened 1 time(s) 
[ 3094.506075] MOB: -349,-512,511 , requested size:49 
[ 3094.514487] MOB: Sent 256 characters to the user 
[ 3094.522646] MOB: Character device successfully closed 
[ 3120.658568] MOB: SPI Character device has been opened 2 time(s) 
[ 3120.668609] MOB: 0,0,0 , requested size:48 
[ 3120.676392] MOB: Sent 256 characters to the user 
[ 3120.684740] MOB: Character device successfully closed 

+3

'return(size_requested = 0);'は0を返し、0はファイルの終わりを意味します。 – immibis

+0

それはカーネル側からもファイルを閉じますか? – obayhan

+0

最初のprintkにフォーマットエラーがあります。 –

答えて

2

あなたは.read機能の概念をmisaunderstood:

読者(ユーザ空間)が唯一値は.readを返され、を読まれていたバイトの数としてそれを解釈見ています。 (あなたのケースでposition.readから最後のパラメータについては

は、その解釈は完全にドライバの作者次第です。 positionで示される値は、ファイルが開かれたときにカーネルコアによって0に初期化されます。その後、カーネル自体は決して変更されません。それはが反映されますので、意味的により良い、あなたはpositionが指す値を、インクリメントも、

return size_requested; 

または:あなたは常に最初から読みたい場合は

、あなただけpositionパラメータを無視して読み込まれたバイト数。それ以外は無視してください:

*position += size_requested; 
return size_requested; 
+0

ああ私の間違い。私はあなたが今言いましたあなたのポイントを持っています。 – obayhan

+1

いいえ、ゼロはEOFを意味します。*は何も読み取られていません*。そうでない場合は、負のリターンコードでは、ユーザー空間になりますreadから '-1'を返し、' errno'はその戻りコードに設定されます。その差は正の値になります。 –

+0

よろしいですか?ありがとうございました – obayhan

関連する問題