Esempio n. 1
0
File: main.c Progetto: Wiznet/W7500
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}