锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Linux的设备驱动程序架构分析之MMC / SD(二)

时间:2023-01-19 15:00:00 72种1206电阻包

转自:http://blog.csdn.net/liuhaoyutz

内核版本:3.10.1

 
一,s3cmci_ops分析

在上一篇文章中,我们分析了它Mini2440 MMC / SD驱动探针函数s3cmci_probe。结构在函数中初始化mmc_host指针变量mmc,其中,设置mmc-> ops为s3cmci_ops,s3cmci_ops定义在drivers / mmc / host / s3cmci.c文件中:



struct mmc_host是mmc core层与主机层的接口,mmc_host.ops是控制主机完成用户请求的接口函数集,其类型是struct mmc_host_ops,该结构体定义在include / linux / mmc / host.h文件中:

  1.  83structmmc_host_ops {  
  2.  84     / * 
  3.  85 *“启用”在主机被声明时被调用,并且“禁用”被调用 
  4.  86 *当主机被释放时。“启用”和“禁用”已被弃用。 
  5.  87 * /  
  6.  88    int  (* enable)(struct  mmc_host * host);  
  7.  89    int  (* disable)(struct  mmc_host * host);  
  8.  90     / * 
  9.  91 *主机可以实现pre_req和post_req 
  10.  92 *命令来支持请求的双缓冲(准备一个 
  11.  93 *请求,而另一个请求是活动的)。 
  12.  94 * pre_req()必须后跟post_req()。 
  13.  95 *撤消对pre_req()的调用,调用post_req() 
  14.  96 *非零错误条件。 
  15.  97 * /  
  16.  98    void     (* post_req)(structmmc_host * host,  struct  mmc_request * req,  
  17.  99                 int  err);  
  18. 100    void     (* pre_req)(struct  mmc_host * host,  struct  mmc_request * req,  
  19. 101                bool  is_first_req);  
  20. 102    void     (* request)(struct  mmc_host * host,  struct  mmc_request * req);  
  21. 103    / * 
  22. 104 *避免频繁地调用这三个函数,或者在“fastpath”中, 
  23. 105 *因为底层控制器可能会以昂贵的方式实施它们 
  24. 106 *和/或缓慢的方式。 
  25. 107 * 
  26. 108 *另请注意,这些功能可能会休眠,所以不要打电话给他们 
  27. 109 *在原子语境中! 
  28. 110 * 
  29. 111 * get_ro回调函数的返回值应为: 
  30. 112 * 0用于读/写卡 
  31. 113 * 1用于只读卡 
  32. 114 * -ENOSYS不支持时(等于NULL回调) 
  33. 115 *或错误发生错误的负errno值 
  34. 116 * 
  35. 117 * get_cd回调的返回值应为: 
  36. 118 * 0为缺席卡 
  37. 119 * 1为现在的卡 
  38. 不支持120 * -ENOSYS(等于NULL回调) 
  39. 121 *或错误发生错误的负errno值 
  40. 122 * /  
  41. 123    void     (* set_ios)(struct  mmc_host * host,  struct  mmc_ios * ios);  
  42. 124    int  (* get_ro)(struct  mmc_host * host);  
  43. 125    int  (* get_cd)(struct  mmc_host * host);  
  44. 126  
  45. 127    void     (* enable_sdio_irq)(structmmc_host * host,  int  enable);  
  46. 128  
  47. 129    / *可选回调HC怪癖* /  
  48. 130    void     (* init_card)(struct  mmc_host * host,  struct  mmc_card * card);  
  49. 131  
  50. 132    int  (* start_signal_voltage_switch)(struct  mmc_host * host,  struct  mmc_ios * ios);  
  51. 133  
  52. 134    / *检查卡是否正在拉dat [0:3]低*  
  53. 135    int  (* card_busy)(struct  mmc_host * host);  
  54. 136  
  55. 137    / * SD和eMMC卡的调谐命令操作码值不同* /  
  56. 138    int  (* execute_tuning)(struct  mmc_host * host,u32 opcode);  
  57. 139    int  (* select_drive_strength)(unsigned  int  max_dtr,  int  host_drv,intcard_drv);  
  58. 140    void     (* hw_reset)(struct  mmc_host * host);  
  59. 141    void     (* card_event)(structmmc_host * host);  
  60. 142};  


请求函数用于处理用户的请求。

set_ios函数用于设置SDI的控制参数,如时钟,总线宽度等等。

get_ro函数用于探测SD卡是否有写保护。

get_cd函数用于探测卡是否已插入插槽。

enable_sdio_irq函数用于启动或禁用SDI中断。

需要注意的是,为什么没有对MMC / SD进行读写的读取和写入函数呢?这是因为Linux的块设备的读写操作是通过请求函数完成的。

那么对于mini2440的,它的s3cmci_ops中的成员函数在什么时候会被调用呢举例如下?

在驱动器/ MMC /核心/ core.c文件中:

 

相关文章