I am trying to read a sector from SD card inserted into Realtek 5260 card reader. The card reader is a PCI device attached to the laptop. I issue READ_SINGLE_BLOCK (17) by writing the command and its parameters to the command buffer. The command instructs the reader to use ping pong buffer for the data.
//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);
After issuing READ_SINGLE_BLOCK I program the controller to move data from the ping pong buffer to the command buffer:
//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);
The problem is that after sending the command and waiting for the interrupt from the device I observe 0s in the command buffer, like if read failed. What can be the reason of the fail? How do I approach such an issue?
Thanks!