注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

嵌入式开发实战4——内核的编译之十八MMC(SD、SDIO)卡的驱动说明5  

2012-07-25 20:41:18|  分类: ARM开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

嵌入式开发实战4——内核的编译之十八MMC(SD、SDIO)卡的驱动说明5


 
觉得这个东西很长,一时半会说不完,而他又和MTD有很深的联系,所以把它挪到了MTD子系统中进行讲解。还得先把重要的整个环境的通透说清楚。
先实践,后深入讲解,省得大家落进一个又一个的坑儿。
不过今天仍然接着说SD卡的驱动,讲完了CARD,就要开始讲CORE部分了,这个可是相当复杂。如无意外,还得从KCONFIG和MAKEFILE讲起,其实主要是为了看清整个工程的脉络。更便于大家学习。

core/Makefile

5       ifeq ($(CONFIG_MMC_DEBUG),y)                             

6                EXTRA_CFLAGS                  += -DDEBUG   

7       endif                                    

8                                           

9       obj-$(CONFIG_MMC)                += mmc_core.o                

10     mmc_core-y                       := core.o bus.o host.o \  

11                                             mmc.o mmc_ops.o sd.o sd_ops.o \

12                                             sdio.o sdio_ops.o sdio_bus.o \

13                                             sdio_cis.o sdio_io.o sdio_irq.o

14                                         

15     mmc_core-$(CONFIG_DEBUG_FS) += debugfs.o                     


需要关注的文件还是相当多的,象在CARD里一样,看一看入口的函数:subsys_initcall(mmc_init)

mmc/core/core.c

1315         static int __init mmc_init(void)                

1316         {                

1317                   int ret;     

1318                           

1319                   workqueue = create_singlethread_workqueue("kmmcd");  

1320                   if (!workqueue)        

1321                            return -ENOMEM;

1322                           

1323                   ret = mmc_register_bus();     

1324                   if (ret)      

1325                            goto destroy_workqueue;

1326                           

1327                   ret = mmc_register_host_class(); 

1328                   if (ret)      

1329                            goto unregister_bus;

1330                           

1331                   ret = sdio_register_bus();       

1332                   if (ret)      

1333                            goto unregister_host_class;

1334                           

1335                   return 0; 

1336                           

1337         unregister_host_class:            

1338                   mmc_unregister_host_class();       

1339         unregister_bus:                

1340                   mmc_unregister_bus(); 

1341         destroy_workqueue:                

1342                   destroy_workqueue(workqueue);  

1343                           

1344                   return ret;       

1345         }                

1319行内核时间处理机制中大名鼎鼎的工作队列就被使用在这里了。我们知道每个工作队列有一个或多个专用的进程("内核线程"), 它运行提交给这个队列的函数。通常我们使用create_workqueue来创建一个工作队列,实际上他可能创建了多个线程运行在系统不同的处理器上。然而在很多情况下, 我们提交的任务可能是些简单的单线程就能够完成的工作,这时候使用create_singlethread_workqueue来代替创建工作队列时在适用不过了。这里就是直接使用create_singlethread_workqueue创建一个单线程的工作队列。

1323行之前分析内核入口的时候提及的mmc_bus_type,看代码。

mmc/core/bus.c

150  int mmc_register_bus(void)   

151  {       

152            return bus_register(&mmc_bus_type);

153  }

看这代码清晰简单,不再废话。

1327行省略,它主要是对sys目录下的一些操作。

1331行又来个sdio_bus,其实SDIO 是目前我们比较关心的技术,SDIO 故名思义,就是 SD 的 I/O 接口(interface )的意思,不过这样解释可能还有点抽像。更具体的说明,SD 本来是记忆卡的标准,但是现在也可以把 SD 拿来插上一些外围接口使用,这样的技术便是 SDIO 。所以 SDIO 本身是一种相当单纯的技术,透过 SD 的 I/O 接脚来连接外部外围,并且透过 SD 上的 I/O 数据接位与这些外围传输数据,而且 SD 协会会员也推出很完整的 SDIO stack 驱动程序,使得 SDIO 外围(我们称为 SDIO 卡)的开发与应用变得相当热门。现在已经有非常多的手机或是手持装置都支持 SDIO 的功能(SD 标准原本就是针对 mobile device 而制定),而且许多 SDIO 外围也都被开发出来,让手机外接外围更加容易,并且开发上更有弹性(不需要内建外围)。目前常见的 SDIO 外围(SDIO 卡)有:Wi-Fi card (无线网络卡)、CMOS sensor card (照相模块)、GPS card

GSM/GPRS modem card、Bluetooth card、Radio/TV card。SDIO 的应用将是未来嵌入式系统最重要的接口技术之一,并且也会取代目前 GPIO 式的 SPI 接口。

         这儿注册个sdio_bus就是为那些sdio外设服务的,就像前面我们分析的card目录使用mmc_bus,说不准哪天又多出个什么wi-fi卡就要依附在这条sdio总线上,那时我们就可以像mmc_bus一样拿来用了。至少这里我们现在还不用管他,这也就是说刚才core中见到的若干个文件,只要名字带了个sdio的头的,我们八成都不用再来管他了。

mmc_init比较简短,说到这里也就算是结束了。一般来说core层所做的初始化的工作较少,多半是为整个子系统的工作提供必要的接口,就像前面分析块层设备驱动一样。另外,前面我们说过在card层给我们core的分析留下了一些线索,下面我们就来按之前遗留下来的函数的顺序对其一一进行分析。

不能偷懒啊。要努力。

  评论这张
 
阅读(771)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017