关于linux驱动 字符驱动设备中open函数的问题。。。

这个是应用层默认的open函数定义:intopen(constchar*pathname,intflags);这个是驱动程序中一般的open函数的定义:int(*open... 这个是应用层默认的open函数定义:int open( const char * pathname,int flags);

这个是驱动程序中一般的open函数的定义:int(*open)(struct inode *inode, struct file *filp)

如下是一个LED点亮的应用层主函数
[code=C/C++][/code]void main(void)
{
int testdev;
int i;
char buf[10];
testdev = open ("/dev/test",O_RDWR); //这里应该是用的应用层默认的Open函数吧。。。
if(testdev == -1)
{
printf("Cann't open file...../n");
exit(0);
}
printf("buf = 0x%x/n",buf);
read(testdev,buf,10); //成功open以后testdev的值不是为0吗?这里怎么又能够成为file文件描述符呢?
write(testdev,buf,1);
led_ctl.port='G';
led_ctl.bit=5;
led_ctl.value=0;
ioctl(testdev,GPIO_IO_SET_GPG,&led_ctl);
printf("%s",buf);
pause();
close(testdev);
}

我的疑问是:
1.驱动程序中的open函数:int(*open)(struct inode *inode, struct file *filp)
在哪里使用了啊?
2.驱动中的open函数一般是用来做什么的啊?
3.上文代码中,成功open以后testdev的值不是为0吗?这里怎么又能够成为file文件描述符呢?
展开
 我来答
fengbenben1987
推荐于2017-10-08 · 超过10用户采纳过TA的回答
知道答主
回答量:21
采纳率:0%
帮助的人:27.7万
展开全部
/*这是一个简单的用户程序与驱动交互的例程*/
void main(void)
{
int testdev;
int i;
char buf[10];

/* 这里是用的open系统调用,是linux内核接口函数,不是库函数,返回fd,详细请google ,这个open最终会调用驱动中的open函数(代码流程是这样的open()->sys_open()->filp_open()->dentry_open()->驱动open)*/

testdev = open ("/dev/test",O_RDWR);
if(testdev == -1)
{
printf("Cann't open file...../n");
exit(0);
}
printf("buf = 0x%x/n",buf);
/* 下面的read write 和ioctl是用户程序和内核驱动的最直接的交互方式 */
read(testdev,buf,10);
write(testdev,buf,1);
led_ctl.port='G';
led_ctl.bit=5;
led_ctl.value=0;
ioctl(testdev,GPIO_IO_SET_GPG,&led_ctl);
printf("%s",buf);
pause();
close(testdev);
}
你基础有点弱,慢慢学习就知道了,参考下《linux设备驱动程序》
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式