当用户调用read()函数时,内核相应地调用sir_read()函数。在Sir_read()中,通过判断硬件寄存器是否有新数据到来而决定是否从设备读取数据,然后使用内核提供的copy touser(void*to,const void*from,unsigned long count)函数将数据返回应用程序。write()函数的实现与read()函数的实现过程正好相反。在sir_write()中,通过调用copy_from user_form_user(void*to,const void*from,unsigned long count,)函数来完成把数据从用户的应用程序传送给硬件设备。 1.2.5实现模式 设备驱动程序的主体完成了,现在要把驱动程序嵌入内核。实现Llnux下IrDA设备驱动功能主要有两种形式:一是通过内核来进行加载,需要用户在./etc/rc.d/目录中定义的初始启动脚本中写入命令,当内核启动的时候,就开始加载IrDA设备驱动程序,内核启动完成之后,IrDA驱动功能也随即实现了,但是增大了内核;第二是通过模块加载的形式。比较两者,第二种形式更加灵活,在此着重对模块加载形式进行讨论。模块设计是Llnux中特有的技术,它使Linux内核功能更容易扩展。采用模块来设计Linux设备驱动程序会很轻松,并且能够形成固定的模式。任何人只要依照这个模式去设计,都能设计出优良的设备驱动程序。 先简要概述一下基于模块加载的设备驱动程序的设计步骤。首先每一个可装配的设备驱动程序都必须有init_module和cleanup module两个函数,装载和卸载设备时内核自动调用这两个函数。前者在insmod的时候执行,后者在rmmod的时候执行。通过模块加载命令insmod来把IrDA设备驱动程序插入到内核之中。在init_module中,除可以对硬件设备进行检查和初始化外,还必须调用reglster_*’函数将设备登记到系统中。本例中是通过register_chrdev来登记的,如果是块设备或网络设备则应该用reglstei_blkdev和register_netdev来登记。registeT_chrdev的主要功能是将设备名和结构flle operatioons登记到系统的设备控制块中。最后可以通过执行模块卸载命令rmmod,调用IrDA驱动程序中的cleanup_module()函数,来对IrDA驱动程序模块卸载,具体实现过程如图l所示。
2 基于MC68HC908AP64红外发射器的设计 2.1 红外发射器的硬件设计 为了可以检测Sitsang板端的IrDA设备能否正常工作,设计了一个IrDA发射器。发射器的体积为l3cm
本文章更多内容:<<上一页 - 1 - 2 - 3 |