《精通linux设备驱动程序开发》——PCMCIA和CF

一、PCMCIA和CF是什么

  1、PCMCIA是16位数据传输接口规范。CF卡比PCMCIA要小,但和PCMCIA相兼容。

    1)、CF卡有50个引脚,但使用无源的CF_PCMCIA转换的适配器,可插入笔记本的68针的PCMCIA槽中。

    2)、PCMCIA和CF被限制在笔记本和手持式设备中,没有进入台式机和高端的机器中。


  2、PCMCIA规范修订后,现在支持高速的32位的CardBus卡。术语PC卡也常用来纸袋PCMCIA或CardBus设备。CardBus近似于PCI总线,因此内核将对CardBus设备的支持从

        PCMCIA设备的支持从pcmcia层移到了PCI层。


  3、PC卡有三种形式,其厚度依次增加:Type I(3.3mm),Type II(5mm),Type III(10.5mm)。


  4、笔记本计算机上的PCMCIA(P180  图9-1)和嵌入式系统上的PCMCIA(P180  图9-2)。



二、Linux-PCMCIA子系统

  1、Linux对PCMCIA的支持包括基于Intel的笔记本计算机,以及ARM、MIPS和PowerPC这些体系架构。


  2、PCMCIA子系统组成包括:PCMCIA主机控制器驱动程序,各种卡的客户驱动程序,辅助热插拔的守护程序,用户模式,以及和以上部分所有模块交互的卡服务模块。


  3、Linux-PCMCIA子系统(P181  图9-3)。

    1)、主机控制器驱动程序,实现了和PCMCIA主机控制器通信的底层例程。

    2)、PCMCIA客户驱动程序,用于相应插座事件。

    3)、PCMCIA核心,为主机控制器驱动程序和客户驱动程序提供服务。

    4)、驱动程序服务模块(ds),给客户驱动程序提供注册接口和总线服务。

    5)、pcmciautils包,包括一些用于控制PCMCIA插座的状态并在不同的卡配置机制间加以选择的工具。


  4、PCMCIA驱动程序组件与PC硬件之间的关联。(P181  图9-4)



三、主机控制器驱动程序

  1、通用卡驱动程序负责处理由卡函数产生的中断,而主机控制器驱动程序负责处理由诸如卡插入和拔出等事件所触发的、总线特定的中断。



四、PCMCIA核心

  1、PCMCIA核心的主要作用就是提供PCMCIA卡服务。它即支持客户驱动程序,又支持主机控制驱动程序。包括用于轮询插座相关事件的内核线程pccardd。


  2、PCMCIA核心的另一组件是用于操作CIS的库。CIS是PCMCIA卡的一部分。PCMCIA/CF存储空间分为两部分:属性存储空间和普通存储空间。属性存储空间包括CIS和卡配

        置寄存器。普通存储空间用于存储磁盘数据。



五、驱动程序服务

  1、驱动程序服务提供了基础设施包括如下部分:

    1)、捕获由pccardd内核线程分发的事件警告的处理程序。

    2)、负责和内核的总线核心通信的层。

    3)、服务例程。



六、客户驱动程序

 一)、数据结构

  1、PCMCIA设备由pcmcia_device_id结构体所标识,定义于include/linux/mod  devicetable.h文件中:

        struct  pcmcia_device_id {

            /*  .  .  .  */

            __u16  manf_id;

            __u16  card_id;

            __u8  func_id;

            /*  .  .  .  */

        };

    1)、manf_id、card_id和func_id分别保存PCMCIA卡制造商的ID、卡ID以及功能ID。

    2)、PCMCIA核心提供了宏PCMCIA_DEVICE_MANF_CARD(),用于从提供制造商和卡ID创建pcmcia_device_id结构。

    3)、宏PCMCIA_DEVICE_TABLE()标记了在模块映像中支持的pcmcia_device_ids,以便在卡插入槽、pcmcia子系统从CIS空间收集匹配的制造商/卡/功能ID时,能够根据

              需要加载模块。

    4)、PCMCIA、PCI和USB的设备ID与热插拔方法(P184  表9-1)


  2、PCMCIA客户驱动程序需要和它们的pcmcia_device_id表相关联,pcmcia_device_id中有probe()和remove()方法,这种关联是通过pcmcia_driver结构来获得的:

         struct  pcmcia_driver {

             int  (*probe)(struct  pcmcia_device  *dev);

             void  (*remove)(struct  pcmcia_device  *dev);

             /*  .  .  .  */

             struct  pcmcia_device_id  *id_table;

             /*  .  .  .  */

          };


  3、pcmcia_device结构代表一个PCMCIA设备,定义于driver/pcmcia/ds.h文件中:

        struct  pcmcia_device {

           /*  .  .  .  */

           io_req_t  io;

           irq_req_t  irq;

           config_reg_t  conf;

           /*  .  .  .  */

           struct  device  dev;

           /*  .  .  .  */

        };


  4、CIS操作例程使用定义于include/pcmcia/cispl.h文件中的tuple_t结构体保存CIS信息单元。

         typedef  struct  tuple_t {

             /*  .  .  .  */

             cisdata_t  TupleCode;

             /*  .  .  .  */

             cisdata_t  DesiredTuple;

             /*  .  .  .  */

             cisdata_t  *TupleData;

          };


  5、CIS包含针对卡所支持的每种配置的配置表入口.cis_cftable_entry定义于include/pcmcia/cistpl.h文件中,保存了此入口:

         typedef  struct  cistpl_cftable_entry_t {

             /*  .  .  .  */

             cistpl_power_t  vcc,  vpp1,  vpp2;

             cistpl_io_t  irq;

             cistpl_irq_t  irq;

             cistpl_mem_t  mem;

             /*  .  .  .  */

         };


  6、cistparse_t也定义在include/pcmcia.cistpl.h文件中,保存PCMCIA核心部分分析过的元组:

         typedef  struct  cisparse_t {

              /*  .  .  .  */

              cistpl_manfid_t  manfid;

              /*  .  .  .  */

              cistpl_cftable_entry_t  cftable_entry;


二)、设备实例:PCMCIA卡

  1、代码清单9-1:注册客户驱动程序。

  2、代码清单9-2:配置通用设备驱动程序。



七、将零件组装在一起



八、PCMCIA存储

  1、现在的PCMCIA/CF存储支持吉字节的容量。存储卡多种多样:

    1)、迷你IDE硬盘驱动器或微盘。

    2)、模拟IDE的固定存储卡。

    3)、使用内存的存储卡,但不能模拟IDE。



九、串行PCMCIA

  1、使用串行传输的带PCMCIA/CF卡的网络。(P190  图9-5)


十、调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值