static void Callback( void *AppHandle, u32 Event, void *pArg) { ADI_DEV_1D_BUFFER *pBuffer; // pointer to the buffer that was processed // CASEOF (event type) switch (Event) { // CASE (buffer processed) case ADI_DEV_EVENT_BUFFER_PROCESSED: // identify which buffer is generating the callback // we're setup to only get callbacks on inbound buffers so we know this // is an inbound buffer pBuffer = (ADI_DEV_1D_BUFFER *)pArg; if (pArg == &InboundBuffer) { InputBuffer[InputBufferhead] = InboundData; InputBufferhead = (InputBufferhead +1) % INBUFLEN; if ((InputBufferhead +1) % INBUFLEN != InputBuffertail) // requeue the inbound buffer ezErrorCheck(adi_dev_Read(DriverHandle, ADI_DEV_1D, (ADI_DEV_BUFFER *)&InboundBuffer)); } else if (pArg == &OutboundBuffer) { sending_done = 1; } break; // CASE (an error) case ADI_UART_EVENT_BREAK_INTERRUPT: ezErrorCheck(ADI_UART_EVENT_BREAK_INTERRUPT); break; case ADI_UART_EVENT_FRAMING_ERROR: ezErrorCheck(ADI_UART_EVENT_FRAMING_ERROR); break; case ADI_UART_EVENT_PARITY_ERROR: ezErrorCheck(ADI_UART_EVENT_PARITY_ERROR); break; case ADI_UART_EVENT_OVERRUN_ERROR: ezErrorCheck(ADI_UART_EVENT_OVERRUN_ERROR); break; // ENDCASE } // return }
void UARTinit( u32 baudrate ) { ADI_DCB_HANDLE DCBManagerHandle = 0; // handle to the callback service u32 cclk, sclk, vco; // frequencies (note these are in MHz) u32 i; //loop variable ADI_DEV_CMD_VALUE_PAIR ConfigurationTable [] = { // configuration table for the UART driver { ADI_DEV_CMD_SET_DATAFLOW_METHOD, (void *)ADI_DEV_MODE_CHAINED }, { ADI_UART_CMD_SET_DATA_BITS, (void *)8 }, { ADI_UART_CMD_ENABLE_PARITY, (void *)FALSE }, { ADI_UART_CMD_SET_STOP_BITS, (void *)1 }, { ADI_UART_CMD_SET_BAUD_RATE, (void *)baudrate }, { ADI_UART_CMD_SET_LINE_STATUS_EVENTS, (void *)TRUE }, { ADI_DEV_CMD_END, NULL }, }; InputBufferhead = 0; InputBuffertail = 0; // create two buffers that will be initially be placed on the inbound queue // only the inbound buffer will have a callback InboundBuffer.Data = &InboundData; InboundBuffer.ElementCount = 1; InboundBuffer.ElementWidth = 1; InboundBuffer.CallbackParameter = (void*)&InboundBuffer; InboundBuffer.ProcessedFlag = FALSE; InboundBuffer.pNext = NULL; sending_done = 1; OutboundBuffer.Data = OutboundData; OutboundBuffer.ElementCount = 1; OutboundBuffer.ElementWidth = 1; OutboundBuffer.CallbackParameter = (void*)&OutboundBuffer; OutboundBuffer.ProcessedFlag = TRUE; OutboundBuffer.pNext = NULL; // open the UART driver for bidirectional data flow ezErrorCheck(adi_dev_Open(DeviceManagerHandle, &ADIUARTEntryPoint, 0, NULL, &DriverHandle, ADI_DEV_DIRECTION_BIDIRECTIONAL, NULL, DCBManagerHandle, Callback)); // configure the UART driver with the values from the configuration table ezErrorCheck(adi_dev_Control(DriverHandle, ADI_DEV_CMD_TABLE, ConfigurationTable)); // give the device the inbound buffer ezErrorCheck(adi_dev_Read(DriverHandle, ADI_DEV_1D, (ADI_DEV_BUFFER *)&InboundBuffer)); // enable data flow ezErrorCheck(adi_dev_Control(DriverHandle, ADI_DEV_CMD_SET_DATAFLOW, (void *)TRUE)); }
void UARTwrite(u8* data, u32 len) { while (len>0) { while (UARTsending()); sending_done = 0; OutboundBuffer.ElementCount = min(OUTBUFLEN,len); memcpy( OutboundData, data, OutboundBuffer.ElementCount ); len -= OutboundBuffer.ElementCount; data+= OutboundBuffer.ElementCount; OutboundBuffer.ProcessedFlag = 0; // requeue the outbound buffer ezErrorCheck(adi_dev_Write(DriverHandle, ADI_DEV_1D, (ADI_DEV_BUFFER *)&OutboundBuffer)); } while (UARTsending()); }
u8 UARTread() { u8 data; while (!UARThit()); data = InputBuffer[InputBuffertail]; InputBuffertail = (InputBuffertail +1) % INBUFLEN; if (InboundBuffer.ProcessedFlag == 1) { InboundBuffer.ProcessedFlag = 0; // requeue the inbound buffer ezErrorCheck(adi_dev_Read(DriverHandle, ADI_DEV_1D, (ADI_DEV_BUFFER *)&InboundBuffer)); } return data; }
/********************************************************************* * Function: main *********************************************************************/ void main(void) { u32 ResponseCount; void *pExitCriticalArg; u32 i; //loop variable // initialize the EZ-Kit ezInit(1); // initialize the flag manager because the LEDs and buttons connect via flags // Since callbacks are not being used memory does not to be given to the service ezErrorCheck(adi_flag_Init(NULL, 0, &ResponseCount, NULL)); //***CODE SNIPPED****// InitTimers(); while (1) { //***CODE SNIPPED****// } } // END WHILE