Linux 用户空间 I/O 驱动程序可以支持用于 I2C 或 SPI 设备吗?
例如,在 i.MX 或 Zynq 等 SoC 中使用时,是否可以将 UIO 用于 I2C 或 SPI?可以将 I2C 或 SPI 传感器/IC 作为
dev/uioX
设备进行探测,该设备能够 mmap()
并且还可以使用一些基于 GPIO 的中断?
在设备树中,是否可以使用例如在地址0x40的I2C总线上创建UIO设备?
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
clock-frequency = <100000>;
status = "okay";
acc_sensor_0: acc_sensor@0x40 {
reg = <0x40 0x100>;
compatible = "generic-uio";
linux,uio-name = "my_acc_sensor_0";
};
};
Linux 用户空间 I/O 驱动程序是否可以支持用于 I2C 或 SPI 设备
没有。
I2C和SPI都是总线,有主控制器和从设备。
它是连接到 CPU 的主控制器,因此由 CPU 直接控制(即写入和读取)。总线上从设备的任何 I/O 都必须通过主控制器执行。一种异常异常是中断;从设备可以向 CPU 生成中断,然后由从设备的驱动程序处理。
你的问题不明确;您所说的“I2C 或 SPI 设备”到底指的是什么?
如果您指的是“从设备”,那么您似乎没有意识到这样的从设备不是由CPU直接访问的。从设备将具有只能通过总线访问的寄存器。这些寄存器不会被分配 SoC 物理地址空间中的任何地址。因此,CPU 对从设备寄存器进行内存映射是不可能的。从设备不适合 Linux 用户空间 I/O 驱动程序。 可以使用
i2c-dev从用户空间控制 I2C 从设备。研究Documentation/i2c/dev-interface.rst. 可以使用
spidev从用户空间控制 SPI 从设备。研究文档/spi/spidev.rst.
I2C 或 SPI 主控制器不适合作为 Linux 用户空间 I/O 驱动程序。这样的主控制器永远不会有用户空间接口(例如目录中的设备节点),即使它有内核驱动程序。