计算fnctl.ioctl的opt参数的函数
ioctl-opt的Python项目详细描述
pythonified linux asm-generic/ioctl.h。
所以您可以复制驱动程序的代码计算fcntl.ioctl的opt参数。
例如,从以下IOCTL声明(取自input.h)开始:
#include<sys/ioctl.h> #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */
你可以写下:
fromioctl_optimportIOC,IOC_READEVIOCGNAME=lambdalength:IOC(IOC_READ,ord('E'),0x06,length)
差别很小,都来自python语言或编码风格:
- 从ioctl_opt开始使用的宏/常量,不能以下划线开头
- 定义的宏变为可调用的(这里是lambda,可以是函数)
- IOC的nr参数必须是整数,因此C的单引号字符变成了ord调用
- 避免隐藏内置len函数
然后,您可能需要编写pythonic函数来方便地访问该ioctl:
importctypesimportfcntldefgetDeviceName(fd,length=1024):name=(ctypes.c_char*length)()actual_length=fcntl.ioctl(fd,EVIOCGNAME(length),name,True)ifactual_length<0:raiseOSError(-actual_length)ifname[actual_length-1]==b'\x00':actual_length-=1returnname[:actual_length]
定义hidraw ioctl的更高级示例,需要结构(有关如何定义结构的更多信息,请查看python版本的ctype文档):
importctypesfromioctl_optimportIOR,IOC,IOC_READ,IOC_WRITE# hid.hHID_MAX_DESCRIPTOR_SIZE=4096# hidraw.hclasshidraw_report_descriptor(ctypes.Structure):_fields_=[('size',ctypes.c_uint),('value',ctypes.c_ubyte*HID_MAX_DESCRIPTOR_SIZE),]classhidraw_devinfo(ctypes.Structure):_fields_=[('bustype',ctypes.c_uint),('vendor',ctypes.c_short),('product',ctypes.c_short),]HIDIOCGRDESCSIZE=IOR(ord('H'),0x01,ctypes.c_int)HIDIOCGRDESC=IOR(ord('H'),0x02,hidraw_report_descriptor)HIDIOCGRAWINFO=IOR(ord('H'),0x03,hidraw_devinfo)HIDIOCGRAWNAME=lambdalength:IOC(IOC_READ,ord('H'),0x04,length)HIDIOCGRAWPHYS=lambdalength:IOC(IOC_READ,ord('H'),0x05,length)HIDIOCSFEATURE=lambdalength:IOC(IOC_WRITE|IOC_READ,ord('H'),0x06,length)HIDIOCGFEATURE=lambdalength:IOC(IOC_WRITE|IOC_READ,ord('H'),0x07,length)