2016-11-22 77 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

您misaunderstood的.read函数的概念:

读者(用户空间)只能看到值由.read返回并把它解释为数量已经读取字节。

至于最后一个参数.readposition你的情况),其解释完全处于驾驶员的作者。值为position,由内核核心在文件打开时被初始化为0。之后,内核本身从不修改它。

如果你想永远从一开始读,你可能只是忽略position参数:

return size_requested; 

或者语义上更好,你可以增加值,由position指出,所以它会反映读取的字节数。但否则忽略它:

*position += size_requested; 
return size_requested; 
+0

哦,我的错误。我明白了你现在告诉你的观点。感谢您的努力(:那么零意味着什么阅读和负值意味着错误照常权 – obayhan

+1

没有,零表示EOF,这是不一样的*不读*否则肯定的,负面返回代码,用户空间将得到? '-1'读取,'errno'将被设置为返回码,不同之处在于它是正的。 –

+0

哦,好的。谢谢 – obayhan