基于Linux/Qtopia的车载温度网络采集 03
- UID
- 872238
|
基于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; //挂接定时中断服务程序
} |
|
|
|
|
|