为什么运行测试一个驱动程序会显示无法open 想象啊?
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
另外在/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
所以我mknod 时用mknod lcd c 10 255
不知到我的步骤有什么错误啊,始终是无法打开驱动程序的open函数,就是无法打开文件,是我建立设备文件名,那里错误了吗?
主设备号在register设备时不能被其他module占有
即mknod时major在系统中没被用
[ 本帖最后由 whoisliang 于 2008-12-30 13:53 编辑 ]
但是在那个lcd.c程序里,没有主设备号,只有次设备号,那我mknod时新建立一个主设备号,以前没有用过的?可是建立后,在proc/devices中没有新建立的主设备号呢
if(testdev=-1)
= ? ==吧