/* * ============ Platform Configuration ============ */ #include #define EAP_RX_BUF UCA0RXBUF #define EAP_TX_BUF UCA0TXBUF #define EAP_RX_VECTOR USCIAB0RX_VECTOR #define EAP_TX_VECTOR PORT2_VECTOR #define EAP_RX_ACK_CONFIG() (P2DIR |= BIT0) #define EAP_RX_ACK_SET() (P2OUT |= BIT0) #define EAP_RX_ACK_CLR() (P2OUT &= ~BIT0) #define EAP_TX_INT_CONFIG() (P2DIR &= ~BIT1, P2IES |= BIT1, P2IFG &= BIT1, P2IE |= BIT1) #define EAP_TX_INT_TST() (P2IFG & BIT1) #define EAP_TX_INT_CLR() (P2IFG &= ~BIT1) void init(void) { WDTCTL = WDTPW + WDTHOLD; BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0; if (CALBC1_1MHZ != 0xFF) { DCOCTL = 0x00; BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */ DCOCTL = CALDCO_1MHZ; } BCSCTL1 |= XT2OFF + DIVA_0; BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1; P1DIR |= BIT0; /* LED */ P1OUT &= ~BIT0; UCA0CTL1 |= UCSWRST; P1SEL |= BIT1 + BIT2; P1SEL2 |= BIT1 + BIT2; EAP_RX_ACK_CONFIG(); EAP_RX_ACK_SET(); EAP_TX_INT_CONFIG(); UCA0CTL1 = UCSSEL_2 + UCSWRST; UCA0MCTL = UCBRF_0 + UCBRS_6; UCA0BR0 = 8; UCA0CTL1 &= ~UCSWRST; IFG2 &= ~(UCA0RXIFG); IE2 |= UCA0RXIE; __enable_interrupt(); } /* * ============ Serial Driver ============ */ #include __attribute__((interrupt(EAP_RX_VECTOR))) static void rxHandler(void) { uint8_t b = EAP_RX_BUF; if (Em_Message_addByte(b)) { Em_Message_dispatch(); } EAP_RX_ACK_CLR(); EAP_RX_ACK_SET(); } __attribute__((interrupt(EAP_TX_VECTOR))) static void txHandler(void) { if (EAP_TX_INT_TST()) { uint8_t b; if (Em_Message_getByte(&b)) { EAP_TX_BUF = b; } EAP_TX_INT_CLR(); } } void Em_Message_startSend() { uint8_t b; if (Em_Message_getByte(&b)) { UCA0TXBUF = b; } } uint8_t Em_Message_lock() { uint8_t key; asm ("MOV r2, %0": "=r" (key)); key &= 0x8; asm ("DINT"); return key; } void Em_Message_unlock(uint8_t key) { if (key) { asm ("EINT"); } else { asm ("DINT"); } } /* * ============ Application Program ============ */ #include int main(int argc, char *argv[]) { volatile int dummy = 0; init(); FileTest_run(); while (dummy == 0) { /* idle */ } return 0; } FileTest_fileSize_t fileSizeVal; int seed; void FileTest_connectHandler(void) { P1OUT |= BIT0; } void FileTest_disconnectHandler(void) { P1OUT &= ~BIT0; } void FileTest_fileSize_fetch(FileTest_fileSize_t* const output) { *output = fileSizeVal; } void FileTest_fileSize_store(FileTest_fileSize_t* const input) { fileSizeVal = *input; } uint16_t FileTest_fileData_fetch(FileTest_fileData_t* const output, int32_t offset, uint16_t count) { int32_t rem = fileSizeVal - offset; if (rem < count) { count = (uint16_t)rem; } uint16_t i; for (i = 0; i < count; i++) { output->elems[i] = (seed + (offset + i)) & 0xFF; } return count; } uint16_t FileTest_fileData_store(FileTest_fileData_t* const input, int32_t offset, uint16_t count) { if (offset == 0 && count) { seed = input->elems[0]; } return count; }