编程PCI SD卡读卡器

Programming PCI SD card reader

提问人:ZwClose 提问时间:10/20/2023 最后编辑:LundinZwClose 更新时间:10/20/2023 访问量:68

问:

我正在尝试从插入 Realtek 5260 读卡器的 SD 卡中读取扇区。读卡器是连接到笔记本电脑的 PCI 设备。我通过将命令及其参数写入命令缓冲区来发出READ_SINGLE_BLOCK (17)。该命令指示读取器对数据使用乒乓缓冲区。

    //read single block
    init_cmd(hDev);

    add_cmd(hDev, WRITE_REG, 0xFDA9, 0xFFu, 0x51u); //SD_CMD0 0x11 | 0x40
    add_cmd(hDev, WRITE_REG, 0xFDAA, 0xFFu, 0); //SD_CMD1
    add_cmd(hDev, WRITE_REG, 0xFDAB, 0xFFu, 0); //SD_CMD2
    add_cmd(hDev, WRITE_REG, 0xFDAC, 0xFFu, 0); //SD_CMD3
    add_cmd(hDev, WRITE_REG, 0xFDAD, 0xFFu, 0); //SD_CMD4

    add_cmd(hDev, WRITE_REG, 0xFDAF, 0xFFu, 0x0); //SD_BYTE_CNT_L
    add_cmd(hDev, WRITE_REG, 0xFDB0, 0xFFu, 0x2); //SD_BYTE_CNT_H
    add_cmd(hDev, WRITE_REG, 0xFDB1, 0xFFu, 0x1); //SD_BLOCK_CNT_L
    add_cmd(hDev, WRITE_REG, 0xFDB2, 0xFFu, 0x0); //SD_BLOCK_CNT_H

    add_cmd(hDev, WRITE_REG, 0xFDA0, 0x3u, 0x1); //SD_CFG1 : bus width

    add_cmd(hDev, WRITE_REG, 0xFDA1, 0xFFu, 0x1); //SD_CFG2 : RSP_TYPE_R1
    add_cmd(hDev, WRITE_REG, 0xFD5B, 1, 1); //CARD_DATA_SOURCE : 1 : RTSX_PINGPONG_BUFFER

    add_cmd(hDev, WRITE_REG, 0xFDB3, 0xFFu, 0x80 | 0xC); //SD_TRANSFER : RTSX_TM_NORMAL_READ
    add_cmd(hDev, CHECK_REG, 0xFDB3, 0x40u, 0x40); //SD_TRANSFER : SD_TRANSFER_END

    send_cmd(hDev);

发出READ_SINGLE_BLOCK后,我对控制器进行编程,以将数据从乒乓缓冲区移动到命令缓冲区:

    //read ping pong buffer
    init_cmd(hDev);
    DWORD reg = 0xFA00;
    for (DWORD i = 0; i < 0x100; i++)
    {
        add_cmd(hDev, READ_REG, reg, 0, 0);
        reg++;
    }
    send_cmd(hDev);

问题是,在发送命令并等待来自设备的中断后,我在命令缓冲区中观察到 0,就像读取失败一样。失败的原因可能是什么?我该如何处理这样的问题?

谢谢!

C 控制器 硬件 SD 卡 PCI-E

评论


答: 暂无答案