/** Read NAP's IRQ register. * NAP's IRQ register shows which channels in NAP need to be serviced. NAP IRQ * line will stay high as long as any bit in IRQ register reads is high. * * \return 32 bit value from NAP's IRQ register. */ static u32 nap_irq_rd_blocking(void) { u8 temp[4] = { 0, 0, 0, 0 }; nap_xfer_blocking(NAP_REG_IRQ, 4, temp, temp); return (temp[0] << 24) | (temp[1] << 16) | (temp[2] << 8) | temp[3]; }
int main(void) { init(1); printf("\n\nFirmware info - git: " GIT_VERSION ", built: " __DATE__ " " __TIME__ "\n\r"); printf("--- NAP TEST REGS TEST ---\n\r"); u8 rdwr_in[4]; u8 rdwr_out[4] = {0, 0, 0, 0}; u32 count = 1; u32 rdwr_bad = 0; u32 beef_bad = 0; /* First read should give "DECAFBAD", */ nap_xfer_blocking(254, 4, rdwr_in, rdwr_out); if (rdwr_in[0] != 0xDE || rdwr_in[1] != 0xCA || rdwr_in[2] != 0xFB || rdwr_in[3] != 0xAD) { printf("First read of rd/wr test register reads %02X%02X%02X%02X, " "should be DECAFBAD\n", rdwr_in[0], rdwr_in[1], rdwr_in[2], rdwr_in[3]); rdwr_bad++; } u8 i = 1; while (1) { rdwr_out[0] = i; rdwr_out[1] = i; rdwr_out[2] = i; rdwr_out[3] = i; nap_xfer_blocking(254, 4, rdwr_in, rdwr_out); if (rdwr_in[0] != (u8)(i-1) || rdwr_in[1] != (u8)(i-1) || rdwr_in[2] != (u8)(i-1) || rdwr_in[3] != (u8)(i-1)) { printf("\nrd/wr register reads %02X%02X%02X%02X, " " but i = 0x%02X\n", rdwr_in[0], rdwr_in[1], rdwr_in[2], rdwr_in[3], (u8)(i-1)); rdwr_bad++; } i++; nap_xfer_blocking(255, 4, rdwr_in, NULL); if (rdwr_in[0] != 0xDE || rdwr_in[1] != 0xAD || rdwr_in[2] != 0xBE || rdwr_in[3] != 0xEF) { printf("\nDeceased cow register reads %02X%02X%02X%02X, " "should be DEADBEEF\n", rdwr_in[0], rdwr_in[1], rdwr_in[2], rdwr_in[3]); beef_bad++; } led_toggle(LED_GREEN); led_toggle(LED_RED); count++; if (count % 5000 == 0) printf("%d/%d errors out of %d\n", (unsigned int)rdwr_bad, (unsigned int)beef_bad, (unsigned int)count); /*for (u32 i = 0; i < 60000; i++)*/ /*__asm__("nop");*/ } while (1); return 0; }