为什么运行测试一个驱动程序会显示无法open 想象啊?

发布于 2022-09-23 13:50:30 字数 4898 浏览 14 评论 0

#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
  int testdev;
  int i;
  char buf[10];
testdev=open("/dev/lcd",O_RDWR);
if(testdev=-1)
  {
    printf("Cann't open file\n");
   exit(0);
  }
   read(testdev,buf,10);
   for(i=0;i<10;i++)
   printf("%d\n",buf);
   close(testdev);
}
上面为我写的一个简单的驱动程序的测试程序usblptest.c。可是运行(./usbtest)后,显示:
[root@localhost test3]# lstest
Makefile  usblptest  usblptest.c  usblptest.o
[root@localhost test3]# ./usblptest
Cann't open file
[root@localhost test3]#
这是怎么回事情啊,无法打开open函数(值返回为负),我是没有接实际设备的。驱动程序我是在系统内找的一个lcd.c,我自己编译后,在加载进内核的,过程如下:
[root@localhost test2]# ls
lcd.c  lcd.h  lcd.ko  lcd.mod.c  lcd.mod.o  lcd.o  Makefile  Module.symvers
[root@localhost test2]# insmod lcd.ko
[root@localhost dev]# mknod lcd c 10 255
[root@localhost dev]# ls
bsg      lp3       ram6      tty1   tty36  tty62           usbmon3
bus      MAKEDEV   ram7      tty10  tty37  tty63           usbmon4
cdrom    mapper    ram8      tty11  tty38  tty7            usbmon5
console  mem       ram9      tty12  tty39  tty8            usbmon6
core     net       ramdisk   tty13  tty4   tty9            usbmon7
disk     null      random    tty14  tty40  ttyS0           usbmon8
dvd      nvram     root      tty15  tty41  ttyS1           vcs
fd       oldmem    rtc       tty16  tty42  ttyS2           vcs1
full     parport0  scd0      tty17  tty43  ttyS3           vcs2
fuse     parport1  sda       tty18  tty44  urandom         vcs3
hpet     parport2  sda1      tty19  tty45  usbdev1.1_ep00  vcs4
initctl  parport3  sda2      tty2   tty46  usbdev1.1_ep81  vcs5
input    port      sda3      tty20  tty47  usbdev2.1_ep00  vcs6
kmem     ppp       sda5      tty21  tty48  usbdev2.1_ep81  vcs7
kmsg     ptmx      sda6      tty22  tty49  usbdev3.1_ep00  vcs8
kvm      pts       sda7      tty23  tty5   usbdev3.1_ep81  vcsa
lcd      ram       sda8      tty24  tty50  usbdev4.1_ep00  vcsa1
具备了lcd设备文件了。我查看驱动源代码,发现里面的MINOR设置成255,

static struct miscdevice lcd_dev = {
        MISC_DYNAMIC_MINOR,
        "lcd",
        &lcd_fops
};

static int lcd_init(void)
{
        int ret;
        unsigned long data;

        pr_info("%s\n", LCD_DRIVER);
        ret = misc_register(&lcd_dev);
。。。。

[ 本帖最后由 dreamice 于 2008-12-30 15:28 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

别把无礼当个性 2022-09-30 13:50:30

另外在/linux/miscdevice下面观察到 MISC_DYNAMIC_MINOR, 为255,如下:
#define MPT_MINOR       220
#define MISC_DYNAMIC_MINOR 255
#define TUN_MINOR            200
在/proc/devices中只发现misc为10的主设备号,所以,我选择了10为主设备号,我这里正确吗?如下:
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
10 misc

独木成林 2022-09-30 13:50:30

所以我mknod 时用mknod lcd c 10 255

放手` 2022-09-30 13:50:30

不知到我的步骤有什么错误啊,始终是无法打开驱动程序的open函数,就是无法打开文件,是我建立设备文件名,那里错误了吗?

極樂鬼 2022-09-30 13:50:30

主设备号在register设备时不能被其他module占有
即mknod时major在系统中没被用

[ 本帖最后由 whoisliang 于 2008-12-30 13:53 编辑 ]

耳钉梦 2022-09-30 13:50:30

但是在那个lcd.c程序里,没有主设备号,只有次设备号,那我mknod时新建立一个主设备号,以前没有用过的?可是建立后,在proc/devices中没有新建立的主设备号呢

∝单色的世界 2022-09-30 13:50:30

if(testdev=-1)

= ?   ==吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文