Linux process / kernel間の参照
Microzed
Windows10 64Bit
petalinux 2019.1
開発用OS:CentOS-7-1708+Hyper-V
で開発中です。
petalinux 2016.2 :旧と呼ぶ
petalinux 2019.1 :新とよぶ
への移行過程で問題が発生しました。
新でデバイスドライバ側がOpenできません。
process側冒頭で下記を実行します:
#ifdef FLASH fd = open("/dev/mydev", O_RDWR); #else fd = open("mydev", O_RDWR); #endif if (fd < 0) { printf("Device Driver Open Error fd= %x\n", fd); exit(1); } printf("Device Driver Open No fd= %x\n", fd);
新ではFLASHを定義、未定義とも
fd=0xffffffff
が返ってきます。
旧では問題ありません。
Kernel側で関係すると思われる箇所。
static struct file_operations my_fops = {
owner: THIS_MODULE,
open: my_open,
unlocked_ioctl: my_ioctl, // ioctl以外は使用しない
};
static int my_open(struct inode *inode, struct file *filp)
{
int minor;
printk("System call enabled\n"); minor = MINOR(inode->i_rdev); if (minor > MY_MAX) { printk(KERN_ERR "illegal minor number\n"); return -1; } my_dev[minor].minor = minor; filp->private_data = &my_dev[minor]; return 0;
}
新の場合、process側での記述
fd = open("/dev/mydev", O_RDWR);
fd = open("mydev", O_RDWR);
上記ふたつともNGでした。
my_open関数冒頭の
printk("System call enabled\n");
が実行されていないので呼ばれていないようです。
旧では
fd = open("mydev", O_RDWR);
でGOになります。
一般には/dev/mydevが正しいらしいのですが、根拠が分かりません。
新の場合でも一時的にErrorが出ないことがありました。誤認の可能性もあります。
process側のキーワードは3つあります。
open、mydev、O_RDWR
このうち"open"だけがKernel側への指令として意味があり,mydevは別のワードでも差し支えないのではないかと思っています。
Kernel側でmydevというワードは単独では使われていません。
insmodに対応するstatic int __init mydev_init(void)関数
rmmodに対応するstatic void __exit mydev_exit(void)関数
という形で登場しますが。
これらの動作は問題ありません。
非常に簡単な間違いをしているのではないかと恐れています。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー