1.1 --- a/test.c Wed Feb 13 00:29:18 2013 +0000
1.2 +++ b/test.c Sun Feb 17 00:45:43 2013 +0000
1.3 @@ -18,6 +18,7 @@
1.4 #include <signal.h>
1.5 #include <stdlib.h>
1.6 #include <usb.h>
1.7 +#include <unistd.h>
1.8
1.9 /* Found in Python's asdl.h. */
1.10
1.11 @@ -25,6 +26,16 @@
1.12 typedef enum {false, true} bool;
1.13 #endif
1.14
1.15 +/* Initialisation states. */
1.16 +
1.17 +typedef enum
1.18 +{
1.19 + MAX_DEVSTATE_INIT = 0,
1.20 + MAX_DEVSTATE_CONNECTED = 1,
1.21 + MAX_DEVSTATE_RESET = 2,
1.22 + MAX_DEVSTATE_READY = 3
1.23 +} max_devstate;
1.24 +
1.25 /* Pin assignments:
1.26 *
1.27 * Sniffer UBB Shield
1.28 @@ -96,7 +107,9 @@
1.29 #define MAX_HIRQ_FRAMEIRQ 64
1.30 #define MAX_HIRQ_HXFRDNIRQ 128
1.31
1.32 +#define MAX_HIEN_BUSEVENTIE 1
1.33 #define MAX_HIEN_CONDETIE 32
1.34 +#define MAX_HIEN_FRAMEIE 64
1.35
1.36 #define MAX_MODE_PERIPHERAL 0
1.37 #define MAX_MODE_HOST 1
1.38 @@ -111,6 +124,7 @@
1.39 #define MAX_MODE_HOST_FULLSPEED MAX_MODE_HOST_ENABLED
1.40 #define MAX_MODE_HOST_LOWSPEED MAX_MODE_HOST_ENABLED | MAX_MODE_LOWSPEED
1.41
1.42 +#define MAX_HCTL_BUSRST 1
1.43 #define MAX_HCTL_SAMPLEBUS 4
1.44 #define MAX_HCTL_RCVTOG0 16
1.45 #define MAX_HCTL_RCVTOG1 32
1.46 @@ -216,11 +230,12 @@
1.47 /**
1.48 * Return whether data can be sent.
1.49 */
1.50 -bool max_can_send()
1.51 +bool max_can_send(uint8_t *status)
1.52 {
1.53 - uint8_t status = max_read(MAX_REG_HIRQ, NULL);
1.54 -
1.55 - return !(status & MAX_HIRQ_SNDBAVIRQ);
1.56 + if (status == NULL)
1.57 + return max_read(MAX_REG_HIRQ, NULL) & MAX_HIRQ_SNDBAVIRQ;
1.58 + else
1.59 + return *status & MAX_HIRQ_SNDBAVIRQ;
1.60 }
1.61
1.62 /**
1.63 @@ -316,6 +331,7 @@
1.64 {
1.65 uint8_t status, hrsl = 0;
1.66
1.67 + printf("Writing FIFO with setup...\n");
1.68 max_write_fifo(0, setup, 8);
1.69
1.70 /* Set the address. */
1.71 @@ -326,11 +342,14 @@
1.72
1.73 do
1.74 {
1.75 + printf("Initiating transfer...\n");
1.76 status = max_write(MAX_REG_HXFR, MAX_HXFR_SETUP);
1.77 status = max_wait_transfer(status);
1.78 hrsl = max_read(MAX_REG_HRSL, &status);
1.79 + printf("HRSL = %x\n", hrsl);
1.80 + sleep(1);
1.81 }
1.82 - while ((hrsl & MAX_HRSL_HRSLT) != 0);
1.83 + while (hrsl & MAX_HRSL_HRSLT);
1.84
1.85 return status;
1.86 }
1.87 @@ -367,7 +386,7 @@
1.88
1.89 hrsl = max_read(MAX_REG_HRSL, &status);
1.90 }
1.91 - while ((hrsl & MAX_HRSL_HRSLT) != 0);
1.92 + while (hrsl & MAX_HRSL_HRSLT);
1.93
1.94 if (endpoint)
1.95 *toggle = max_get_send_toggle();
1.96 @@ -407,7 +426,7 @@
1.97
1.98 hrsl = max_read(MAX_REG_HRSL, &status);
1.99 }
1.100 - while ((hrsl & MAX_HRSL_HRSLT) != 0);
1.101 + while (hrsl & MAX_HRSL_HRSLT);
1.102
1.103 do
1.104 {
1.105 @@ -515,6 +534,9 @@
1.106 max_write(MAX_REG_MODE, MAX_MODE_HOST_FULLSPEED);
1.107 }
1.108
1.109 + /* Reset the device. */
1.110 +
1.111 + max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST);
1.112 return true;
1.113 }
1.114
1.115 @@ -533,6 +555,39 @@
1.116 setup[7] = length >> 8;
1.117 }
1.118
1.119 +bool max_init_device(bool *in_toggle)
1.120 +{
1.121 + uint8_t data[64], len = 64, setup[8];
1.122 + struct usb_device_descriptor *desc;
1.123 +
1.124 + printf("Sending control request to address 0, endpoint 0...\n");
1.125 + setup_packet(setup, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, USB_DT_DEVICE, 0, USB_DT_DEVICE_SIZE);
1.126 + max_control(0, setup);
1.127 + max_recv(0, 0, data, &len, in_toggle);
1.128 +
1.129 + if (len >= sizeof(struct usb_device_descriptor))
1.130 + {
1.131 + desc = (struct usb_device_descriptor *) data;
1.132 + printf("bLength: %d\n", desc->bLength);
1.133 + printf("bDescriptorType: %d\n", desc->bDescriptorType);
1.134 + printf("bcdUSB: %d\n", desc->bcdUSB);
1.135 + printf("bDeviceClass: %d\n", desc->bDeviceClass);
1.136 + printf("bDeviceSubClass: %d\n", desc->bDeviceSubClass);
1.137 + printf("bDeviceProtocol: %d\n", desc->bDeviceProtocol);
1.138 + printf("bMaxPacketSize0: %d\n", desc->bMaxPacketSize0);
1.139 + printf("idVendor: %x\n", desc->idVendor);
1.140 + printf("idProduct: %x\n", desc->idProduct);
1.141 + printf("bcdDevice: %d\n", desc->bcdDevice);
1.142 + printf("iManufacturer: %d\n", desc->iManufacturer);
1.143 + printf("iProduct: %d\n", desc->iProduct);
1.144 + printf("iSerialNumber: %d\n", desc->iSerialNumber);
1.145 + printf("bNumConfigurations: %d\n", desc->bNumConfigurations);
1.146 + return true;
1.147 + }
1.148 +
1.149 + return false;
1.150 +}
1.151 +
1.152 void shutdown(int signum)
1.153 {
1.154 printf("Closing...\n");
1.155 @@ -545,7 +600,7 @@
1.156 uint8_t status = 0, revision = 0;
1.157 uint16_t count;
1.158 bool in_toggle = 0;
1.159 - uint8_t data[64], len = 64, setup[8];
1.160 + max_devstate devstate = MAX_DEVSTATE_INIT;
1.161
1.162 signal(SIGINT, &shutdown);
1.163
1.164 @@ -595,8 +650,8 @@
1.165 printf("Setting INT signalling...\n");
1.166 status = max_write(MAX_REG_CPUCTL, MAX_CPUCTL_IE);
1.167
1.168 - printf("Setting connection signalling...\n");
1.169 - status = max_write(MAX_REG_HIEN, MAX_HIEN_CONDETIE);
1.170 + printf("Setting event signalling...\n");
1.171 + status = max_write(MAX_REG_HIEN, MAX_HIEN_CONDETIE | MAX_HIEN_FRAMEIE | MAX_HIEN_BUSEVENTIE);
1.172
1.173 /* Check various registers. */
1.174
1.175 @@ -620,19 +675,41 @@
1.176 {
1.177 status = max_read(MAX_REG_HIRQ, NULL);
1.178
1.179 - if ((status & MAX_HIRQ_CONDETIRQ) && devicechanged() && max_can_send())
1.180 + if (status & MAX_HIRQ_BUSEVENTIRQ)
1.181 + printf("Bus ");
1.182 + if (status & MAX_HIRQ_RCVDAVIRQ)
1.183 + printf("Data ");
1.184 + if (status & MAX_HIRQ_SUSDNIRQ)
1.185 + printf("Suspended ");
1.186 + if (status & MAX_HIRQ_CONDETIRQ)
1.187 + printf("Connection ");
1.188 + if (status & MAX_HIRQ_FRAMEIRQ)
1.189 + printf("Frame ");
1.190 + printf("\n");
1.191 +
1.192 + /* Detect device connection/disconnection. */
1.193 +
1.194 + if ((devstate == MAX_DEVSTATE_INIT) && (status & MAX_HIRQ_CONDETIRQ) && devicechanged())
1.195 {
1.196 - printf("Sending control request to address 0, endpoint 0...\n");
1.197 - setup_packet(setup, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR, USB_DT_DEVICE, 0, USB_DT_DEVICE_SIZE);
1.198 - max_control(0, setup);
1.199 - max_recv(0, 0, data, &len, &in_toggle);
1.200 + devstate = MAX_DEVSTATE_CONNECTED;
1.201 }
1.202 - if (status & MAX_HIRQ_SUSDNIRQ)
1.203 - printf("Suspend done.\n");
1.204 - if (status & MAX_HIRQ_BUSEVENTIRQ)
1.205 - printf("Bus event.\n");
1.206 - if (status & MAX_HIRQ_RCVDAVIRQ)
1.207 - printf("Data received.\n");
1.208 +
1.209 + /* Handle device reset initiation. */
1.210 +
1.211 + else if ((devstate == MAX_DEVSTATE_CONNECTED) && (status & MAX_HIRQ_BUSEVENTIRQ))
1.212 + {
1.213 + status = max_write(MAX_REG_MODE, max_read(MAX_REG_MODE, NULL) | MAX_MODE_SOFKAENAB);
1.214 + devstate = MAX_DEVSTATE_RESET;
1.215 + }
1.216 +
1.217 + /* Handle device reset completion, initiating communications. */
1.218 +
1.219 + else if ((devstate == MAX_DEVSTATE_RESET) && (status & MAX_HIRQ_FRAMEIRQ) && max_can_send(&status))
1.220 + {
1.221 + max_init_device(&in_toggle);
1.222 + devstate = MAX_DEVSTATE_READY;
1.223 + status = max_write(MAX_REG_HIEN, MAX_HIEN_CONDETIE | MAX_HIEN_BUSEVENTIE);
1.224 + }
1.225
1.226 max_write(MAX_REG_HIRQ, status);
1.227 }