当前位置:  技术问答>linux和unix

驱动中的open函数和应用程序中的open函数是什么关系阿?

    来源: 互联网  发布时间:2017-01-22

    本文导语:  在网上看见这么一个例子:http://apps.hi.baidu.com/share/detail/32585036 #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  typedef unsigned char BYTE; #define DS18B20_PIN   S3C2410_GPB1 #define ...

在网上看见这么一个例子:http://apps.hi.baidu.com/share/detail/32585036
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

typedef unsigned char BYTE;

#define DS18B20_PIN   S3C2410_GPB1
#define DS18B20_PIN_OUTP S3C2410_GPB1_OUTP
#define DS18B20_PIN_INP   S3C2410_GPB1_INP
#define HIGH 1
#define LOW 0
#define DEV_NAME "DS18B20"
#define DEV_MAJOR 232
static BYTE data[2];

// DS18B20复位函数
BYTE DS18b20_reset (void)
{
    // 配置GPIOB0输出模式
    s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);
   
    // 向18B20发送一个上升沿,并保持高电平状态约100微秒
    s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
    udelay(100);
   
    // 向18B20发送一个下降沿,并保持低电平状态约600微秒
    s3c2410_gpio_setpin(DS18B20_PIN, LOW);
    udelay(600);
   
    // 向18B20发送一个上升沿,此时可释放DS18B20总线
    s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
    udelay(100);
    
    // 以上动作是给DS18B20一个复位脉冲
    // 通过再次配置GPIOB1引脚成输入状态,可以检测到DS18B20是否复位成功
    s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_INP);
   
    // 若总线在释放后总线状态为高电平,则复位失败
    if(s3c2410_gpio_getpin(DS18B20_PIN)){ printk("DS18b20 reset failed.rn"); return 1;}

    return 0;
}

void DS18b20_write_byte (BYTE byte)
{
    BYTE i;
    // 配置GPIOB1为输出模式
    s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);

    // 写“1”时隙:
    //     保持总线在低电平1微秒到15微秒之间
    //     然后再保持总线在高电平15微秒到60微秒之间
    //     理想状态: 1微秒的低电平然后跳变再保持60微秒的高电平
    //
    // 写“0”时隙:
    //     保持总线在低电平15微秒到60微秒之间
    //     然后再保持总线在高电平1微秒到15微秒之间
    //     理想状态: 60微秒的低电平然后跳变再保持1微秒的高电平
    for (i = 0; i >= 1;
    }
    s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
}

BYTE DS18b20_read_byte (void)
{
    BYTE i = 0;
    BYTE byte = 0;
    // 读“1”时隙:
    //     若总线状态保持在低电平状态1微秒到15微秒之间
    //     然后跳变到高电平状态且保持在15微秒到60微秒之间
    //      就认为从DS18B20读到一个“1”信号
    //     理想情况: 1微秒的低电平然后跳变再保持60微秒的高电平
    //
    // 读“0”时隙:
    //     若总线状态保持在低电平状态15微秒到30微秒之间
    //     然后跳变到高电平状态且保持在15微秒到60微秒之间
    //     就认为从DS18B20读到一个“0”信号
    //     理想情况: 15微秒的低电平然后跳变再保持46微秒的高电平
    for (i = 0; i >= 1;

        s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
        s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_INP);

        // 若总线在我们设它为低电平之后若1微秒之内变为高
        // 则认为从DS18B20处收到一个“1”信号
        // 因此把byte的D7为置“1”
        if (s3c2410_gpio_getpin(DS18B20_PIN)) byte |= 0x80;
        udelay(60);
    }
    return byte;      
}

void DS18b20_proc(void)        
{
    while(DS18b20_reset());
   
    udelay(120);
   
    DS18b20_write_byte(0xcc);
    DS18b20_write_byte(0x44);
   
    udelay(5);
   
    while(DS18b20_reset());
    udelay(200);
   
    DS18b20_write_byte(0xcc);
    DS18b20_write_byte(0xbe);
   
    data[0] = DS18b20_read_byte();
    data[1] = DS18b20_read_byte();
}

static ssize_t s3c2440_18b20_read(struct file *filp, char *buf, size_t len, loff_t *off)
{
    DS18b20_proc();

    buf[0] = data[0];
    buf[1] = data[1];
   
    return 1;
}

static struct file_operations s3c2440_18b20_fops =
{
    .owner = THIS_MODULE,
    .read = s3c2440_18b20_read,
};

static int __init s3c2440_18b20_init(void)
{
    if (register_chrdev(DEV_MAJOR, DEV_NAME, &s3c2440_18b20_fops) i_cdev;
        if (!p) {
            inode->i_cdev = p = new;
            list_add(&inode->i_devices, &p->list);
            new = NULL;
        } else if (!cdev_get(p))
            ret = -ENXIO;
    } else if (!cdev_get(p))
        ret = -ENXIO;
    spin_unlock(&cdev_lock);
    cdev_put(new);
    if (ret)
        return ret;

    ret = -ENXIO;
    filp->f_op = fops_get(p->ops);//这个地方就是后去你自己驱动中定义的文件操作了。
    if (!filp->f_op)
        goto out_cdev_put;

    if (filp->f_op->open) {
        ret = filp->f_op->open(inode,filp);  //这个函数就是你的驱动中定义的xxx_open函数了
        if (ret)
            goto out_cdev_put;
    }

    return 0;

 out_cdev_put:
    cdev_put(p);
    return ret;
}

同时,chrdev_open后,应用程序就可以通过read,和write调用驱动中定义的xxx_read,xxx_write函数了,明白了吗。

|
用户空间使用系统调用open时,内核会自动调用file_operations 结构体中的open函数。
其他人都已经写的很清楚了。
static struct file_operations s3c2440_18b20_fops =
{
  .owner = THIS_MODULE,
  .read = s3c2440_18b20_read,
};

不过,你的这个驱动并没有定义open函数。如果没有定义的话,会调用一个默认的
open函数,永远可以打开成功。
不过,建议最好写一个自己的open函数。。。。

    
 
 

您可能感兴趣的文章:

  • 救急!!linux驱动函数问题!!
  • 【求助】:如何用ioctl()函数调用一个驱动程序
  • 驱动开发有没有函数手册
  • CAT命令读取设备文件,驱动read函数被反复调用,为什么?
  • 驱动函数中的return
  • usb驱动关于probe函数
  • linux驱动中probe函数中参数传递问题?
  • 驱动模块中用socket,哪有相关的函数啊??
  • 请教:Linux驱动程序中的llseek函数
  • 底层硬件驱动如何调用应用层的回调函数,求指点!
  • Linux内核驱动中有没有像waitforsingleobject这样的函数
  • 请教:修改Linux内核时,需要调用驱动程序的函数,头文件也包含了,但是编译时候说头文件找不到!
  • linux驱动程序中怎么做api函数供应用程序调用
  • linux 下 usb 鼠标驱动 关于 open 函数里面 mouse->irq->dev = mouse->usbdev 疑问
  • linux驱动open函数问题,大家来看看(我没有分,所以给的少点)
  • 诡异的问题,关于应用程序调用驱动内函数时的执行顺序
  • C# 调用API函数弹出映射网络驱动器对话框问题
  • linux驱动中的接口函数的不理解
  • 请教一下网卡驱动里面的几个函数
  • RTC驱动测试函数read_time怎么写?
  • 编写驱动后 open 一直返回 -1
  • 再问: linux驱动从open到最后设置寄存器过程
  • 请教:linux中usb驱动中sd_open()的系统调用是怎么触发的
  • PL2303HX驱动问题,每次open ttyUSB0时 设备就挂了
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • -------------- 请问大家,做好一个PCI设备驱动了,如何做个应用程序来使用这个驱动呢??
  • 请问, linux 驱动中, IO 口变化了,驱动如何通知应用程序?
  • 驱动程序(模块)怎样与应用层交互呀?也就是应用程序怎样控制驱动程序?让其做什么它就做什么。
  • 谁有2.4内核可用的网卡驱动及应用程序?
  • 请教一下在驱动里怎么调用应用程序
  • 请问如何设置驱动程序和应用程序的启动顺序和优先级呢?
  • 菜鸟请教,应用程序如何判断驱动程序已经挂载成功
  • linux驱动程序是怎样通过内核和应用程序通信,还有是怎样和硬件通信,跪求求解,谢谢高手留言。
  • i2c驱动对应的应用程序
  • 网卡驱动如何和应用程序通信?
  • linux 驱动中想用 kobject_uevent 和应用程序通讯. 但不知如何用?
  • 如何不写驱动通过应用程序获得一块内存并取得它的物理地址?
  • linux下如何单步或设置断点调试驱动或应用程序
  • 请教下,应用程序使用通过驱动程序使用设备的过程
  • 应用程序调用网卡驱动,收不到包,为什么
  • Linux下有哪些可视化软件开发Linux下的应用软件和驱动程序
  • 【求助】基于2.6.29内核编译的驱动程序能否应用于2.6.32内核的系统?
  • 请教下驱动问题,什么情况下会导致Ctrl+C终止不了应用程序
  • 嵌入式系统字符驱动程序(应用)问题(初学),请帮忙回答
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 字符设备驱动,混杂设备驱动,总线、设备、驱动模型、平台驱动
  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • 好不容易下到sis900网卡for unix的驱动,但装上驱动后系统驱动时: SiS900 adapter initialization failure!
  • 我的网卡在redhat7.3下不能自动驱动,但我有for linux的驱动程序,请问如何才能驱动我的网卡,我是菜菜,请详细说明,谢谢!
  • Linux环境下,“PC机的驱动”与“嵌入式驱动”有什么区别?
  • linux:怎么在驱动中调用IIC驱动?
  • linux驱动 单片机驱动
  • linux下一个驱动怎么调用另一个驱动
  • u boot中怎样写flash驱动以及串口驱动
  • Linux环境下,如何一个驱动中调用另外一个驱动
  • 一个驱动文件,生成多个驱动模块??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3