|
76 | 76 | #define TPM2_I2C_DEV "/dev/i2c-1" |
77 | 77 | #define TPM2_I2C_HZ 400000 /* 400kHz */ |
78 | 78 | static int i2cOpenFailed = 0; |
| 79 | + static int i2cDevFd = -1; |
79 | 80 | #else |
80 | 81 | /* SPI */ |
81 | 82 | #ifndef TPM2_SPI_DEV_CS |
|
112 | 113 | #define TPM2_SPI_DEV TPM2_SPI_DEV_PATH TPM2_SPI_DEV_CS |
113 | 114 | static int spiOpenFailed = 0; |
114 | 115 | #endif |
| 116 | + static int spiDevFd = -1; |
115 | 117 | #endif |
116 | 118 | #endif |
117 | 119 |
|
|
195 | 197 | word16 size, void* userCtx) |
196 | 198 | { |
197 | 199 | int ret = TPM_RC_FAILURE; |
198 | | - int i2cDev = open(TPM2_I2C_DEV, O_RDWR); |
199 | | - if (i2cDev >= 0) { |
| 200 | + if (i2cDevFd < 0) { |
| 201 | + i2cDevFd = open(TPM2_I2C_DEV, O_RDWR | O_CLOEXEC); |
| 202 | + } |
| 203 | + if (i2cDevFd >= 0) { |
200 | 204 | if (isRead) |
201 | | - ret = i2c_read(i2cDev, addr, buf, size); |
| 205 | + ret = i2c_read(i2cDevFd, addr, buf, size); |
202 | 206 | else |
203 | | - ret = i2c_write(i2cDev, addr, buf, size); |
| 207 | + ret = i2c_write(i2cDevFd, addr, buf, size); |
204 | 208 |
|
205 | | - close(i2cDev); |
| 209 | + if (ret != TPM_RC_SUCCESS) { |
| 210 | + close(i2cDevFd); |
| 211 | + i2cDevFd = -1; |
| 212 | + } |
206 | 213 | } |
207 | 214 | else if (!i2cOpenFailed) { |
208 | 215 | i2cOpenFailed = 1; |
|
264 | 271 | word16 xferSz, void* userCtx) |
265 | 272 | { |
266 | 273 | int ret; |
267 | | - int spiDev; |
268 | 274 | #ifdef WOLFTPM_CHECK_WAIT_STATE |
269 | 275 | int timeout; |
270 | 276 | #endif |
|
274 | 280 |
|
275 | 281 | /* Note: PI has issue with 5-10Mhz on packets sized over 130 bytes */ |
276 | 282 | unsigned int maxSpeed = TPM2_SPI_HZ; |
277 | | - int mode = 0; /* Mode 0 (CPOL=0, CPHA=0) */ |
278 | 283 | int bits_per_word = 8; /* 8-bits */ |
279 | 284 |
|
280 | 285 | #ifdef WOLFTPM_AUTODETECT |
|
290 | 295 | #ifdef WOLFTPM_CHECK_WAIT_STATE |
291 | 296 | timeout = TPM_SPI_WAIT_RETRY; |
292 | 297 | #endif |
293 | | - spiDev = open(TPM2_SPI_DEV, O_RDWR); |
294 | | - if (spiDev >= 0) { |
| 298 | + if (spiDevFd < 0) { |
| 299 | + spiDevFd = open(TPM2_SPI_DEV, O_RDWR | O_CLOEXEC); |
| 300 | + if (spiDevFd >= 0) { |
| 301 | + int mode = 0; /* Mode 0 (CPOL=0, CPHA=0) */ |
| 302 | + ioctl(spiDevFd, SPI_IOC_WR_MODE, &mode); |
| 303 | + } |
| 304 | + } |
| 305 | + if (spiDevFd >= 0) { |
295 | 306 | struct spi_ioc_transfer spi; |
296 | 307 | size_t size; |
297 | 308 |
|
298 | | - ioctl(spiDev, SPI_IOC_WR_MODE, &mode); |
299 | | - ioctl(spiDev, SPI_IOC_WR_MAX_SPEED_HZ, &maxSpeed); |
300 | | - ioctl(spiDev, SPI_IOC_WR_BITS_PER_WORD, &bits_per_word); |
301 | | - |
302 | 309 | XMEMSET(&spi, 0, sizeof(spi)); |
| 310 | + spi.speed_hz = maxSpeed; |
| 311 | + spi.bits_per_word = bits_per_word; |
303 | 312 |
|
304 | 313 | #ifdef WOLFTPM_CHECK_WAIT_STATE |
305 | 314 | /* Keep CS asserted for header and flow control transfers */ |
|
309 | 318 | spi.tx_buf = (unsigned long)txBuf; |
310 | 319 | spi.rx_buf = (unsigned long)rxBuf; |
311 | 320 | spi.len = TPM_TIS_HEADER_SZ; |
312 | | - size = ioctl(spiDev, SPI_IOC_MESSAGE(1), &spi); |
| 321 | + size = ioctl(spiDevFd, SPI_IOC_MESSAGE(1), &spi); |
313 | 322 | if (size != TPM_TIS_HEADER_SZ) { |
314 | 323 | ret = TPM_RC_FAILURE; |
315 | 324 | } |
|
322 | 331 | spi.len = 1; |
323 | 332 | do { |
324 | 333 | /* Check for SPI ready */ |
325 | | - size = ioctl(spiDev, SPI_IOC_MESSAGE(1), &spi); |
| 334 | + size = ioctl(spiDevFd, SPI_IOC_MESSAGE(1), &spi); |
326 | 335 | } while ( |
327 | 336 | (size == 1) && |
328 | 337 | ((rxBuf[TPM_TIS_HEADER_SZ-1] & TPM_TIS_READY_MASK) == 0) && |
|
342 | 351 | spi.tx_buf = (unsigned long)&txBuf[TPM_TIS_HEADER_SZ]; |
343 | 352 | spi.rx_buf = (unsigned long)&rxBuf[TPM_TIS_HEADER_SZ]; |
344 | 353 | spi.len = xferSz - TPM_TIS_HEADER_SZ; |
345 | | - size = ioctl(spiDev, SPI_IOC_MESSAGE(1), &spi); |
| 354 | + size = ioctl(spiDevFd, SPI_IOC_MESSAGE(1), &spi); |
346 | 355 | if (size != (size_t)xferSz - TPM_TIS_HEADER_SZ) |
347 | 356 | ret = TPM_RC_FAILURE; |
348 | 357 | } |
|
351 | 360 | if (spi.cs_change == 1) { |
352 | 361 | spi.cs_change = 0; |
353 | 362 | spi.len = 1; |
354 | | - size = ioctl(spiDev, SPI_IOC_MESSAGE(1), &spi); |
| 363 | + size = ioctl(spiDevFd, SPI_IOC_MESSAGE(1), &spi); |
355 | 364 | (void)size; /* Ignore result */ |
356 | 365 | } |
357 | 366 | #else |
358 | 367 | /* Send Entire Message - no wait states */ |
359 | 368 | spi.tx_buf = (unsigned long)txBuf; |
360 | 369 | spi.rx_buf = (unsigned long)rxBuf; |
361 | 370 | spi.len = xferSz; |
362 | | - size = ioctl(spiDev, SPI_IOC_MESSAGE(1), &spi); |
| 371 | + size = ioctl(spiDevFd, SPI_IOC_MESSAGE(1), &spi); |
363 | 372 | if (size != (size_t)xferSz) |
364 | 373 | ret = TPM_RC_FAILURE; |
365 | 374 | #endif /* WOLFTPM_CHECK_WAIT_STATE */ |
366 | 375 |
|
367 | | - close(spiDev); |
| 376 | + if (ret != TPM_RC_SUCCESS) { |
| 377 | + close(spiDevFd); |
| 378 | + spiDevFd = -1; |
| 379 | + } |
368 | 380 | } |
369 | 381 | else { |
370 | 382 | /* Failed to open device */ |
|
398 | 410 | foundSpiDev = 1; |
399 | 411 | } |
400 | 412 | else { |
| 413 | + if (spiDevFd >= 0) { |
| 414 | + close(spiDevFd); |
| 415 | + spiDevFd = -1; |
| 416 | + } |
401 | 417 | devLen = (int)XSTRLEN(TPM2_SPI_DEV); |
402 | 418 | /* tries spidev0.[0-4] */ |
403 | 419 | if (TPM2_SPI_DEV[devLen-1] < MAX_SPI_DEV_CS) { |
|
0 commit comments