MMC PCI cardreader 簡介記錄

mmc_blk_probe
    mc_blk_alloc
        mmc_blk_alloc_req
            md->disk = alloc_disk
            disk_name mmcblk%d%s md->name_idx subname
            mmc_initqueue
            queue.data = md;queue.issue_fn = mmc_blk_issue_rq
                blk_init_queue(mmc_request_fn, lock)
                mq->thread = kthread_run(mmc_queue_thread,***)
    mc_set_driver_data(card md),md 就是mmc_blk_data
    每一个分区添加disk mmc_add_disk

mmc_request_fn
    wake_up(mq->thread)
    mmc_request_fn
    blk_fetch_request
    issue_fn mmc-blk_issue_rq
    mmc_blk_part_switch
    mmc_blk_issue_rw_rq(mq, req)
        mmc_blk_preppacked_list/*不知道*/
        mmc_blk_rw_rq_prep(mq_rq, card, disable_multi, mq)/**************/
            填充mq_rq->brq这个指针指向的结构体mmc_blk_request
            brq->data.sg = mqrq->sg
            brq->data.sg_len = mmc_queue_mapsg
            mqrq->mmc_active.mrq = &blk->mrq
        mmc_start_req(mqrq->mmc_active)
driver/core/core.c
            __mmc_start_data_req


mmc_blk_issue_rq(struct *mmc_queue, struct request *req)







driver/host/rtsx_icr.c
发送命令并得到返回值
rtsx_icr_send_cmd_and_get_resp(struct rtsx_icr *, struct mmc_command *cmd)
    rtsx_icr_init_cmd
    rtsx_icr_reg_set_sd_cmd
        把命令号cmd->opcode放在SD_CMD0 FF09处,参数32位放在SD_CMD1处FF10
    通过sd_conf2来设置回应的类别。
    通过card_data_source来设置data source,ring buffer或者ping pang buffer。ringbuffer地址为memar。使用pingpong buf
    返回48位数据直接放在SD_CMD0之后的arg中,如果是136位的回应,是在pingpong buf中读取。返回参数放在cmd->resp[i].
    把地址长度的表放在dma内存中,然后把命令的物理地址放在HCBAR,数据的物理地址放在HDBAR。开始命令的dma传输写HCBCLR.HDBCTLR
发送数据
发送数据要线发送命令,然后发数据
rtsx_icr_transfer_data
    同理开始dma后等待中断wait_for_completion_interruptible_timeout

中断:

mmc_host_ops
set_ios设置host
get_ro是否只读,读取BIPRbit19写保护,
get_cd卡是否存在,等卡的中断设置
start_signal_voltage_switch切电压,设置H_SD_LDO_CFG0 FF52 3.3 或1.8V
card_busy卡是否忙,读SD_BUS_STAT FF05
execute_tuning





pci设备枚举
pci_controller {
    .pci_ops
    .mem_resource
    .mem_offset
    .io_resource
    .io_offset
}
pci_ops {
    .read
    .write
}
register_pci_controller(pcie);
    request_resouce
    pcibios_scanbus
        pci_add_resource_offset
        pci_scan_root_bus
linux/driver/pci/
        pci_creat_root_bus
        pci_bus_insert_busn_res
        pci_scan_child_bus
            for devfn < 0x100
            pci_scan_slot根据每一个设备及功能号来搜索设备
            pci_scan_singnal_device
            pci_scan_device
                alloc_pci_dev
                alloc
                pci_bus_read_Dev_vendor_id读取配置空间的vendor和deviceid
                dev->dev.type = &pci_dev_type
                dev->vendor = l &0xffff
                dev->device = (l >> 16) & 0xffff;
        pci_bus_add_device
这样就把每一个pci接口的设备功能增加为一个设备。
pci设备配置头
                DW |    Byte3    |    Byte2    |    Byte1    |     Byte0     | Addr
        ---+---------------------------------------------------------+-----
         0 |     Device ID     |     Vendor ID      | 00
        ---+---------------------------------------------------------+-----
         1 |      Status     |      Command      | 04
        ---+---------------------------------------------------------+-----
         2 |        Class Code        | Revision ID | 08
        ---+---------------------------------------------------------+-----
         3 |   BIST  | Header Type | Latency Timer | Cache Line  | 0C
        ---+---------------------------------------------------------+-----
         4 |           Base Address 0           | 10
        ---+---------------------------------------------------------+-----
         5 |           Base Address 1           | 14
        ---+---------------------------------------------------------+-----
         6 |           Base Address 2           | 18
        ---+---------------------------------------------------------+-----
         7 |           Base Address 3           | 1C
        ---+---------------------------------------------------------+-----
         8 |           Base Address 4           | 20
        ---+---------------------------------------------------------+-----
         9 |           Base Address 5           | 24
        ---+---------------------------------------------------------+-----
        10 |          CardBus CIS pointer          | 28
        ---+---------------------------------------------------------+-----
        11 |  Subsystem Device ID  |   Subsystem Vendor ID   | 2C
        ---+---------------------------------------------------------+-----
        12 |        Expansion ROM Base Address        | 30
        ---+---------------------------------------------------------+-----
        13 |        Reserved(Capability List)         | 34
        ---+---------------------------------------------------------+-----
        14 |            Reserved             | 38
        ---+---------------------------------------------------------+-----
        15 |  Max_Lat  |  Min_Gnt  |  IRQ Pin  |  IRQ Line  | 3C
        -------------------------------------------------------------------

pcibus
pci_bus_type
{
    .name = "pci",
    match = pci_bus_match,
    dev_attrs = pci_dev_attrs,
    bus_attrs = pci_bus_attrs,
    drv_attrs = pci_drv_attrs,
}
pci_bus_match
    id->vendor == dev->vendor &&
    id->device == dev->device &&
    id->subvendor == dev->subsystem_vendor &&
    id->subdevice == dev->subsystem_device
    device的这几个值都是从pci配置偷里读出来的。dricer.id的值是写在driver里的。所以这四个值要与配置空间偷保持一致才能被匹配。
    dev->irq = read byte PCI_INTERRUPT_LINE,中断号是读的配置空间。pci有几个中断线,每隔设备设置可能不同。


pci_driver
/driver/mfd/rtsx_pcr.c
pci_driver resx_pci_driver {
    .name
    .id_table
    .probe
}

probe
    pci_set_dma_mask
    pci_enable_device
    pci_request_regions
    pci_resource_len
    pci_resource_start
    pcr->remap_addr = ioremap_nocache
    pcr->rts_resv_buf = dma_alloc_coherent
    4K的空间,1K给cmd,3k给数据用作data的sg dma传输。
    init_delayed_work(carddet_work)
    request_irq(pcr->pci->irq, rtsx_pci_isr, IRQF_SHARED, pcr)
    rtsx_pci_init_chip
        有5209 5229 5249 5227,这几个主要是区别不同的read的一些差别。提供统一的接口。
        填充pcr->ops
            .turn_on_led
            .turn_off_led
            .enable_auto_blink
            .ard_power_on
            .card_power_off
            switch_output_voltage切换电压
        pcr->sd_pull_ctl_enable_tbl
        pcr->sd_pull_ctl_disable_tbl
    mfd_add_device


driver/mfd/rtsx_pcr.c







HCBAR
    命令传输的物理地址。是指多个设置寄存器的命令的传输,
HCBCTLR
    命令传输的控制寄存器。开始传输和传输的长度字节。
HDBAR
    数据传输的物理地址。
HDBCTLR
    数据的传输控制,包括开始,方向,停止。
HAIMR
    单个寄存器的设置。
BIRP(bus interrupt pending register)
    总线的中断标志位,命令传输完成,数据传输完成,上一次传输正确,上一次传输错误,sd卡的插入拔出,sd卡写保护,card errror crc controler error,bus error。
BIER
    中断时能。
OCP_WRAPPER_EN
    不知道。
MEMAR
    ringbuffer 的访问地址,ringbuffer 干啥的不知道。
MEMCTLR
    ringbuffer 的数据读写通过ocp/
SDMAR
    感觉和HDMAR一样
SDMACTLR
    和HDBCTLR一样

CARD——STOP card transfer reset register
    SD/MS error signal clear, SD/MS transfer reset
CARD_OE
    SD output enable
CARD_DATA_RESOURCE
    数据源的选择,ping pongbuffer or ring buffer
CARD_DMA_CTl
    DMA的总线宽度,只有在使用ring buffer并且block 长度不为4的整数倍蔡有影响。
SDCMD_PULL_CTL
    SD的CMD CD WP CLK线的上下拉控制。
SDCMD_DRV——SEL
    CD WP CMD CLK 的驱动电流,4ma 8ma,初始化时设置成8ma
SDCMD_SR_CTLR
    CD WP CMD CLK sr ctlr
SDDATA03_PULL_CTKR
    data0~3 pullctlr
DRV SR CTLR
DATA04_PULL_CTRL
CARD_EXIT
    card write protect exist.OR
SD_CONFIGURE1
    clk 的分频,模式选择sd2.0 3.0 ddr,一线四线八线选择
SD_CONFIGURE2
    是否计算CRC7,CRC16检查,反馈的类型,无反馈,6个字节17个字节的反馈。
SD_CONFIGURE3
    cmd不等card busy直接start stop,clk stop when data transfer done,check response 。response timeout enable。
SD_STATUS1
    CRC7 16error write CRCerror,
SD_STATUS2
    CMD response invalid。 response timeout。
SD_BUS_STATUS
    表示cmd和data线的高低电平,还有clk的toggle

SD_CMD00~5
    cmd0~4 command0~39 或resonpse0~39 cmd5 response40~47
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值