From ba78bd9ba834260d035a9830726afc34fdad2a15 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Sun, 18 Oct 2009 23:32:54 +0200 Subject: import firmware from LEGO v1.05 --- AT91SAM7S256/Source/d_bt.c | 453 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 453 insertions(+) create mode 100644 AT91SAM7S256/Source/d_bt.c (limited to 'AT91SAM7S256/Source/d_bt.c') diff --git a/AT91SAM7S256/Source/d_bt.c b/AT91SAM7S256/Source/d_bt.c new file mode 100644 index 0000000..55b81f7 --- /dev/null +++ b/AT91SAM7S256/Source/d_bt.c @@ -0,0 +1,453 @@ +// +// Date init 14.12.2004 +// +// Revision date $Date:: 16-05-06 9:42 $ +// +// Filename $Workfile:: d_bt.c $ +// +// Version $Revision:: 21 $ +// +// Archive $Archive:: /LMS2006/Sys01/Main/Firmware/Source/d_bt.c $ +// +// Platform C +// + + +#include "stdconst.h" +#include "modules.h" +#include "m_sched.h" +#include "d_bt.h" +#include "d_bt.r" +#include + +enum +{ + BT_FAST_TIMEOUT = 500, + BT_CMD_TIMEOUT_2S = 2000, + BT_TIMEOUT_30S = 30000 +}; + +#define SETTimeout(TOut) CmdTOut = 0;\ + CmdTOutLimit = TOut +#define RESETTimeout CmdTOut = 0 + +static UWORD CmdTOut; +static UWORD CmdTOutLimit; + +void dBtInit(void) +{ + SETTimeout(0); + BTInit; + BTInitPIOPins; + BTInitADC; +} + +void dBtSetBcResetPinLow(void) +{ + BTSetResetLow; /* Set Reset pin to Bluecore chip low */ +} + +void dBtSetBcResetPinHigh(void) +{ + BTSetResetHigh; /* Set Reset pin to Bluecore chip high */ +} + +void dBtStartADConverter(void) +{ + BTStartADConverter; +} + +void dBtInitReceive(UBYTE *InputBuffer, UBYTE Mode) +{ + BTInitReceiver(InputBuffer, Mode); +} + +void dBtSetArm7CmdSignal(void) +{ + BT_SetArm7CmdPin; +} + +void dBtClearArm7CmdSignal(void) +{ + BT_ClearArm7CmdPin; +} + +UBYTE dBtGetBc4CmdSignal(void) +{ + UWORD ADValue; + + BTReadADCValue(ADValue); + + if (ADValue > 0x200) + { + ADValue = 1; + } + else + { + ADValue = 0; + } + return(ADValue); +} + + +UWORD dBtTxEnd(void) +{ + UWORD TxEnd; + + REQTxEnd(TxEnd); + + return(TxEnd); + +} + +UWORD dBtCheckForTxBuf(void) +{ + UWORD AvailBytes; + + AVAILOutBuf(AvailBytes); + + return(AvailBytes); +} + +void dBtSendMsg(UBYTE *OutputBuffer, UBYTE BytesToSend, UWORD MsgSize) +{ + + /* Used for sending a complete message that can be placed in the buffer - */ + /* or to send the first part of a message that cannot be placed in the buffer */ + /* once (bigger than the buffer) */ + BTSendMsg(OutputBuffer,BytesToSend, MsgSize); +} + +void dBtSend(UBYTE *OutputBuffer, UBYTE BytesToSend) +{ + + /* Used for continous stream of data to be send */ + BTSend(OutputBuffer, BytesToSend); +} + +UWORD dBtReceivedData(UWORD *pLength, UWORD *pBytesToGo) +{ + UWORD RtnVal; + + RtnVal = TRUE; + BTReceivedData(pLength, pBytesToGo); + if (*pLength) + { + SETTimeout(0); + } + else + { + if (CmdTOut < CmdTOutLimit) + { + CmdTOut++; + if (CmdTOut >= CmdTOutLimit) + { + SETTimeout(0); + RtnVal = FALSE; + } + } + } + return(RtnVal); +} + +void dBtResetTimeOut(void) +{ + RESETTimeout; +} + +void dBtClearTimeOut(void) +{ + SETTimeout(0); +} + +void dBtSendBtCmd(UBYTE Cmd, UBYTE Param1, UBYTE Param2, UBYTE *pBdAddr, UBYTE *pName, UBYTE *pCod, UBYTE *pPin) +{ + UBYTE Tmp; + UBYTE SendData; + UWORD CheckSumTmp; + UBYTE BtOutBuf[128]; + UBYTE BtOutCnt; + + SendData = 0; + BtOutCnt = 0; + switch (Cmd) + { + case MSG_BEGIN_INQUIRY: + { + BtOutBuf[BtOutCnt++] = MSG_BEGIN_INQUIRY; + BtOutBuf[BtOutCnt++] = Param1; + BtOutBuf[BtOutCnt++] = 0x00; + BtOutBuf[BtOutCnt++] = Param2; + BtOutBuf[BtOutCnt++] = 0x00; + BtOutBuf[BtOutCnt++] = 0x00; + BtOutBuf[BtOutCnt++] = 0x00; + BtOutBuf[BtOutCnt++] = 0x00; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_CANCEL_INQUIRY: + { + BtOutBuf[BtOutCnt++] = MSG_CANCEL_INQUIRY; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_CONNECT: + { + BtOutBuf[BtOutCnt++] = MSG_CONNECT; + memcpy(&(BtOutBuf[BtOutCnt]), pBdAddr, SIZE_OF_BDADDR); + BtOutCnt += SIZE_OF_BDADDR; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_OPEN_PORT: + { + BtOutBuf[BtOutCnt++] = MSG_OPEN_PORT; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_LOOKUP_NAME: + { + BtOutBuf[BtOutCnt++] = MSG_LOOKUP_NAME; + memcpy(&(BtOutBuf[BtOutCnt]), pBdAddr, SIZE_OF_BDADDR); + BtOutCnt += SIZE_OF_BDADDR; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_ADD_DEVICE: + { + BtOutBuf[BtOutCnt++] = MSG_ADD_DEVICE; + memcpy(&(BtOutBuf[BtOutCnt]), pBdAddr, SIZE_OF_BDADDR); + BtOutCnt += SIZE_OF_BDADDR; + memcpy(&(BtOutBuf[BtOutCnt]), pName, SIZE_OF_BT_NAME); + BtOutCnt += SIZE_OF_BT_NAME; + memcpy(&(BtOutBuf[BtOutCnt]), pCod, SIZE_OF_CLASS_OF_DEVICE); + BtOutCnt += SIZE_OF_CLASS_OF_DEVICE; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_REMOVE_DEVICE: + { + BtOutBuf[BtOutCnt++] = MSG_REMOVE_DEVICE; + memcpy(&(BtOutBuf[BtOutCnt]), pBdAddr, SIZE_OF_BDADDR); + BtOutCnt += SIZE_OF_BDADDR; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_DUMP_LIST: + { + BtOutBuf[BtOutCnt++] = MSG_DUMP_LIST; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_CLOSE_CONNECTION: + { + BtOutBuf[BtOutCnt++] = MSG_CLOSE_CONNECTION; + BtOutBuf[BtOutCnt++] = Param1; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_ACCEPT_CONNECTION: + { + BtOutBuf[BtOutCnt++] = MSG_ACCEPT_CONNECTION; + BtOutBuf[BtOutCnt++] = Param1; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_PIN_CODE: + { + BtOutBuf[BtOutCnt++] = MSG_PIN_CODE; + memcpy(&(BtOutBuf[BtOutCnt]), pBdAddr, SIZE_OF_BDADDR); + BtOutCnt += SIZE_OF_BDADDR; + memcpy(&(BtOutBuf[BtOutCnt]), pPin, SIZE_OF_BT_PINCODE); + BtOutCnt += SIZE_OF_BT_PINCODE; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_OPEN_STREAM: + { + BtOutBuf[BtOutCnt++] = MSG_OPEN_STREAM; + BtOutBuf[BtOutCnt++] = Param1; + + SendData = 1; + SETTimeout(BT_TIMEOUT_30S); + } + break; + + case MSG_START_HEART: + { + BtOutBuf[BtOutCnt++] = MSG_START_HEART; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_SET_DISCOVERABLE: + { + BtOutBuf[BtOutCnt++] = MSG_SET_DISCOVERABLE; + BtOutBuf[BtOutCnt++] = Param1; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_CLOSE_PORT: + { + BtOutBuf[BtOutCnt++] = MSG_CLOSE_PORT; + BtOutBuf[BtOutCnt++] = 0x03; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_SET_FRIENDLY_NAME: + { + BtOutBuf[BtOutCnt++] = MSG_SET_FRIENDLY_NAME; + memcpy(&(BtOutBuf[BtOutCnt]), pName, SIZE_OF_BT_NAME); + BtOutCnt += SIZE_OF_BT_NAME; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_LINK_QUALITY: + { + BtOutBuf[BtOutCnt++] = MSG_GET_LINK_QUALITY; + BtOutBuf[BtOutCnt++] = Param1; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_SET_FACTORY_SETTINGS: + { + BtOutBuf[BtOutCnt++] = MSG_SET_FACTORY_SETTINGS; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_LOCAL_ADDR: + { + BtOutBuf[BtOutCnt++] = MSG_GET_LOCAL_ADDR; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_FRIENDLY_NAME: + { + BtOutBuf[BtOutCnt++] = MSG_GET_FRIENDLY_NAME; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_DISCOVERABLE: + { + BtOutBuf[BtOutCnt++] = MSG_GET_DISCOVERABLE; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_PORT_OPEN: + { + BtOutBuf[BtOutCnt++] = MSG_GET_PORT_OPEN; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_VERSION: + { + BtOutBuf[BtOutCnt++] = MSG_GET_VERSION; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_GET_BRICK_STATUSBYTE: + { + BtOutBuf[BtOutCnt++] = MSG_GET_BRICK_STATUSBYTE; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + + case MSG_SET_BRICK_STATUSBYTE: + { + BtOutBuf[BtOutCnt++] = MSG_SET_BRICK_STATUSBYTE; + BtOutBuf[BtOutCnt++] = Param1; + BtOutBuf[BtOutCnt++] = Param2; + + SendData = 1; + SETTimeout(BT_FAST_TIMEOUT); + } + break; + } + + if (SendData == 1) + { + CheckSumTmp = 0; + for(Tmp = 0; Tmp < BtOutCnt; Tmp++) + { + CheckSumTmp += BtOutBuf[Tmp]; + } + CheckSumTmp = (UWORD) (1 + (0xFFFF - CheckSumTmp)); + BtOutBuf[BtOutCnt++] = (UBYTE)((CheckSumTmp & 0xFF00)>>8); + BtOutBuf[BtOutCnt++] = (UBYTE)(CheckSumTmp & 0x00FF); + BTSendMsg(BtOutBuf, BtOutCnt, (UWORD)BtOutCnt); + } +} + + + +void dBtExit(void) +{ + BTExit; +} -- cgit v1.2.3