// interface_test_main.c
// BCD -- Ben Hutton, Chris Leary, Devrin Talen
// A test program for the SIE.
#include "usb_primitives.h"
#include "usb_interface.h"
#include <stdlib.h>
#define debug(string) sprintf(print_buffer, string); send_debug()
#if 0
void test_hc_based_junks()
{
HC_T *hc;
SIE_T *sie;
uint8_t iter;
TRANSACTION_T *trans;
hc = HostController();
sie = SerialInterfaceEngine();
hc_bind_sie(hc, sie);
trans = Transaction(CONTROL, TokenPacket(IN, 0, 0), DataPacket(DATA0, 0));
hc_push_transaction(hc, trans);
sie_reset(sie);
for (iter = 0; iter < 100; iter++)
_delay_ms(10); // 17.476 ms max
sie_idle(sie);
hc_do_transaction(hc);
}
void testing_some_junks_names_get_worse()
{
TOKEN_PACKET_T *tp;
TRANSACTION_T *trans;
SIE_T *sie;
uint8_t iter;
sie = SerialInterfaceEngine();
tp = TokenPacket(IN, 0, 0);
packet_make_crc5(tp);
trans = Transaction(CONTROL, tp, NULL);
transaction_place_in_buffer(trans, sie->buffer, &(sie->token_packet_length),
&(sie->data_packet_length));
sie_nrzi_encode_buffer(sie, 1);
for (iter = 0; iter < 3; iter++) sie->buffer[iter] = flip_byte(sie->buffer[iter], 8);
sie_reset(sie);
for (iter = 0; iter < 21; iter++) _delay_ms(1000);
sie_idle(sie);
sie_control_transfer(sie);
}
void test_nrzi_transfer()
{
SIE_T *sie;
uint8_t iter;
sie = SerialInterfaceEngine();
sie->buffer_encoding = NRZI;
sie->buffer[0] = 0xb1;
sie->buffer[1] = 0xab;
sie->buffer[2] = 0x46;
for (iter = 0; iter < 3; iter++) {
sie->buffer[iter] = flip_byte(sie->buffer[iter], 8);
}
sie_reset(sie);
for (iter = 0; iter < 21; iter++) {
_delay_ms(1);
}
sie_idle(sie);
sie->token_packet_length = 24;
sie->data_packet_length = 0;
sie_control_transfer(sie);
}
void test_sie_transfer()
{
SIE_T *sie;
unsigned char iter;
debug("Program started.\n");
sie = SerialInterfaceEngine();
for (iter = 0; iter < 16; iter++) sie->buffer[iter] = 0;
sie->buffer[0] = 0x0f;
sie->token_packet_length = 8;
sie->data_packet_length = 0;
sie->data_direction = TRANSMIT;
sie_control_transfer(sie);
debug("Program ended.\n\n");
}
#endif
void test_hc_sie_interaction()
{
HC_T *hc;
SIE_T *sie;
uint8_t iter;
// transaction-specific variables
TRANSACTION_T *setup;
TRANSACTION_T **ins;
TOKEN_PACKET_T *tp;
DATA_PACKET_T *dp;
// create an SIE and a HC
hc = HostController();
sie = SerialInterfaceEngine();
hc_bind_sie(hc, sie);
ins = malloc(sizeof(TRANSACTION_T *) * 3);
// hold reset
sie_reset(sie);
for (iter = 0; iter < 100; iter++) _delay_ms(10);
sie_idle(sie);
// create a setup transaction
tp = TokenPacket(SETUP, 0, 0);
dp = DataPacket(DATA0, 8);
dp->data[7] = 0x80;
dp->data[6] = 0x06;
dp->data[5] = 0x00;
dp->data[4] = 0x01;
dp->data[3] = 0x00;
dp->data[2] = 0x00;
dp->data[1] = 0x12;
dp->data[0] = 0x00;
// create the control transaction with the new token packet
setup = Transaction(CONTROL, tp, dp);
hc_push_transaction(hc, setup);
// we also need 3 INs to read the device descriptor
for (iter = 0; iter < 3; iter++) {
tp = TokenPacket(IN, 0, 0);
// this is a data in, so PID and size don't matter
dp = DataPacket(DATA0, 0);
ins[iter] = Transaction(CONTROL, tp, dp);
// push the transaction on the HC queue
hc_push_transaction(hc, ins[iter]);
}
// do the transactions
for (iter = 0; iter < 4; iter++) hc_do_transaction(hc);
debug("Program finished.\n");
debug("-----------------\n");
debug("-----------------\n\n\n");
}
int main()
{
// initialization
DDRA=0x0f;
DDRC=0xff;
//testing_some_junks_names_get_worse();
//test_hc_based_junks();
test_hc_sie_interaction();
//test_sie_transfer();
while (1);
}