ioctl返回值为-1。错误号errno:14, bad address。 上网查阅才知道需要使用_IOWR等宏来生成cmd命令,而不能自己写。 虽然自己写也可以,但很有可能和系统的其他cmd命令冲突。刚好当ioctl的cmd=2使就出现了错误。 从新定义cmd如下: #defineTYPE 'S'#defineLEVEL_DOWN _IOWR(TYPE, 0, int)#defineLEVEL_UP _IOWR...
(2)ioctl-test-driver.c,字符设备驱动,实现了unlocked_ioctl 接口,根据上层用户的 cmd 执行对应的操作(初始化设备、读寄存器、写寄存器)。在接收上层 cmd 之前应该对其进行充分的检查,流程及具体代码实现如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 // ioctl-test-driver.c static const struct file...
前文提到 ioctl 方法第二个参数 cmd 为用户与驱动的 “协议”,理论上可以为任意 int 型数据,可以为 0、1、2、3……,但是为了确保该 “协议” 的唯一性,ioctl 命令应该使用更科学严谨的方法赋值,在linux中,提供了一种 ioctl 命令的统一格式,将 32 位 int 型数据划分为四个位段,如下图所示: 在内核中,提...
ret = ioctl(fd, MYCMD);if(ret ==-1) {printf("ioctl: %s\n", strerror(errno)); } 函数功能: 1.向硬件设备发送控制命令 2.还可以和硬件设备进行读或者写操作 参数: fd:文件描述符 request:给硬件设备发送的控制命令 arg:保存的就是用户缓冲区的首地址 ...
前文提到 ioctl 方法第二个参数 cmd 为用户与驱动的 “协议”,理论上可以为任意 int 型数据,可以为 0、1、2、3……,但是为了确保该 “协议” 的唯一性,ioctl 命令应该使用更科学严谨的方法赋值,在linux中,提供了一种 ioctl 命令的统一格式,将 32 位 int 型数据划分为四个位段,如下图所示: ...
2、ioctl-test-driver.c,字符设备驱动,实现了unlocked_ioctl 接口,根据上层用户的 cmd 执行对应的操作(初始化设备、读寄存器、写寄存器)。在接收上层 cmd 之前应该对其进行充分的检查,流程及具体代码实现如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 // ioctl-test-driver.c ... static const struct...
Linux驱动程序设计的时候偶然发现的ioctl()函数的cmd参数不能为2,如果为2,ioctl()函数返回-1,网上说就是这样的,正常,不知道为什么,stack overflow上有一个外国学友的建议: “In general, you want to compose your ioctl commands using the_IOfamily of macros, with a unique type, to avoid collisions. ...
2)_IOC_READ:值为1,从设备驱动读取数据。 3)_IOC_WRITE:值为2,往设备驱动写入数据。 4)_IOC_READ|_IOC_WRITE:双向数据传输。 4)数据大小:与体系结构相关,ARM下占14bit(_IOC_SIZEBITS),如果数据是int,内核给这个赋的值就是sizeof(int)。 强调一下,内核是要求按这样的方法把cmd分类,当然你也可以不这样...
return -EFAULT; ptr += sizeof(binder_uintptr_t); /*根据之前读取的node_ptr,在proc中的nodes红黑树中查找对应的binder_node*/ node = binder_get_node(proc, node_ptr); if (node == NULL) { binder_user_error("%d:%d %s u%016llx no match\n", proc->pid, thread->pid, cmd == BC_INC...