(1) read函数
read、write称为对设备的I/O操作。当用户进程对设备执行 I/O操作时,设备可能并不具备进行I/O操作的条件。这些情况下,用户进程可以选择继续等待,即通过interruptible_sleep_on() 函数让用户进程进入睡眠状态;也可以选择不等待,立即返回。这就产生一两种类型的I/O操作,即阻塞型I/O和非阻塞型I/O。我们的驱动同时支持阻塞型和非阻塞型的读操作。
(2) ioctl函数
设备特殊文件之所以特殊就是因为它代表一个设备,可以通过它对设备的属性进行设置,这和对设备的I/O操作不同。我们通过ioct1函数来实现, ioct1的实质就是向设备发送命令来改变设备的属性。在实现此驱动的过程中发现,FSK来电显示芯片在没有真正的FSK数据的时候也会受到干扰,使数据线上有电平的跳动,从而产生不应该产生的中断对系统的性能造成影响,因而提供了2个ioct1命令给用户进程,来控制FSK中断的打开与关闭。
(30 select函数
为了使用户进程可以使用I/O多路转接技术,在驱动程序中实现了select函数。当用户进程执行select系统调用的时候,每一个加入select 测试集合的设备的select函数都被调用,如果其中任何一个或多个设备可以进行要求的I/O操作,则select返回;否则,通过 select_wait()函数让用户进程进入睡眠状态,直到有任何一个设备可以进行要求的I/O操作或超时为止。
(4) 中断处理函数及下半部分处理函数
FSK来电显示芯片只有1根数据线连接到CPU的GPIO口上。这根数据线的每一字节数据都以0开始、以1结束,中间是8位的ASCII码,最低位最先发送,在没有数的时候数据线一直保护高电平。由于FSK来电显示数据具有这种特殊的格式,把这根数据线同时接到CPU的外部中断线上,并设置为下降沿触发,这样每来1字节数据就会产生一次中断。FSK数据帧由若干字节这样的数据组成。FSK数据速率是1.2kb/s,因而1个bit延续约 0.83ms。这样收一个字节的数据就需要耗费约8.3ms的时间。显然在中断处理程序里面接收数据是不合适的,所以在中断处理程序中只调用 mark_up函数标记数据的到来,而把接收及处理数据的任务留到下半部分程序中完成。
下半部分程序负责接收1字节的FSK来电显示数据,由于1字节数据中可能有多个下降延,所以在进入处理函数后首先要关闭FSK中断,然后每0.83ms读一次GPIO口,接收一位的数据,收完1字节数据后要打开FSK中断,以接收下一字节的数据。
根据本次FSK中断是否为此次通信的每一个中断,可以判断本次接收的是否为FSK数据帧的第一个字节,如果是,那么将启动一个内核定时器,其超时时间设为1s(因为一个FSK数据帧的传输时间不会超过1s)。在定时器超时后,内核将调用定时器超过时处理函数,提取出主叫用户的电话号码,并通过 wake_up函数唤醒任何等待读此设备的用户进程。
共4页: 上一页 [1] [2] 3 [4] 下一页
|