免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2911 | 回复: 6
打印 上一主题 下一主题

为什么运行测试一个驱动程序会显示无法open 想象啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-30 13:41 |只看该作者 |倒序浏览
#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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-30 13:44 |只看该作者
另外在/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

论坛徽章:
0
3 [报告]
发表于 2008-12-30 13:45 |只看该作者
所以我mknod 时用mknod lcd c 10 255

论坛徽章:
0
4 [报告]
发表于 2008-12-30 13:47 |只看该作者
不知到我的步骤有什么错误啊,始终是无法打开驱动程序的open函数,就是无法打开文件,是我建立设备文件名,那里错误了吗?

论坛徽章:
0
5 [报告]
发表于 2008-12-30 13:51 |只看该作者

回复 #3 tangpujun 的帖子

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

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

论坛徽章:
0
6 [报告]
发表于 2008-12-30 14:03 |只看该作者
但是在那个lcd.c程序里,没有主设备号,只有次设备号,那我mknod时新建立一个主设备号,以前没有用过的?可是建立后,在proc/devices中没有新建立的主设备号呢

论坛徽章:
0
7 [报告]
发表于 2008-12-30 15:14 |只看该作者
if(testdev=-1)

= ?   ==吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP