2

我正在尝试在 Android 上运行一个简单的 IOCTL 示例。我正在使用内核 2.6 和 ICS。模块已正确注册/取消注册 (insmod/rmmod)。但是,每次尝试./user_app在模拟器上执行时,我总是得到

error: first ioctl: Not a typewriter 
error: second ioctl: Not a typewriter 
message: `�

这显然是一个ENOTTY。我调试了应用程序,并且没有执行任何 fops 程序(device_ioctl、read_ioctl 和 write_ioctl)。

我想知道在 Android 上使用/实现 IOCTL 是否有任何限制。非常感谢您提前。

——劳尔

这是代码:

模块.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>

#define MY_MACIG 'G'
#define READ_IOCTL _IOR(MY_MACIG, 0, int)
#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)


int main(){
    char buf[200];
    int fd = -1;
    if ((fd = open("/data/local/afile.txt", O_RDWR)) < 0) {
        perror("open");
        return -1;
    }
    if(ioctl(fd, WRITE_IOCTL, "hello world") < 0)
        perror("first ioctl");
    if(ioctl(fd, READ_IOCTL, buf) < 0)
        perror("second ioctl");

    printf("message: %s\n", buf);
    return 0;

}

用户应用程序.c

#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>

#define MY_MACIG 'G'
#define READ_IOCTL _IOR(MY_MACIG, 0, int)
#define WRITE_IOCTL _IOW(MY_MACIG, 1, int)

static char msg[200];

static ssize_t device_read(struct file *filp, char __user *buffer, size_t length, loff_t *offset)
{
    ...
}


static ssize_t device_write(struct file *filp, const char __user *buff, size_t len, loff_t *off)
{
    ...
}
char buf[200];
int device_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) {
    int len = 200;
    switch(cmd) {
    case READ_IOCTL:    
        ...
        break;

    case WRITE_IOCTL:
        ...
        break;

    default:
        return -ENOTTY;
    }
    return len;

}
static struct file_operations fops = {
    .read = device_read, 
    .write = device_write,
    .unlocked_ioctl = device_ioctl,
};

static int __init example_module_init(void)
{
    printk("registering module");
    return 0;
}

static void __exit example_module_exit(void)
{
    printk("unregistering module");
}  

module_init(example_module_init);
module_exit(example_module_exit);
MODULE_LICENSE("GPL");
4

1 回答 1

0

这是您发布的全部代码吗?初始化模块时您没有注册 char 设备,因此这是行不通的。
此外,在分配 IOCTLS 编号时要小心。在错误的文件上使用保留的 IOCTL 时,您将得到 ENOTTY。请参阅内容以确保您没有冲突。在此处
阅读有关 char 驱动程序的更多信息。

于 2013-08-27T09:20:56.793 回答