【发布时间】:2018-12-17 20:53:59
【问题描述】:
我正在尝试编写一个简单的 Raspberry Pi GPIO 驱动程序,其中四个开关连接到四个 GPIO 引脚,用于读取每个开关状态。问题是,我不确定如何从内核写入用户空间,当我插入设备内核模块并尝试使用cat 命令读取设备文件时,我什么也没得到。
device_read函数如下:
static ssize_t gpio_driver_read(struct file *filp, char *buf, size_t len, loff_t *f_pos)
{
/* Size of valid data in gpio_driver - data to send in user space. */
int data_size = 0;
/* Counter for 'for' loop. */
int i;
/* Print to kernel space. */
printk(KERN_INFO "Reading active Switch state...\n");
for (i = 0; i < 4; i = i+1)
{
printk(KERN_INFO "Loop number %d...\n", i);
/* TODO: fill gpio_driver_buffer here. */
if (i == 0 && mySwitches[0])
sprintf(gpio_driver_buffer, "gpio_driver: gpio12 value: %d\n", GetGpioPinValue(GPIO_12));
else if (i == 1 && mySwitches[1])
sprintf(gpio_driver_buffer, "gpio_driver: gpio16 value: %d\n", GetGpioPinValue(GPIO_16));
else if (i == 2 && mySwitches[2])
sprintf(gpio_driver_buffer, "gpio_driver: gpio20 value: %d\n", GetGpioPinValue(GPIO_20));
else if (i == 3 && mySwitches[3])
sprintf(gpio_driver_buffer, "gpio_driver: gpio21 value: %d\n", GetGpioPinValue(GPIO_21));
printk(KERN_INFO "%s\n", gpio_driver_buffer);
/* Get size of valid data. */
data_size = strlen(gpio_driver_buffer);
printk(KERN_INFO "%d\n", data_size);
/* Send data to user space. */
if (copy_to_user(buf, gpio_driver_buffer, data_size) != 0)
{
return -EFAULT;
}
}
return 0;
}
gpio_driver_buffer 是一个默认大小的数组(我将其设置为 80)。mySwitches 是一个由 4 个元素组成的数组,每个元素的值为 0 或 1(我将其作为参数传递插入内核模块时,1表示我想看开关的状态,0表示我不看开关)。GetGpioPinValue是一个返回开关状态的函数。
问题是,当我尝试使用cat 命令读取设备文件时,我什么也得不到。但是,如您所见,我使用printk 命令调试了程序,并且所有内容都在内核空间中正确写入。问题可能出在哪里?
【问题讨论】:
-
你能在你创建设备文件的地方包含代码吗?您希望在哪里使用 filep?如何提供用户空间“buf”?它应该与您正在处理的文件相关联吗?
-
return 0;- 您应该返回读取的字节数。现在你的函数读取零字节。
标签: c linux-kernel raspberry-pi linux-device-driver