+ def handle_data_cmd24(self, mosi):
+ if self.start_token_found:
+ if len(self.read_buf) == 0:
+ self.ss_data = self.ss
+ self.read_buf.append(mosi)
+ if self.blocklen == 0: # FIXME
+ print("warning: setting blocklength to 512")
+ self.blocklen = 512
+ # Wait until block transfer completed.
+ if len(self.read_buf) < self.blocklen:
+ return
+ self.es_data = self.es
+ self.put(self.ss_data, self.es_data, self.out_ann, [24, ['Block data: %s' % self.read_buf]])
+ self.read_buf = []
+ self.state = 'DATA RESPONSE'
+ elif mosi == 0xfe:
+ self.put(self.ss, self.es, self.out_ann, [24, ['Data Start Token']])
+ self.start_token_found = True
+
+ def handle_data_response(self, miso):
+ miso &= 0x1F
+ if miso & 0x10 or not miso & 0x01:
+ # This is not the byte we are waiting for.
+ # Should we return to IDLE here?
+ return
+ self.put(self.miso_bits[7][1], self.miso_bits[5][2], self.out_ann, [134, ['don\'t care']])
+ self.put(self.miso_bits[4][1], self.miso_bits[4][2], self.out_ann, [134, ['0']])
+ if miso == 0x05:
+ self.put(self.miso_bits[3][1], self.miso_bits[1][2], self.out_ann, [134, ['Data accepted']])
+ elif miso == 0x0B:
+ self.put(self.miso_bits[3][1], self.miso_bits[1][2], self.out_ann, [134, ['Data rejected (CRC error)']])
+ elif miso == 0x0D:
+ self.put(self.miso_bits[3][1], self.miso_bits[1][2], self.out_ann, [134, ['Data rejected (write error)']])
+ self.put(self.miso_bits[0][1], self.miso_bits[0][2], self.out_ann, [134, ['1']])
+ self.put(self.ss, self.es, self.out_ann, [24, ['Data Response']]) # Assume cmd24 initiated the transfer.
+ self.state = 'IDLE'
+