我将嵌入式 Linux 用于 NIOS II 处理器和设备树。GPIO 功能提供了一次读取和或写入单个位的能力。我有一些固件和 PIOS,我想通过一次设置或读取所有 32 位来原子地读取或写入。似乎会有一个通用设备驱动程序,如果设备树被赋予适当的兼容性,那么将存在一个允许打开设备然后读取和写入设备的驱动程序。我已经搜索了此功能,但没有找到驱动程序。一个存在于分支中,但被 Linus 删除。
我的问题是什么是 Linux 设备树方式来读取和写入通用 32 位寄存器/pio 的设备?
我将嵌入式 Linux 用于 NIOS II 处理器和设备树。GPIO 功能提供了一次读取和或写入单个位的能力。我有一些固件和 PIOS,我想通过一次设置或读取所有 32 位来原子地读取或写入。似乎会有一个通用设备驱动程序,如果设备树被赋予适当的兼容性,那么将存在一个允许打开设备然后读取和写入设备的驱动程序。我已经搜索了此功能,但没有找到驱动程序。一个存在于分支中,但被 Linus 删除。
我的问题是什么是 Linux 设备树方式来读取和写入通用 32 位寄存器/pio 的设备?
你的答案是 SCULL
您必须编写带有文件操作的字符设备驱动程序来打开和关闭设备。读取、写入、ioctl 和复制设备的内容。
static struct file_operations query_fops =
{
.owner = THIS_MODULE,
.open = my_open,
.release = my_close,
.ioctl = my_ioctl
};
使用 iomem 映射地址,并使用 rawread 和 rawwrite 直接读取和写入该地址。如下创建并注册一个设备,然后可以从用户空间访问它:
register_chrdev (0, DEVICE_NAME, & query_fops);
device_create (dev_class, NULL, MKDEV (dev_major, 0), NULL, DEVICE_NAME);
然后从用户空间访问它,如下所示:
fd = open("/dev/mydevice", O_RDWR);
然后您可以使用 ioctl 从用户空间使用 GPIO:
ioctl(fd, SET_STATE);