I2C hang recover function added
Dependencies: UniGraphic mbed vt100
In this version, check_i2c_pins function was added in edge_mgr.cpp.
プログラムの起動時、I2Cモジュールを初期化する前に、I2Cに使用するピンの電位を確認し
もし一方でも Low に張り付いていた場合、SCL を GPIO 出力に設定して
所定回数 (I2C_UNLOCK_TRIAL_CYCLE) 反転させることにより、疑似リセットクロックを生成します。
その後は、通常の起動手順に復帰し、以降はこれまでと同様の動作をします。
Diff: afLib/StatusCommand.cpp
- Revision:
- 0:d895cd1cd897
diff -r 000000000000 -r d895cd1cd897 afLib/StatusCommand.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/afLib/StatusCommand.cpp Tue Apr 03 08:30:29 2018 +0000 @@ -0,0 +1,135 @@ +/** + * Copyright 2015 Afero, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "StatusCommand.h" + +#define SERIAL_PRINT_DBG_ASR_ON 0 + +StatusCommand::StatusCommand(uint16_t bytesToSend) { + _cmd = 0x30; + _bytesToSend = bytesToSend; + _bytesToRecv = 0; +} + +StatusCommand::StatusCommand() { + _cmd = 0x30; + _bytesToSend = 0; + _bytesToRecv = 0; +} + +StatusCommand::~StatusCommand() { +} + +uint16_t StatusCommand::getSize() { + return sizeof(_cmd) + sizeof(_bytesToSend) + sizeof(_bytesToRecv); +} + +uint16_t StatusCommand::getBytes(int *bytes) { + int index = 0; + + bytes[index++] = (_cmd); + bytes[index++] = (_bytesToSend & 0xff); + bytes[index++] = ((_bytesToSend >> 8) & 0xff); + bytes[index++] = (_bytesToRecv & 0xff); + bytes[index++] = ((_bytesToRecv >> 8) & 0xff); + + return index; +} + +uint8_t StatusCommand::calcChecksum() { + uint8_t result = 0; + + result += (_cmd); + result += (_bytesToSend & 0xff); + result += ((_bytesToSend >> 8) & 0xff); + result += (_bytesToRecv & 0xff); + result += ((_bytesToRecv >> 8) & 0xff); + + return result; +} + +void StatusCommand::setChecksum(uint8_t checksum) { + _checksum = checksum; +} + +uint8_t StatusCommand::getChecksum() { + uint8_t result = 0; + + result += (_cmd); + result += (_bytesToSend & 0xff); + result += ((_bytesToSend >> 8) & 0xff); + result += (_bytesToRecv & 0xff); + result += ((_bytesToRecv >> 8) & 0xff); + + return result; +} + +void StatusCommand::setAck(bool ack) { + _cmd = ack ? 0x31 : 0x30; +} + +void StatusCommand::setBytesToSend(uint16_t bytesToSend) { + _bytesToSend = bytesToSend; +} + +uint16_t StatusCommand::getBytesToSend() { + return _bytesToSend; +} + +void StatusCommand::setBytesToRecv(uint16_t bytesToRecv) { + _bytesToRecv = bytesToRecv; +} + +uint16_t StatusCommand::getBytesToRecv() { + return _bytesToRecv; +} + +bool StatusCommand::equals(StatusCommand *statusCommand) { + return (_cmd == statusCommand->_cmd && _bytesToSend == statusCommand->_bytesToSend && + _bytesToRecv == statusCommand->_bytesToRecv); +} + +bool StatusCommand::isValid() { + return (_checksum == calcChecksum()) && (_cmd == 0x30 || _cmd == 0x31); +} + +void StatusCommand::dumpBytes() { +#if SERIAL_PRINT_DBG_ASR_ON + int len = getSize(); + int bytes[len]; + getBytes(bytes); + + printf("len : %d\n",len); + printf("data : "); + for (int i = 0; i < len; i++) { + if (i > 0) { + printf(", "); + } + int b = bytes[i] & 0xff; + printf("0x%02x", b) ; + } + printf("\n") ; +#endif +} + +void StatusCommand::dump() { +#if SERIAL_PRINT_DBG_ASR_ON + printf("cmd : %s\n",_cmd == 0x30 ? "STATUS" : "STATUS_ACK"); + printf("bytes to send : %d\n",_bytesToSend); + printf("bytes to receive : %d\n",_bytesToRecv); +#endif +} +