新闻  |   论坛  |   博客  |   在线研讨会
写个驱动,控制主板蜂鸣器
0750long | 2009-04-07 16:17:35    阅读:4216   发布文章

写个驱动,控制主板蜂鸣器

 

    当应用软件发生故障之后,最好能够通过蜂鸣器进行报警,为此,在Linux下写了一个非常小的IO驱动,实现了蜂鸣器的报警控制。下面对蜂鸣器的控制原理与实现进行简单说明,这种实现仅仅针对X86计算机系统。

       由上图可知,我们要控制蜂鸣器,那么首先通过定时器2产生一个驱动方波信号,然后控制io使能信号,驱动蜂鸣器工作。通常计算机系统提供了三个定时器,其中定时器0用于产生操作系统的心跳时钟;定时器1用于产生SDRAM的周期性刷新信号(20ms左右);定时器2用于驱动蜂鸣器,产生报警信号。Intel8254芯片就提供了三路可编程定时器,一直沿用至今。8254控制该芯片的IO端口为IO_BASE + 0x40 ~ IO_BASE + 0x43,其中0x400x410x42分别为三路定时器的16位定时值寄存器,0x43为控制命令寄存器。控制命令寄存器的格式定义如下:

 

1.         bit76]——定时器选择位。选择对哪个计数器进行操作。“00”表示选择Counter 0,“01”表示选择Counter 1,“10”表示选择Counter 2,“11”表示Read-Back Command(仅对于8254,对于8253无效)。

2.         bit54]——Read/Write/Latch格式位。“00”表示锁存(Latch)当前计数器的值;“01”只读写计数器的高字节(MSB);“10”只读写计数器的低字节(LSB);“11”表示先读写计数器的LSB,再读写MSB

3.         bit31]——Mode bits,控制各通道的工作模式。“000”对应Mode 0;“001”对应Mode 1;“010”对应Mode 2;“011”对应Mode 3(方波信号发生器);“100”对应Mode 4;“101”对应Mode 5

4.         bit0]——控制计数器的存储模式。0表示以二进制格式存储,1表示计数器中的值以BCD格式存储。

 

知道如何控制定时器2之后,剩下的一个问题就需要了解speaker使能的IO端口了。这个端口就是0x610x618255的一个端口,这个端口的低两位用来控制蜂鸣器,位信息描述如下:

1、  bit0用来使能counter2,当bit0==0时,禁止counter2,否则使能counter2

2、  bit1用来控制counter2输出的方波信号,当为1时输出使能,否则禁止输出。

 

了解上述信息之后就可以很容易在Linux内核控制蜂鸣器了,可以直接写一个字符驱动,然后应用软件通过IOCTL将具体的发声信息传递给内核,由内核完成蜂鸣器的驱动。蜂鸣器驱动的内核部分核心代码可以点击下载[rar],感兴趣的朋友还可以将这个东西做成一个“虚拟小钢琴”,通过键盘来弹奏乐曲,可以自己娱乐一下。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客