2639
return false;
2640
}
2641
2642
-static void sd_write_byte(SDState *sd, uint8_t value)
2642
+static size_t sd_write_data(SDState *sd, const void *buf, size_t length)
2643
{
2644
unsigned int partition_access;
2645
int i;
2646
+ const uint8_t *value = buf;
2647
2648
if (!sd->blk || !blk_is_inserted(sd->blk)) {
2648
- return;
2649
+ return length;
2650
}
2651
2652
if (sd->state != sd_receivingdata_state) {
2653
qemu_log_mask(LOG_GUEST_ERROR,
2654
"%s: not in Receiving-Data state\n", __func__);
2654
- return;
2655
+ return length;
2656
}
2657
2658
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
2658
- return;
2659
+ return length;
2660
+
2661
+ /*
2662
+ * Only read one byte at a time. We will be called again with the
2663
+ * remaining.
2664
+ */
2665
+ length = 1;
2666
2667
trace_sdcard_write_data(sd->proto->name,
2668
sd->last_cmd_name,
2662
- sd->current_cmd, sd->data_offset, value);
2669
+ sd->current_cmd, sd->data_offset, value[0]);
2670
switch (sd->current_cmd) {
2671
case 24: /* CMD24: WRITE_SINGLE_BLOCK */
2665
- if (sd_generic_write_byte(sd, value)) {
2672
+ if (sd_generic_write_byte(sd, value[0])) {
2673
/* TODO: Check CRC before committing */
2674
sd->state = sd_programming_state;
2675
sd_blk_write(sd, sd->data_start, sd->data_offset);
2694
}
2695
}
2696
}
2690
- sd->data[sd->data_offset++] = value;
2697
+ sd->data[sd->data_offset++] = value[0];
2698
if (sd->data_offset >= sd->blk_len) {
2699
/* TODO: Check CRC before committing */
2700
sd->state = sd_programming_state;
2724
break;
2725
2726
case 26: /* CMD26: PROGRAM_CID */
2720
- if (sd_generic_write_byte(sd, value)) {
2727
+ if (sd_generic_write_byte(sd, value[0])) {
2728
/* TODO: Check CRC before committing */
2729
sd->state = sd_programming_state;
2730
for (i = 0; i < sizeof(sd->cid); i ++)
2742
break;
2743
2744
case 27: /* CMD27: PROGRAM_CSD */
2738
- if (sd_generic_write_byte(sd, value)) {
2745
+ if (sd_generic_write_byte(sd, value[0])) {
2746
/* TODO: Check CRC before committing */
2747
sd->state = sd_programming_state;
2748
for (i = 0; i < sizeof(sd->csd); i ++)
2765
break;
2766
2767
case 42: /* CMD42: LOCK_UNLOCK */
2761
- if (sd_generic_write_byte(sd, value)) {
2768
+ if (sd_generic_write_byte(sd, value[0])) {
2769
/* TODO: Check CRC before committing */
2770
sd->state = sd_programming_state;
2771
sd_lock_command(sd);
2775
break;
2776
2777
case 56: /* CMD56: GEN_CMD */
2771
- sd_generic_write_byte(sd, value);
2778
+ sd_generic_write_byte(sd, value[0]);
2779
break;
2780
2781
default:
2782
g_assert_not_reached();
2783
}
2784
+
2785
+ return length;
2786
}
2787
2779
-static uint8_t sd_read_byte(SDState *sd)
2788
+static size_t sd_read_data(SDState *sd, void *buf, size_t length)
2789
{
2790
/* TODO: Append CRCs */
2791
const uint8_t dummy_byte = 0x00;
2792
unsigned int partition_access;
2784
- uint8_t ret;
2793
uint32_t io_len;
2794
+ uint8_t *value = buf;
2795
2796
if (!sd->blk || !blk_is_inserted(sd->blk)) {
2788
- return dummy_byte;
2797
+ memset(buf, dummy_byte, length);
2798
+ return length;
2799
}
2800
2801
if (sd->state != sd_sendingdata_state) {
2802
qemu_log_mask(LOG_GUEST_ERROR,
2803
"%s: not in Sending-Data state\n", __func__);
2794
- return dummy_byte;
2804
+ memset(buf, dummy_byte, length);
2805
+ return length;
2806
}
2807
2808
if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION)) {
2798
- return dummy_byte;
2809
+ memset(buf, dummy_byte, length);
2810
+ return length;
2811
}
2812
2813
+ /*
2814
+ * We will only read one byte at a time. We will be called again with the
2815
+ * remaining buffer.
2816
+ */
2817
+ length = 1;
2818
+
2819
io_len = sd_blk_len(sd);
2820
2821
trace_sdcard_read_data(sd->proto->name,
2833
case 30: /* CMD30: SEND_WRITE_PROT */
2834
case 51: /* ACMD51: SEND_SCR */
2835
case 56: /* CMD56: GEN_CMD */
2818
- sd_generic_read_byte(sd, &ret);
2836
+ sd_generic_read_byte(sd, value);
2837
break;
2838
2839
case 18: /* CMD18: READ_MULTIPLE_BLOCK */
2850
sd_blk_read(sd, sd->data_start, io_len);
2851
}
2852
}
2835
- ret = sd->data[sd->data_offset ++];
2853
+ *value = sd->data[sd->data_offset++];
2854
2855
if (sd->data_offset >= io_len) {
2856
sd->data_start += io_len;
2869
default:
2870
qemu_log_mask(LOG_GUEST_ERROR, "%s: DAT read illegal for command %s\n",
2871
__func__, sd->last_cmd_name);
2854
- return dummy_byte;
2872
+ *value = dummy_byte;
2873
}
2874
2857
- return ret;
2875
+ return length;
2876
}
2877
2878
static bool sd_receive_ready(SDState *sd)
3214
sc->get_dat_lines = sd_get_dat_lines;
3215
sc->get_cmd_line = sd_get_cmd_line;
3216
sc->do_command = sd_do_command;
3199
- sc->write_byte = sd_write_byte;
3200
- sc->read_byte = sd_read_byte;
3217
+ sc->write_data = sd_write_data;
3218
+ sc->read_data = sd_read_data;
3219
sc->receive_ready = sd_receive_ready;
3220
sc->data_ready = sd_data_ready;
3221
sc->get_inserted = sd_get_inserted;