├── .github └── workflows │ └── generate-wiki.yaml ├── .gitignore ├── README.md ├── logic-analyzer ├── I2C.csv ├── I2C.xlsx └── Toniebox-SPI-I2C-startup.logicdata ├── protocol └── rtnl │ └── CommandList.csv ├── tools ├── cert_config.py.example ├── firmware_info.py ├── magic_byte_analysis.py ├── rtnl_decoder.proto ├── rtnl_decoder.py ├── ssl_client.py └── ssl_server.py └── wiki └── Home.md /.github/workflows/generate-wiki.yaml: -------------------------------------------------------------------------------- 1 | name: Generate wiki from code 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v1 14 | # Additional steps to generate documentation in "Documentation" directory 15 | - name: Upload Documentation to Wiki 16 | uses: SwiftDocOrg/github-wiki-publish-action@v1 17 | with: 18 | path: "wiki" 19 | env: 20 | GH_PERSONAL_ACCESS_TOKEN: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | tools/__pycache__/ 2 | tools/cert_config.py 3 | protocol/rtnl/_data/ 4 | .~lock.* 5 | protocol/rtnl/CommandList.xlsx 6 | tools/certgen/* 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # toniebox 2 | Holds all gathered information 3 | 4 | Feel free to push updates to our wiki. Just clone this repo, edit the wiki files in the "wiki" directory and open a pull request. 5 | 6 | # Introduction 7 | There are currently three known revisions of the Toniebox. All information gathered here is from revision 1 (r1). Revision 2 (r2) just has some changes on the board layout. 8 | The latest revision 3 (r3) has a different MCU and the CC3200 got replaced with an CC3235S. 9 | The Hackiebox Custom Firmware and the Hackiebox NG Custom Bootloader are currently only compatible with r1/r2. 10 | -------------------------------------------------------------------------------- /logic-analyzer/I2C.csv: -------------------------------------------------------------------------------- 1 | Time [s], Analyzer Name,Device, Decoded Protocol Result 2 | 2.826569060000000,I2C,Unknown,Setup Read to [0x7F] + NAK 3 | 2.826624460000000,I2C,Unknown,0xFF + NAK 4 | 2.826674860000000,I2C,Unknown,0xFF + NAK 5 | 2.826701260000000,I2C,Unknown,0xFF + NAK 6 | 2.826747560000000,I2C,Unknown,0xFF + NAK 7 | 2.826778140000000,I2C,Unknown,0xFF + NAK 8 | 2.826807640000000,I2C,Unknown,0xFF + NAK 9 | 2.826829140000000,I2C,Unknown,0xFF + NAK 10 | 2.826850880000000,I2C,Unknown,0xFF + NAK 11 | 2.826863160000000,I2C,Unknown,0xFF + NAK 12 | 2.826888560000000,I2C,Unknown,0xFF + NAK 13 | 2.826901860000000,I2C,Unknown,0xFF + NAK 14 | 2.826918560000000,I2C,Unknown,0xFF + Missing ACK/NAK 15 | 2.826961180000000,I2C,Unknown,Setup Read to [0x7F] + NAK 16 | 2.827017300000000,I2C,Unknown,Setup Read to [0x01] + ACK 17 | 2.827021120000000,I2C,Unknown,Setup Write to [0x00] + ACK 18 | 2.827022800000000,I2C,Unknown,0x88 + ACK 19 | 2.827025400000000,I2C,Unknown,0x09 + ACK 20 | 2.827033920000000,I2C,Unknown,0x02 + ACK 21 | 2.827049880000000,I2C,Unknown,0xBB + Missing ACK/NAK 22 | 3.048139240000000,I2C,0x1D,Setup Write to [0x1D] + ACK 23 | 3.048162740000000,I2C,0x1D,0x0C + ACK 24 | 3.049132580000000,I2C,0x1D,Setup Read to [0x1D] + ACK 25 | 3.049156080000000,I2C,0x1D,0x00 + NAK 26 | 3.050133660000000,I2C,0x1D,Setup Write to [0x1D] + ACK 27 | 3.050157180000000,I2C,0x1D,0x16 + ACK 28 | 3.051132500000000,I2C,0x1D,Setup Read to [0x1D] + ACK 29 | 3.051156020000000,I2C,0x1D,0x00 + NAK 30 | 3.052133100000000,I2C,0x1D,Setup Write to [0x1D] + ACK 31 | 3.052156600000000,I2C,0x1D,0x2A + ACK 32 | 3.053128320000000,I2C,0x1D,0x02 + ACK 33 | 3.053163200000000,I2C,0x1D,Setup Write to [0x1D] + ACK 34 | 3.053186700000000,I2C,0x1D,0x0E + ACK 35 | 3.054128420000000,I2C,0x1D,0x02 + ACK 36 | 3.054163300000000,I2C,0x1D,Setup Write to [0x1D] + ACK 37 | 3.054186800000000,I2C,0x1D,0x2B + ACK 38 | 3.055128280000000,I2C,0x1D,0x00 + ACK 39 | 3.055163900000000,I2C,0x1D,Setup Write to [0x1D] + ACK 40 | 3.055187400000000,I2C,0x1D,0x09 + ACK 41 | 3.056128120000000,I2C,0x1D,0xD0 + ACK 42 | 3.056163260000000,I2C,0x1D,Setup Write to [0x1D] + ACK 43 | 3.056186760000000,I2C,0x1D,0x0A + ACK 44 | 3.057128220000000,I2C,0x1D,0x08 + ACK 45 | 3.057163600000000,I2C,0x1D,Setup Write to [0x1D] + ACK 46 | 3.057187120000000,I2C,0x1D,0x21 + ACK 47 | 3.058128080000000,I2C,0x1D,0x54 + ACK 48 | 3.058162960000000,I2C,0x1D,Setup Write to [0x1D] + ACK 49 | 3.058186460000000,I2C,0x1D,0x23 + ACK 50 | 3.059128180000000,I2C,0x1D,0x1B + ACK 51 | 3.059163060000000,I2C,0x1D,Setup Write to [0x1D] + ACK 52 | 3.059186560000000,I2C,0x1D,0x24 + ACK 53 | 3.060128040000000,I2C,0x1D,0x3F + ACK 54 | 3.060163660000000,I2C,0x1D,Setup Write to [0x1D] + ACK 55 | 3.060187160000000,I2C,0x1D,0x25 + ACK 56 | 3.061127880000000,I2C,0x1D,0x3F + ACK 57 | 3.061163000000000,I2C,0x1D,Setup Write to [0x1D] + ACK 58 | 3.061186520000000,I2C,0x1D,0x26 + ACK 59 | 3.062127980000000,I2C,0x1D,0x28 + ACK 60 | 3.062163360000000,I2C,0x1D,Setup Write to [0x1D] + ACK 61 | 3.062186880000000,I2C,0x1D,0x27 + ACK 62 | 3.063127840000000,I2C,0x1D,0x7F + ACK 63 | 3.063162720000000,I2C,0x1D,Setup Write to [0x1D] + ACK 64 | 3.063186220000000,I2C,0x1D,0x0F + ACK 65 | 3.064127940000000,I2C,0x1D,0x10 + ACK 66 | 3.064162820000000,I2C,0x1D,Setup Write to [0x1D] + ACK 67 | 3.064186320000000,I2C,0x1D,0x2C + ACK 68 | 3.065127800000000,I2C,0x1D,0x12 + ACK 69 | 3.065163420000000,I2C,0x1D,Setup Write to [0x1D] + ACK 70 | 3.065186940000000,I2C,0x1D,0x2D + ACK 71 | 3.066127640000000,I2C,0x1D,0x40 + ACK 72 | 3.066162780000000,I2C,0x1D,Setup Write to [0x1D] + ACK 73 | 3.066186280000000,I2C,0x1D,0x2E + ACK 74 | 3.067127740000000,I2C,0x1D,0x40 + ACK 75 | 3.067163120000000,I2C,0x1D,Setup Write to [0x1D] + ACK 76 | 3.067186640000000,I2C,0x1D,0x2A + ACK 77 | 3.068127600000000,I2C,0x1D,0x03 + ACK 78 | 3.068162980000000,I2C,0x1D,Setup Write to [0x1D] + ACK 79 | 3.068186480000000,I2C,0x1D,0x0C + ACK 80 | 3.069131560000000,I2C,0x1D,Setup Read to [0x1D] + ACK 81 | 3.069155080000000,I2C,0x1D,0x00 + NAK 82 | 3.070132660000000,I2C,0x1D,Setup Write to [0x1D] + ACK 83 | 3.070156160000000,I2C,0x1D,0x16 + ACK 84 | 3.071131500000000,I2C,0x1D,Setup Read to [0x1D] + ACK 85 | 3.071155000000000,I2C,0x1D,0x00 + NAK 86 | 3.072151340000000,I2C,0x18,Setup Write to [0x18] + ACK 87 | 3.072174840000000,I2C,0x18,0x00 + ACK 88 | 3.073127320000000,I2C,0x18,0x00 + ACK 89 | 3.073162440000000,I2C,0x18,Setup Write to [0x18] + ACK 90 | 3.073185940000000,I2C,0x18,0x01 + ACK 91 | 3.074127420000000,I2C,0x18,0x01 + ACK 92 | 3.074162780000000,I2C,0x18,Setup Write to [0x18] + ACK 93 | 3.074186300000000,I2C,0x18,0x04 + ACK 94 | 3.075127260000000,I2C,0x18,0x07 + ACK 95 | 3.075162880000000,I2C,0x18,Setup Write to [0x18] + ACK 96 | 3.075186400000000,I2C,0x18,0x06 + ACK 97 | 3.076127120000000,I2C,0x18,0x20 + ACK 98 | 3.076162740000000,I2C,0x18,Setup Write to [0x18] + ACK 99 | 3.076186260000000,I2C,0x18,0x07 + ACK 100 | 3.077127220000000,I2C,0x18,0x00 + ACK 101 | 3.077163340000000,I2C,0x18,Setup Write to [0x18] + ACK 102 | 3.077186860000000,I2C,0x18,0x08 + ACK 103 | 3.078127080000000,I2C,0x18,0x00 + ACK 104 | 3.078162700000000,I2C,0x18,Setup Write to [0x18] + ACK 105 | 3.078186200000000,I2C,0x18,0x05 + ACK 106 | 3.079127180000000,I2C,0x18,0x96 + ACK 107 | 3.079162540000000,I2C,0x18,Setup Write to [0x18] + ACK 108 | 3.079186060000000,I2C,0x18,0x0B + ACK 109 | 3.080127020000000,I2C,0x18,0x84 + ACK 110 | 3.080162660000000,I2C,0x18,Setup Write to [0x18] + ACK 111 | 3.080186160000000,I2C,0x18,0x0C + ACK 112 | 3.081126880000000,I2C,0x18,0x86 + ACK 113 | 3.081162500000000,I2C,0x18,Setup Write to [0x18] + ACK 114 | 3.081186020000000,I2C,0x18,0x0D + ACK 115 | 3.082126980000000,I2C,0x18,0x01 + ACK 116 | 3.082163100000000,I2C,0x18,Setup Write to [0x18] + ACK 117 | 3.082186620000000,I2C,0x18,0x0E + ACK 118 | 3.083126840000000,I2C,0x18,0x00 + ACK 119 | 3.093131220000000,I2C,0x18,Setup Write to [0x18] + ACK 120 | 3.093154740000000,I2C,0x18,0x1B + ACK 121 | 3.094126460000000,I2C,0x18,0x00 + ACK 122 | 3.094161820000000,I2C,0x18,Setup Write to [0x18] + ACK 123 | 3.094185340000000,I2C,0x18,0x3C + ACK 124 | 3.095126300000000,I2C,0x18,0x19 + ACK 125 | 3.095161940000000,I2C,0x18,Setup Write to [0x18] + ACK 126 | 3.095185440000000,I2C,0x18,0x00 + ACK 127 | 3.096126160000000,I2C,0x18,0x01 + ACK 128 | 3.096161280000000,I2C,0x18,Setup Write to [0x18] + ACK 129 | 3.096184800000000,I2C,0x18,0x21 + ACK 130 | 3.097126260000000,I2C,0x18,0x4E + ACK 131 | 3.097162380000000,I2C,0x18,Setup Write to [0x18] + ACK 132 | 3.097185900000000,I2C,0x18,0x22 + ACK 133 | 3.098126120000000,I2C,0x18,0x70 + ACK 134 | 3.098161740000000,I2C,0x18,Setup Write to [0x18] + ACK 135 | 3.098185240000000,I2C,0x18,0x23 + ACK 136 | 3.099126220000000,I2C,0x18,0x44 + ACK 137 | 3.099161580000000,I2C,0x18,Setup Write to [0x18] + ACK 138 | 3.099185100000000,I2C,0x18,0x2E + ACK 139 | 3.100126060000000,I2C,0x18,0x0B + ACK 140 | 3.100161700000000,I2C,0x18,Setup Write to [0x18] + ACK 141 | 3.100185200000000,I2C,0x18,0x2C + ACK 142 | 3.101125920000000,I2C,0x18,0xE0 + ACK 143 | 3.101161540000000,I2C,0x18,Setup Write to [0x18] + ACK 144 | 3.101185060000000,I2C,0x18,0x00 + ACK 145 | 3.102126020000000,I2C,0x18,0x03 + ACK 146 | 3.102161640000000,I2C,0x18,Setup Write to [0x18] + ACK 147 | 3.102185160000000,I2C,0x18,0x10 + ACK 148 | 3.103125880000000,I2C,0x18,0x01 + ACK 149 | 3.103161500000000,I2C,0x18,Setup Write to [0x18] + ACK 150 | 3.103185000000000,I2C,0x18,0x00 + ACK 151 | 3.104125980000000,I2C,0x18,0x00 + ACK 152 | 3.104160840000000,I2C,0x18,Setup Write to [0x18] + ACK 153 | 3.104184360000000,I2C,0x18,0x43 + ACK 154 | 3.105125820000000,I2C,0x18,0x8C + ACK 155 | 3.105161460000000,I2C,0x18,Setup Write to [0x18] + ACK 156 | 3.105184960000000,I2C,0x18,0x30 + ACK 157 | 3.106125680000000,I2C,0x18,0x80 + ACK 158 | 3.106161300000000,I2C,0x18,Setup Write to [0x18] + ACK 159 | 3.106184820000000,I2C,0x18,0x33 + ACK 160 | 3.107125780000000,I2C,0x18,0x14 + ACK 161 | 3.307120980000000,I2C,0x18,Setup Write to [0x18] + ACK 162 | 3.307144480000000,I2C,0x18,0x2E + ACK 163 | 3.308120320000000,I2C,0x18,Setup Read to [0x18] + ACK 164 | 3.308143820000000,I2C,0x18,0x10 + NAK 165 | 3.309121900000000,I2C,0x18,Setup Write to [0x18] + ACK 166 | 3.309145420000000,I2C,0x18,0x00 + ACK 167 | 3.310116120000000,I2C,0x18,0x01 + ACK 168 | 3.310151260000000,I2C,0x18,Setup Write to [0x18] + ACK 169 | 3.310174760000000,I2C,0x18,0x24 + ACK 170 | 3.311116220000000,I2C,0x18,0x7F + ACK 171 | 3.311151600000000,I2C,0x18,Setup Write to [0x18] + ACK 172 | 3.311175120000000,I2C,0x18,0x25 + ACK 173 | 3.312116080000000,I2C,0x18,0x7F + ACK 174 | 3.312151700000000,I2C,0x18,Setup Write to [0x18] + ACK 175 | 3.312175220000000,I2C,0x18,0x26 + ACK 176 | 3.313115940000000,I2C,0x18,0x7F + ACK 177 | 3.363118660000000,I2C,0x18,Setup Write to [0x18] + ACK 178 | 3.363142180000000,I2C,0x18,0x28 + ACK 179 | 3.364113640000000,I2C,0x18,0x00 + ACK 180 | 3.364149760000000,I2C,0x18,Setup Write to [0x18] + ACK 181 | 3.364173280000000,I2C,0x18,0x29 + ACK 182 | 3.365113500000000,I2C,0x18,0x00 + ACK 183 | 3.365149120000000,I2C,0x18,Setup Write to [0x18] + ACK 184 | 3.365172620000000,I2C,0x18,0x2A + ACK 185 | 3.366113600000000,I2C,0x18,0x00 + ACK 186 | 3.416116080000000,I2C,0x18,Setup Write to [0x18] + ACK 187 | 3.416139580000000,I2C,0x18,0x1F + ACK 188 | 3.417111040000000,I2C,0x18,0x00 + ACK 189 | 3.417146680000000,I2C,0x18,Setup Write to [0x18] + ACK 190 | 3.417170180000000,I2C,0x18,0x20 + ACK 191 | 3.418110900000000,I2C,0x18,0x00 + ACK 192 | 3.469112080000000,I2C,0x18,Setup Write to [0x18] + ACK 193 | 3.469135600000000,I2C,0x18,0x28 + ACK 194 | 3.470108560000000,I2C,0x18,0x06 + ACK 195 | 3.470144680000000,I2C,0x18,Setup Write to [0x18] + ACK 196 | 3.470168200000000,I2C,0x18,0x29 + ACK 197 | 3.471108400000000,I2C,0x18,0x06 + ACK 198 | 3.471144040000000,I2C,0x18,Setup Write to [0x18] + ACK 199 | 3.471167540000000,I2C,0x18,0x1F + ACK 200 | 3.472108500000000,I2C,0x18,0xC2 + ACK 201 | 3.472143880000000,I2C,0x18,Setup Write to [0x18] + ACK 202 | 3.472167400000000,I2C,0x18,0x24 + ACK 203 | 3.473108360000000,I2C,0x18,0x92 + ACK 204 | 3.473143980000000,I2C,0x18,Setup Write to [0x18] + ACK 205 | 3.473167500000000,I2C,0x18,0x25 + ACK 206 | 3.474108220000000,I2C,0x18,0x92 + ACK 207 | 3.524110700000000,I2C,0x18,Setup Write to [0x18] + ACK 208 | 3.524134200000000,I2C,0x18,0x00 + ACK 209 | 3.525105920000000,I2C,0x18,0x00 + ACK 210 | 3.525141540000000,I2C,0x18,Setup Write to [0x18] + ACK 211 | 3.525165060000000,I2C,0x18,0x3F + ACK 212 | 3.526105780000000,I2C,0x18,0xD5 + ACK 213 | 3.526143140000000,I2C,0x18,Setup Write to [0x18] + ACK 214 | 3.526166660000000,I2C,0x18,0x41 + ACK 215 | 3.527105880000000,I2C,0x18,0xDC + ACK 216 | 3.527141240000000,I2C,0x18,Setup Write to [0x18] + ACK 217 | 3.527164760000000,I2C,0x18,0x42 + ACK 218 | 3.528105720000000,I2C,0x18,0xDC + ACK 219 | 3.528141100000000,I2C,0x18,Setup Write to [0x18] + ACK 220 | 3.528164620000000,I2C,0x18,0x26 + ACK 221 | 3.529109700000000,I2C,0x18,Setup Read to [0x18] + ACK 222 | 3.529133200000000,I2C,0x18,0x00 + NAK 223 | 3.540110060000000,I2C,0x18,Setup Write to [0x18] + ACK 224 | 3.540133560000000,I2C,0x18,0x26 + ACK 225 | 3.541108880000000,I2C,0x18,Setup Read to [0x18] + ACK 226 | 3.541132400000000,I2C,0x18,0x01 + NAK 227 | 3.552109260000000,I2C,0x18,Setup Write to [0x18] + ACK 228 | 3.552132760000000,I2C,0x18,0x26 + ACK 229 | 3.553108340000000,I2C,0x18,Setup Read to [0x18] + ACK 230 | 3.553131860000000,I2C,0x18,0x01 + NAK 231 | 3.564108700000000,I2C,0x18,Setup Write to [0x18] + ACK 232 | 3.564132220000000,I2C,0x18,0x26 + ACK 233 | 3.565107780000000,I2C,0x18,Setup Read to [0x18] + ACK 234 | 3.565131300000000,I2C,0x18,0x01 + NAK 235 | 3.576108140000000,I2C,0x18,Setup Write to [0x18] + ACK 236 | 3.576131660000000,I2C,0x18,0x26 + ACK 237 | 3.577107240000000,I2C,0x18,Setup Read to [0x18] + ACK 238 | 3.577130760000000,I2C,0x18,0x01 + NAK 239 | 3.588107600000000,I2C,0x18,Setup Write to [0x18] + ACK 240 | 3.588131120000000,I2C,0x18,0x26 + ACK 241 | 3.589106680000000,I2C,0x18,Setup Read to [0x18] + ACK 242 | 3.589130200000000,I2C,0x18,0x01 + NAK 243 | 3.600107040000000,I2C,0x18,Setup Write to [0x18] + ACK 244 | 3.600130560000000,I2C,0x18,0x26 + ACK 245 | 3.601106140000000,I2C,0x18,Setup Read to [0x18] + ACK 246 | 3.601129660000000,I2C,0x18,0x01 + NAK 247 | 3.612106500000000,I2C,0x18,Setup Write to [0x18] + ACK 248 | 3.612130020000000,I2C,0x18,0x26 + ACK 249 | 3.613105580000000,I2C,0x18,Setup Read to [0x18] + ACK 250 | 3.613129100000000,I2C,0x18,0x01 + NAK 251 | 3.624105940000000,I2C,0x18,Setup Write to [0x18] + ACK 252 | 3.624129460000000,I2C,0x18,0x26 + ACK 253 | 3.625105040000000,I2C,0x18,Setup Read to [0x18] + ACK 254 | 3.625128560000000,I2C,0x18,0x01 + NAK 255 | 3.636105400000000,I2C,0x18,Setup Write to [0x18] + ACK 256 | 3.636128920000000,I2C,0x18,0x26 + ACK 257 | 3.637104480000000,I2C,0x18,Setup Read to [0x18] + ACK 258 | 3.637128000000000,I2C,0x18,0x01 + NAK 259 | 3.648104840000000,I2C,0x18,Setup Write to [0x18] + ACK 260 | 3.648128360000000,I2C,0x18,0x26 + ACK 261 | 3.649103940000000,I2C,0x18,Setup Read to [0x18] + ACK 262 | 3.649127440000000,I2C,0x18,0x01 + NAK 263 | 3.660104300000000,I2C,0x18,Setup Write to [0x18] + ACK 264 | 3.660127800000000,I2C,0x18,0x26 + ACK 265 | 3.661103380000000,I2C,0x18,Setup Read to [0x18] + ACK 266 | 3.661126900000000,I2C,0x18,0x01 + NAK 267 | 3.672103500000000,I2C,0x18,Setup Write to [0x18] + ACK 268 | 3.672127000000000,I2C,0x18,0x26 + ACK 269 | 3.673102580000000,I2C,0x18,Setup Read to [0x18] + ACK 270 | 3.673126100000000,I2C,0x18,0x01 + NAK 271 | 3.684102940000000,I2C,0x18,Setup Write to [0x18] + ACK 272 | 3.684126460000000,I2C,0x18,0x26 + ACK 273 | 3.685102040000000,I2C,0x18,Setup Read to [0x18] + ACK 274 | 3.685125540000000,I2C,0x18,0x01 + NAK 275 | 3.696102400000000,I2C,0x18,Setup Write to [0x18] + ACK 276 | 3.696125900000000,I2C,0x18,0x26 + ACK 277 | 3.697101480000000,I2C,0x18,Setup Read to [0x18] + ACK 278 | 3.697125000000000,I2C,0x18,0x01 + NAK 279 | 3.708101840000000,I2C,0x18,Setup Write to [0x18] + ACK 280 | 3.708125360000000,I2C,0x18,0x26 + ACK 281 | 3.709100940000000,I2C,0x18,Setup Read to [0x18] + ACK 282 | 3.709124440000000,I2C,0x18,0x01 + NAK 283 | 3.720101300000000,I2C,0x18,Setup Write to [0x18] + ACK 284 | 3.720124820000000,I2C,0x18,0x26 + ACK 285 | 3.721100380000000,I2C,0x18,Setup Read to [0x18] + ACK 286 | 3.721123900000000,I2C,0x18,0x01 + NAK 287 | 3.732100740000000,I2C,0x18,Setup Write to [0x18] + ACK 288 | 3.732124260000000,I2C,0x18,0x26 + ACK 289 | 3.733099840000000,I2C,0x18,Setup Read to [0x18] + ACK 290 | 3.733123360000000,I2C,0x18,0x01 + NAK 291 | 3.744100240000000,I2C,0x18,Setup Write to [0x18] + ACK 292 | 3.744123740000000,I2C,0x18,0x26 + ACK 293 | 3.745099320000000,I2C,0x18,Setup Read to [0x18] + ACK 294 | 3.745122840000000,I2C,0x18,0x01 + NAK 295 | 3.756099680000000,I2C,0x18,Setup Write to [0x18] + ACK 296 | 3.756123200000000,I2C,0x18,0x26 + ACK 297 | 3.757098780000000,I2C,0x18,Setup Read to [0x18] + ACK 298 | 3.757122280000000,I2C,0x18,0x01 + NAK 299 | 4.476696420000000,I2C,0x18,Setup Write to [0x18] + ACK 300 | 4.476719920000000,I2C,0x18,0x41 + ACK 301 | 4.476748940000000,I2C,0x18,0x82 + ACK 302 | 4.476784320000000,I2C,0x18,Setup Write to [0x18] + ACK 303 | 4.476807820000000,I2C,0x18,0x42 + ACK 304 | 4.476836840000000,I2C,0x18,0x82 + ACK 305 | 4.476872200000000,I2C,0x18,Setup Write to [0x18] + ACK 306 | 4.476895720000000,I2C,0x18,0x26 + ACK 307 | 4.476928840000000,I2C,0x18,Setup Read to [0x18] + ACK 308 | 4.476952360000000,I2C,0x18,0x11 + NAK 309 | 4.476989720000000,I2C,0x18,Setup Write to [0x18] + ACK 310 | 4.477013240000000,I2C,0x18,0x40 + ACK 311 | 4.477042500000000,I2C,0x18,0x00 + ACK 312 | 4.477079380000000,I2C,0x18,Setup Write to [0x18] + ACK 313 | 4.477102880000000,I2C,0x18,0x41 + ACK 314 | 4.477132140000000,I2C,0x18,0xDC + ACK 315 | 4.477167760000000,I2C,0x18,Setup Write to [0x18] + ACK 316 | 4.477191280000000,I2C,0x18,0x42 + ACK 317 | 4.477220540000000,I2C,0x18,0xDC + ACK 318 | 4.477255920000000,I2C,0x18,Setup Write to [0x18] + ACK 319 | 4.477279420000000,I2C,0x18,0x26 + ACK 320 | 4.477312800000000,I2C,0x18,Setup Read to [0x18] + ACK 321 | 4.477336320000000,I2C,0x18,0x00 + NAK 322 | 4.487064220000000,I2C,0x18,Setup Write to [0x18] + ACK 323 | 4.487087740000000,I2C,0x18,0x26 + ACK 324 | 4.487121100000000,I2C,0x18,Setup Read to [0x18] + ACK 325 | 4.487144620000000,I2C,0x18,0x00 + NAK 326 | 4.497063760000000,I2C,0x18,Setup Write to [0x18] + ACK 327 | 4.497087280000000,I2C,0x18,0x26 + ACK 328 | 4.498062860000000,I2C,0x18,Setup Read to [0x18] + ACK 329 | 4.498086360000000,I2C,0x18,0x00 + NAK 330 | 4.509063280000000,I2C,0x18,Setup Write to [0x18] + ACK 331 | 4.509086800000000,I2C,0x18,0x26 + ACK 332 | 4.510062400000000,I2C,0x18,Setup Read to [0x18] + ACK 333 | 4.510085920000000,I2C,0x18,0x00 + NAK 334 | 4.520063060000000,I2C,0x18,Setup Write to [0x18] + ACK 335 | 4.520086580000000,I2C,0x18,0x26 + ACK 336 | 4.521062180000000,I2C,0x18,Setup Read to [0x18] + ACK 337 | 4.521085680000000,I2C,0x18,0x00 + NAK 338 | 4.532062760000000,I2C,0x18,Setup Write to [0x18] + ACK 339 | 4.532086280000000,I2C,0x18,0x26 + ACK 340 | 4.532119400000000,I2C,0x18,Setup Read to [0x18] + ACK 341 | 4.532142900000000,I2C,0x18,0x11 + NAK 342 | 5.532041640000000,I2C,0x1D,Setup Write to [0x1D] + ACK 343 | 5.532065160000000,I2C,0x1D,0x00 + ACK 344 | 5.532098280000000,I2C,0x1D,Setup Read to [0x1D] + ACK 345 | 5.532121800000000,I2C,0x1D,0x20 + NAK 346 | 5.532159160000000,I2C,0x1D,Setup Write to [0x1D] + ACK 347 | 5.532182680000000,I2C,0x1D,0x81 + ACK 348 | 5.532215560000000,I2C,0x1D,Setup Read to [0x1D] + ACK 349 | 5.532239060000000,I2C,0x1D,0xFB + ACK 350 | 5.532268080000000,I2C,0x1D,0xFA + ACK 351 | 5.532294340000000,I2C,0x1D,0x0E + ACK 352 | 5.532320600000000,I2C,0x1D,0xFB + ACK 353 | 5.532346860000000,I2C,0x1D,0xFA + ACK 354 | 5.532373120000000,I2C,0x1D,0x0E + ACK 355 | 5.532399380000000,I2C,0x1D,0xFB + ACK 356 | 5.532425640000000,I2C,0x1D,0xFA + ACK 357 | 5.532451660000000,I2C,0x1D,0x0E + ACK 358 | 5.532477920000000,I2C,0x1D,0xFB + ACK 359 | 5.532504180000000,I2C,0x1D,0xFA + ACK 360 | 5.532530440000000,I2C,0x1D,0x0E + ACK 361 | 5.532556700000000,I2C,0x1D,0xFB + ACK 362 | 5.532582980000000,I2C,0x1D,0xFA + ACK 363 | 5.532609240000000,I2C,0x1D,0x0E + ACK 364 | 5.532635240000000,I2C,0x1D,0xFB + ACK 365 | 5.532661500000000,I2C,0x1D,0xFA + ACK 366 | 5.532687760000000,I2C,0x1D,0x0E + ACK 367 | 5.532714020000000,I2C,0x1D,0xFB + ACK 368 | 5.532740300000000,I2C,0x1D,0xFA + ACK 369 | 5.532766560000000,I2C,0x1D,0x0E + ACK 370 | 5.532792820000000,I2C,0x1D,0xFB + ACK 371 | 5.532819080000000,I2C,0x1D,0xFA + ACK 372 | 5.532845080000000,I2C,0x1D,0x0E + ACK 373 | 5.532871360000000,I2C,0x1D,0xFB + ACK 374 | 5.532897620000000,I2C,0x1D,0xFA + ACK 375 | 5.532923880000000,I2C,0x1D,0x0E + ACK 376 | 5.532950140000000,I2C,0x1D,0xFB + ACK 377 | 5.532976400000000,I2C,0x1D,0xFA + ACK 378 | 5.533002660000000,I2C,0x1D,0x0E + ACK 379 | 5.533031920000000,I2C,0x1D,0xFB + ACK 380 | 5.533058180000000,I2C,0x1D,0xFA + ACK 381 | 5.533084440000000,I2C,0x1D,0x0E + ACK 382 | 5.533110700000000,I2C,0x1D,0xFB + ACK 383 | 5.533136960000000,I2C,0x1D,0xFA + ACK 384 | 5.533163240000000,I2C,0x1D,0x0E + ACK 385 | 5.533189500000000,I2C,0x1D,0xFB + ACK 386 | 5.533215500000000,I2C,0x1D,0xFA + ACK 387 | 5.533241760000000,I2C,0x1D,0x0E + ACK 388 | 5.533268020000000,I2C,0x1D,0xFB + ACK 389 | 5.533294300000000,I2C,0x1D,0xFA + ACK 390 | 5.533320560000000,I2C,0x1D,0x0E + ACK 391 | 5.533346820000000,I2C,0x1D,0xFB + ACK 392 | 5.533373080000000,I2C,0x1D,0xFA + ACK 393 | 5.533399080000000,I2C,0x1D,0x0E + ACK 394 | 5.533425360000000,I2C,0x1D,0xFB + ACK 395 | 5.533451620000000,I2C,0x1D,0xFA + ACK 396 | 5.533477880000000,I2C,0x1D,0x0E + ACK 397 | 5.533504140000000,I2C,0x1D,0xFB + ACK 398 | 5.533530400000000,I2C,0x1D,0xFA + ACK 399 | 5.533556660000000,I2C,0x1D,0x0E + ACK 400 | 5.533582920000000,I2C,0x1D,0xFB + ACK 401 | 5.533608940000000,I2C,0x1D,0xFA + ACK 402 | 5.533635200000000,I2C,0x1D,0x0E + ACK 403 | 5.533661460000000,I2C,0x1D,0xFB + ACK 404 | 5.533687720000000,I2C,0x1D,0xFA + ACK 405 | 5.533713980000000,I2C,0x1D,0x0E + ACK 406 | 5.533740240000000,I2C,0x1D,0xFB + ACK 407 | 5.533766500000000,I2C,0x1D,0xFA + ACK 408 | 5.533792520000000,I2C,0x1D,0x0E + ACK 409 | 5.533818780000000,I2C,0x1D,0xFB + ACK 410 | 5.533845040000000,I2C,0x1D,0xFA + ACK 411 | 5.533871300000000,I2C,0x1D,0x0E + ACK 412 | 5.533897560000000,I2C,0x1D,0xFB + ACK 413 | 5.533923820000000,I2C,0x1D,0xFA + ACK 414 | 5.533950080000000,I2C,0x1D,0x0E + ACK 415 | 5.533976100000000,I2C,0x1D,0xFB + ACK 416 | 5.534002360000000,I2C,0x1D,0xFA + ACK 417 | 5.534031880000000,I2C,0x1D,0x0E + ACK 418 | 5.534058140000000,I2C,0x1D,0xFB + ACK 419 | 5.534084400000000,I2C,0x1D,0xFA + ACK 420 | 5.534110660000000,I2C,0x1D,0x0E + ACK 421 | 5.534136920000000,I2C,0x1D,0xFB + ACK 422 | 5.534162940000000,I2C,0x1D,0xFA + ACK 423 | 5.534189200000000,I2C,0x1D,0x0E + ACK 424 | 5.534215460000000,I2C,0x1D,0xFB + ACK 425 | 5.534241720000000,I2C,0x1D,0xFA + ACK 426 | 5.534267980000000,I2C,0x1D,0x0E + ACK 427 | 5.534294240000000,I2C,0x1D,0xFB + ACK 428 | 5.534320500000000,I2C,0x1D,0xFA + ACK 429 | 5.534346520000000,I2C,0x1D,0x0E + ACK 430 | 5.534372780000000,I2C,0x1D,0xFB + ACK 431 | 5.534399040000000,I2C,0x1D,0xFA + ACK 432 | 5.534425300000000,I2C,0x1D,0x0E + ACK 433 | 5.534451560000000,I2C,0x1D,0xFB + ACK 434 | 5.534477820000000,I2C,0x1D,0xFA + ACK 435 | 5.534504080000000,I2C,0x1D,0x0E + ACK 436 | 5.534530360000000,I2C,0x1D,0xFB + ACK 437 | 5.534556360000000,I2C,0x1D,0xFA + ACK 438 | 5.534582620000000,I2C,0x1D,0x0E + ACK 439 | 5.534608880000000,I2C,0x1D,0xFB + ACK 440 | 5.534635140000000,I2C,0x1D,0xFA + ACK 441 | 5.534661400000000,I2C,0x1D,0x0E + ACK 442 | 5.534687680000000,I2C,0x1D,0xFB + ACK 443 | 5.534713680000000,I2C,0x1D,0xFA + ACK 444 | 5.534739940000000,I2C,0x1D,0x0E + NAK 445 | 5.534868060000000,I2C,0x18,Setup Write to [0x18] + ACK 446 | 5.534891580000000,I2C,0x18,0x2E + ACK 447 | 5.534924460000000,I2C,0x18,Setup Read to [0x18] + ACK 448 | 5.534947960000000,I2C,0x18,0x10 + NAK 449 | 6.535017820000000,I2C,0x1D,Setup Write to [0x1D] + ACK 450 | 6.535041320000000,I2C,0x1D,0x00 + ACK 451 | 6.535074460000000,I2C,0x1D,Setup Read to [0x1D] + ACK 452 | 6.535097960000000,I2C,0x1D,0x20 + NAK 453 | 6.535139840000000,I2C,0x1D,Setup Write to [0x1D] + ACK 454 | 6.535163340000000,I2C,0x1D,0x81 + ACK 455 | 6.535196220000000,I2C,0x1D,Setup Read to [0x1D] + ACK 456 | 6.535219740000000,I2C,0x1D,0xFB + ACK 457 | 6.535248740000000,I2C,0x1D,0xFA + ACK 458 | 6.535275000000000,I2C,0x1D,0x0E + ACK 459 | 6.535301260000000,I2C,0x1D,0xFB + ACK 460 | 6.535327540000000,I2C,0x1D,0xFA + ACK 461 | 6.535353800000000,I2C,0x1D,0x0E + ACK 462 | 6.535380060000000,I2C,0x1D,0xFB + ACK 463 | 6.535406060000000,I2C,0x1D,0xFA + ACK 464 | 6.535432340000000,I2C,0x1D,0x0E + ACK 465 | 6.535458600000000,I2C,0x1D,0xFB + ACK 466 | 6.535484860000000,I2C,0x1D,0xFA + ACK 467 | 6.535511120000000,I2C,0x1D,0x0E + ACK 468 | 6.535537380000000,I2C,0x1D,0xFB + ACK 469 | 6.535563640000000,I2C,0x1D,0xFA + ACK 470 | 6.535589660000000,I2C,0x1D,0x0E + ACK 471 | 6.535615920000000,I2C,0x1D,0xFB + ACK 472 | 6.535642180000000,I2C,0x1D,0xF9 + ACK 473 | 6.535668440000000,I2C,0x1D,0x0E + ACK 474 | 6.535694700000000,I2C,0x1D,0xFB + ACK 475 | 6.535720960000000,I2C,0x1D,0xFA + ACK 476 | 6.535747220000000,I2C,0x1D,0x0E + ACK 477 | 6.535773480000000,I2C,0x1D,0xFB + ACK 478 | 6.535799500000000,I2C,0x1D,0xFA + ACK 479 | 6.535825760000000,I2C,0x1D,0x0E + ACK 480 | 6.535852020000000,I2C,0x1D,0xFB + ACK 481 | 6.535878280000000,I2C,0x1D,0xFA + ACK 482 | 6.535904540000000,I2C,0x1D,0x0E + ACK 483 | 6.535930800000000,I2C,0x1D,0xFB + ACK 484 | 6.535957060000000,I2C,0x1D,0xFA + ACK 485 | 6.535983080000000,I2C,0x1D,0x0E + ACK 486 | 6.536009600000000,I2C,0x1D,0xFB + ACK 487 | 6.536035860000000,I2C,0x1D,0xFA + ACK 488 | 6.536062120000000,I2C,0x1D,0x0E + ACK 489 | 6.536095620000000,I2C,0x1D,0xFB + ACK 490 | 6.536121880000000,I2C,0x1D,0xFA + ACK 491 | 6.536148160000000,I2C,0x1D,0x0E + ACK 492 | 6.536174420000000,I2C,0x1D,0xFB + ACK 493 | 6.536200680000000,I2C,0x1D,0xFA + ACK 494 | 6.536226940000000,I2C,0x1D,0x0E + ACK 495 | 6.536253200000000,I2C,0x1D,0xFB + ACK 496 | 6.536279200000000,I2C,0x1D,0xFA + ACK 497 | 6.536305480000000,I2C,0x1D,0x0E + ACK 498 | 6.536331740000000,I2C,0x1D,0xFB + ACK 499 | 6.536358000000000,I2C,0x1D,0xFA + ACK 500 | 6.536384260000000,I2C,0x1D,0x0E + ACK 501 | 6.536410520000000,I2C,0x1D,0xFB + ACK 502 | 6.536436780000000,I2C,0x1D,0xFA + ACK 503 | 6.536462800000000,I2C,0x1D,0x0E + ACK 504 | 6.536489060000000,I2C,0x1D,0xFB + ACK 505 | 6.536515320000000,I2C,0x1D,0xFA + ACK 506 | 6.536541580000000,I2C,0x1D,0x0E + ACK 507 | 6.536567840000000,I2C,0x1D,0xFB + ACK 508 | 6.536594100000000,I2C,0x1D,0xFA + ACK 509 | 6.536620360000000,I2C,0x1D,0x0E + ACK 510 | 6.536646620000000,I2C,0x1D,0xFB + ACK 511 | 6.536672640000000,I2C,0x1D,0xFA + ACK 512 | 6.536698900000000,I2C,0x1D,0x0E + ACK 513 | 6.536725160000000,I2C,0x1D,0xFB + ACK 514 | 6.536751420000000,I2C,0x1D,0xF9 + ACK 515 | 6.536777680000000,I2C,0x1D,0x0E + ACK 516 | 6.536803940000000,I2C,0x1D,0xFB + ACK 517 | 6.536829960000000,I2C,0x1D,0xFA + ACK 518 | 6.536856220000000,I2C,0x1D,0x0E + ACK 519 | 6.536882480000000,I2C,0x1D,0xFB + ACK 520 | 6.536908740000000,I2C,0x1D,0xFA + ACK 521 | 6.536935000000000,I2C,0x1D,0x0E + ACK 522 | 6.536961260000000,I2C,0x1D,0xFB + ACK 523 | 6.536987540000000,I2C,0x1D,0xFA + ACK 524 | 6.538010520000000,I2C,0x1D,0x0E + ACK 525 | 6.538036780000000,I2C,0x1D,0xFB + ACK 526 | 6.538062800000000,I2C,0x1D,0xFA + ACK 527 | 6.538089060000000,I2C,0x1D,0x0E + ACK 528 | 6.538115320000000,I2C,0x1D,0xFB + ACK 529 | 6.538141580000000,I2C,0x1D,0xFA + ACK 530 | 6.538167840000000,I2C,0x1D,0x0E + ACK 531 | 6.538194100000000,I2C,0x1D,0xFB + ACK 532 | 6.538220120000000,I2C,0x1D,0xFA + ACK 533 | 6.538246380000000,I2C,0x1D,0x0E + ACK 534 | 6.538272640000000,I2C,0x1D,0xFB + ACK 535 | 6.538298900000000,I2C,0x1D,0xFA + ACK 536 | 6.538325160000000,I2C,0x1D,0x0E + ACK 537 | 6.538351420000000,I2C,0x1D,0xFB + ACK 538 | 6.538377680000000,I2C,0x1D,0xFA + ACK 539 | 6.538403960000000,I2C,0x1D,0x0E + ACK 540 | 6.538429960000000,I2C,0x1D,0xFB + ACK 541 | 6.538456220000000,I2C,0x1D,0xFA + ACK 542 | 6.538482480000000,I2C,0x1D,0x0E + ACK 543 | 6.538508740000000,I2C,0x1D,0xFB + ACK 544 | 6.538535000000000,I2C,0x1D,0xFA + ACK 545 | 6.538561280000000,I2C,0x1D,0x0E + ACK 546 | 6.538587540000000,I2C,0x1D,0xFB + ACK 547 | 6.538613540000000,I2C,0x1D,0xFA + ACK 548 | 6.538639800000000,I2C,0x1D,0x0E + ACK 549 | 6.538666060000000,I2C,0x1D,0xFB + ACK 550 | 6.538692320000000,I2C,0x1D,0xFA + ACK 551 | 6.538718600000000,I2C,0x1D,0x0E + NAK 552 | 6.538846460000000,I2C,0x18,Setup Write to [0x18] + ACK 553 | 6.538869980000000,I2C,0x18,0x2E + ACK 554 | 6.539014340000000,I2C,0x18,Setup Read to [0x18] + ACK 555 | 6.539037860000000,I2C,0x18,0x10 + NAK 556 | 7.539989260000000,I2C,0x1D,Setup Write to [0x1D] + ACK 557 | 7.540012780000000,I2C,0x1D,0x00 + ACK 558 | 7.540985860000000,I2C,0x1D,Setup Read to [0x1D] + ACK 559 | 7.541009360000000,I2C,0x1D,0x20 + NAK 560 | 7.541996700000000,I2C,0x1D,Setup Write to [0x1D] + ACK 561 | 7.542020200000000,I2C,0x1D,0x81 + ACK 562 | 7.542985780000000,I2C,0x1D,Setup Read to [0x1D] + ACK 563 | 7.543009300000000,I2C,0x1D,0xFB + ACK 564 | 7.543981760000000,I2C,0x1D,0xFA + ACK 565 | 7.544008020000000,I2C,0x1D,0x0E + ACK 566 | 7.544034280000000,I2C,0x1D,0xFB + ACK 567 | 7.544060800000000,I2C,0x1D,0xFA + ACK 568 | 7.544087060000000,I2C,0x1D,0x0E + ACK 569 | 7.544113320000000,I2C,0x1D,0xFB + ACK 570 | 7.544139580000000,I2C,0x1D,0xFA + ACK 571 | 7.544165840000000,I2C,0x1D,0x0E + ACK 572 | 7.544192100000000,I2C,0x1D,0xFB + ACK 573 | 7.544218360000000,I2C,0x1D,0xFA + ACK 574 | 7.544244620000000,I2C,0x1D,0x0E + ACK 575 | 7.544270880000000,I2C,0x1D,0xFB + ACK 576 | 7.544296900000000,I2C,0x1D,0xFA + ACK 577 | 7.544323400000000,I2C,0x1D,0x0E + ACK 578 | 7.544349660000000,I2C,0x1D,0xFB + ACK 579 | 7.544375920000000,I2C,0x1D,0xFA + ACK 580 | 7.544402200000000,I2C,0x1D,0x0E + ACK 581 | 7.544428460000000,I2C,0x1D,0xFB + ACK 582 | 7.544454720000000,I2C,0x1D,0xFA + ACK 583 | 7.544480980000000,I2C,0x1D,0x0E + ACK 584 | 7.544507240000000,I2C,0x1D,0xFB + ACK 585 | 7.544533500000000,I2C,0x1D,0xFA + ACK 586 | 7.544559500000000,I2C,0x1D,0x0E + ACK 587 | 7.544586020000000,I2C,0x1D,0xFB + ACK 588 | 7.544612280000000,I2C,0x1D,0xFA + ACK 589 | 7.544638540000000,I2C,0x1D,0x0E + ACK 590 | 7.544664800000000,I2C,0x1D,0xFB + ACK 591 | 7.544690820000000,I2C,0x1D,0xFA + ACK 592 | 7.544717080000000,I2C,0x1D,0x0E + ACK 593 | 7.544743340000000,I2C,0x1D,0xFB + ACK 594 | 7.544769600000000,I2C,0x1D,0xFA + ACK 595 | 7.544795860000000,I2C,0x1D,0x0E + ACK 596 | 7.544822120000000,I2C,0x1D,0xFB + ACK 597 | 7.544848380000000,I2C,0x1D,0xFA + ACK 598 | 7.544874640000000,I2C,0x1D,0x0E + ACK 599 | 7.544900900000000,I2C,0x1D,0xFB + ACK 600 | 7.544927420000000,I2C,0x1D,0xF9 + ACK 601 | 7.544953680000000,I2C,0x1D,0x0E + ACK 602 | 7.545992880000000,I2C,0x1D,0xFB + ACK 603 | 7.546019160000000,I2C,0x1D,0xFA + ACK 604 | 7.546045420000000,I2C,0x1D,0x0E + ACK 605 | 7.546071680000000,I2C,0x1D,0xFB + ACK 606 | 7.546097940000000,I2C,0x1D,0xFA + ACK 607 | 7.546124200000000,I2C,0x1D,0x0E + ACK 608 | 7.546150460000000,I2C,0x1D,0xFB + ACK 609 | 7.546176720000000,I2C,0x1D,0xFA + ACK 610 | 7.546202980000000,I2C,0x1D,0x0E + ACK 611 | 7.546229240000000,I2C,0x1D,0xFB + ACK 612 | 7.546255500000000,I2C,0x1D,0xFA + ACK 613 | 7.546281760000000,I2C,0x1D,0x0E + ACK 614 | 7.546308020000000,I2C,0x1D,0xFB + ACK 615 | 7.546334280000000,I2C,0x1D,0xFA + ACK 616 | 7.546360540000000,I2C,0x1D,0x0E + ACK 617 | 7.546386800000000,I2C,0x1D,0xFB + ACK 618 | 7.546413060000000,I2C,0x1D,0xFA + ACK 619 | 7.546439320000000,I2C,0x1D,0x0E + ACK 620 | 7.546465600000000,I2C,0x1D,0xFB + ACK 621 | 7.546491600000000,I2C,0x1D,0xFA + ACK 622 | 7.546518120000000,I2C,0x1D,0x0E + ACK 623 | 7.546544380000000,I2C,0x1D,0xFB + ACK 624 | 7.546570640000000,I2C,0x1D,0xFA + ACK 625 | 7.546596640000000,I2C,0x1D,0x0E + ACK 626 | 7.546622900000000,I2C,0x1D,0xFB + ACK 627 | 7.546649160000000,I2C,0x1D,0xFA + ACK 628 | 7.546675440000000,I2C,0x1D,0x0E + ACK 629 | 7.546701700000000,I2C,0x1D,0xFB + ACK 630 | 7.546727960000000,I2C,0x1D,0xFA + ACK 631 | 7.546754220000000,I2C,0x1D,0x0E + ACK 632 | 7.546780720000000,I2C,0x1D,0xFB + ACK 633 | 7.546806740000000,I2C,0x1D,0xFA + ACK 634 | 7.546833000000000,I2C,0x1D,0x0E + ACK 635 | 7.546859260000000,I2C,0x1D,0xFB + ACK 636 | 7.546885520000000,I2C,0x1D,0xFA + ACK 637 | 7.546911780000000,I2C,0x1D,0x0E + ACK 638 | 7.546938040000000,I2C,0x1D,0xFB + ACK 639 | 7.546964300000000,I2C,0x1D,0xFA + ACK 640 | 7.547984020000000,I2C,0x1D,0x0E + ACK 641 | 7.548010280000000,I2C,0x1D,0xFB + ACK 642 | 7.548036540000000,I2C,0x1D,0xFA + ACK 643 | 7.548062800000000,I2C,0x1D,0x0E + ACK 644 | 7.548089060000000,I2C,0x1D,0xFB + ACK 645 | 7.548115320000000,I2C,0x1D,0xFA + ACK 646 | 7.548141840000000,I2C,0x1D,0x0E + ACK 647 | 7.548168100000000,I2C,0x1D,0xFB + ACK 648 | 7.548194360000000,I2C,0x1D,0xFA + ACK 649 | 7.548220380000000,I2C,0x1D,0x0E + ACK 650 | 7.548246640000000,I2C,0x1D,0xFB + ACK 651 | 7.548272900000000,I2C,0x1D,0xFA + ACK 652 | 7.548299160000000,I2C,0x1D,0x0E + ACK 653 | 7.548325420000000,I2C,0x1D,0xFB + ACK 654 | 7.548351680000000,I2C,0x1D,0xFA + ACK 655 | 7.548377940000000,I2C,0x1D,0x0E + ACK 656 | 7.548404200000000,I2C,0x1D,0xFB + ACK 657 | 7.548430460000000,I2C,0x1D,0xFA + ACK 658 | 7.548456720000000,I2C,0x1D,0x0E + NAK 659 | 7.548584840000000,I2C,0x18,Setup Write to [0x18] + ACK 660 | 7.548608360000000,I2C,0x18,0x2E + ACK 661 | 7.548985460000000,I2C,0x18,Setup Read to [0x18] + ACK 662 | 7.549008960000000,I2C,0x18,0x10 + NAK 663 | 7.796059100000000,I2C,0x18,Setup Write to [0x18] + ACK 664 | 7.796082620000000,I2C,0x18,0x41 + ACK 665 | 7.796111880000000,I2C,0x18,0x82 + ACK 666 | 7.796147500000000,I2C,0x18,Setup Write to [0x18] + ACK 667 | 7.796171020000000,I2C,0x18,0x42 + ACK 668 | 7.796200280000000,I2C,0x18,0x82 + ACK 669 | 7.796235660000000,I2C,0x18,Setup Write to [0x18] + ACK 670 | 7.796259160000000,I2C,0x18,0x26 + ACK 671 | 7.796292540000000,I2C,0x18,Setup Read to [0x18] + ACK 672 | 7.796316040000000,I2C,0x18,0x00 + NAK 673 | 7.806315940000000,I2C,0x18,Setup Write to [0x18] + ACK 674 | 7.806339460000000,I2C,0x18,0x26 + ACK 675 | 7.806789300000000,I2C,0x18,Setup Read to [0x18] + ACK 676 | 7.806812820000000,I2C,0x18,0x00 + NAK 677 | 7.815973760000000,I2C,0x18,Setup Write to [0x18] + ACK 678 | 7.815997260000000,I2C,0x18,0x26 + ACK 679 | 7.816030640000000,I2C,0x18,Setup Read to [0x18] + ACK 680 | 7.816054160000000,I2C,0x18,0x00 + NAK 681 | 7.825973300000000,I2C,0x18,Setup Write to [0x18] + ACK 682 | 7.825996820000000,I2C,0x18,0x26 + ACK 683 | 7.826030180000000,I2C,0x18,Setup Read to [0x18] + ACK 684 | 7.826053700000000,I2C,0x18,0x00 + NAK 685 | 7.835972840000000,I2C,0x18,Setup Write to [0x18] + ACK 686 | 7.835996360000000,I2C,0x18,0x26 + ACK 687 | 7.836029480000000,I2C,0x18,Setup Read to [0x18] + ACK 688 | 7.836053000000000,I2C,0x18,0x00 + NAK 689 | 7.845972640000000,I2C,0x18,Setup Write to [0x18] + ACK 690 | 7.845996140000000,I2C,0x18,0x26 + ACK 691 | 7.846029280000000,I2C,0x18,Setup Read to [0x18] + ACK 692 | 7.846052780000000,I2C,0x18,0x11 + NAK 693 | 7.846087160000000,I2C,0x18,Setup Write to [0x18] + ACK 694 | 7.846110680000000,I2C,0x18,0x40 + ACK 695 | 7.846139680000000,I2C,0x18,0x0C + ACK 696 | 7.846176300000000,I2C,0x18,Setup Write to [0x18] + ACK 697 | 7.846199820000000,I2C,0x18,0x41 + ACK 698 | 7.846228840000000,I2C,0x18,0xDC + ACK 699 | 7.846264460000000,I2C,0x18,Setup Write to [0x18] + ACK 700 | 7.846287960000000,I2C,0x18,0x42 + ACK 701 | 7.846316980000000,I2C,0x18,0xDC + ACK 702 | 7.846352860000000,I2C,0x18,Setup Write to [0x18] + ACK 703 | 7.846376360000000,I2C,0x18,0x26 + ACK 704 | 7.846409240000000,I2C,0x18,Setup Read to [0x18] + ACK 705 | 7.846432760000000,I2C,0x18,0x00 + NAK 706 | 7.855972400000000,I2C,0x18,Setup Write to [0x18] + ACK 707 | 7.855995920000000,I2C,0x18,0x26 + ACK 708 | 7.856028800000000,I2C,0x18,Setup Read to [0x18] + ACK 709 | 7.856052300000000,I2C,0x18,0x11 + NAK 710 | 8.855945900000000,I2C,0x1D,Setup Write to [0x1D] + ACK 711 | 8.855969399999999,I2C,0x1D,0x00 + ACK 712 | 8.856058279999999,I2C,0x1D,Setup Read to [0x1D] + ACK 713 | 8.856081780000000,I2C,0x1D,0x20 + NAK 714 | 8.856123660000000,I2C,0x1D,Setup Write to [0x1D] + ACK 715 | 8.856147160000001,I2C,0x1D,0x81 + ACK 716 | 8.856330540000000,I2C,0x1D,Setup Read to [0x1D] + ACK 717 | 8.856354039999999,I2C,0x1D,0xFB + ACK 718 | 8.856383060000001,I2C,0x1D,0xFA + ACK 719 | 8.856409319999999,I2C,0x1D,0x0E + ACK 720 | 8.856435579999999,I2C,0x1D,0xFB + ACK 721 | 8.856461840000000,I2C,0x1D,0xFA + ACK 722 | 8.856488100000000,I2C,0x1D,0x0E + ACK 723 | 8.856514360000000,I2C,0x1D,0xFB + ACK 724 | 8.856540620000001,I2C,0x1D,0xFA + ACK 725 | 8.856566880000001,I2C,0x1D,0x0E + ACK 726 | 8.856592900000001,I2C,0x1D,0xFB + ACK 727 | 8.856619159999999,I2C,0x1D,0xFA + ACK 728 | 8.856645420000000,I2C,0x1D,0x0E + ACK 729 | 8.856671680000000,I2C,0x1D,0xFB + ACK 730 | 8.856697940000000,I2C,0x1D,0xFA + ACK 731 | 8.856724200000000,I2C,0x1D,0x0E + ACK 732 | 8.856750220000000,I2C,0x1D,0xFB + ACK 733 | 8.856776480000001,I2C,0x1D,0xFA + ACK 734 | 8.856802739999999,I2C,0x1D,0x0E + ACK 735 | 8.856828999999999,I2C,0x1D,0xFB + ACK 736 | 8.856855260000000,I2C,0x1D,0xFA + ACK 737 | 8.856881520000000,I2C,0x1D,0x0E + ACK 738 | 8.856907780000000,I2C,0x1D,0xFB + ACK 739 | 8.857015540000001,I2C,0x1D,0xFA + ACK 740 | 8.857041799999999,I2C,0x1D,0x0E + ACK 741 | 8.857067819999999,I2C,0x1D,0xFB + ACK 742 | 8.857094080000000,I2C,0x1D,0xFA + ACK 743 | 8.857120340000000,I2C,0x1D,0x0E + ACK 744 | 8.857288340000000,I2C,0x1D,0xFB + ACK 745 | 8.857314600000000,I2C,0x1D,0xF9 + ACK 746 | 8.857340860000001,I2C,0x1D,0x0E + ACK 747 | 8.857367119999999,I2C,0x1D,0xFB + ACK 748 | 8.857393139999999,I2C,0x1D,0xFA + ACK 749 | 8.857419399999999,I2C,0x1D,0x0E + ACK 750 | 8.857445660000000,I2C,0x1D,0xFB + ACK 751 | 8.857471920000000,I2C,0x1D,0xFA + ACK 752 | 8.857498180000000,I2C,0x1D,0x0E + ACK 753 | 8.857524440000001,I2C,0x1D,0xFB + ACK 754 | 8.857550700000001,I2C,0x1D,0xFA + ACK 755 | 8.857576959999999,I2C,0x1D,0x0E + ACK 756 | 8.857602979999999,I2C,0x1D,0xFB + ACK 757 | 8.857629240000000,I2C,0x1D,0xFA + ACK 758 | 8.857655500000000,I2C,0x1D,0x0E + ACK 759 | 8.857681760000000,I2C,0x1D,0xFB + ACK 760 | 8.857708020000000,I2C,0x1D,0xFA + ACK 761 | 8.857734280000001,I2C,0x1D,0x0E + ACK 762 | 8.857760539999999,I2C,0x1D,0xFB + ACK 763 | 8.857786559999999,I2C,0x1D,0xFA + ACK 764 | 8.857812819999999,I2C,0x1D,0x0E + ACK 765 | 8.857839080000000,I2C,0x1D,0xFB + ACK 766 | 8.857865340000000,I2C,0x1D,0xFA + ACK 767 | 8.857891600000000,I2C,0x1D,0x0E + ACK 768 | 8.857917860000001,I2C,0x1D,0xFB + ACK 769 | 8.858015119999999,I2C,0x1D,0xFA + ACK 770 | 8.858041380000000,I2C,0x1D,0x0E + ACK 771 | 8.858067640000000,I2C,0x1D,0xFB + ACK 772 | 8.858093900000000,I2C,0x1D,0xFA + ACK 773 | 8.858120160000000,I2C,0x1D,0x0E + ACK 774 | 8.858288659999999,I2C,0x1D,0xFB + ACK 775 | 8.858314920000000,I2C,0x1D,0xFA + ACK 776 | 8.858341180000000,I2C,0x1D,0x0E + ACK 777 | 8.858367440000000,I2C,0x1D,0xFB + ACK 778 | 8.858393700000001,I2C,0x1D,0xFA + ACK 779 | 8.858419720000001,I2C,0x1D,0x0E + ACK 780 | 8.858445980000001,I2C,0x1D,0xFB + ACK 781 | 8.858472239999999,I2C,0x1D,0xFA + ACK 782 | 8.858498500000000,I2C,0x1D,0x0E + ACK 783 | 8.858524760000000,I2C,0x1D,0xFB + ACK 784 | 8.858551020000000,I2C,0x1D,0xFA + ACK 785 | 8.858577280000000,I2C,0x1D,0x0E + ACK 786 | 8.858603560000001,I2C,0x1D,0xFB + ACK 787 | 8.858629560000001,I2C,0x1D,0xFA + ACK 788 | 8.858655819999999,I2C,0x1D,0x0E + ACK 789 | 8.858682079999999,I2C,0x1D,0xFB + ACK 790 | 8.858708340000000,I2C,0x1D,0xFA + ACK 791 | 8.858734600000000,I2C,0x1D,0x0E + ACK 792 | 8.858760860000000,I2C,0x1D,0xFB + ACK 793 | 8.858786880000000,I2C,0x1D,0xFA + ACK 794 | 8.858813140000001,I2C,0x1D,0x0E + ACK 795 | 8.858839400000001,I2C,0x1D,0xFB + ACK 796 | 8.858865659999999,I2C,0x1D,0xF9 + ACK 797 | 8.858891920000000,I2C,0x1D,0x0E + ACK 798 | 8.858918180000000,I2C,0x1D,0xFB + ACK 799 | 8.859015440000000,I2C,0x1D,0xFA + ACK 800 | 8.859041700000001,I2C,0x1D,0x0E + ACK 801 | 8.859067960000001,I2C,0x1D,0xFB + ACK 802 | 8.859094219999999,I2C,0x1D,0xFA + ACK 803 | 8.859120480000000,I2C,0x1D,0x0E + ACK 804 | 8.859288500000000,I2C,0x1D,0xFB + ACK 805 | 8.859314760000000,I2C,0x1D,0xFA + ACK 806 | 8.859340760000000,I2C,0x1D,0x0E + ACK 807 | 8.859367020000001,I2C,0x1D,0xFB + ACK 808 | 8.859393280000001,I2C,0x1D,0xFA + ACK 809 | 8.859419539999999,I2C,0x1D,0x0E + ACK 810 | 8.859445800000000,I2C,0x1D,0xFB + ACK 811 | 8.859472080000000,I2C,0x1D,0xFA + ACK 812 | 8.859498340000000,I2C,0x1D,0x0E + NAK 813 | 8.859626199999999,I2C,0x18,Setup Write to [0x18] + ACK 814 | 8.859649720000000,I2C,0x18,0x2E + ACK 815 | 8.859682579999999,I2C,0x18,Setup Read to [0x18] + ACK 816 | 8.859706100000000,I2C,0x18,0x10 + NAK 817 | 9.858909380000000,I2C,0x1D,Setup Write to [0x1D] + ACK 818 | 9.858932899999999,I2C,0x1D,0x00 + ACK 819 | 9.858966020000000,I2C,0x1D,Setup Read to [0x1D] + ACK 820 | 9.858989540000000,I2C,0x1D,0x20 + NAK 821 | 9.859031399999999,I2C,0x1D,Setup Write to [0x1D] + ACK 822 | 9.859054920000000,I2C,0x1D,0x81 + ACK 823 | 9.859087779999999,I2C,0x1D,Setup Read to [0x1D] + ACK 824 | 9.859111300000000,I2C,0x1D,0xFB + ACK 825 | 9.859140300000000,I2C,0x1D,0xFA + ACK 826 | 9.859166580000000,I2C,0x1D,0x0E + ACK 827 | 9.859192840000000,I2C,0x1D,0xFB + ACK 828 | 9.859219100000001,I2C,0x1D,0xFA + ACK 829 | 9.859245359999999,I2C,0x1D,0x0E + ACK 830 | 9.859271619999999,I2C,0x1D,0xFB + ACK 831 | 9.859297880000000,I2C,0x1D,0xFA + ACK 832 | 9.859323880000000,I2C,0x1D,0x0E + ACK 833 | 9.859350160000000,I2C,0x1D,0xFB + ACK 834 | 9.859376420000000,I2C,0x1D,0xFA + ACK 835 | 9.859402680000001,I2C,0x1D,0x0E + ACK 836 | 9.859428940000001,I2C,0x1D,0xFB + ACK 837 | 9.859455199999999,I2C,0x1D,0xFA + ACK 838 | 9.859481460000000,I2C,0x1D,0x0E + ACK 839 | 9.859507460000000,I2C,0x1D,0xFB + ACK 840 | 9.859533720000000,I2C,0x1D,0xFA + ACK 841 | 9.859560000000000,I2C,0x1D,0x0E + ACK 842 | 9.859586260000000,I2C,0x1D,0xFB + ACK 843 | 9.859612520000001,I2C,0x1D,0xFA + ACK 844 | 9.859638779999999,I2C,0x1D,0x0E + ACK 845 | 9.859665039999999,I2C,0x1D,0xFB + ACK 846 | 9.859691300000000,I2C,0x1D,0xFA + ACK 847 | 9.859717300000000,I2C,0x1D,0x0E + ACK 848 | 9.859743560000000,I2C,0x1D,0xFB + ACK 849 | 9.859769840000000,I2C,0x1D,0xFA + ACK 850 | 9.859796100000001,I2C,0x1D,0x0E + ACK 851 | 9.859822360000001,I2C,0x1D,0xFB + ACK 852 | 9.859848619999999,I2C,0x1D,0xFA + ACK 853 | 9.859874639999999,I2C,0x1D,0x0E + ACK 854 | 9.859901400000000,I2C,0x1D,0xFB + ACK 855 | 9.859927400000000,I2C,0x1D,0xF9 + ACK 856 | 9.859953680000000,I2C,0x1D,0x0E + ACK 857 | 9.859979940000001,I2C,0x1D,0xFB + ACK 858 | 9.860006200000001,I2C,0x1D,0xFA + ACK 859 | 9.860032459999999,I2C,0x1D,0x0E + ACK 860 | 9.860058720000000,I2C,0x1D,0xFB + ACK 861 | 9.860084980000000,I2C,0x1D,0xFA + ACK 862 | 9.860111240000000,I2C,0x1D,0x0E + ACK 863 | 9.860137260000000,I2C,0x1D,0xFB + ACK 864 | 9.860163520000000,I2C,0x1D,0xFA + ACK 865 | 9.860189780000001,I2C,0x1D,0x0E + ACK 866 | 9.860216039999999,I2C,0x1D,0xFB + ACK 867 | 9.860242299999999,I2C,0x1D,0xFA + ACK 868 | 9.860268560000000,I2C,0x1D,0x0E + ACK 869 | 9.860294820000000,I2C,0x1D,0xFB + ACK 870 | 9.860320820000000,I2C,0x1D,0xFA + ACK 871 | 9.860347100000000,I2C,0x1D,0x0E + ACK 872 | 9.860373360000001,I2C,0x1D,0xFB + ACK 873 | 9.860399620000001,I2C,0x1D,0xFA + ACK 874 | 9.860425879999999,I2C,0x1D,0x0E + ACK 875 | 9.860452140000000,I2C,0x1D,0xFB + ACK 876 | 9.860478400000000,I2C,0x1D,0xFA + ACK 877 | 9.860504660000000,I2C,0x1D,0x0E + ACK 878 | 9.860530660000000,I2C,0x1D,0xFB + ACK 879 | 9.860556920000001,I2C,0x1D,0xFA + ACK 880 | 9.860583200000001,I2C,0x1D,0x0E + ACK 881 | 9.860609459999999,I2C,0x1D,0xFB + ACK 882 | 9.860635719999999,I2C,0x1D,0xFA + ACK 883 | 9.860661980000000,I2C,0x1D,0x0E + ACK 884 | 9.860687980000000,I2C,0x1D,0xFB + ACK 885 | 9.860714240000000,I2C,0x1D,0xFA + ACK 886 | 9.860740500000000,I2C,0x1D,0x0E + ACK 887 | 9.860766760000001,I2C,0x1D,0xFB + ACK 888 | 9.860793040000001,I2C,0x1D,0xFA + ACK 889 | 9.860819299999999,I2C,0x1D,0x0E + ACK 890 | 9.860845560000000,I2C,0x1D,0xFB + ACK 891 | 9.860871820000000,I2C,0x1D,0xFA + ACK 892 | 9.860899320000000,I2C,0x1D,0x0E + ACK 893 | 9.860925580000000,I2C,0x1D,0xFB + ACK 894 | 9.860951840000000,I2C,0x1D,0xFA + ACK 895 | 9.860978120000000,I2C,0x1D,0x0E + ACK 896 | 9.861004380000001,I2C,0x1D,0xFB + ACK 897 | 9.861030639999999,I2C,0x1D,0xFA + ACK 898 | 9.861056639999999,I2C,0x1D,0x0E + ACK 899 | 9.861082900000000,I2C,0x1D,0xFB + ACK 900 | 9.861109160000000,I2C,0x1D,0xFA + ACK 901 | 9.861135420000000,I2C,0x1D,0x0E + ACK 902 | 9.861161680000000,I2C,0x1D,0xFB + ACK 903 | 9.861187940000001,I2C,0x1D,0xFA + ACK 904 | 9.861214220000001,I2C,0x1D,0x0E + ACK 905 | 9.861240219999999,I2C,0x1D,0xFB + ACK 906 | 9.861266479999999,I2C,0x1D,0xFA + ACK 907 | 9.861292760000000,I2C,0x1D,0x0E + ACK 908 | 9.861319000000000,I2C,0x1D,0xFB + ACK 909 | 9.861345260000000,I2C,0x1D,0xF9 + ACK 910 | 9.861371520000001,I2C,0x1D,0x0E + ACK 911 | 9.861397780000001,I2C,0x1D,0xFB + ACK 912 | 9.861424059999999,I2C,0x1D,0xFA + ACK 913 | 9.861450059999999,I2C,0x1D,0x0E + ACK 914 | 9.861476320000000,I2C,0x1D,0xFB + ACK 915 | 9.861502580000000,I2C,0x1D,0xFA + ACK 916 | 9.861528840000000,I2C,0x1D,0x0E + ACK 917 | 9.861555100000000,I2C,0x1D,0xFB + ACK 918 | 9.861581360000001,I2C,0x1D,0xFA + ACK 919 | 9.861607640000001,I2C,0x1D,0x0E + NAK 920 | 9.861735500000000,I2C,0x18,Setup Write to [0x18] + ACK 921 | 9.861759019999999,I2C,0x18,0x2E + ACK 922 | 9.861791880000000,I2C,0x18,Setup Read to [0x18] + ACK 923 | 9.861815399999999,I2C,0x18,0x10 + NAK 924 | -------------------------------------------------------------------------------- /logic-analyzer/I2C.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniebox-reverse-engineering/toniebox/31d7a42126f2024dec0ea00bca844c6d2f188ac8/logic-analyzer/I2C.xlsx -------------------------------------------------------------------------------- /logic-analyzer/Toniebox-SPI-I2C-startup.logicdata: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/toniebox-reverse-engineering/toniebox/31d7a42126f2024dec0ea00bca844c6d2f188ac8/logic-analyzer/Toniebox-SPI-I2C-startup.logicdata -------------------------------------------------------------------------------- /protocol/rtnl/CommandList.csv: -------------------------------------------------------------------------------- 1 | Command;Source;Description;Example String;Example Number;Example F9 2 | 632;BOX;Toniebox MAC;0123456789AB;; 3 | 703;SERVER;FW_1;EU_V3.0.5_BF1-0;;880c667 4 | 704;SERVER;FW_2;EU_V3.0.5_stable_branch;;880c667 5 | 623;BOX;WIFI_SSID_BSSID;WLAN_SSID[0x00]0123456789AB ;;880c667 6 | -------------------------------------------------------------------------------- /tools/cert_config.py.example: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | base_path = "/tmp/" 4 | 5 | box_client_certfile = base_path + "box_fake/client.cer" 6 | box_keyfile = base_path + "box_fake/private.key" 7 | 8 | ca_fake_pemfile = base_path + "fake/ca.pem" 9 | ca_fake_certfile = base_path + "fake/ca.cer" 10 | ca_fake_keyfile = base_path + "fake/ca.key" 11 | 12 | host_cert_dir = base_path + "fake_site_certs/hostcert/" 13 | 14 | host_fake_pemfile = host_cert_dir + "prod.de.tbs.toys.pem" 15 | host_fake_certfile = host_cert_dir + "prod.de.tbs.toys.cer" 16 | host_fake_keyfile = ca_fake_keyfile 17 | -------------------------------------------------------------------------------- /tools/firmware_info.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Format of Tonibox OFW Image: 4 | # 5 | # from -160 to -153 the git shorthash 6 | # from -152 to -140 the creation date 7 | # from -64 to EOF the SHA256 hash of the file 8 | # 9 | 10 | import hashlib 11 | import re 12 | import sys 13 | import argparse 14 | import os 15 | import fnmatch 16 | import json 17 | 18 | # some global variables 19 | # Images types 20 | TYPE_BOOTINFO = 0 21 | TYPE_BL = 1 22 | TYPE_FW = 2 23 | #IMG_TYPE = 0 24 | # boot modes 25 | MODE_NOTEST = 0 26 | MODE_TESTREADY = 1 27 | MODE_TESTING = 2 28 | BOOT_MODE = 0 29 | 30 | BOOT_MODES = ["NOTEST", "TESTREADY", "TEST" ] 31 | 32 | # 0xBEAC0005 seems to identify the file end in the mcuimgX.bin files 33 | search_pattern = bytes([0x05, 0x00, 0xac, 0xbe]) 34 | #search_pattern_bl = bytes([0x05, 0x00, 0xac, 0xbe]) 35 | 36 | def identifyFileType(data, inputfile): 37 | # first lets check if the image is of type mcubootinfo.bin 38 | file_size = os.stat(inputfile).st_size 39 | if file_size == 8: 40 | return TYPE_BOOTINFO 41 | elif data[-4:] == search_pattern: 42 | return TYPE_BL 43 | elif data[-68:-64] == search_pattern: 44 | return TYPE_FW 45 | else: 46 | raise Exception("FILE TYPE NOT SUPPORTED") 47 | return -1 48 | 49 | 50 | def doBoloParsing(data): 51 | # find the git shorthash at -96 to -89 52 | # find the date at -88 to -59 53 | return [(data[-96:-89].decode('utf-8')),(data[-88:-59].decode('utf-8'))] 54 | 55 | 56 | def doBootInfoParsing(data): 57 | result_dict = {'Slot':[],'Mode':[]} 58 | 59 | # get selected image 60 | slot = ord(data[0:1]) 61 | slotText = "mcuimg"+str(slot+1)+".bin"+" (0x0"+str(slot)+")" 62 | result_dict['Slot'].append(slotText) 63 | 64 | # ARM is little endian 65 | IMG_STATUS_TESTING = bytes([0x21, 0x43, 0x34, 0x12]) # from flc.c 0x12344321 66 | IMG_STATUS_TESTREADY = bytes([0x65, 0x87, 0x78, 0x56]) # from flc.c 0x56788765 67 | IMG_STATUS_NOTEST = bytes([0xBA, 0xDC, 0xCD, 0xAB]) # from flc.c 0xABCDDCBA 68 | 69 | mode_dict = {0 : 'NOTEST', 1 : 'TESTING', 2 : 'TESTREADY'} 70 | 71 | match_list = [IMG_STATUS_NOTEST, IMG_STATUS_TESTING, IMG_STATUS_TESTREADY] 72 | result_dict['Mode'].append(mode_dict[match_list.index(data[4:8])]) 73 | 74 | result_str = ('\n'.join("{}: {}".format(k, v) for k, v in result_dict.items())).replace("[","").replace("]","").replace("'","") 75 | return result_str 76 | 77 | 78 | def doJSONDump(data, inputfile): 79 | data = {'Filename': inputfile, 'FWInfo': findFWInfo(data), 'creationDate': findCreationDate( 80 | data), 'git shorthash': findGITHash(data), 'sha256': findHash(data), 'calculatedHash': calcHash(data)} 81 | return json.dumps(data, indent=4) 82 | 83 | 84 | def doCSVHeader(): 85 | data = "Filename" + ";" +"Filetype" + ";" + "Version1" + ";" + "Version2" + ";" + \ 86 | "Creation Date" + ";" + "git short hash" + \ 87 | ";" + "hash" + ";" + "calculated hash" + ";" + "boot mode" + ";" + "selected slot" 88 | return data 89 | 90 | 91 | def doCSVDump(data, inputfile): 92 | #if (filetype == TYPE_FW): 93 | fwInfo = findFWInfo(data) 94 | if len(fwInfo) > 0: 95 | version1 = fwInfo[0] 96 | else: 97 | version1 = "" 98 | if len(fwInfo) > 1: 99 | version2 = fwInfo[1] 100 | else: 101 | version2 = "" 102 | data = inputfile +";" + version1 + ";" + version2 + ";" + findCreationDate( 103 | data) + ";" + findGITHash(data) + ";" + findHash(data) + ";" + calcHash(data) 104 | #elif (type == TYPE_BOOTINFO): 105 | # bootinfo = doBootInfoParsing(data) 106 | # data = inputfile + ";" + type + ";" + "" + ";" + "" + ";" + "" + ";" + "" + ";" + "" + ";" + "" + ";" + bootinfo['Mode'] + ";" + bootinfo['Slot'] 107 | return data 108 | 109 | 110 | def printAllInfo(data): 111 | versions = findFWInfo(data) 112 | for i in versions: 113 | print("Firmware Version: \t"+i) 114 | print("\nCreation Date: \t\t" + findCreationDate(data)) 115 | print("\nRead SHA256: \t\t" + findHash(data)) 116 | print("Calculated SHA256: \t" + calcHash(data)) 117 | print("GIT Shorthash: \t\t" + findGITHash(data)) 118 | return 119 | 120 | 121 | def findFWInfo(data): 122 | # find version number with regular expression 123 | # search for matches of the byte patter 0500acbe 124 | # use that byte pattern as an anchor for our search 125 | # assuming the string won't get to big we are jumping backwards 126 | # and search 127 | versions = [] 128 | for iter in re.finditer(b'\x05\x00\xac\xbe', data): 129 | search = data[iter.start()-100: iter.start()] 130 | for x in re.finditer(rb'(EU_V|PD_V|US_V|UK_V).{3}(\.[0-9]).*', search): 131 | versions = x.group().decode("utf-8").split('\x00') 132 | return list(filter(None, versions)) 133 | 134 | 135 | def findCreationDate(data): 136 | # get the creation date 137 | return data[-152:-140].decode('utf-8') 138 | 139 | 140 | def findHash(data): 141 | # print out the SHA256 hash given in the binary file 142 | # the hash is located directly at the end of the file 143 | sha256 = data[-64:].decode('utf-8') 144 | return sha256 145 | 146 | 147 | def calcHash(data): 148 | # lets do a hash calculation of the raw file data by our own for comparing 149 | calcedhash = hashlib.sha256(data[:-64]).hexdigest() 150 | return calcedhash 151 | 152 | 153 | def findGITHash(data): 154 | # jump to offset -160 relativ to end of file, here we are asuming and git 155 | # shorthash can be found it is 7 digits per default so it ends 156 | # at -153 relativ to the end 157 | return data[-160:-153].decode('utf-8') 158 | 159 | 160 | def main(argv): 161 | 162 | parser = argparse.ArgumentParser() 163 | parser.add_argument("FILE", help="input file") 164 | group = parser.add_mutually_exclusive_group() 165 | dumpgroup = parser.add_mutually_exclusive_group() 166 | group.add_argument("-H", "--sha256", action="count", 167 | help="find sha256 hash stored in file", default=0) 168 | group.add_argument("-c", "--calcHash", action="count", 169 | help="calculate sha256 hash of file content", default=0) 170 | group.add_argument("-a", "--all", action="count", 171 | help="output everything (default)", default=0) 172 | group.add_argument("-g", "--git", action="count", 173 | help="output git hash from file", default=0) 174 | group.add_argument("-d", "--date", action="count", 175 | help="output creation date", default=0) 176 | group.add_argument("-V", "--version", action="count", 177 | help="output version strings from file", default=0) 178 | group.add_argument("-r", "--recursive", action="count", 179 | help="recursive extracting (in recursive mode option -all is used)", default=0) 180 | dumpgroup.add_argument("-j", "--json", action="count", 181 | help="dump output in json format", default=0) 182 | dumpgroup.add_argument("-C", "--csv", action="count", 183 | help="dump output in csv format", default=0) 184 | 185 | args = parser.parse_args() 186 | 187 | inputfile = args.FILE 188 | if not(args.recursive): 189 | with open(inputfile, "rb") as binary_file: 190 | # Read the whole file at once 191 | data = binary_file.read() 192 | # Return the hexadecimal representation of the binary data, byte instance 193 | type = identifyFileType(data, inputfile) 194 | 195 | try: 196 | if not(args.recursive) and type == TYPE_BOOTINFO: 197 | print (doBootInfoParsing(data)) 198 | elif not(args.recursive) and type == TYPE_BL: 199 | print (doBoloParsing(data)) 200 | elif args.sha256: 201 | print(findHash(data)) 202 | elif args.calcHash: 203 | print(calcHash(data)) 204 | elif args.git: 205 | print(findGITHash(data)) 206 | elif args.date: 207 | print(findCreationDate(data)) 208 | elif args.version: 209 | print(findFWInfo(data)) 210 | elif args.recursive: 211 | json_list = [] 212 | if (args.csv): 213 | print(doCSVHeader()) 214 | for root, dirnames, filenames in os.walk(inputfile): 215 | for filename in fnmatch.filter(filenames, '*.bin'): 216 | with open(os.path.join(root, filename), "rb") as binary_file: 217 | try: 218 | # Read the whole file at once 219 | data = binary_file.read() 220 | type = identifyFileType(data, os.path.join(root, filename)) 221 | if (args.json): 222 | if (type == TYPE_BOOTINFO): 223 | print ('Found bootinfo file skipped for JSON-Output: ') 224 | print( doBootInfoParsing(data) ) 225 | elif (type == TYPE_BL): 226 | print ('Found bootloader file skipped for JSON-Output: ') 227 | print (*doBoloParsing(data), sep = "\n") 228 | else: 229 | json_list.append(json.loads(doJSONDump( 230 | data, os.path.join(root, filename)))) 231 | elif (args.csv): 232 | if (type == TYPE_FW): 233 | print(doCSVDump(data, os.path.join(root, filename))) 234 | else: 235 | print('\n\nFilename: '+ os.path.join(root, filename)) 236 | if (type == TYPE_BOOTINFO): 237 | print( doBootInfoParsing(data) ) 238 | #print( ('\n'.join("{}: {}".format(k, v) for k, v in doBootInfoParsing(data).items())).replace("[","").replace("]","").replace("'","") ) 239 | elif (type == TYPE_BL): 240 | print (*doBoloParsing(data), sep = "\n") 241 | else: 242 | printAllInfo(data) 243 | except: 244 | print("File not supported: " + os.path.join(root, filename)) 245 | if (args.json): 246 | print(json.dumps(json_list, indent=4)) 247 | elif args.json: 248 | print(doJSONDump(data, inputfile)) 249 | else: 250 | printAllInfo(data) 251 | except: 252 | print("File not supported: "+ inputfile) 253 | 254 | if __name__ == "__main__": 255 | main(sys.argv[1:]) 256 | -------------------------------------------------------------------------------- /tools/magic_byte_analysis.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import argparse 4 | import binascii 5 | import os 6 | import sys 7 | from dataclasses import dataclass 8 | from datetime import date 9 | from asn1crypto.x509 import Certificate 10 | 11 | @dataclass 12 | class MagicByteInfo: 13 | magic: bytes = None 14 | clientCertDate: date = None 15 | error: str = None 16 | path: str = None 17 | 18 | def __str__(self): 19 | if self.error == None: 20 | return self.path + "\r\n" + " Magic: 0x" + binascii.hexlify(self.magic).decode('ascii') + "\r\n" + " Not Valid Until: " + self.clientCertDate.strftime('%Y-%m-%d') + "\r\n" 21 | else: 22 | return self.path + "\r\n" + " Error: " + self.error + "\r\n" 23 | 24 | def getMagic(data): 25 | # Get the magic bytes from the image 26 | magic = data[-8:-4] 27 | return magic 28 | 29 | def search(dir): 30 | magic = MagicByteInfo() 31 | 32 | PATH_CLIENT_DER = os.path.join(dir, "cert/client.der") 33 | PATH_MCUIMG_BIN = os.path.join(dir, "sys/mcuimg.bin") 34 | SIZE_MCUIMG_BIN = 20956 35 | 36 | with open(PATH_CLIENT_DER, "rb") as clientDer: 37 | data = clientDer.read() 38 | cert = Certificate.load(data) 39 | magic.clientCertDate = cert["tbs_certificate"]["validity"]["not_before"].native.date() 40 | 41 | mcuimgSize = os.stat(PATH_MCUIMG_BIN).st_size 42 | if mcuimgSize == SIZE_MCUIMG_BIN: 43 | with open(PATH_MCUIMG_BIN, "rb") as mcuimgBin: 44 | data = mcuimgBin.read() 45 | magic.magic = getMagic(data)[::-1] 46 | else: 47 | raise ValueError("mcuimg.bin has the wrong filesize - " + PATH_MCUIMG_BIN) 48 | 49 | magic.path = dir 50 | return magic 51 | 52 | def searchRecursive(dir): 53 | result_list = [] 54 | for entry in os.scandir(dir): 55 | try: 56 | if entry.is_dir(): 57 | result_list.append(search(entry.path)) 58 | except (ValueError, FileNotFoundError) as err: 59 | result_list.append(MagicByteInfo(error=str(err), path=entry.path)) 60 | 61 | 62 | return result_list 63 | 64 | 65 | 66 | 67 | def main(argv): 68 | 69 | parser = argparse.ArgumentParser() 70 | parser.add_argument("DIR", help="Base search directoy") 71 | group = parser.add_mutually_exclusive_group() 72 | dumpgroup = parser.add_mutually_exclusive_group() 73 | group.add_argument("-r", "--recursive", action="count", help="recursive search in subdirs", default=0) 74 | dumpgroup.add_argument("-C", "--csv", action="count", help="dump output in csv format", default=0) 75 | args = parser.parse_args() 76 | 77 | result_list = [] 78 | 79 | if not(args.recursive): 80 | result = search(args.DIR) 81 | result_list.append(result) 82 | else: 83 | result_list = searchRecursive(args.DIR) 84 | 85 | if (args.csv): 86 | print("Cert not valid until;Magic Bytes;Path") 87 | for result in result_list: 88 | if (args.csv): 89 | if result.error == None: 90 | print(result.clientCertDate.strftime('%Y-%m-%d') + ";" + "0x" + binascii.hexlify(result.magic).decode('ascii') + ";" + result.path) 91 | else: 92 | print(result) 93 | 94 | if __name__ == "__main__": 95 | main(sys.argv[1:]) 96 | -------------------------------------------------------------------------------- /tools/rtnl_decoder.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | message RTNL_PROTOCOL_A { 4 | fixed64 f1 = 1 5 | variant request_counter = 2 6 | variant flag_payload = 3 //1 -> payload_string, 3 -> payload_number, 4 -> both payloads 7 | variant f4 = 4 8 | variant command_id = 5 9 | string payload_string = 6 10 | variant payload_number = 7 11 | fixed32 firmware_id = 8 //unix_timestamp 12 | string f9 = 9 13 | } 14 | message RTNL_PROTOCOL_B { 15 | fixed32 f1 = 1 //current unix_timestamp 16 | int32 f2 = 2 //fixed? 17 | } -------------------------------------------------------------------------------- /tools/rtnl_decoder.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from dataclasses import dataclass 4 | import logging 5 | 6 | import argparse 7 | from pathlib import Path 8 | 9 | import struct 10 | 11 | logging.basicConfig(level=logging.DEBUG) 12 | 13 | FILE_MAGIC = bytearray([0x0D, 0x0A]) 14 | BLOCK_MAGIC_END = bytearray([0x45 ,0x38 ,0x1D ,0xE9 ,0x5D]) 15 | 16 | parser = argparse.ArgumentParser() 17 | parser.add_argument("file_path", type=Path, help="Path to raw toniebox protobuf log") 18 | parser.add_argument("--output", dest="output_type", default="print", help="default=print, csv") 19 | 20 | p = parser.parse_args() 21 | log_file = p.file_path 22 | logging.info("Decoding Toniebox bytestream...") 23 | 24 | logging.info("Opening file %s", log_file) 25 | 26 | with open(log_file, mode='rb') as file: 27 | data = file.read() 28 | 29 | if not data.startswith(FILE_MAGIC): 30 | logging.error("Magic bytes not found...") 31 | exit(1) 32 | 33 | cursor = len(FILE_MAGIC) 34 | 35 | @dataclass 36 | class Data_Block: 37 | start: int 38 | end: int 39 | data_raw: bytearray 40 | 41 | def __hexify(self, byteblock): 42 | return " ".join(["{:02x}".format(x) for x in byteblock]) 43 | 44 | def __as_hex(self, integer): 45 | return "0x%0.2x" % integer 46 | 47 | def __repr__(self): 48 | return "Data Block\n\tstart: %s\n\tend: %s\n\tdata_raw: %s\n\tdecode: %s" \ 49 | % (self.__as_hex(self.start), self.__as_hex(self.end), self.__hexify(self.data_raw), self.decode_protobuf("print")) 50 | 51 | def decode_protobuf(self, return_type=""): 52 | data = self.data_raw 53 | cursor = 0 54 | 55 | if return_type == "print": 56 | result = "" 57 | else: 58 | result = {} 59 | 60 | while cursor < len(data)-1: 61 | field_id = data[cursor]>>3 62 | field_type = data[cursor]&0b00000111 63 | cursor += 1 64 | 65 | if cursor == 1 and field_type == 2 and data[cursor] == len(data)-2: #skip encapsuling string 66 | cursor += 1 67 | continue 68 | 69 | start = cursor 70 | if field_type == 0: 71 | type_name = "Variant" 72 | content, cursor = self.__parse_variant(data, cursor) 73 | elif field_type == 1: 74 | type_name = "Fixed64" 75 | content, cursor = self.__parse_fixed64(data, cursor) 76 | elif field_type == 2: 77 | type_name = "String" 78 | content, cursor = self.__parse_string(data, cursor) 79 | elif field_type == 5: 80 | type_name = "Fixed32" 81 | content, cursor = self.__parse_fixed32(data, cursor) 82 | else: 83 | type_name = "Unknown" 84 | logging.error("Unknown field_type %i" % (field_type)) 85 | end = cursor 86 | 87 | if return_type == "print": 88 | result += f"\n\t\t{field_id}({type_name}):\t{content}" 89 | else: 90 | if f"{field_id}" in result: 91 | logging.warn(f"Field {field_id} declared multiple times") 92 | result[f"{field_id}"] = {"field_id": field_id, "field_type": field_type, "type_name": type_name, "content": content, "raw": self.__hexify(data[start:end])} 93 | 94 | return result 95 | 96 | def generate_csv(self): 97 | result = self.decode_protobuf() 98 | csv = "" 99 | for i in range(1, 10): 100 | if f"{i}" in result: 101 | csv = csv + str(result[f"{i}"]["content"]).replace("\n", "\\n").replace("\r", "\\r").replace("\"", "") + ";" + result[f"{i}"]["raw"] + ";" 102 | else: 103 | csv = csv + ";;" 104 | return csv 105 | 106 | def __set_bit(self, value, bit): 107 | return value | (1<> bit 113 | 114 | def __parse_variant(self, data, cursor): 115 | number = 0 116 | length = 0 117 | while True: 118 | for i in range(7): 119 | if self.__get_bit(data[cursor+length], i): 120 | number = number + (self.__set_bit(0, i+7*length)) 121 | if not self.__get_bit(data[cursor+length], 7) or length == 7: 122 | break 123 | length +=1 124 | 125 | length +=1 126 | return (number, cursor+length) 127 | 128 | def __parse_fixed8(self, data, cursor): 129 | return (int(data[cursor]), cursor+1) 130 | def __parse_fixed16(self, data, cursor): 131 | return (struct.unpack('