summaryrefslogtreecommitdiffstats
path: root/api/cmd.c
diff options
context:
space:
mode:
authorOliver Schinagl <oliver@schinagl.nl>2011-06-28 13:40:27 (GMT)
committerOliver Schinagl <oliver@schinagl.nl>2011-06-28 13:40:27 (GMT)
commitfecdd9457cd3912c2b89aff1f99db0ba669af93b (patch)
tree34bbc7387ded825e303c3117b6c6da2cbe1fd771 /api/cmd.c
downloadAF903x_SRC-fecdd9457cd3912c2b89aff1f99db0ba669af93b.zip
AF903x_SRC-fecdd9457cd3912c2b89aff1f99db0ba669af93b.tar.gz
AF903x_SRC-fecdd9457cd3912c2b89aff1f99db0ba669af93b.tar.bz2
Initial checkin' of sourceball extracted from installer.
DRIVER_RELEASE_VERSION : v9.08.14.1 FW_RELEASE_VERSION : v8_8_63_0 API_RELEASE_VERSION : 200.20090402.0 Not sure what those version numbers relate to. Might be Driver, the actual driver (src) FW, the little bin file that is only a keymapping for the remote API, all the tuners or so from /api? No support for Asus U3100 mini (yet).
Diffstat (limited to 'api/cmd.c')
-rw-r--r--api/cmd.c990
1 files changed, 990 insertions, 0 deletions
diff --git a/api/cmd.c b/api/cmd.c
new file mode 100644
index 0000000..a1eb3e0
--- /dev/null
+++ b/api/cmd.c
@@ -0,0 +1,990 @@
+#include "cmd.h"
+
+
+Byte Cmd_sequence = 0;
+
+
+Dword Cmd_addChecksum (
+ IN Demodulator* demodulator,
+ OUT Dword* bufferLength,
+ OUT Byte* buffer
+) {
+ Dword error = Error_NO_ERROR;
+ Dword loop = (*bufferLength - 1) / 2;
+ Dword remain = (*bufferLength - 1) % 2;
+ Dword i;
+ Word checksum = 0;
+
+ for (i = 0; i < loop; i++)
+ checksum += (Word) (buffer[2 * i + 1] << 8) + (Word) (buffer[2 * i + 2]);
+ if (remain)
+ checksum += (Word) (buffer[*bufferLength - 1] << 8);
+
+ checksum = ~checksum;
+ buffer[*bufferLength] = (Byte) ((checksum & 0xFF00) >> 8);
+ buffer[*bufferLength + 1] = (Byte) (checksum & 0x00FF);
+ buffer[0] = (Byte) (*bufferLength + 1);
+ *bufferLength += 2;
+
+ return (error);
+}
+
+
+Dword Cmd_removeChecksum (
+ IN Demodulator* demodulator,
+ OUT Dword* bufferLength,
+ OUT Byte* buffer
+) {
+ Dword error = Error_NO_ERROR;
+ Dword loop = (*bufferLength - 3) / 2;
+ Dword remain = (*bufferLength - 3) % 2;
+ Dword i;
+ Word checksum = 0;
+
+ for (i = 0; i < loop; i++)
+ checksum += (Word) (buffer[2 * i + 1] << 8) + (Word) (buffer[2 * i + 2]);
+ if (remain)
+ checksum += (Word) (buffer[*bufferLength - 3] << 8);
+
+ checksum = ~checksum;
+ if (((Word)(buffer[*bufferLength - 2] << 8) + (Word)(buffer[*bufferLength - 1])) != checksum) {
+ error = Error_WRONG_CHECKSUM;
+ goto exit;
+ }
+ if (buffer[2])
+ error = Error_FIRMWARE_STATUS | buffer[2];
+
+ buffer[0] = (Byte) (*bufferLength - 3);
+ *bufferLength -= 2;
+
+exit :
+ return (error);
+}
+
+
+Dword Cmd_busTx (
+ IN Demodulator* demodulator,
+ IN Dword bufferLength,
+ OUT Byte* buffer
+) {
+ Dword error = Error_NO_ERROR;
+ Byte i;
+ Ganymede* ganymede;
+
+ ganymede = (Ganymede*) demodulator;
+
+ for (i = 0; i < User_RETRY_MAX_LIMIT; i++) {
+ error = ganymede->cmdDescription->busDescription->busTx (demodulator, bufferLength, buffer);
+ if (error == 0) goto exit;
+
+ User_delay (demodulator, 1);
+ }
+
+exit:
+ return (error);
+}
+
+
+Dword Cmd_busRx (
+ IN Demodulator* demodulator,
+ IN Dword bufferLength,
+ OUT Byte* buffer
+) {
+ Dword error = Error_NO_ERROR;
+ Byte i;
+ Ganymede* ganymede;
+
+ ganymede = (Ganymede*) demodulator;
+
+ for (i = 0; i < User_RETRY_MAX_LIMIT; i++) {
+ error = ganymede->cmdDescription->busDescription->busRx (demodulator, bufferLength, buffer);
+ if (error == 0) goto exit;
+
+ User_delay (demodulator, 1);
+ }
+
+exit:
+ return (error);
+}
+
+
+Dword Cmd_busRxData (
+ IN Demodulator* demodulator,
+ IN Dword bufferLength,
+ OUT Byte* buffer
+) {
+ Dword error = Error_NO_ERROR;
+ Byte i;
+ Ganymede* ganymede;
+
+ ganymede = (Ganymede*) demodulator;
+
+ for (i = 0; i < User_RETRY_MAX_LIMIT; i++) {
+ error = ganymede->cmdDescription->busDescription->busRxData (demodulator, bufferLength, buffer);
+ if (error == 0) goto exit;
+
+ User_delay (demodulator, 1);
+ }
+
+exit:
+ return (error);
+}
+
+
+Dword Cmd_writeRegisters (
+ IN Demodulator* demodulator,
+ IN Byte chip,
+ IN Processor processor,
+ IN Dword registerAddress,
+ IN Byte registerAddressLength,
+ IN Dword writeBufferLength,
+ IN Byte* writeBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Dword i;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ if (writeBufferLength == 0) goto exit;
+ if (registerAddressLength > 4) {
+ error = Error_PROTOCOL_FORMAT_INVALID;
+ goto exit;
+ }
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((writeBufferLength + 12) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+
+ /** short command */
+ if (User_USE_SHORT_CMD && ganymede->booted) {
+ for (i = 0; i < writeBufferLength; i++) {
+ command = Command_SHORT_REG_DEMOD_WRITE + (Byte) (chip << 4) + (Byte) (processor << 4);
+ buffer[0] = (Byte) 4;
+ buffer[1] = (Byte) command;
+ buffer[2] = (Byte) ((registerAddress + i) >> 8);
+ buffer[3] = (Byte) (registerAddress + i);
+ buffer[4] = writeBuffer[i];
+
+ bufferLength = 5;
+ error = Cmd_busTx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+ }
+ goto exit;
+ }
+
+ /** add frame header */
+ command = Cmd_buildCommand (Command_REG_DEMOD_WRITE, processor, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) writeBufferLength;
+ buffer[5] = (Byte) registerAddressLength;
+ buffer[6] = (Byte) ((registerAddress) >> 24); /** Get first byte of reg. address */
+ buffer[7] = (Byte) ((registerAddress) >> 16); /** Get second byte of reg. address */
+ buffer[8] = (Byte) ((registerAddress) >> 8); /** Get third byte of reg. address */
+ buffer[9] = (Byte) (registerAddress ); /** Get fourth byte of reg. address */
+
+ /** add frame data */
+ for (i = 0; i < writeBufferLength; i++) {
+ buffer[10 + i] = writeBuffer[i];
+ }
+
+ /** add frame check-sum */
+ bufferLength = 10 + writeBufferLength;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ /** send frame */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+
+ /** get reply frame */
+ bufferLength = 5;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ /** remove check-sum from reply frame */
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_writeTunerRegisters (
+ IN Demodulator* demodulator,
+ IN Byte chip,
+ IN Byte tunerAddress,
+ IN Word registerAddress,
+ IN Byte registerAddressLength,
+ IN Byte writeBufferLength,
+ IN Byte* writeBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Dword i;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ if (writeBufferLength == 0) goto exit;
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((Dword)(writeBufferLength + 11) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ /** short command */
+ if (User_USE_SHORT_CMD && ganymede->booted) {
+ for (i = 0; i < writeBufferLength; i++) {
+ command = Command_SHORT_REG_TUNER_WRITE + (Byte) (chip << 4) + (Byte) (Processor_LINK << 4);
+ buffer[0] = (Byte) 5;
+ buffer[1] = (Byte) command;
+ buffer[2] = (Byte) tunerAddress;
+ buffer[3] = (Byte) registerAddressLength;
+ buffer[4] = (Byte) ((registerAddress + i) >> 8);
+ buffer[5] = (Byte) (registerAddress + i);
+ buffer[6] = writeBuffer[i];
+
+ bufferLength = 7;
+ error = Cmd_busTx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+ }
+ goto exit;
+ }
+
+ /** add frame header */
+ command = Cmd_buildCommand (Command_REG_TUNER_WRITE, Processor_LINK, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) writeBufferLength;
+ buffer[5] = (Byte) tunerAddress;
+ buffer[6] = (Byte) registerAddressLength;
+ buffer[7] = (Byte) (registerAddress >> 8); /** Get high byte of reg. address */
+ buffer[8] = (Byte) (registerAddress); /** Get low byte of reg. address */
+
+ /** add frame data */
+ for (i = 0; i < writeBufferLength; i++) {
+ buffer[9 + i] = writeBuffer[i];
+ }
+
+ /** add frame check-sum */
+ bufferLength = 9 + writeBufferLength;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ /** send frame */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i , &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+
+ /** get reply frame */
+ bufferLength = 5;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ /** remove check-sum from reply frame */
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_writeEepromValues (
+ IN Demodulator* demodulator,
+ IN Byte chip,
+ IN Byte eepromAddress,
+ IN Word registerAddress,
+ IN Byte registerAddressLength,
+ IN Byte writeBufferLength,
+ IN Byte* writeBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Dword i;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ if (writeBufferLength == 0) goto exit;
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((Dword)(writeBufferLength + 11) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ /** add frame header */
+ command = Cmd_buildCommand (Command_REG_EEPROM_WRITE, Processor_LINK, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) writeBufferLength;
+ buffer[5] = (Byte) eepromAddress;
+ buffer[6] = (Byte) registerAddressLength;
+ buffer[7] = (Byte) (registerAddress >> 8); /** Get high byte of reg. address */
+ buffer[8] = (Byte) registerAddress; /** Get low byte of reg. address */
+
+ /** add frame data */
+ for (i = 0; i < writeBufferLength; i++) {
+ buffer[9 + i] = writeBuffer[i];
+ }
+
+ /** add frame check-sum */
+ bufferLength = 9 + writeBufferLength;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ /** send frame */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+
+ /** get reply frame */
+ bufferLength = 5;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ /** remove check-sum from reply frame */
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_readRegisters (
+ IN Demodulator* demodulator,
+ IN Byte chip,
+ IN Processor processor,
+ IN Dword registerAddress,
+ IN Byte registerAddressLength,
+ IN Dword readBufferLength,
+ OUT Byte* readBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword sendLength;
+ Dword remainLength;
+ Dword i, k;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ if (readBufferLength == 0) goto exit;
+ if (registerAddressLength > 4) {
+ error = Error_PROTOCOL_FORMAT_INVALID;
+ goto exit;
+ }
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((readBufferLength + 5) > User_MAX_PKT_SIZE) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ if ((readBufferLength + 5) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+
+ /** short command */
+ if (User_USE_SHORT_CMD && ganymede->booted) {
+ for (i = 0; i < readBufferLength; i++) {
+ command = Command_SHORT_REG_DEMOD_READ + (Byte) (chip << 4) + (Byte) (processor << 4);
+ buffer[0] = (Byte) 3;
+ buffer[1] = (Byte) command;
+ buffer[2] = (Byte) ((registerAddress + i) >> 8);
+ buffer[3] = (Byte) (registerAddress + i);
+
+ bufferLength = 4;
+ error = Cmd_busTx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ bufferLength = 2;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ readBuffer[i] = buffer[1];
+ }
+ goto exit;
+ }
+
+ /** add frame header */
+ command = Cmd_buildCommand (Command_REG_DEMOD_READ, processor, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) readBufferLength;
+ buffer[5] = (Byte) registerAddressLength;
+ buffer[6] = (Byte) (registerAddress >> 24); /** Get first byte of reg. address */
+ buffer[7] = (Byte) (registerAddress >> 16); /** Get second byte of reg. address */
+ buffer[8] = (Byte) (registerAddress >> 8); /** Get third byte of reg. address */
+ buffer[9] = (Byte) (registerAddress); /** Get fourth byte of reg. address */
+
+ /** add frame check-sum */
+ bufferLength = 10;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+
+ /** send frame */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+
+ /** get reply frame */
+ bufferLength = 5 + readBufferLength;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ /** remove check-sum from reply frame */
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ for (k = 0; k < readBufferLength; k++) {
+ readBuffer[k] = buffer[k + 3];
+ }
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_readTunerRegisters (
+ IN Demodulator* demodulator,
+ IN Byte chip,
+ IN Byte tunerAddress,
+ IN Word registerAddress,
+ IN Byte registerAddressLength,
+ IN Byte readBufferLength,
+ IN Byte* readBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Dword i, k;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ if (readBufferLength == 0) goto exit;
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((Dword)(readBufferLength + 5) > User_MAX_PKT_SIZE) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ if ((Dword)(readBufferLength + 5) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ /** short command */
+ if (User_USE_SHORT_CMD && ganymede->booted) {
+ for (i = 0; i < readBufferLength; i++) {
+ command = Command_SHORT_REG_TUNER_READ + (Byte) (chip << 4) + (Byte) (Processor_LINK << 4);
+ buffer[0] = (Byte) 5;
+ buffer[1] = (Byte) command;
+ buffer[2] = (Byte) tunerAddress;
+ buffer[3] = (Byte) registerAddressLength;
+ buffer[4] = (Byte) ((registerAddress + i) >> 8);
+ buffer[5] = (Byte) (registerAddress + i);
+
+ bufferLength = 6;
+ error = Cmd_busTx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ bufferLength = 2;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ readBuffer[i] = buffer[1];
+ }
+ goto exit;
+ }
+
+ /** add command header */
+ command = Cmd_buildCommand (Command_REG_TUNER_READ, Processor_LINK, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) readBufferLength;
+ buffer[5] = (Byte) tunerAddress;
+ buffer[6] = (Byte) registerAddressLength;
+ buffer[7] = (Byte) (registerAddress >> 8); /** Get high byte of reg. address */
+ buffer[8] = (Byte) (registerAddress); /** Get low byte of reg. address */
+
+ /** add frame check-sum */
+ bufferLength = 9;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ /** send frame */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+
+ /** get reply frame */
+ bufferLength = 5 + readBufferLength;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ /** remove frame check-sum */
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ for (k = 0; k < readBufferLength; k++) {
+ readBuffer[k] = buffer[k + 3];
+ }
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_readEepromValues (
+ IN Demodulator* demodulator,
+ IN Byte chip,
+ IN Byte eepromAddress,
+ IN Word registerAddress,
+ IN Byte registerAddressLength,
+ IN Byte readBufferLength,
+ OUT Byte* readBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Dword i, k;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ if (readBufferLength == 0) goto exit;
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((Dword)(readBufferLength + 5) > User_MAX_PKT_SIZE) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ if ((Dword)(readBufferLength + 5) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ /** add command header */
+ command = Cmd_buildCommand (Command_REG_EEPROM_READ, Processor_LINK, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) readBufferLength;
+ buffer[5] = (Byte) eepromAddress;
+ buffer[6] = (Byte) registerAddressLength;
+ buffer[7] = (Byte) (registerAddress >> 8); /** Get high byte of reg. address */
+ buffer[8] = (Byte) registerAddress; /** Get low byte of reg. address */
+
+ /** add frame check-sum */
+ bufferLength = 9;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ /** send frame */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+
+ /** get reply frame */
+ bufferLength = 5 + readBufferLength;
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ /** remove frame check-sum */
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ for (k = 0; k < readBufferLength; k++) {
+ readBuffer[k] = buffer[k + 3];
+ }
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_loadFirmware (
+ IN Demodulator* demodulator,
+ IN Dword length,
+ IN Byte* firmware
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Dword loop;
+ Dword remain;
+ Dword i, j, k;
+ Byte buffer[255];
+ Dword payloadLength;
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ payloadLength = (maxFrameSize - 6);
+ loop = length / payloadLength;
+ remain = length % payloadLength;
+
+ k = 0;
+ command = Cmd_buildCommand (Command_FW_DOWNLOAD, Processor_LINK, 0);
+ for (i = 0; i < loop; i++) {
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+
+ for (j = 0; j < payloadLength; j++)
+ buffer[4 + j] = firmware[j + i*payloadLength];
+
+ bufferLength = 4 + payloadLength;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ sendLength = 0;
+ remainLength = maxFrameSize;
+ while (remainLength > 0) {
+ k = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, k, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += k;
+ remainLength -= k;
+ }
+ }
+
+ if (remain) {
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+
+ for (j = 0; j < remain; j++)
+ buffer[4 + j] = firmware[j + i*payloadLength];
+
+ bufferLength = 4 + remain;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0)
+ {
+ k = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, k, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += k;
+ remainLength -= k;
+ }
+ }
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_reboot (
+ IN Demodulator* demodulator,
+ IN Byte chip
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ command = Cmd_buildCommand (Command_REBOOT, Processor_LINK, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ bufferLength = 4;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ error = Cmd_busTx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_sendCommand (
+ IN Demodulator* demodulator,
+ IN Word command,
+ IN Byte chip,
+ IN Processor processor,
+ IN Dword writeBufferLength,
+ IN Byte* writeBuffer,
+ IN Dword readBufferLength,
+ OUT Byte* readBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Byte buffer[255];
+ Dword bufferLength;
+ Dword remainLength;
+ Dword sendLength;
+ Dword i, k;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ User_enterCriticalSection (demodulator);
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ if ((writeBufferLength + 6) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ if ((readBufferLength + 5) > User_MAX_PKT_SIZE) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+ if ((readBufferLength + 5) > maxFrameSize) {
+ error = Error_INVALID_DATA_LENGTH;
+ goto exit;
+ }
+
+
+ if (writeBufferLength == 0) {
+ command = Cmd_buildCommand (command, processor, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ bufferLength = 4;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ // send command packet
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+ } else {
+ command = Cmd_buildCommand (command, processor, chip);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ for (k = 0; k < writeBufferLength; k++)
+ buffer[k + 4] = writeBuffer[k];
+
+
+ bufferLength = 4 + writeBufferLength;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+
+ /** send command */
+ i = 0;
+ sendLength = 0;
+ remainLength = bufferLength;
+ while (remainLength > 0) {
+ i = (remainLength > User_MAX_PKT_SIZE) ? (User_MAX_PKT_SIZE) : (remainLength);
+ error = Cmd_busTx (demodulator, i, &buffer[sendLength]);
+ if (error) goto exit;
+
+ sendLength += i;
+ remainLength -= i;
+ }
+ }
+
+ bufferLength = 5 + readBufferLength;
+
+ error = Cmd_busRx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ error = Cmd_removeChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ if (readBufferLength) {
+ for (k = 0; k < readBufferLength; k++) {
+ readBuffer[k] = buffer[k + 3];
+ }
+ }
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}
+
+
+Dword Cmd_receiveData (
+ IN Demodulator* demodulator,
+ IN Dword registerAddress,
+ IN Dword readBufferLength,
+ OUT Byte* readBuffer
+) {
+ Dword error = Error_NO_ERROR;
+ Word command;
+ Byte buffer[255];
+ Dword bufferLength;
+ Ganymede* ganymede;
+ Dword maxFrameSize;
+
+ if (readBufferLength == 0) goto exit;
+
+ ganymede = (Ganymede*) demodulator;
+ maxFrameSize = ganymede->cmdDescription->mailBoxSize; /** releaseExternalRemove */
+
+ User_enterCriticalSection (demodulator);
+
+ command = Cmd_buildCommand (Command_DATA_READ, Processor_LINK, 0);
+ buffer[1] = (Byte) (command >> 8);
+ buffer[2] = (Byte) command;
+ buffer[3] = (Byte) Cmd_sequence++;
+ buffer[4] = (Byte) ((readBufferLength >> 16) & 0xFF);
+ buffer[5] = (Byte) ((readBufferLength >> 8) & 0xFF);
+ buffer[6] = (Byte) (readBufferLength & 0xFF);
+ buffer[7] = (Byte) ((registerAddress >> 16) & 0xFF);
+ buffer[8] = (Byte) ((registerAddress >> 8) & 0xFF);
+ buffer[9] = (Byte) (registerAddress & 0xFF);
+
+ bufferLength = 10;
+ error = Cmd_addChecksum (demodulator, &bufferLength, buffer);
+ if (error) goto exit;
+
+ error = Cmd_busTx (demodulator, bufferLength, buffer);
+ if (error) goto exit;
+
+ error = Cmd_busRxData (demodulator, readBufferLength, readBuffer);
+
+exit :
+ User_leaveCriticalSection (demodulator);
+ return (error);
+}