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 の使用/実装に制限があるかどうかを知りたいです。事前にどうもありがとうございました。

――ラウル

コードは次のとおりです。

module.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;

}

user_app.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 に答える