日期:2014-05-16  浏览次数:20666 次

驱动中的open函数和应用程序中的open函数是什么关系阿?
在网上看见这么一个例子:http://apps.hi.baidu.com/share/detail/32585036
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>

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.\r\n"); 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 < 8; i++)
  {
  s3c2410_gpio_setpin(DS18B20_PIN, LOW); udelay(1);
  if(byte & HIGH)
  {
  // 若byte变量的D0位是1,则需向总线上写“1”
  // 根据写“1”时隙规则,电平在此处翻转为高
  s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
  }
  else
  {
  // 若byte变量的D0位是0,则需向总线上写“0”
  // 根据写“0”时隙规则,电平在保持为低
  // s3c2410_gpio_setpin(DS18B20_PIN, LOW);
  }
  // 电平状态保持60微秒
  udelay(60);

  s3c2410_gpio_setpin(DS18B20_PIN, HIGH);
  udelay(15);

  byte >>= 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 < 8; i++)
  {
  s3c2410_gpio_cfgpin(DS18B20_PIN, DS18B20_PIN_OUTP);
  s3c2410_gpio_setpin(DS18B20_PIN, LOW);