首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于Linux/Qtopia的车载温度网络采集 03

基于Linux/Qtopia的车载温度网络采集 03

3.2 硬件设备接口层
  硬件设备接口层用来描述驱动程序与设备的交互。这些工作通过虚拟文件系统与设备驱动程序的接口实现。这个接口由file_operation结构定义,其结构如下:
  static struct file_operations DS18B20_fops ={
  .owner=THIS_MODULE, //指向拥有该结构的模块,内核使用该结构维护模块使用计数
  .open=DS18B20_open, //打开设备函数
  .read=DS18B20_read, //读接口函数
  .write=DS18B20_write,//写接口函数
  .fasync=DS18B20_fasync, //异步通知函数
  .poll=DS18B20_poll,//poll函数
  .release=DS18B20_release, //释放设备函数
  };
  3.2.1 打开设备函数
  打开设备函数主要完成设备的初始化。
  DS18B20_open(struct inode *inode,struct file *filp) {
  Initial_Timer( );//初始化定时器,使内核模块按一定周期读温度
  Initial_Device_DS18B20();//初始化硬件
  readtemperature();//开始读取……
  }
  void readtemperature(void) {
  ……Temperature=DS18B20read();//读取2个8位数据,此函数完成的硬件操作时序,由当前读通道号变量指定当前通道
  DS_SLOT_NO();//将本次读通道号放入缓冲区
  DS18B20Event();//数据放入缓冲区,唤醒等待队列并启动异步通知
  if(ReleaseFlag)
  CycleTimer_Delay_Soft(hdelay);//如果没有读停止信号,通过内核定时器延时,进行下一次读,在中断服务程序中再次启动读
  ……
  }
  在使用内核定时器之前需定义一个定时器结构体 static struct timer_list CycleTimer。下面是定时器的具体操作:
  static void Initial_Timer(void) {
  init_timer(&CycleTimer); );//初始化定时器结构
  CycleTimer.function=DS18B20_timer; //挂接定时中断服务程序
  }
返回列表