linux驱动、设备注册问题、、、???

xgfhahaha 2009-03-22 02:20:54
为什么我的驱动模块加载运行后,在proc/devices中有注册设备号、名称,而dev/下面没有啊、、、???

proc/devices和dev/的注册号有什么区别、关系啊、???

如果应用层打开设备,是根据proc/devices,还是根据dev/里面的注册啊、??

急,望能指点、、、
...全文
390 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjz9898 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xgfhahaha 的回复:]

int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY

打开的时候写成int fd = open( /dev/yourdevicename, O_RDWR );试试,还有就是你的驱动注册的设备号和你mknod时候定义的设备号一定要相同。
white1977 2009-03-23
  • 打赏
  • 举报
回复
驱动是你自己写的吗?自己写的话,在驱动中加些调试信息显示,在应用程序中调用后,查看驱动的调试信息,查看是在什么地方出错。或者在驱动程序中返回值设定内容自己记住,然后在应用程序中OPEN 时看看返回值是多少,查找出错地方。
hefuhua 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 xgfhahaha 的帖子:]
为什么我的驱动模块加载运行后,在proc/devices中有注册设备号、名称,而dev/下面没有啊、、、???

proc/devices和dev/的注册号有什么区别、关系啊、???

如果应用层打开设备,是根据proc/devices,还是根据dev/里面的注册啊、??

急,望能指点、、、
[/Quote]

proc是内核接口,一般之直接传递些简单数据和输入简要的信息和一些调试信息

/dev是应用层的设备驱动文件的接口,一般是文件系统启动后,有udev这个相应的软件包按一定的规则建立

而udev这个应用软件,一般是通过/sys/下对于的内核文件接口建立的,所以你的驱动需要
建立内核的相应的sys接口才会启动后自动建立相应的/dev文件,一些热拔插事件的设备需要udev软件包的守护进程
udevd根据/sys和/proc接口实现

这个知识点简单,但是设计范围广

这个lfs上说了些
http://www.linuxfromscratch.org/lfs/view/6.3/chapter07/udev.html
xgfhahaha 2009-03-22
  • 打赏
  • 举报
回复
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{ /*设置数据位数*/
perror("Can't Open Serial Port");
return -1;
}
else
return fd;

}
/**
*@breif main()
*/
int main(int argc, char **argv)
{
int fd,i,j;
int nread;
char buff[512];
char *dev ="/dev/ttyVK";
fd = OpenDev(dev);
if (fd<0)
{
printf("Can't Open Serial Port!\n");
exit(0);
}

for(i=0;i<80;i++)
{
buff[i]=i;
}

write(fd,buff,32);

printf(" end write \n\n");

nread = read(fd,buff,3);

printf("\nLen %d\n",nread);

for(j=0;j<nread;j++)
{
printf("%x ",buff[j]);
}

printf("\n");

close(fd);
exit(0);
}
上面是我的应用层简单测试代码、、、、
insmod、mknod以后,dev/下面的确有了所需要的ttyVK字符设备号、、、、
但是当我运行上面测试代码时候(这个应用程序应该没有问题),报错:
Can"t Open Serial Port:No such device address
Can"t Open Serial Port!
这是什么问题啊、、???
独孤过儿 2009-03-22
  • 打赏
  • 举报
回复
你这样试试看,先mknod创建设备。然后

chmod 777

把设备的权限放开,然后再open试试看

顺便把出错的提示贴上来,看不到提示,别人也帮不了你啊,查问题基本靠猜是很痛苦的 ^_^
xgfhahaha 2009-03-22
  • 打赏
  • 举报
回复
我试过了、、、
mknod以后的确在dev/下面生成了对应的字符设备号、、、
但是在应用层,open这个字符设备号时,报错打不开、、、

郁闷、、、
独孤过儿 2009-03-22
  • 打赏
  • 举报
回复
你需要自己用

mknode命令在/dev目录下自己注册个设备

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧