Board logo

标题: 嵌入式Linux系统中MMC卡驱动管理技术研究 04 [打印本页]

作者: samwalton    时间: 2013-12-28 20:17     标题: 嵌入式Linux系统中MMC卡驱动管理技术研究 04

所有对清求队列的操作必须要求拥有该锁并禁止中断,然而,在驱动程序拥有这个锁的同时,其他任何读写请求不能排队到系统的任何块设备上,其他读写处理函数也不能运行。为了尽量减轻由于驱动程序长期的拥有该锁而导致系统性能下降的问题,在实现集群读写时必须遵循以下原则:

  ①对请求队列进行读写操作时要获得锁;
②对请求队列操作完毕后释放请求锁;
③为了减少占用锁的时间,可先把队列中的request结构从队列中取下来,再打开锁,然后在开锁的情况下对取下的request结构进行操作。

  基于以上原则,读/写处理函数的伪码如下所示:
mmc_request_fn()
whilc(1){
加锁io_request_lock;
读取当前mmc卡请求队列的第一个请求结构request;
释放锁io_request_lock;
if(request为空)
cxit(O); /*没有可以处理的队列,返回*/
read_mmc(); /*调用集群读写函数*/
加锁io_request_lock;
在queue结构中取处理完毕的request结构,释放request资源;
释放锁io_request_lock;
}
}

  2.3 守护线程

  在MMC卡驱动程序初始化的时候,启动守护线程mme_block_thread。它平时处于睡眠状态,当有对MMC卡的读/写请求时,mmc_blok_thread被唤醒。该线程调用上述读/写处理函数mmc_request_fn(),处理完毕后再进入睡眠状态。

  2.4 电源管理

   嵌入式系统一般有低功耗要求,当某设备长期没有运行时,就应该停止给该设备供电,以减少电能消耗。在内核中有一个需要注册的电源管理设备的队列pm_list,同时也有电源管理线程kpowered,它的优先级是所有运行进程中最低的。当系统长时间没有进程运行时,kpowered被唤醒,扫描pm_list队列各个注册的设备。如果发现该设备长期没有运行,则向该设备发出PM_SUSPEND事件;而当设备重新开始使用时,则向pm_list队列发出:PM_RESUME事件。

  在MMC卡驱动模块中注册了电源管理的回调函数mme_block_callback,即pm_register(PM_UNKNOWN_DEV,0,mme_pm_callback)。这样MMC卡就注册到了pm_list队列中去了。当有电源事件时,就触发mmc_pm_callback函数。该函数处理各种电源事件。

   程序中的电源事件有两种:

   ①PM_SUSPEND事件。该事件使MMC卡进入省电模式。这时驱动程序保存MMC卡的当前状态和重要寄存器的内容,如时钟寄存器MMC_CLKRT和状态寄存器MMC_STAT等。然后,设置MMC卡的供电GPIO为高电平,关闭MMC卡的电源供应,没置MMC卡在时钟使能寄存器CKEN的相应位为O,关闭MMC卡的时钟脉冲。这时,MMC卡就进入了省电模式。

  ②PM_RESUME事件。该事件使MMC卡进入正常工作模式。这时程序恢复在进入省电模式前保存的寄存器,打开电源供应和时钟脉冲,MMC卡恢复到正常的工作模式。
当然电源事件也可以由用户进程自愿触发。在文件系统的接口file_operaion io_control中留有电源理管理接口,用户可以通过io_contol向卡发送电源事件请求。

  2.5 热插拔管理

  在手机、PDA等嵌入式系统中,都要求提供对设备的即插即用功能,使用户无须安装驱动程




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0