我的thermo3 click有tmp102 sensor。
为了从中读取数据,我使用I2C编写了一个用户空间应用程序,如下所示:
fd = open("/dev/i2c-0", O_RDWR))
ioctl(fd, I2C_SLAVE, 0x48)
read(fd, &buf, 2)
但后来我在linux source code找到了它的驱动程序。
所以我想知道:
1)我可以编写一个使用此驱动程序API的用户空间应用程序(意味着使用驱动程序的设备文件)吗?
2)I2C用户空间应用程序如何在不使用此驱动程序的情况下工作(因为当我使用i2c用户空间应用程序时,我的内核中未启用此驱动程序)或这是I2C的工作方式?
答案 0 :(得分:1)
1)这是一个hwmon设备,你没有设备文件可供使用。相反,api在/sys/class/hwmon
。特别是,您想要阅读/sys/class/hwmon/hwmonX/tempX_input
个文件
2)通过使用/dev/i2c-0
,您可以直接在i2c总线上进行通信,从而有效地绕过任何内核驱动程序。然后,您必须知道您使用的任何设备的详细信息(注册读取及其含义......),而不是使用通用的Linux内核抽象。
答案 1 :(得分:1)
用户级应用程序无法与硬件交互。他们可以通过系统调用(ioctl,open,read和write等)和Sysfs(sysfs是一个虚拟文件系统)进行通信。
1: - 您的设备是hwmom设备。你的驱动程序是“tmp102”。驱动程序为用户级应用程序公开这三个 temp1_input , temp1_max_hyst 和 temp1_max sysfs条目。
SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp102_show_temp, NULL , 0);
SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, tmp102_show_temp, tmp102_set_temp, 1);
SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, tmp102_show_temp,
tmp102_set_temp, 2);
您可以读取/ sys / class / hwmom / tmp102 / temp1_input sysfs文件。 你可以读写这两个sysfs文件/ sys / class / hwmom / tmp102 / temp1_max_hyst和sys / class / hwmom / tmp102 / temp1_max。
2: - / dev中的文件是UDEV在运行时创建的实际设备文件。设备文件是设备驱动程序的接口,它出现在文件系统中,就像它是普通文件一样。您的驱动程序已公开其他一些设备文件。 thermal_zone_of_sensor_register(hwmon_dev,0,hwmon_dev,& tmp102_of_thermal_ops)。你有/ dev / hwmom_dev节点。
用户级应用程序无法直接与任何i2c设备或硬件进行通信。 Linux内核有局限性。应用程序需要驱动程序作为控制任何设备的接口。