# HG changeset patch # User Paul Boddie # Date 1363194670 0 # Node ID f33f9c21ca2f6aa5f4fdb44810d2e95e2014e7fd # Parent 491e069640b5ffd664a2ad3e27757f2dcdbd7f0f Fixed the mode macros and introduced better disconnection testing. Tidied up the event handling logic. diff -r 491e069640b5 -r f33f9c21ca2f Makefile --- a/Makefile Wed Mar 13 16:13:55 2013 +0000 +++ b/Makefile Wed Mar 13 17:11:10 2013 +0000 @@ -13,7 +13,7 @@ ARCH = mipsel-openwrt-linux CC = $(ARCH)-gcc -CFLAGS = -g -Wall -fPIC -march=mips32 -I$(LIBUBB)/include # -DDEBUG=1 +CFLAGS = -g -Wall -fPIC -march=mips32 -I$(LIBUBB)/include # -DDEBUG_EVENTS=1 # -DDEBUG=1 LDFLAGS = -lubb -L$(LIBUBB) #-static #-L$(SYSLIBS) TARGET = test diff -r 491e069640b5 -r f33f9c21ca2f test.c --- a/test.c Wed Mar 13 16:13:55 2013 +0000 +++ b/test.c Wed Mar 13 17:11:10 2013 +0000 @@ -137,10 +137,10 @@ #define MAX_MODE_DMPULLDN 64 #define MAX_MODE_DPPULLDN 128 -#define MAX_MODE_HOST_ENABLED MAX_MODE_HOST | MAX_MODE_SEPIRQ_OFF | MAX_MODE_DMPULLDN | MAX_MODE_DPPULLDN -#define MAX_MODE_HOST_ACTIVE MAX_MODE_HOST_ENABLED | MAX_MODE_SOFKAENAB +#define MAX_MODE_HOST_ENABLED (MAX_MODE_HOST | MAX_MODE_SEPIRQ_OFF | MAX_MODE_DMPULLDN | MAX_MODE_DPPULLDN) +#define MAX_MODE_HOST_ACTIVE (MAX_MODE_HOST_ENABLED | MAX_MODE_SOFKAENAB) #define MAX_MODE_HOST_FULLSPEED MAX_MODE_HOST_ACTIVE -#define MAX_MODE_HOST_LOWSPEED MAX_MODE_HOST_ACTIVE | MAX_MODE_LOWSPEED +#define MAX_MODE_HOST_LOWSPEED (MAX_MODE_HOST_ACTIVE | MAX_MODE_LOWSPEED) #define MAX_HCTL_BUSRST 1 #define MAX_HCTL_SAMPLEBUS 4 @@ -558,12 +558,14 @@ ((hrsl & MAX_HRSL_KSTATUS) && !(mode & MAX_MODE_LOWSPEED))) { printf("Device is low speed.\n"); - max_write(MAX_REG_MODE, MAX_MODE_HOST_LOWSPEED); + if (max_read(MAX_REG_MODE, NULL) != MAX_MODE_HOST_LOWSPEED) + max_write(MAX_REG_MODE, MAX_MODE_HOST_LOWSPEED); } else { printf("Device is full speed.\n"); - max_write(MAX_REG_MODE, MAX_MODE_HOST_FULLSPEED); + if (max_read(MAX_REG_MODE, NULL) != MAX_MODE_HOST_FULLSPEED) + max_write(MAX_REG_MODE, MAX_MODE_HOST_FULLSPEED); } return true; @@ -918,7 +920,7 @@ connection_event = status & MAX_HIRQ_CONDETIRQ; frame_event = status & MAX_HIRQ_FRAMEIRQ; - #ifdef DEBUG + #ifdef DEBUG_EVENTS if (bus_event) printf("Bus "); if (data_event) printf("Data "); if (suspended_event) printf("Suspended "); @@ -942,18 +944,13 @@ /* Handle device connection. */ - else if ((devstate == MAX_DEVSTATE_CONNECTED) && frame_event) + else if ((devstate == MAX_DEVSTATE_CONNECTED) && frame_event && !(--framecount)) { - if (framecount) - framecount--; - else - { - /* Reset the device. */ + /* Reset the device. */ - max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST); - devstate = MAX_DEVSTATE_START; - printf("START\n"); - } + max_write(MAX_REG_HCTL, MAX_HCTL_BUSRST); + devstate = MAX_DEVSTATE_START; + printf("START\n"); } /* Handle device reset initiation. */ @@ -968,11 +965,9 @@ /* Handle device reset completion, getting device details and resetting the device again. */ - else if ((devstate == MAX_DEVSTATE_RESET) && frame_event) + else if ((devstate == MAX_DEVSTATE_RESET) && frame_event && !(--framecount)) { - if (framecount) - framecount--; - else if (!max_init_device(&device)) + if (!max_init_device(&device)) printf("FAILED: RESET -> INSPECTED\n"); else { @@ -992,11 +987,9 @@ /* Handle second reset completion, setting the address. */ - else if ((devstate == MAX_DEVSTATE_RESET_AGAIN) && frame_event) + else if ((devstate == MAX_DEVSTATE_RESET_AGAIN) && frame_event && !(--framecount)) { - if (framecount) - framecount--; - else if (!max_complete_device(&device)) + if (!max_complete_device(&device)) printf("FAILED: RESET_AGAIN -> ADDRESSING\n"); else { @@ -1009,22 +1002,17 @@ /* Post-addressing. */ - else if ((devstate == MAX_DEVSTATE_ADDRESSING) && frame_event) + else if ((devstate == MAX_DEVSTATE_ADDRESSING) && frame_event && !(--framecount)) { - if (framecount) - framecount--; - else - { - usb_show_languages(max_get_descriptor(&device, USB_DT_STRING, 0, 0, false)); - usb_show_configuration(max_get_descriptor(&device, USB_DT_CONFIG, 0, 0, false)); - devstate = MAX_DEVSTATE_READY; - printf("READY\n"); - } + usb_show_languages(max_get_descriptor(&device, USB_DT_STRING, 0, 0, false)); + usb_show_configuration(max_get_descriptor(&device, USB_DT_CONFIG, 0, 0, false)); + devstate = MAX_DEVSTATE_READY; + printf("READY\n"); } /* Handle device disconnection. */ - else if ((devstate != MAX_DEVSTATE_INIT) && connection_event) + else if ((devstate != MAX_DEVSTATE_INIT) && connection_event && !devicechanged()) { devstate = MAX_DEVSTATE_INIT; printf("INIT\n");