static void kbd_drv_rx(int irq, void *dev_id, struct pt_regs *regs) { int i; kbd_setregs(regs); #ifndef CONFIG_SA1100_ITSY while (!ignore_kbd_irq && (i=getcFromKBCTL()) != KBCTL_NODATA) { if (i != KBCTL_AGAIN && i != KK_NONE) handle_scancode((unsigned char) i, ((unsigned char)i & 0x80) ? 0 : 1); } #endif // vsync_irq(); reset_timer1( (TIMER1_RATE+30)/60 ); mark_bh(KEYBOARD_BH); }
// ************************************************************************************************* // Test RF reception // ************************************************************************************************* void test_rf(void) { u16 time1, time2, packet1, packet2, div; s16 ref, delta; u8 i; s16 freqest; u8 freqest1; s16 freqest0; u8 continue_test = YES; // Config radio for RX rftest_init(); // Set timeout in 1.5 seconds reset_timer1(); set_timer1(32768*1.5); T1CCTL0 = 0x44; T1CTL = 0x02; // Clear RF interrupts S1CON &= ~(BIT1 | BIT0); // Clear MCU interrupt flag RFIF &= ~BIT4; // Clear "receive/transmit done" interrupt RFIM |= BIT4; // Enable "receive/transmit done" interrupt // Enable IRQ INT_ENABLE(INUM_RFTXRX, INT_ON); INT_ENABLE(INUM_RF, INT_ON); INT_ENABLE(INUM_T1, INT_ON); // Clear test result variable test_result = 0; // Continue to receive packets until timeout while ((rftest_count < RFTEST_PACKET_COUNT) && (!sTimer1.iflag)) { // Start new RX if radio is IDLE if (MARCSTATE == 0x01) SRX(); } SIDLE(); // Analyze received packets if (sTimer1.iflag || rftest_count < RFTEST_PACKET_COUNT/2) { // Timeout - no or not enough packets received test_result = 0x8000; continue_test = NO; } else { // Store last and first packet for (i=0; i<RFTEST_PACKET_COUNT; i++) { if (rftest[i].valid) { time1 = rftest[i].time; packet1 = rftest[i].packet_nb; break; } } for (i=RFTEST_PACKET_COUNT-1; i>0; i--) { if (rftest[i].valid) { time2 = rftest[i].time; packet2 = rftest[i].packet_nb; break; } } // Calculate mean freqest freqest = 0; div = 0; for (i=0; i<RFTEST_PACKET_COUNT; i++) { if (rftest[i].valid) { // Sign extend negative numbers if ((rftest[i].freqoffset & BIT7) == BIT7) { freqest += (s16)(0xFF00 | rftest[i].freqoffset); } else { freqest += (s16)(rftest[i].freqoffset); } div++; } } // FREQEST range check freqest0 = freqest/(s16)div; if ((freqest0 < RFTEST_FREQEST_MIN) || (freqest0 > RFTEST_FREQEST_MAX)) { test_result = 0x2000 | (u8)freqest0; continue_test = NO; } else { // FREQEST range ok // Calculate distance between 1 and 2 // TX sends packet each 3276 ACLK ticks (= 1145 T1CLK ticks) ref = (packet2 - packet1)*3276; delta = time2 - time1; if ((ref - delta) < RFTEST_ACLK_DEVIATION_MAX) { // Store ACLK deviation in test result test_result = ((ref - delta)&0x0F) << 8; // Store average FREQEST if (freqest < 0) { freqest1 = (u8)((freqest*(-1))/div); freqest1 = ~freqest1 + 1; test_result |= freqest1; } else { test_result |= (u8)(freqest/div); } } else if ((delta - ref) < RFTEST_ACLK_DEVIATION_MAX) { // Store ACLK deviation in test result test_result = ((delta - ref)&0x0F) << 8; // Store average FREQEST if (freqest < 0) { freqest1 = (u8)((freqest*(-1))/div); freqest1 = ~freqest1 + 1; test_result |= freqest1; } else { test_result |= (u8)(freqest/div); } } else { // Too high ACLK deviation test_result = 0x4000; continue_test = NO; } } } // 2nd test stage - use RF offset to catch another few packets if (continue_test == YES) { rftest_count = 0; // Clear RX variables for (i=0; i<RFTEST_PACKET_COUNT; i++) { rftest[i].valid = 0; rftest[i].time = 0; rftest[i].packet_nb = 0; rftest[i].freqoffset = 0; } // Set frequency offset FSCTRL0 = freqest0; // Set timeout in 0.5 seconds reset_timer1(); set_timer1(32768*0.5); // Try to receive just 1 packet while ((rftest_count < 1) && (!sTimer1.iflag)) { // Start new RX if radio is IDLE if (MARCSTATE == 0x01) SRX(); } SIDLE(); // Analyze received packets frequency offset - should be close to 0 if (rftest_count > 0) { if (!((rftest[0].freqoffset >= 0xFE) || (rftest[0].freqoffset <= 0x02))) { test_result = 0x1000; } } else { test_result = 0x1000; } } // Disable IRQ INT_ENABLE(INUM_RFTXRX, INT_OFF); INT_ENABLE(INUM_RF, INT_OFF); INT_ENABLE(INUM_T1, INT_OFF); // Stop Timer1 T1CTL = 0x00; T1CNTL = 0x55; reset_timer1(); }
int main(void) { /****************INITIALIZATIONS*******************/ //other stuff Im experimenting with for SoR uartInit(); // initialize the UART (serial port) uartSetBaudRate(0, 9600); // set UARTE speed, for Bluetooth uartSetBaudRate(1, 115200); // set UARTD speed, for USB connection, up to 500k, try 115200 if it uartSetBaudRate(2, 57600); // set UARTH speed uartSetBaudRate(3, 57600); // set UARTJ speed, for Blackfin //G=Ground, T=Tx (connect to external Rx), R=Rx (connect to external Tx) // initialize rprintf system and configure uart1 (USB) for rprintf rprintfInit(uart1SendByte); configure_ports(); // configure which ports are analog, digital, etc. LED_on(); rprintf("\r\nSystem Warming Up"); // initialize the timer system (comment out ones you don't want) init_timer0(TIMER_CLK_1024); init_timer1(TIMER_CLK_64); init_timer2(TIMER2_CLK_64); init_timer3(TIMER_CLK_64); init_timer4(TIMER_CLK_64); init_timer5(TIMER_CLK_1024); //timer5Init(); a2dInit(); // initialize analog to digital converter (ADC) a2dSetPrescaler(ADC_PRESCALE_DIV32); // configure ADC scaling a2dSetReference(ADC_REFERENCE_AVCC); // configure ADC reference voltage int i = 0, j = 0; //let system stabelize for X time for(i=0;i<16;i++) { j=a2dConvert8bit(i);//read each ADC once to get it working accurately delay_cycles(5000); //keep LED on long enough to see Axon reseting rprintf("."); } LED_off(); rprintf("Initialization Complete \r\n"); reset_timer0(); reset_timer1(); reset_timer2(); reset_timer3(); reset_timer4(); reset_timer5(); while(1) { control(); delay_cycles(100); //an optional small delay to prevent crazy oscillations } return 0; }
void prvSetupHardware(){ int i, j; //add 1.7s delay for potential power issues delay_cycles(65535); delay_cycles(65535); delay_cycles(65535); delay_cycles(65535); delay_cycles(65535); delay_cycles(65535); delay_cycles(65535); uartInit(); // initialize the UART (serial port) uartSetBaudRate(0, 38400); // set UARTE speed, for Bluetooth uartSetBaudRate(1, 115200); // set UARTD speed, for USB connection, up to 500k, try 115200 if it doesn't work uartSetBaudRate(2, 38400); // set UARTH speed uartSetBaudRate(3, 38400); // set UARTJ speed, for Blackfin //G=Ground, T=Tx (connect to external Rx), R=Rx (connect to external Tx) rprintfInit(uart1SendByte);// initialize rprintf system and configure uart1 (USB) for rprintf configure_ports(); // configure which ports are analog, digital, etc. LED_on(); //rprintf("\r\nSystem Warmed Up"); // initialize the timer system init_timer0(TIMER_CLK_1024); // init_timer1(TIMER_CLK_64); // Timer 1 is initialized by FreeRTOS init_timer2(TIMER2_CLK_64); init_timer3(TIMER_CLK_64); init_timer4(TIMER_CLK_64); init_timer5(TIMER_CLK_64); a2dInit(); // initialize analog to digital converter (ADC) a2dSetPrescaler(ADC_PRESCALE_DIV32); // configure ADC scaling a2dSetReference(ADC_REFERENCE_AVCC); // configure ADC reference voltage //let system stabelize for X time for(i=0;i<16;i++) { j=a2dConvert8bit(i);//read each ADC once to get it working accurately delay_cycles(5000); //keep LED on long enough to see Axon reseting rprintf("."); } LED_off(); rprintf("Initialization Complete \r\n"); //reset all timers to zero reset_timer0(); reset_timer1(); reset_timer2(); reset_timer3(); reset_timer4(); reset_timer5(); /********PWM Setup***********/ prvPWMSetup(); }