diff options
author | Oliver Schinagl <oliver@schinagl.nl> | 2011-06-28 13:40:27 (GMT) |
---|---|---|
committer | Oliver Schinagl <oliver@schinagl.nl> | 2011-06-28 13:40:27 (GMT) |
commit | fecdd9457cd3912c2b89aff1f99db0ba669af93b (patch) | |
tree | 34bbc7387ded825e303c3117b6c6da2cbe1fd771 /api/cmd.c | |
download | AF903x_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.c | 990 |
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); +} |