1.1 --- a/test.c Fri Feb 08 22:50:08 2013 +0000
1.2 +++ b/test.c Sat Feb 09 00:05:25 2013 +0000
1.3 @@ -16,6 +16,7 @@
1.4 #include <ubb/ubb.h>
1.5 #include <stdio.h>
1.6 #include <time.h>
1.7 +#include <unistd.h>
1.8
1.9 /* Pin assignments:
1.10 *
1.11 @@ -44,12 +45,16 @@
1.12 #define MAX_REG_READ 0x00
1.13 #define MAX_REG_WRITE 0x02
1.14
1.15 +#define MAX_REG_USBIRQ 13
1.16 #define MAX_REG_USBCTL 15
1.17 #define MAX_REG_PINCTL 17
1.18 #define MAX_REG_REVISION 18
1.19 +#define MAX_REG_HIRQ 25
1.20 #define MAX_REG_MODE 27
1.21 #define MAX_REG_HRSL 31
1.22
1.23 +#define MAX_USBIRQ_OSCOKIRQ 1
1.24 +
1.25 #define MAX_USBCTL_PWRDOWN 16
1.26 #define MAX_USBCTL_CHIPRES 32
1.27
1.28 @@ -60,6 +65,8 @@
1.29 #define MAX_PINCTL_FDUPSPI_HALF 0
1.30 #define MAX_PINCTL_FDUPSPI_FULL 16
1.31
1.32 +#define MAX_HIRQ_BUSEVENTIRQ 1
1.33 +
1.34 #define MAX_MODE_PERIPHERAL 0
1.35 #define MAX_MODE_HOST 1
1.36 #define MAX_MODE_SEPIRQ_OFF 0
1.37 @@ -196,6 +203,51 @@
1.38 return result;
1.39 }
1.40
1.41 +void chipreset()
1.42 +{
1.43 + printf("Resetting...\n");
1.44 + spi_begin();
1.45 + spi_sendrecv(max_reg_write(MAX_REG_USBCTL));
1.46 + spi_sendrecv(MAX_USBCTL_CHIPRES);
1.47 + spi_end();
1.48 +
1.49 + printf("Clearing the reset...\n");
1.50 + spi_begin();
1.51 + spi_sendrecv(max_reg_write(MAX_REG_USBCTL));
1.52 + spi_sendrecv(0);
1.53 + spi_end();
1.54 +}
1.55 +
1.56 +uint8_t wait()
1.57 +{
1.58 + uint8_t status = 0, oscillator = 0;
1.59 +
1.60 + /* Wait for the oscillator before performing USB activity. */
1.61 +
1.62 + printf("Waiting...\n");
1.63 +
1.64 + while (!oscillator)
1.65 + {
1.66 + spi_begin();
1.67 + spi_send(max_reg_read(MAX_REG_USBIRQ));
1.68 + oscillator = spi_recv();
1.69 + spi_end();
1.70 +
1.71 + oscillator = oscillator & MAX_USBIRQ_OSCOKIRQ;
1.72 + if (!oscillator)
1.73 + usleep(3000); /* 3ms */
1.74 + }
1.75 +
1.76 + return status;
1.77 +}
1.78 +
1.79 +void reset()
1.80 +{
1.81 + SET(MAX_RESET);
1.82 + nanosleep(&tRESET, NULL);
1.83 + CLR(MAX_RESET);
1.84 +}
1.85 +
1.86 int main(int argc, char *argv[])
1.87 {
1.88 uint8_t status = 0, revision = 0, hrsl = 0;
1.89 @@ -225,6 +277,9 @@
1.90
1.91 /* Initialise the MAX3421E. */
1.92
1.93 + reset();
1.94 + wait();
1.95 +
1.96 /* Set full-duplex, interrupt signalling. */
1.97
1.98 printf("Setting pin control...\n");
1.99 @@ -234,22 +289,6 @@
1.100 spi_end();
1.101 printf("INT set to %d\n", PIN(MAX_INT));
1.102
1.103 - SET(MAX_RESET);
1.104 - nanosleep(&tRESET, NULL);
1.105 - CLR(MAX_RESET);
1.106 -
1.107 - printf("Resetting...\n");
1.108 - spi_begin();
1.109 - spi_sendrecv(max_reg_write(MAX_REG_USBCTL));
1.110 - spi_sendrecv(MAX_USBCTL_CHIPRES);
1.111 - spi_end();
1.112 -
1.113 - printf("Clearing the reset...\n");
1.114 - spi_begin();
1.115 - spi_sendrecv(max_reg_write(MAX_REG_USBCTL));
1.116 - spi_sendrecv(0);
1.117 - spi_end();
1.118 -
1.119 /* Set host mode. */
1.120
1.121 printf("Setting mode...\n");
1.122 @@ -270,6 +309,18 @@
1.123 printf("Revision = %x\n", revision);
1.124 printf("INT set to %d\n", PIN(MAX_INT));
1.125
1.126 + /* Detect bus event. */
1.127 +
1.128 + if (status & MAX_HIRQ_BUSEVENTIRQ)
1.129 + {
1.130 + printf("Clearing BUSEVENTIRQ...\n");
1.131 + spi_begin();
1.132 + status = spi_sendrecv(max_reg(MAX_REG_HIRQ));
1.133 + spi_sendrecv(MAX_HIRQ_BUSEVENTIRQ);
1.134 + spi_end();
1.135 + printf("Status = %x\n", status);
1.136 + }
1.137 +
1.138 printf("HRSL...\n");
1.139 spi_begin();
1.140 status = spi_sendrecv(max_reg_read(MAX_REG_HRSL));