我正在为加速度计实现一个SPI驱动程序。SPI部分已经完成,但我无法从用户空间读取值。
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暴徒: SPI字符设备已被打开1次3094.506075暴徒:-349,-512,511,请求大小:49 3094.514487暴徒:发送256个字符给用户3094.522646暴击:字符设备成功关闭3120.658568暴击: SPI字符设备已被打开2次3120.668609暴徒: 0,0,0,0,0,0,0,请求大小:48 3120.676392暴徒:发送256个字符给用户3120.684740暴徒:字符设备成功关闭
我做错了什么?
发布于 2016-11-22 13:54:30
您误解了.read函数的概念:
读取器(用户空间)只看到.read返回的值,并将其解释为已读取的字节数。
至于.read的最后一个参数(在您的例子中是position),它的解释完全取决于驱动程序的作者。position指出的值在打开文件时由内核初始化为0。在此之后,内核本身从不修改它。
如果您希望始终从一开始就读取,则可以忽略position参数:
return size_requested;或者,在语义上更好的是,您可以增加position指出的值,因此它将反映读取的字节总数。但在其他情况下忽略它:
*position += size_requested;
return size_requested;https://stackoverflow.com/questions/40738054
复制相似问题