| 578 | } |
| 579 | |
| 580 | static rt_err_t mmcsd_read_sd_status(struct rt_mmcsd_card *card, rt_uint32_t *sd_status) |
| 581 | { |
| 582 | rt_int32_t err; |
| 583 | struct rt_mmcsd_req req; |
| 584 | struct rt_mmcsd_cmd cmd; |
| 585 | struct rt_mmcsd_data data; |
| 586 | |
| 587 | err = mmcsd_app_cmd(card->host, card); |
| 588 | if (err) |
| 589 | return err; |
| 590 | |
| 591 | rt_memset(&req, 0, sizeof(struct rt_mmcsd_req)); |
| 592 | rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd)); |
| 593 | rt_memset(&data, 0, sizeof(struct rt_mmcsd_data)); |
| 594 | |
| 595 | req.cmd = &cmd; |
| 596 | req.data = &data; |
| 597 | |
| 598 | cmd.cmd_code = SEND_STATUS; |
| 599 | cmd.arg = 0; |
| 600 | cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC; |
| 601 | |
| 602 | data.blksize = 64; |
| 603 | data.blks = 1; |
| 604 | data.flags = DATA_DIR_READ; |
| 605 | data.buf = sd_status; |
| 606 | |
| 607 | mmcsd_set_data_timeout(&data, card); |
| 608 | |
| 609 | mmcsd_send_request(card->host, &req); |
| 610 | |
| 611 | if (cmd.err) |
| 612 | return cmd.err; |
| 613 | if (data.err) |
| 614 | return data.err; |
| 615 | |
| 616 | /* Convert endian */ |
| 617 | for (uint32_t i=0; i < 8; i++) |
| 618 | { |
| 619 | uint32_t tmp = sd_status[i]; |
| 620 | sd_status[i] = sd_status[15 - i]; |
| 621 | sd_status[15 - i] = tmp; |
| 622 | } |
| 623 | for (uint32_t i=0; i < 16; i++) |
| 624 | { |
| 625 | sd_status[i] = be32_to_cpu(sd_status[i]); |
| 626 | } |
| 627 | |
| 628 | |
| 629 | return 0; |
| 630 | } |
| 631 | |
| 632 | static rt_err_t sd_switch_voltage(struct rt_mmcsd_host *host) |
| 633 | { |
no test coverage detected