From b1eb8876568d0fa7a9882220b2bbf44448edbe89 Mon Sep 17 00:00:00 2001 From: Mickey Malone Date: Tue, 9 Feb 2021 07:05:45 -0600 Subject: [PATCH] Work in progress, updated test tool to only read and prototyped firmware to continuously write to the TX buffer. Firmware still needs work, this was only done to understand how the pico usb core works. --- firmware/pico_rng.c | 38 ++++++++++++++++++++-- firmware/pico_rng_test.py | 68 ++++++++++++++++++--------------------- 2 files changed, 66 insertions(+), 40 deletions(-) diff --git a/firmware/pico_rng.c b/firmware/pico_rng.c index 8d00884..bf68bd7 100644 --- a/firmware/pico_rng.c +++ b/firmware/pico_rng.c @@ -578,10 +578,38 @@ void ep1_out_handler(uint8_t *buf, uint16_t len) { usb_start_transfer(ep, (char*)new_buf, size); } +void get_random_data(char *buffer, uint16_t len) { + uint16_t adc_result; + uint8_t size; + int i; + + gpio_put(25, 1); + + if(len > 64) + { + //TODO handle length error + size = 64; + } + + memset(buffer, 0, len); + for(i = 1; i <= len; i=i+1) + { + adc_result = adc_read(); + memcpy(&buffer[i-1], (void*)&adc_result, 2); + } + + gpio_put(25, 0); +} + void ep2_in_handler(uint8_t *buf, uint16_t len) { printf("Sent %d bytes to host\n", len); // Get ready to rx again from host - usb_start_transfer(usb_get_endpoint_configuration(EP1_OUT_ADDR), NULL, 64); + + char buffer[64]; + get_random_data(buffer, 64); + //usb_start_transfer(usb_get_endpoint_configuration(EP1_OUT_ADDR), NULL, 64); + struct usb_endpoint_configuration *ep = usb_get_endpoint_configuration(EP2_IN_ADDR); + usb_start_transfer(ep, buffer, 64); } int main(void) { @@ -604,8 +632,12 @@ int main(void) { tight_loop_contents(); } - // Get ready to rx from host - usb_start_transfer(usb_get_endpoint_configuration(EP1_OUT_ADDR), NULL, 64); + char buffer[64]; + + // Get ready to tx + get_random_data(buffer, 64); + usb_start_transfer(usb_get_endpoint_configuration(EP2_IN_ADDR), buffer, 64); + //usb_start_transfer(usb_get_endpoint_configuration(EP1_OUT_ADDR), NULL, 64); // Everything is interrupt driven so just loop here while (1) { diff --git a/firmware/pico_rng_test.py b/firmware/pico_rng_test.py index 95d5942..0e17f69 100755 --- a/firmware/pico_rng_test.py +++ b/firmware/pico_rng_test.py @@ -1,50 +1,44 @@ #!/usr/bin/env python3 -# -# Copyright (c) 2020 Raspberry Pi (Trading) Ltd. -# -# SPDX-License-Identifier: BSD-3-Clause -# - -# sudo pip3 install pyusb - import usb.core import usb.util import random +import time +import argparse -# find our device -dev = usb.core.find(idVendor=0x0000, idProduct=0x0004) +# Parser stuff +parser = argparse.ArgumentParser(description="Raspberry Pi Pico Random Number Generator Test Tool") +parser.add_argument("--performance", action="store_true", help="Performance test the RNG.") +args = parser.parse_args() -# was it found? -if dev is None: - raise ValueError('Device not found') +# Get the device +rng = usb.core.find(idVendor=0x0000, idProduct=0x0004) +assert rng is not None -# get an endpoint instance -cfg = dev.get_active_configuration() -intf = cfg[(0, 0)] +# Get the configuration of the device +cfg = rng.get_active_configuration() -outep = usb.util.find_descriptor( - intf, - # match the first OUT endpoint - custom_match= \ - lambda e: \ - usb.util.endpoint_direction(e.bEndpointAddress) == \ - usb.util.ENDPOINT_OUT) +# Get the only interface of our device +intf = cfg.interfaces()[0] -inep = usb.util.find_descriptor( - intf, - # match the first IN endpoint - custom_match= \ - lambda e: \ - usb.util.endpoint_direction(e.bEndpointAddress) == \ - usb.util.ENDPOINT_IN) +# Get the endpoints +endpts = intf.endpoints() -assert inep is not None -assert outep is not None +# Get the IN or Host RCV Device TX endpoint +endpts_in = endpts[0] if endpts[0].bEndpointAddress == usb.util.ENDPOINT_IN else endpts[1] -num_bytes = random.randint(1,64) +# Time tracking for bits/s +count = 0 +start_time = (int(time.time()) - 1) -outep.write([num_bytes], 500) -from_device = inep.read(num_bytes, 500) - -print(":".join("{:02x}".format(b) for b in from_device)) +if args.performance: + while True: + try: + from_device = endpts_in.read(endpts_in.wMaxPacketSize, 500) + count = count+1 + print(":".join("{:02x}".format(b) for b in from_device), end="") + print(" KBps {0:.2f}".format((int((count * 64) / (int(time.time()) - start_time))) / 1024 )) + except KeyboardInterrupt: + exit(0) +else: + print(":".join("{:02x}".format(b) for b in endpts_in.read(endpts_in.wMaxPacketSize, 500)))