你走在正确的轨道上,你只需要找出要使用的常数。你的供应商的程序实际上会以十进制和十六进制打印出来——如果你只是编辑的话main()
并移动printf
无尽之上的线while
loop:
printf("Ioctl Number: (int)%d (hex)%x\n", SSD1289_GET_KEYS, SSD1289_GET_KEYS);
while(1)
get_keys(fd);
解释:
_IOR
是一个定义在的宏sys/ioctl.h
。其定义如下:
#define _IOC(inout,group,num,len) \
(inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
#define _IO(g,n) _IOC(IOC_VOID, (g), (n), 0)
#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t))
#define _IOW(g,n,t) _IOC(IOC_IN, (g), (n), sizeof(t))
我已经包含了相关的上下文行。您可以看到该宏构造了一个位掩码(我们可以从名称中看出)处理读取操作。但您的目标是找出所需的位掩码,这可以轻松完成:通过运行供应商的 C 程序cc -E
,您将在应用预处理器命令后看到源代码。追踪定义get_keys
(首先会有很多头文件,所以它将位于输出的最后),然后取出第二个参数。
结果可能取决于系统,因此您应该亲自尝试一下。在我的盒子上,它显示为
((__uint32_t)0x40000000 | ((sizeof(unsigned char *) & 0x1fff) << 16) | ((('keys')) << 8) | ((1)))
不急于将其翻译成Python,我在开头添加了以下几行main()
:
printf("%d", ((__uint32_t)0x40000000 | ((sizeof(unsigned char *) & 0x1fff) << 16) |
((('keys')) << 8) | ((1))));
exit(0);
我运行了程序,它给了我输出1702458113
, which may成为您需要的值。它应该与十进制输出相同printf
命令已经存在(但隐藏在无尽的下面)while
环形)。但你自己检查一下,如果你把你的硬件搞坏了或者什么的,别怪我!