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
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