2011-11-23 78 views
1

使用Python,我试图使用ioctl写入USB传感器。我有大量的例子直接或通过pyusb从设备读取,或简单的文件写入,但任何更复杂的消失在雷达之外。使用ioctl使用Python写入USB设备

我需要使用control_transfer写专题报道消息

的命令是ioctl(devicehandle, Operation, Args)

我已经是确定正确的操作问题。 Args,我认为应该是包含设备功能报告的缓冲区?再加上可变的标志设置为true

任何帮助或建议将不胜收到

我要补充;使用Python的原因是代码必须独立于设备。

回答

0

根据对fcntl模块中的文档,ioctl()是针对UNIX的,所以它不会在Windows上工作。似乎有一个名为DeviceIoControl()的Windows变体,其工作原理类似。

IOCTL是由设备驱动程序或操作系统声明的,所以我非常怀疑在不同的操作系统上有IOCTL操作具有相同的操作ID(IOCTL编号)和相同的参数。

对于Linux,你可以检查的头文件针对特定的设备驱动程序或可能对有效的IOCTL一些USB内核头文件。

+0

由设备独立,我应该说在LINUX处理器变种。 USB设备供应商是不是特别有帮助,但stracing一直在解开的情况一刀有用。不幸的是USB参数很模糊。 –

4

一个很好的例子是用于蟒linuxdvb和v412结合。 http://pypi.python.org/pypi/linuxdvbhttp://pypi.python.org/pypi/v4l2,但这些都不是很Python的。只适用于Linux/Unix系统。

你必须将ARGS结构翻译成Python可以理解的东西,在ctype的帮助下。 的Operation值是一样的一个中C

对应于C呼叫

struct operation_arg { 
    int fields1; 
    int fields2; 
} 

struct operation_arg Args; 
Args.field1 = data1; 
Args.field2 = data2; 

devicehandle = open("/dev/my_usb", O_RDWR); 

retval = ioctl(devicehandle, Operation, &Args); 
/* check retval value */ 

你必须在Python定义相应的CTYPE为struct operation_arg。它会给这种代码

import ctypes 
import linuxdvb 
import fcntl 

class operation_arg(ctypes.Structure): 
    _fields_ = [ 
     ('field1', ctypes.c_int), 
     ('field2', ctypes.c_int) 
    ] 

Args = operation_args() 
Args.field1 = data1; 
Args.field2 = data2; 

devicehandle = open('/dev/my_usb', 'rw') 

# try: 
fcntl.ioctl(devicehandle, operation, Args) 
# exception block to check error