int32_t uart_putc(uint8_t uartNum, uint8_t ch) { if(uartNum == 0) { if(IS_BUFFER_FULL(u0tx)) { BUFFER_CLEAR(u0tx); return RET_NOK; } else { BUFFER_IN(u0tx) = ch; BUFFER_IN_MOVE(u0tx, 1); UART_ITConfig(UART0,(UART_IT_FLAG_TXI),ENABLE); } } else if(uartNum == 1) { if(IS_BUFFER_FULL(u1tx)) { BUFFER_CLEAR(u1tx); return RET_NOK; } else { UartPutc(UART1,ch); //BUFFER_IN(u1tx) = ch; //BUFFER_IN_MOVE(u1tx, 1); //UART_ITConfig(UART1,(UART_IT_FLAG_TXI),ENABLE); } } return RET_OK; }
static ssize_t read_data (MifareTag tag, uint8_t command, uint8_t file_no, off_t offset, size_t length, void *data, int cs) { ssize_t bytes_read = 0; void *p = data; ASSERT_ACTIVE (tag); ASSERT_MIFARE_DESFIRE (tag); BUFFER_INIT (cmd, 8); BUFFER_INIT (res, MAX_FRAME_SIZE); BUFFER_APPEND (cmd, command); BUFFER_APPEND (cmd, file_no); BUFFER_APPEND_LE (cmd, offset, 3, sizeof (off_t)); BUFFER_APPEND_LE (cmd, length, 3, sizeof (size_t)); if (cs) { if (!(p = assert_crypto_buffer_size (tag, MAX_FRAME_SIZE - 1))) return -1; } do { ssize_t frame_bytes; DESFIRE_TRANSCEIVE (tag, cmd, res); frame_bytes = BUFFER_SIZE (res) - 1; memcpy ((uint8_t *)p + bytes_read, res + 1, frame_bytes); bytes_read += frame_bytes; if (res[0] == 0xAF) { if (p != data) { // If we are handling memory, request more for next frame. if (!(p = assert_crypto_buffer_size (tag, bytes_read + MAX_FRAME_SIZE - 1))) return -1; } BUFFER_CLEAR (cmd); BUFFER_APPEND (cmd, 0xAF); } } while (res[0] != 0x00); if (cs) { if (mifare_cryto_postprocess_data (tag, p, &bytes_read, cs)) memcpy (data, p, bytes_read); } return bytes_read; }
static ssize_t write_data (MifareTag tag, uint8_t command, uint8_t file_no, off_t offset, size_t length, void *data, int cs) { size_t bytes_left; size_t bytes_send = 0; void *p = data; ASSERT_ACTIVE (tag); ASSERT_MIFARE_DESFIRE (tag); BUFFER_INIT (cmd, MAX_FRAME_SIZE); BUFFER_INIT (res, 1); BUFFER_APPEND (cmd, command); BUFFER_APPEND (cmd, file_no); BUFFER_APPEND_LE (cmd, offset, 3, sizeof (off_t)); BUFFER_APPEND_LE (cmd, length, 3, sizeof (size_t)); p = mifare_cryto_preprocess_data (tag, data, &length, cs); bytes_left = 52; while (bytes_send < length) { size_t frame_bytes = MIN(bytes_left, length - bytes_send); BUFFER_APPEND_BYTES (cmd, (uint8_t *)p + bytes_send, frame_bytes); DESFIRE_TRANSCEIVE (tag, cmd, res); bytes_send += frame_bytes; if (0x00 == res[0]) break; // PICC returned 0xAF and expects more data BUFFER_CLEAR (cmd); BUFFER_APPEND (cmd, 0xAF); bytes_left = 0x59; } if (0x00 != res[0]) { // 0xAF (additionnal Frame) failure can happen here (wrong crypto method). MIFARE_DESFIRE (tag)->last_picc_error = res[0]; bytes_send = -1; } return bytes_send; }