aboutsummaryrefslogtreecommitdiff
path: root/i2c/sw/trng_extractor_i2c.c
diff options
context:
space:
mode:
authorPaul Selkirk <paul@psgd.org>2015-04-08 16:01:31 -0400
committerPaul Selkirk <paul@psgd.org>2015-04-08 16:03:15 -0400
commitaeaf94f4e83826fe56f38fc670973a60a5010ef1 (patch)
tree6f3d3ba5d0caf5be29f2a4f873a97b8070d6adc9 /i2c/sw/trng_extractor_i2c.c
parent891a24d969181f02762c031b9cfe0fd96c116634 (diff)
Unify and refactor eim and i2c software.
Unify memory maps. Move tc_init, tc_next, tc_wait_* into tc_[eim|i2c].c. Move eim_setup into tc_eim.c, move i2c_open into tc_i2c.c.
Diffstat (limited to 'i2c/sw/trng_extractor_i2c.c')
-rw-r--r--i2c/sw/trng_extractor_i2c.c64
1 files changed, 27 insertions, 37 deletions
diff --git a/i2c/sw/trng_extractor_i2c.c b/i2c/sw/trng_extractor_i2c.c
index 7b5b3b2..7b3c2ef 100644
--- a/i2c/sw/trng_extractor_i2c.c
+++ b/i2c/sw/trng_extractor_i2c.c
@@ -44,7 +44,7 @@
#include "cryptech_memory_map.h"
char *usage =
-"%s [-a|r|c] [-n #] [-o file] [-I I2C_device] [-A I2C_addr]\n\
+"%s [-a|r|c] [-n #] [-o file]\n\
\n\
-a avalanche entropy\n\
-r rosc entropy\n\
@@ -58,10 +58,18 @@ int debug = 0; /* for dump() */
/* extract one data sample */
static int extract(off_t status_addr, off_t data_addr, uint32_t *data)
{
+/* In theory, we should wait for "valid" before reading random
+ * data, but as long as this is running over I2C we're going to be so
+ * slow that there's no point, and checking would just make us slower.
+ */
+#define WAIT_FOR_TRNG_VALID 0
+
+#if WAIT_FOR_TRNG_VALID
if (tc_wait(status_addr, ENTROPY1_STATUS_VALID, NULL) != 0) {
fprintf(stderr, "tc_wait failed\n");
return 1;
}
+#endif
if (tc_read(data_addr, (uint8_t *)data, 4) != 0) {
fprintf(stderr, "tc_read failed\n");
@@ -81,11 +89,9 @@ int main(int argc, char *argv[])
off_t data_addr = CSPRNG_ADDR_RANDOM;
FILE *output = stdout;
uint32_t data;
- char *dev = I2C_dev;
- int addr = I2C_addr;
/* parse command line */
- while ((opt = getopt(argc, argv, "h?arcn:o:I:A:")) != -1) {
+ while ((opt = getopt(argc, argv, "h?arcn:o:")) != -1) {
switch (opt) {
case 'h':
case '?':
@@ -104,23 +110,23 @@ int main(int argc, char *argv[])
data_addr = CSPRNG_ADDR_RANDOM;
break;
case 'n':
- num_words = strtoul(optarg, &endptr, 10);
- switch (toupper(*endptr)) {
- case '\0':
- break;
- case 'K':
- num_words *= 1000;
- break;
- case 'M':
- num_words *= 1000000;
- break;
- case 'G':
- num_words *= 1000000000;
- break;
- default:
- fprintf(stderr, "unsupported -n suffix %s\n", endptr);
- return EXIT_FAILURE;
- }
+ num_words = strtoul(optarg, &endptr, 10);
+ switch (toupper(*endptr)) {
+ case '\0':
+ break;
+ case 'K':
+ num_words *= 1000;
+ break;
+ case 'M':
+ num_words *= 1000000;
+ break;
+ case 'G':
+ num_words *= 1000000000;
+ break;
+ default:
+ fprintf(stderr, "unsupported -n suffix %s\n", endptr);
+ return EXIT_FAILURE;
+ }
break;
case 'o':
output = fopen(optarg, "wb+");
@@ -130,16 +136,6 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
break;
- case 'I':
- dev = optarg;
- break;
- case 'A':
- addr = (int)strtol(optarg, NULL, 0);
- if ((addr < 0x03) || (addr > 0x77)) {
- fprintf(stderr, "addr must be between 0x03 and 0x77\n");
- return 1;
- }
- break;
default:
errout:
fprintf(stderr, usage, argv[0]);
@@ -157,12 +153,6 @@ int main(int argc, char *argv[])
goto errout;
}
- /* set up I2C */
- if (i2c_open(dev, addr) != 0) {
- fprintf(stderr, "I2C setup failed\n");
- return EXIT_FAILURE;
- }
-
/* get the data */
for (i = 0; i < num_words; ++i) {
if (extract(status_addr, data_addr, &data) != 0)