• Linux mmc framework2:基本组件之mmc


    1.前言

    本文主要mmc组件的主要流程,在介绍的过程中,将详细说明和mmc相关的流程,涉及到其它组件的详细流程再在相关文章中说明。

    2.主要数据结构和API

    TODO

    3. 主要流程

    3.1 mmc_attach_mmc

    以eMMC为例,则扫描时会回调mmc_attach_mmc

    mmc_attach_mmc->

           mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN)

           mmc_send_op_cond

           mmc_attach_bus_ops

           mmc_select_voltage

           mmc_init_card->

             mmc_add_card

    • mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN)
    identification阶段需要设为opendrain模式,协议约定;
    • mmc_send_op_cond
    发送CMD1,arg为0,获取OCR寄存器的内容,设备支持的电压范围
    • mmc_attach_bus_ops
    关联mmc_bus_type的ops
    • mmc_select_voltage
    根据host支持的电压范围和OCR寄存器中读取的电压范围,得出两者都支持的电压范围,然后选取最小的电压值。对于我们的host一般会采用固定输出的电压值。
    • mmc_init_card
    处理卡的检测和初始化:
    
    a). mmc_set_bus_mode(host, MMC_BUSMODE_OPENDRAIN);初始前将busmode设为opendrain 主要是用于identify mode执行线与,进入transfer模式将设为pushpull模式
    
    b). mmc_go_idle(host):发送CMD0,由于改变了OCR的值,需要让卡重新回到idle状态
    
    c).mmc_send_op_cond(host, ocr | (1 << 30), &rocr):发送CMD1,设置访问mode,前一个CMD1是获取ocr值,此处设置为sector模式???,进入ready状态
    
    d).mmc_all_send_cid:发送CMD2,获取CID寄存器的值,进入identification状态
    
    e).mmc_alloc_card:分配一个mmc_card设备,它是mmc子系统最顶层的设备,也是与block层打交道的设备
    
    f).mmc_set_relative_addr:CMD3,mmc_set_relative_addr设置相对地址,此时设备进入standby状态
    
    g).mmc_send_csd: 首先mmc_send_cxd_native(card->host, card->rca << 16,csd, MMC_SEND_CSD)发送CMD9,获取csd 寄存器的值
    
    h).mmc_decode_csd:对获取的csd寄存器值解析
    
    i).mmc_decode_cid:对前面获取的cid寄存器解析
    
    j).mmc_select_card:发送CMD7,在standby和transfer状态之间进行转换,此处转换到transfer状态
    k).mmc_get_ext_csd
    -> mmc_send_ext_csd-> mmc_send_cxd_data-> sg_init_one mmc_set_data_timeout-> mmc_wait_for_req 发送CMD8,获取ext_csd内容 mmc_set_data_timeout:设置延时时间,主要通过CSD寄存器读出,然后进行设置 l).mmc_read_ext_csd:解析ext_csd的内容 m).mmc_set_erase_size:设置擦除单位大小,依赖于ext_csd和csd n).mmc_switch:设置分区相关信息,其中part_config配置访问分区信息,part_time为switch命令执行时间。
    • mmc_add_card
    如果mmc_init_card初始化成功,则将调用mmc_add_card将mmc_card通过device_add加入到设备驱动模型中,此处就会触发执行前文所述的mmc_blk_probe函数
  • 相关阅读:
    Java知识系统回顾整理01基础05控制流程02 switch
    Java知识系统回顾整理01基础05控制流程01if
    Java知识系统回顾整理01基础04操作符07Scanner
    Java知识系统回顾整理01基础04操作符06三元运算符
    Java知识系统回顾整理01基础04操作符05赋值操作符
    Java知识系统回顾整理01基础04操作符04位操作符
    Java知识系统回顾整理01基础04操作符03逻辑运算符
    leetcode-----74. 搜索二维矩阵
    leetcode-----73. 矩阵置零
    leetcode-----72. 编辑距离
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/6744435.html
Copyright © 2020-2023  润新知