reformat board_qc so it is not ugly, and follows industry standards

This commit is contained in:
Andrew J. Kroll 2013-10-21 13:52:35 -04:00
parent 13d625e6be
commit 18e401e55a

View file

@ -16,241 +16,235 @@ USB_DEVICE_DESCRIPTOR buf;
USB Usb; USB Usb;
//USBHub hub(&Usb); //USBHub hub(&Usb);
void setup() {
void setup() laststate = 0;
{ Serial.begin(115200);
laststate=0; E_Notify(PSTR("\r\nCircuits At Home 2011"), 0x80);
Serial.begin( 115200 ); E_Notify(PSTR("\r\nUSB Host Shield Quality Control Routine"), 0x80);
E_Notify(PSTR("\r\nCircuits At Home 2011"),0x80); /* SPI quick test - check revision register */
E_Notify(PSTR("\r\nUSB Host Shield Quality Control Routine"),0x80); E_Notify(PSTR("\r\nReading REVISION register... Die revision "), 0x80);
/* SPI quick test - check revision register */ Usb.Init();
E_Notify(PSTR("\r\nReading REVISION register... Die revision "),0x80); {
Usb.Init(); uint8_t tmpbyte = Usb.regRd(rREVISION);
{ switch (tmpbyte) {
uint8_t tmpbyte = Usb.regRd( rREVISION ); case( 0x01): //rev.01
switch( tmpbyte ) { E_Notify(PSTR("01"), 0x80);
case( 0x01): //rev.01 break;
E_Notify(PSTR("01"),0x80); case( 0x12): //rev.02
break; E_Notify(PSTR("02"), 0x80);
case( 0x12): //rev.02 break;
E_Notify(PSTR("02"),0x80); case( 0x13): //rev.03
break; E_Notify(PSTR("03"), 0x80);
case( 0x13): //rev.03 break;
E_Notify(PSTR("03"),0x80); default:
break; E_Notify(PSTR("invalid. Value returned: "), 0x80);
default: print_hex(tmpbyte, 8);
E_Notify(PSTR("invalid. Value returned: "),0x80); halt55();
print_hex( tmpbyte, 8 ); break;
halt55(); }//switch( tmpbyte...
break; }//check revision register
}//switch( tmpbyte... /* SPI long test */
}//check revision register {
/* SPI long test */ E_Notify(PSTR("\r\nSPI long test. Transfers 1MB of data. Each dot is 64K"), 0x80);
{ uint8_t sample_wr = 0;
E_Notify(PSTR("\r\nSPI long test. Transfers 1MB of data. Each dot is 64K"),0x80); uint8_t sample_rd = 0;
uint8_t sample_wr = 0; uint8_t gpinpol_copy = Usb.regRd(rGPINPOL);
uint8_t sample_rd = 0; for (uint8_t i = 0; i < 16; i++) {
uint8_t gpinpol_copy = Usb.regRd( rGPINPOL ); for (uint16_t j = 0; j < 65535; j++) {
for( uint8_t i = 0; i < 16; i++ ) { Usb.regWr(rGPINPOL, sample_wr);
for( uint16_t j = 0; j < 65535; j++ ) { sample_rd = Usb.regRd(rGPINPOL);
Usb.regWr( rGPINPOL, sample_wr ); if (sample_rd != sample_wr) {
sample_rd = Usb.regRd( rGPINPOL ); E_Notify(PSTR("\r\nTest failed. "), 0x80);
if( sample_rd != sample_wr ) { E_Notify(PSTR("Value written: "), 0x80);
E_Notify(PSTR("\r\nTest failed. "),0x80); print_hex(sample_wr, 8);
E_Notify(PSTR("Value written: "),0x80); E_Notify(PSTR(" read: "), 0x80);
print_hex( sample_wr, 8 ); print_hex(sample_rd, 8);
E_Notify(PSTR(" read: "),0x80); halt55();
print_hex( sample_rd, 8 ); }//if( sample_rd != sample_wr..
halt55(); sample_wr++;
}//if( sample_rd != sample_wr.. }//for( uint16_t j...
sample_wr++; E_Notify(PSTR("."), 0x80);
}//for( uint16_t j... }//for( uint8_t i...
E_Notify(PSTR("."),0x80); Usb.regWr(rGPINPOL, gpinpol_copy);
}//for( uint8_t i... E_Notify(PSTR(" SPI long test passed"), 0x80);
Usb.regWr( rGPINPOL, gpinpol_copy ); }//SPI long test
E_Notify(PSTR(" SPI long test passed"),0x80); /* GPIO test */
}//SPI long test /* in order to simplify board layout, GPIN pins on text fixture are connected to GPOUT */
/* GPIO test */ /* in reverse order, i.e, GPIN0 is connected to GPOUT7, GPIN1 to GPOUT6, etc. */
/* in order to simplify board layout, GPIN pins on text fixture are connected to GPOUT */ {
/* in reverse order, i.e, GPIN0 is connected to GPOUT7, GPIN1 to GPOUT6, etc. */ uint8_t tmpbyte;
{ E_Notify(PSTR("\r\nGPIO test. Connect GPIN0 to GPOUT7, GPIN1 to GPOUT6, and so on"), 0x80);
uint8_t tmpbyte; for (uint8_t sample_gpio = 0; sample_gpio < 255; sample_gpio++) {
E_Notify(PSTR("\r\nGPIO test. Connect GPIN0 to GPOUT7, GPIN1 to GPOUT6, and so on"),0x80); Usb.gpioWr(sample_gpio);
for( uint8_t sample_gpio = 0; sample_gpio < 255; sample_gpio++ ) { tmpbyte = Usb.gpioRd();
Usb.gpioWr( sample_gpio ); /* bit reversing code copied vetbatim from http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious */
tmpbyte = Usb.gpioRd(); tmpbyte = ((tmpbyte * 0x0802LU & 0x22110LU) | (tmpbyte * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
/* bit reversing code copied vetbatim from http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious */ if (sample_gpio != tmpbyte) {
tmpbyte = ((tmpbyte * 0x0802LU & 0x22110LU) | (tmpbyte * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16; E_Notify(PSTR("\r\nTest failed. Value written: "), 0x80);
if( sample_gpio != tmpbyte ) { print_hex(sample_gpio, 8);
E_Notify(PSTR("\r\nTest failed. Value written: "),0x80); E_Notify(PSTR(" Value read: "), 0x80);
print_hex( sample_gpio, 8 ); print_hex(tmpbyte, 8);
E_Notify(PSTR(" Value read: "),0x80); E_Notify(PSTR(" "), 0x80);
print_hex( tmpbyte , 8 ); press_any_key();
E_Notify(PSTR(" "),0x80); break;
press_any_key(); }//if( sample_gpio != tmpbyte...
break; }//for( uint8_t sample_gpio...
}//if( sample_gpio != tmpbyte... E_Notify(PSTR("\r\nGPIO test passed."), 0x80);
}//for( uint8_t sample_gpio... }//GPIO test
E_Notify(PSTR("\r\nGPIO test passed."),0x80); /* PLL test. Stops/starts MAX3421E oscillator several times */
}//GPIO test {
/* PLL test. Stops/starts MAX3421E oscillator several times */ E_Notify(PSTR("\r\nPLL test. 100 chip resets will be performed"), 0x80);
{ /* check current state of the oscillator */
E_Notify(PSTR("\r\nPLL test. 100 chip resets will be performed"),0x80); if (!(Usb.regRd(rUSBIRQ) & bmOSCOKIRQ)) { //wrong state - should be on
/* check current state of the oscillator */ E_Notify(PSTR("\r\nCurrent oscillator state unexpected."), 0x80);
if(!( Usb.regRd( rUSBIRQ ) & bmOSCOKIRQ )) { //wrong state - should be on press_any_key();
E_Notify(PSTR("\r\nCurrent oscillator state unexpected."),0x80); }
press_any_key(); /* Restart oscillator */
} E_Notify(PSTR("\r\nResetting oscillator\r\n"), 0x80);
/* Restart oscillator */ for (uint16_t i = 0; i < 100; i++) {
E_Notify(PSTR("\r\nResetting oscillator\r\n"),0x80); E_Notify(PSTR("\rReset number "), 0x80);
for( uint16_t i = 0; i < 100; i++ ) { Serial.print(i, DEC);
E_Notify(PSTR("\rReset number "),0x80); Usb.regWr(rUSBCTL, bmCHIPRES); //reset
Serial.print( i, DEC ); if (Usb.regRd(rUSBIRQ) & bmOSCOKIRQ) { //wrong state - should be off
Usb.regWr( rUSBCTL, bmCHIPRES ); //reset E_Notify(PSTR("\r\nCurrent oscillator state unexpected."), 0x80);
if( Usb.regRd( rUSBIRQ ) & bmOSCOKIRQ ) { //wrong state - should be off halt55();
E_Notify(PSTR("\r\nCurrent oscillator state unexpected."),0x80); }
halt55(); Usb.regWr(rUSBCTL, 0x00); //release from reset
} uint16_t j = 0;
Usb.regWr( rUSBCTL, 0x00 ); //release from reset for (j = 0; j < 65535; j++) { //tracking off to on time
uint16_t j = 0; if (Usb.regRd(rUSBIRQ) & bmOSCOKIRQ) {
for( j = 0; j < 65535; j++ ) { //tracking off to on time E_Notify(PSTR(" Time to stabilize - "), 0x80);
if( Usb.regRd( rUSBIRQ ) & bmOSCOKIRQ ) { Serial.print(j, DEC);
E_Notify(PSTR(" Time to stabilize - "),0x80); E_Notify(PSTR(" cycles\r\n"), 0x80);
Serial.print( j, DEC ); break;
E_Notify(PSTR(" cycles\r\n"),0x80); }
break; }//for( uint16_t j = 0; j < 65535; j++
} if (j == 0) {
}//for( uint16_t j = 0; j < 65535; j++ E_Notify(PSTR("PLL failed to stabilize"), 0x80);
if( j == 0 ) { press_any_key();
E_Notify(PSTR("PLL failed to stabilize"),0x80); }
press_any_key(); }//for( uint8_t i = 0; i < 255; i++
}
}//for( uint8_t i = 0; i < 255; i++ }//PLL test
/* initializing USB stack */
}//PLL test if (Usb.Init() == -1) {
/* initializing USB stack */ E_Notify(PSTR("\r\nOSCOKIRQ failed to assert"), 0x80);
if (Usb.Init() == -1) { halt55();
E_Notify(PSTR("\r\nOSCOKIRQ failed to assert"),0x80); }
halt55(); E_Notify(PSTR("\r\nChecking USB device communication.\r\n"), 0x80);
}
E_Notify(PSTR("\r\nChecking USB device communication.\r\n"),0x80);
} }
void loop() {
delay(200);
Usb.Task();
usbstate = Usb.getUsbTaskState();
if (usbstate != laststate) {
laststate = usbstate;
/**/
switch (usbstate) {
case( USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE):
E_Notify(PSTR("\r\nWaiting for device..."), 0x80);
break;
case( USB_ATTACHED_SUBSTATE_RESET_DEVICE):
E_Notify(PSTR("\r\nDevice connected. Resetting..."), 0x80);
break;
case( USB_ATTACHED_SUBSTATE_WAIT_SOF):
E_Notify(PSTR("\r\nReset complete. Waiting for the first SOF..."), 0x80);
break;
case( USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE):
E_Notify(PSTR("\r\nSOF generation started. Enumerating device..."), 0x80);
break;
case( USB_STATE_ADDRESSING):
E_Notify(PSTR("\r\nSetting device address..."), 0x80);
break;
case( USB_STATE_RUNNING):
E_Notify(PSTR("\r\nGetting device descriptor"), 0x80);
rcode = Usb.getDevDescr(1, 0, sizeof (USB_DEVICE_DESCRIPTOR), (uint8_t*) & buf);
void loop() if (rcode) {
{ E_Notify(PSTR("\r\nError reading device descriptor. Error code "), 0x80);
delay( 200 ); print_hex(rcode, 8);
Usb.Task(); } else {
usbstate = Usb.getUsbTaskState(); /**/
if(usbstate != laststate) { E_Notify(PSTR("\r\nDescriptor Length:\t"), 0x80);
laststate=usbstate; print_hex(buf.bLength, 8);
/**/ E_Notify(PSTR("\r\nDescriptor type:\t"), 0x80);
switch( usbstate ) { print_hex(buf.bDescriptorType, 8);
case( USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE ): E_Notify(PSTR("\r\nUSB version:\t\t"), 0x80);
E_Notify(PSTR("\r\nWaiting for device..."),0x80); print_hex(buf.bcdUSB, 16);
break; E_Notify(PSTR("\r\nDevice class:\t\t"), 0x80);
case( USB_ATTACHED_SUBSTATE_RESET_DEVICE ): print_hex(buf.bDeviceClass, 8);
E_Notify(PSTR("\r\nDevice connected. Resetting..."),0x80); E_Notify(PSTR("\r\nDevice Subclass:\t"), 0x80);
break; print_hex(buf.bDeviceSubClass, 8);
case( USB_ATTACHED_SUBSTATE_WAIT_SOF ): E_Notify(PSTR("\r\nDevice Protocol:\t"), 0x80);
E_Notify(PSTR("\r\nReset complete. Waiting for the first SOF..."),0x80); print_hex(buf.bDeviceProtocol, 8);
break; E_Notify(PSTR("\r\nMax.packet size:\t"), 0x80);
case( USB_ATTACHED_SUBSTATE_GET_DEVICE_DESCRIPTOR_SIZE ): print_hex(buf.bMaxPacketSize0, 8);
E_Notify(PSTR("\r\nSOF generation started. Enumerating device..."),0x80); E_Notify(PSTR("\r\nVendor ID:\t\t"), 0x80);
break; print_hex(buf.idVendor, 16);
case( USB_STATE_ADDRESSING ): E_Notify(PSTR("\r\nProduct ID:\t\t"), 0x80);
E_Notify(PSTR("\r\nSetting device address..."),0x80); print_hex(buf.idProduct, 16);
break; E_Notify(PSTR("\r\nRevision ID:\t\t"), 0x80);
case( USB_STATE_RUNNING ): print_hex(buf.bcdDevice, 16);
E_Notify(PSTR("\r\nGetting device descriptor"),0x80); E_Notify(PSTR("\r\nMfg.string index:\t"), 0x80);
rcode = Usb.getDevDescr( 1, 0, sizeof(USB_DEVICE_DESCRIPTOR), (uint8_t*)&buf ); print_hex(buf.iManufacturer, 8);
E_Notify(PSTR("\r\nProd.string index:\t"), 0x80);
if( rcode ) { print_hex(buf.iProduct, 8);
E_Notify(PSTR("\r\nError reading device descriptor. Error code "),0x80); E_Notify(PSTR("\r\nSerial number index:\t"), 0x80);
print_hex( rcode, 8 ); print_hex(buf.iSerialNumber, 8);
E_Notify(PSTR("\r\nNumber of conf.:\t"), 0x80);
print_hex(buf.bNumConfigurations, 8);
/**/
E_Notify(PSTR("\r\n\nAll tests passed. Press RESET to restart test"), 0x80);
while (1);
}
break;
case( USB_STATE_ERROR):
E_Notify(PSTR("\r\nUSB state machine reached error state"), 0x80);
break;
default:
break;
}//switch( usbstate...
} }
else {
/**/
E_Notify(PSTR("\r\nDescriptor Length:\t"),0x80);
print_hex( buf.bLength, 8 );
E_Notify(PSTR("\r\nDescriptor type:\t"),0x80);
print_hex( buf.bDescriptorType, 8 );
E_Notify(PSTR("\r\nUSB version:\t\t"),0x80);
print_hex( buf.bcdUSB, 16 );
E_Notify(PSTR("\r\nDevice class:\t\t"),0x80);
print_hex( buf.bDeviceClass, 8 );
E_Notify(PSTR("\r\nDevice Subclass:\t"),0x80);
print_hex( buf.bDeviceSubClass, 8 );
E_Notify(PSTR("\r\nDevice Protocol:\t"),0x80);
print_hex( buf.bDeviceProtocol, 8 );
E_Notify(PSTR("\r\nMax.packet size:\t"),0x80);
print_hex( buf.bMaxPacketSize0, 8 );
E_Notify(PSTR("\r\nVendor ID:\t\t"),0x80);
print_hex( buf.idVendor, 16 );
E_Notify(PSTR("\r\nProduct ID:\t\t"),0x80);
print_hex( buf.idProduct, 16 );
E_Notify(PSTR("\r\nRevision ID:\t\t"),0x80);
print_hex( buf.bcdDevice, 16 );
E_Notify(PSTR("\r\nMfg.string index:\t"),0x80);
print_hex( buf.iManufacturer, 8 );
E_Notify(PSTR("\r\nProd.string index:\t"),0x80);
print_hex( buf.iProduct, 8 );
E_Notify(PSTR("\r\nSerial number index:\t"),0x80);
print_hex( buf.iSerialNumber, 8 );
E_Notify(PSTR("\r\nNumber of conf.:\t"),0x80);
print_hex( buf.bNumConfigurations, 8 );
/**/
E_Notify(PSTR("\r\n\nAll tests passed. Press RESET to restart test"),0x80);
while(1);
}
break;
case( USB_STATE_ERROR ):
E_Notify(PSTR("\r\nUSB state machine reached error state"),0x80);
break;
default:
break;
}//switch( usbstate...
}
}//loop()... }//loop()...
/* constantly transmits 0x55 via SPI to aid probing */ /* constantly transmits 0x55 via SPI to aid probing */
void halt55() void halt55() {
{
E_Notify(PSTR("\r\nUnrecoverable error - test halted!!"),0x80); E_Notify(PSTR("\r\nUnrecoverable error - test halted!!"), 0x80);
E_Notify(PSTR("\r\n0x55 pattern is transmitted via SPI"),0x80); E_Notify(PSTR("\r\n0x55 pattern is transmitted via SPI"), 0x80);
E_Notify(PSTR("\r\nPress RESET to restart test"),0x80); E_Notify(PSTR("\r\nPress RESET to restart test"), 0x80);
while( 1 ) { while (1) {
Usb.regWr( 0x55, 0x55 ); Usb.regWr(0x55, 0x55);
} }
} }
/* prints hex numbers with leading zeroes */ /* prints hex numbers with leading zeroes */
void print_hex(int v, int num_places) void print_hex(int v, int num_places) {
{ int mask = 0, n, num_nibbles, digit;
int mask=0, n, num_nibbles, digit;
for (n=1; n<=num_places; n++) { for (n = 1; n <= num_places; n++) {
mask = (mask << 1) | 0x0001; mask = (mask << 1) | 0x0001;
} }
v = v & mask; // truncate v to specified number of places v = v & mask; // truncate v to specified number of places
num_nibbles = num_places / 4; num_nibbles = num_places / 4;
if ((num_places % 4) != 0) { if ((num_places % 4) != 0) {
++num_nibbles; ++num_nibbles;
} }
do { do {
digit = ((v >> (num_nibbles-1) * 4)) & 0x0f; digit = ((v >> (num_nibbles - 1) * 4)) & 0x0f;
Serial.print(digit, HEX); Serial.print(digit, HEX);
} while(--num_nibbles); } while (--num_nibbles);
} }
/* prints "Press any key" and returns when key is pressed */ /* prints "Press any key" and returns when key is pressed */
void press_any_key() void press_any_key() {
{ E_Notify(PSTR("\r\nPress any key to continue..."), 0x80);
E_Notify(PSTR("\r\nPress any key to continue..."),0x80); while (Serial.available() <= 0); //wait for input
while( Serial.available() <= 0 ); //wait for input Serial.read(); //empty input buffer
Serial.read(); //empty input buffer return;
return;
} }