From 895bd6a737bb61e6060117eb1f20d5ff24009ce7 Mon Sep 17 00:00:00 2001 From: Paul Molloy Date: Sat, 22 Jul 2017 14:30:03 -0500 Subject: [PATCH] Completely trimmed avr build down to bare bones, only completing enumeration with host, no vendor/class requests handled. move avr builds into avr_release dir move original source files into source/old for future reference. avr-size avr_kazzo.elf text data bss dec hex filename 1496 2 43 1541 605 avr_kazzo.elf --- firmware/Makefile.avr | 31 +- firmware/avr_kazzo.elf | Bin 20548 -> 12248 bytes firmware/avr_kazzo.hex | 469 +++--------------- .../{ => avr_release}/main_green_v1_2.hex | 0 .../main_purple_v1_1_v3_0.hex | 0 .../{ => avr_release}/main_v1_2b-v1_4.hex | 0 firmware/source/main.c | 10 +- firmware/source/{ => old}/buffer.c | 0 firmware/source/{ => old}/buffer.h | 0 firmware/source/{ => old}/dump.c | 0 firmware/source/{ => old}/dump.h | 0 firmware/source/{ => old}/flash.c | 0 firmware/source/{ => old}/flash.h | 0 firmware/source/{ => old}/io.c | 0 firmware/source/{ => old}/io.h | 0 firmware/source/{ => old}/logic.h | 0 firmware/source/old/main.c | 72 +++ firmware/source/{ => old}/nes.c | 0 firmware/source/{ => old}/nes.h | 0 firmware/source/{ => old}/operation.c | 0 firmware/source/{ => old}/operation.h | 0 firmware/source/{ => old}/pinport.c | 0 firmware/source/{ => old}/pinport.h | 0 firmware/source/{ => old}/snes.c | 0 firmware/source/{ => old}/snes.h | 0 firmware/source/{ => old}/types.h | 0 firmware/source/old/usb.c | 334 +++++++++++++ firmware/source/old/usb.h | 31 ++ firmware/source/usb.c | 30 +- firmware/source/usb.h | 2 + 30 files changed, 559 insertions(+), 420 deletions(-) rename firmware/{ => avr_release}/main_green_v1_2.hex (100%) rename firmware/{ => avr_release}/main_purple_v1_1_v3_0.hex (100%) rename firmware/{ => avr_release}/main_v1_2b-v1_4.hex (100%) rename firmware/source/{ => old}/buffer.c (100%) rename firmware/source/{ => old}/buffer.h (100%) rename firmware/source/{ => old}/dump.c (100%) rename firmware/source/{ => old}/dump.h (100%) rename firmware/source/{ => old}/flash.c (100%) rename firmware/source/{ => old}/flash.h (100%) rename firmware/source/{ => old}/io.c (100%) rename firmware/source/{ => old}/io.h (100%) rename firmware/source/{ => old}/logic.h (100%) create mode 100644 firmware/source/old/main.c rename firmware/source/{ => old}/nes.c (100%) rename firmware/source/{ => old}/nes.h (100%) rename firmware/source/{ => old}/operation.c (100%) rename firmware/source/{ => old}/operation.h (100%) rename firmware/source/{ => old}/pinport.c (100%) rename firmware/source/{ => old}/pinport.h (100%) rename firmware/source/{ => old}/snes.c (100%) rename firmware/source/{ => old}/snes.h (100%) rename firmware/source/{ => old}/types.h (100%) create mode 100644 firmware/source/old/usb.c create mode 100644 firmware/source/old/usb.h diff --git a/firmware/Makefile.avr b/firmware/Makefile.avr index 82f1d6c..0929d5a 100644 --- a/firmware/Makefile.avr +++ b/firmware/Makefile.avr @@ -8,6 +8,7 @@ DEVICE = atmega164a F_CPU = 16000000 # in Hz +PROJ = avr_kazzo # Fuses and ISP programming handled in bootloader firmware build #SOURCES=$(wildcard source/**/*.c source/*.c) @@ -21,22 +22,22 @@ COMPILE = avr-gcc -Wall -Os -DF_CPU=$(F_CPU) $(CFLAGS) -mmcu=$(DEVICE) # symbolic targets: help: @echo "This Makefile has no default rule. Use one of the following:" - @echo "make hex ............ to build main.hex" + @echo "make hex ............ to build $(PROJ).hex" @echo "make program ........ windows flash firmware via bootloader" @echo "make program_unix ... unix flash firmware via bootloader" @echo "make clean .......... to delete objects and hex file" -hex: main.hex +hex: $(PROJ).hex -program: main.hex +program: $(PROJ).hex ../bootloader/commandline/bootloadHID.exe -r $< -program_unix: main.hex +program_unix: $(PROJ).hex ../bootloader/commandline/bootloadHID -r $< # rule for deleting dependent files (those which can be built by Make): clean: - rm -f main.hex main.lst main.obj main.cof main.list main.map main.eep.hex main.elf $(OBJECTS) main.s usbdrv_Vusb/oddebug.s usbdrv_Vusb/usbdrv.s source/shared_* + rm -f $(PROJ).hex $(PROJ).lst $(PROJ).obj $(PROJ).cof $(PROJ).list $(PROJ).map $(PROJ).eep.hex $(PROJ).elf $(OBJECTS) $(PROJ).s usbdrv_Vusb/oddebug.s usbdrv_Vusb/usbdrv.s source/shared_* # Generic rule for compiling C files: .c.o: @@ -56,22 +57,22 @@ clean: # file targets: -main.elf: shared $(OBJECTS) - $(COMPILE) -o main.elf $(OBJECTS) +$(PROJ).elf: shared $(OBJECTS) + $(COMPILE) -o $(PROJ).elf $(OBJECTS) -main.hex: main.elf - rm -f main.hex main.eep.hex - avr-objcopy -j .text -j .data -O ihex main.elf main.hex -# avr-size -C --mcu=${DEVICE} main.elf - avr-size main.elf +$(PROJ).hex: $(PROJ).elf + rm -f $(PROJ).hex $(PROJ).eep.hex + avr-objcopy -j .text -j .data -O ihex $(PROJ).elf $(PROJ).hex +# avr-size -C --mcu=${DEVICE} $(PROJ).elf + avr-size $(PROJ).elf # debugging targets: -disasm: main.elf - avr-objdump -d main.elf +disasm: $(PROJ).elf + avr-objdump -d $(PROJ).elf cpp: - $(COMPILE) -E main.c + $(COMPILE) -E $(PROJ).c #copy shared .h files which are used in host and firmware shared: diff --git a/firmware/avr_kazzo.elf b/firmware/avr_kazzo.elf index a1f7954c7103869e95b3b98227816f638cb74260..dffad8db9215922ee28658058966ed86d31d078d 100644 GIT binary patch delta 4274 zcmbuDe{fXQ702&=n;!(i=52nHAPoeAga|JwP(ca_HS#mRY^umump~Rt8xjZ!Mse6( zNLyfH$mTAPU~4H@%g|99!q_^c&N`(^XHp+b9R?y0d>+T=;Uuq zpn)r7CmZ#UiOlFt00n;P)MlWY{$%e~mhAlvPxcDWk&T{T#R-+~a9+N8!%%$j-Q#-> zYyFAmZ%#H28~q0N-PQ9_$??RYn^y0jlI;BioiUd&W*>E3To7wKX?$Jv6C)m<%cJr^ zkL~uj8FB+T3Mj$)2M3CUx)N5+P^+?eG;{G4ZWxLYL5>0 zX%mnolfR+6je}ZJ;CH&q_^nlo_m_iio@xU0|KRD05q+R86@bPqNHk$x0>MW=;4 z!1gYh9OxRNC4N!gm7f$iqN_cOAJRWE{6f#%mZE~EoP6T`xw&y-Z(3Mp53OVb6d)rHD^l4y=EI$g_VoK2_;3ny!N2Wa90-x zYJ1zgNB3F1eeB=*(S6rH4jRP={5P48v0?p|H>d|!i(?a3r%uHARoEboa2!UAy%R6K zmorHm&B+wc=ZqaVopU82;T>F%bMc~X%7HOENXQSep8TJx`$OXj+zKoDBo2XRpmgf7 z1o1`T4>RZ?%OxAPC`k(A=#2AM#8Aee{c+7p=kiyF#e{* zIT$aJIDd3Z1AlN9exot{!3C24E8;uqkDCVYaqxPHUkA5K{1$k-#Am?062AvN z7CuWDDa^p{amjxbTpIB^Nf3bHZAmZ!&XfWqVe0Qo{#5W($v+8vN%9wh>m~n8@B)eF zgFg%Fksk$=!%!^=YQPB+KL$>f*a0q*xEcJI#O>fU68`|)BXJ-2M2IOr3U~pA4<*4% zF%P^B-Y@yz0;l47g`2|O1!qcp5u7b?0GubW1()$Q#S7&}0pnqqFA1{12@+2RFO_%( z*edZHaIM6Pz&R3EfM-g)3ao*{`BA`H7@m;?o57tDKMgk9SKQ+}T(kdr%Od%4Z8~BS zbb{ZN3V1HYe-xaJWeqolodjn}tb@DYOhvb0f`0=SMErT+>miQhC&TA3Y>J%XRB!^u z7Vg4V3k9&S6!4*7IGu`u3&78Wk*Uzn2h+C z`9BExLvHvLb_py`=pSJ7J5@#05iq^Z3(@IJWI3_FsuXZK*le@{^iGfimXkk{l$N*- zY_1p;&NhUf?XgfGsfQ9V=_oCCEW!eJgUVxn7AeeJ=1vonbHd`JNz8s@}Erw5# zUMlb+*v4H*6<*QnU)DR>=U+CkM10f81*L)UDLT3(6T$L~3uAaLI2b8_3SJ0Km!7Wz zM^^;*?-s<-Qys@1hCnW$E{1;%rcWzsd066&;0!6jHn4_6YK5PccqjM}#*@%#&wm2O z8q*I`ov83t7|ejQXD7j#Qouif<$}(~@I`PI^t9*nqPiC2zYV4j7HV_|6BDEHmeC2h^f#SWnP$i~)-^PVKbL(YzHQ6end=6c7avw;*zH># z>sp&z>?I{EI=(MDE@n{Iwl8j5FE*EFi=UNii=(>Pl8&BVTUT#yXliw|w6tw%1=rWL z*4Z1IVRbasN40asz=QXRq9u=ruT_lAm_r$=n;RRWg5qM4v~+ux-R^K~YH8jWdK#jK z+H0G??`RTdmfDj?isnevvyDca9iGNYM-yxt9Ce#0 zrYK#WCDt#WEcP#-GHx_r$vly=q9_IVDjiQg;Mm%*&QVrhFB(?lWx)2Www4x0Q!5Ig zh|8K9T7`dUy11|+QKYP_5kFpecc$I`;CH@VZhxqJ$+D_S`^xglCACZKc9B>yRg_k& z5yvW?5b2d_JpBt=5&p_Fv7j=2y7@+@-3;$3W79CEFMZl|x(xJh>KUOYIxAJBDM376 zS)lAn5N}o%I8Vd320F9RbJV_z9zMk(WcT1yykR;eUxPFz<;N-bJf$NUX=aQk!RDA; z0_XV}X9W>i)VVW8=+0(rmGD%hiNPv0J_rBp&?SbdrY7T`D#lpG#zVeJ*s620Pu`6W LZB%JCGuwXvF0kjD literal 20548 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 diff --git a/firmware/avr_kazzo.hex b/firmware/avr_kazzo.hex index 7c5b665..a0b2e2f 100644 --- a/firmware/avr_kazzo.hex +++ b/firmware/avr_kazzo.hex @@ -1,4 +1,4 @@ -:100000000C9476000C94450B0C9493000C94930084 +:100000000C9476000C94B8010C9493000C9493001B :100010000C9493000C9493000C9493000C94930014 :100020000C9493000C9493000C9493000C94930004 :100030000C9493000C9493000C9493000C949300F4 @@ -13,391 +13,84 @@ :1000C00049006E00660069006E00690074006500FA :1000D0004E00650073004C006900760065007300F7 :1000E0002E0063006F006D000403090411241FBE7D -:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E6E09D -:10010000F9E102C005900D92A031B107D9F723E0C3 -:10011000A0E1B1E001C01D92A23BB207E1F70E944D -:10012000590C0C94810C0C940000CF92DF92EF924A -:10013000FF92CF93DF93DB01F701E601813509F4EC -:100140003FC020F48035F1F085EB15C0803649F0D2 -:100150008136D1F7A0912A01B0912B0113968C9191 -:1001600005C0A22FB0E0A35ABE4F8C918083888136 -:100170008F5F888380E0DF91CF91FF90EF90DF90D9 -:10018000CF90089512968C911297808313968C913C -:100190001397818314968C911497828315968C9172 -:1001A0001597838316968C911697848317968C9156 -:1001B0001797858318968C9186838881895FD9CF1C -:1001C00019968C91199780831A968C911A9781832E -:1001D0001B968C911B9782831C968C911C97838312 -:1001E0001D968C911D9784831E968C911E978583F6 -:1001F0001F968C91E1CF0F931F93CF93DF93EC0168 -:10020000FB01D90100914D0110914E01888187FFBA -:1002100009C08E818C93442399F00081118180E87C -:1002200083831DC08FEF8C938E8180933C01442388 -:1002300009F447C070936E0360936D0380E9F0CFBB -:10024000E0912A01F0912B018381883DA1F5008185 -:10025000118180E88383E0912A01F0912B011482BF -:10026000E0912A01F0912B0183818039F1F48A8198 -:10027000813711F08034C9F4E0916D03F0916E0381 -:100280000190F081E02D8D818083E0916D03F091EC -:100290006E030190F081E02D8C818183E0916D03EC -:1002A000F0916E0384818E5F8483C801DF91CF91CA -:1002B0001F910F9108958FEF8C9380E10E94F106BA -:1002C000CACFE0912A01F0912B0183818111F5CFF2 -:1002D000F0936E03E0936D0380E9BCCFEDE5F1E0B0 -:1002E0008FEF819391E0ED36F907D9F780935001B4 -:1002F00080932F01809353018093320180934001BA -:1003000080931D01809343018093200181E00C9430 -:10031000F106CF93DF931F92CDB7DEB7FB01813398 -:10032000C9F030F4882351F0803381F084EB0AC0A7 -:10033000823399F08333D1F727870AC089830E94DB -:100340006E0189810F90DF91CF91089541872287B7 -:1003500080E0F8CF43872487FBCF45872687F8CFF7 -:10036000CF93DF93FC0150E0CA01820F911D4197AA -:10037000C4F52223C1F183818F3FB9F586818F3F78 -:10038000B1F5DA01A35ABE4FED0180E099919F3F8C -:1003900081F58F5F2813FACF66831382982F929589 -:1003A000990F907E91509283148215821086178245 -:1003B000118612861386148615861686178695E092 -:1003C000440F551F9A95E1F743595E4F518340837F -:1003D00090E06D939F5F8913FCCF80E0DF91CF9118 -:1003E00008958EEBFBCF82ECF9CF8FEBF7CF80EC4B -:1003F000F5CF81ECF3CF0F93FB01642F422F202F19 -:10040000803828F0883828F08059883030F086EB22 -:100410000AC0CF010F910C94B001058350E0562B18 -:100420005087478380E00F910895CF92DF92EF923B -:10043000FF920F93CF93DF93FC01EB016A0182815E -:1004400090ED980F903378F59381913099F058F1B1 -:10045000923019F1933021F186E8888381E0D6014A -:100460008C93CE01DF91CF910F91FF90EF90DF90B1 -:10047000CF9008956CE271E08037C0F4803520F5AC -:10048000803408F04BC00381248145810E9489019A -:10049000888381E0F6018083E4CF6DE371E0ECCFE7 -:1004A0006AE171E0E9CF6DE471E0E6CF8038B8F43D -:1004B000960140E0CF01DF91CF910F91FF90EF9037 -:1004C000DF90CF900C94FB007E019FEFE91AF90AB0 -:1004D0000381248145810E9495008883C2CF982F93 -:1004E0009770913049F090F0923099F0933009F084 -:1004F000B3CF6AE171E002C06CE271E0803F60F46A -:10050000803CA8F4803868F485E8E7CF6DE471E0BA -:10051000F5CF6DE371E0F2CF883FB0F796014FEF72 -:10052000C9CF0381248145810E94FB01D6CFDB0125 -:10053000CD91DC918681AECF20E030E0261708F027 -:100540000895E0914D01F0914E01E20FF31F4081BB -:10055000FC014193CF012F5F3F4FF0CF20E030E00F -:10056000261708F00895FC014191CF01E0914D015B -:10057000F0914E01E20FF31F40832F5F3F4FF0CF0A -:100580009091500180912F018F3F79F481E09F3F3E -:1005900009F480E0909140019F3F09F083E0909141 -:1005A0001D019F3F09F084E0089582E0F3CF62309F -:1005B00059F421E08D34920749F121E08C32920701 -:1005C00089F48DE491E00EC0633069F421E08D344C -:1005D0009207E1F021E08C329207D9F021E08D33CF -:1005E000920779F308956430E9F721E08D3492079A -:1005F00069F021E08C32920761F021E08D3392079F -:1006000059F021E08A31920769F7DBCF8CE291E063 -:1006100008958DE391E008958AE191E008951F9394 -:10062000CF93DF930E94F706823D09F071C00E94CC -:10063000C002809310018DE491E090932B01809390 -:100640002A010E94F706823DA1F4D0911001809109 -:100650002A0190912B01C1E0CD1708F45FC090935F -:100660002B0180932A0120E8FC01238380ED0E9466 -:10067000F1060E94F706823F41F480EF0E94F106E6 -:10068000E0912A01F0912B0113820E94F706C82FF6 -:10069000803DE1F480912A0190912B01FC0123819E -:1006A0002038A1F4609110010E94D70290932B0191 -:1006B00080932A01FC011482C3830E94A703E09166 -:1006C0002A01F0912B01882371F183830E94F706A0 -:1006D000182F803FC9F4C0912A01D0912B018B8142 -:1006E000883991F460911001CE010E94D702909355 -:1006F0002B0180932A01FC0113821B83CE010E94EF -:100700002F048823D1F08B83DF91CF911F9108951F -:100710000E94F706823F09F094CF89CF6D2F0E9487 -:10072000D702CF5F99CF88ED83832581878190851C -:10073000820F911D90878783C9CF84EF8B832D8192 -:100740008F819885820F911D98878F83DDCF0F93BE -:10075000CF93DF93EC016F8189858C3001F130F408 -:100760008A3059F08B3091F083EC03C08F30E0F782 -:1007700080E0DF91CF910F91089560680FEF2A819B -:100780004E81888199810E94C90507C00FEF2A8197 -:100790004E81888199810E9400068C83E9CF606632 -:1007A000EDCF9F92AF92BF92CF92DF92EF92FF92E6 -:1007B0000F931F93CF93DF93B62E7A016901DA016D -:1007C0001496CC91D0E0AC2ED70112968C91129752 -:1007D00090E08C179D0778F41496CC9380E0DF911D -:1007E000CF911F910F91FF90EF90DF90CF90BF902E -:1007F000AF909F900895E0910001F0910101478131 -:1008000066818581F6010995E0910001F091010171 -:10081000438562858185F6010995E0910001F0919B -:100820000101478566858585F6010995D701ED911A -:10083000FC91EC0FF11D40816C2F8B2DF601099579 -:100840000E94260A6A2D8B2DF8010995982E6A2D93 -:100850008B2DF80109959812F3CF2196B4CF0F9301 -:100860001F93AC01FC01678181858B30A1F020F4DE -:100870008A3041F083EC03C08F30E0F780E01F91B5 -:100880000F910895606800E115E028EE34E080E003 -:100890000E94D103F3CF06E315E028E435E0F7CF5B -:1008A00011B88FEF82B914B885B917B888B98AB171 -:1008B00084718AB98BB18B6E8BB9509858985198C6 -:1008C000599A08950E945004399A419A389A40984A -:1008D0003A9A429A3C9A449A3D9A459A3F9A479A44 -:1008E00047988FEF84B915B8479A479814B812B84B -:1008F00081B914B885B908950E945004399A419A73 -:100900003C9A449A3D9A459A509A589A3F9A479AE7 -:100910004798579A5F9A5F988FEF84B915B8479AAE -:10092000479814B884B915B85F9A5F9814B812B88C -:1009300081B914B885B90895CF93DF931F92CDB7CD -:10094000DEB7813069F020F0823071F086E904C0B2 -:1009500089830E94500489810F90DF91CF9108957F -:100960000E94620480E0F8CF0E947C04FBCFFC016F -:1009700081E080835898509A000089B18183509813 -:100980005898908181818923981308C08AEA8683C8 -:100990008483828385E58583838308955098589A5C -:1009A00089B1818389B1828389B1838389B1848349 -:1009B00089B1858389B18683509858980895803885 -:1009C00029F4CB010E94B70480E0089587E90895D7 -:1009D0009FEF94B985B9479A479862B945B9589835 -:1009E000509A5098589A14B808955098589840982A -:1009F000419A429A62B99FEF94B985B9479A47984C -:100A000014B800000000409A87FD419800000000E3 -:100A1000000000000000000083B14098419A089552 -:100A200062B99FEF94B985B9479A479814B8409A2C -:100A300087FD4198000000000000000083B140984D -:100A4000419A0895509858989FEF94B962B985B922 -:100A5000479A4798429845B9409A87FD41980000C7 -:100A600000004098419A429A14B808959FEF94B9B3 -:100A7000803208F4806885B9479A479814B862B9FB -:100A80004498000000000000000083B1449A0895DB -:100A90009FEF94B9803208F4806885B9479A4798E7 -:100AA00062B945B9000045980000459A14B8089508 -:100AB000CF93C82F862F642F422FC13051F020F0E2 -:100AC000C23059F0C0EA02C00E94E8048C2FCF91D6 -:100AD00008950E944805C0E0F9CF0E942205FBCF8F -:100AE0008FEF84B984E085B9479A479899B188E037 -:100AF00085B9479A479889B1807214B821E0592F77 -:100B0000507295FD20E041E0811140E0222311F078 -:100B1000411116C031E0511101C030E091E0811166 -:100B200001C090E0332311F091110CC0442311F067 -:100B300031110AC0222311F0911108C08FEF0895DE -:100B400080E1089581E1089582E1089583E10895A7 -:100B5000CF93DF93982F862F642FE901913899F076 -:100B600020F4903849F081EA0BC0923879F093383C -:100B7000D1F70E94700502C00E94F504888380E0CE -:100B8000DF91CF9108950E941005F8CF0E9436059D -:100B9000F5CFEF92FF920F93CF93DF9300D01F9288 -:100BA000CDB7DEB77C018FEF84B965B9479A479816 -:100BB00014B8409A67FD419842B980E0011117C00E -:100BC0000000000093B1F701E80FF11D90834F5F23 -:100BD00042B98F5F281790F74098419A0F900F9075 -:100BE0000F90DF91CF910F91FF90EF9008952B839D -:100BF0004A8389830E94260A89814A812B81E2CF18 -:100C0000EF92FF920F93CF93DF9300D01F92CDB757 -:100C1000DEB77C018FEF84B9603208F4606865B993 -:100C2000479A479814B8449842B980E0011116C019 -:100C30000000000093B1F701E80FF11D90834F5FB2 -:100C400042B98F5F281790F7449A0F900F900F903A -:100C5000DF91CF910F91FF90EF9008952B834A83FE -:100C600089830E94260A89814A812B81E3CF8330C0 -:100C700061F46058633048F4E62FF0E0EE0FFF1F98 -:100C8000E65FFE4F8081918108958FEF9FEF089579 -:100C9000833059F4633048F4E62FF0E0EE0FFF1F85 -:100CA000EC5FFE4F8081918108958FEF9FEF089553 -:100CB0000F931F93CF93DF93982F862F642F092FC5 -:100CC00010E00730110508F043C0F801E659F94F6C -:100CD0000C947B0C71067C06850683068D069606B1 -:100CE0009F06E0910001F09101014083892FDF917F -:100CF000CF911F910F91089563E180910001909130 -:100D000001010E949C0290E0F1CF63E1809100011B -:100D1000909101010E94AE02F6CFC0910001D091E6 -:100D200001010E9437069C8B8B8BEDCFC091000197 -:100D3000D09101010E9448069E8B8D8BE4CFC0911B -:100D40000001D09101010E944806988F8F8BDBCF64 -:100D500092EDCCCF0F931F93CF93DF93FC01EB0168 -:100D60008A018281803488F0803800F58034E1F493 -:100D7000E0910001F091010180818983FA01808175 -:100D80008F5F808380E0888309C0238144816581EF -:100D90000E945806888381E0F8018083CE01DF91AC -:100DA000CF911F910F91089583EDEDCF87E8EBCFA1 -:100DB000EF92FF920F931F93F701803481F4A0917B -:100DC0000001B09101018C91D8018C9380818F5FDB -:100DD000808380E01F910F91FF90EF90089583ED45 -:100DE000F9CFE0910001F091010180830895E09135 -:100DF0000001F091010180810895482F50E04B35AA -:100E0000510508F0FCC0FA01E85FF84F0C947B0C28 -:100E10006307650769076B076E0770077307750738 -:100E200078077A077C077F0781078307850787078D -:100E300089078B078D07FF07FF07FF07FF078F074E -:100E4000910793079507FF07FF07FF07FF0797071E -:100E500099079B079D079F07A107A307A507A7075A -:100E6000A907AB07AD07AF07B107B307B507FF0782 -:100E7000FF07FF07FF07B707B907FD07BB07BD0758 -:100E8000C107C507C807CB07D107CE07CA07CD07DB -:100E9000D007D307D507D707D907DB07DD07DF075B -:100EA000E107E307E507E707E907EB07ED07EF07CA -:100EB000F107F307F507FF07FF07FF07FF07FA072B -:100EC000F707F907FC0711B808958FEF81B980E0A3 -:100ED000089512B8FCCF8FEF82B9F9CF14B8F7CFCD -:100EE0008FEF84B9F4CF15B8F2CF8FEF85B9EFCF7C -:100EF00017B8EDCF18B8EBCF8FEF88B9E8CF389897 -:100F0000E6CF389AE4CF4098E2CF409AE0CF3998C4 -:100F1000DECF399ADCCF4198DACF419AD8CF3A98D0 -:100F2000D6CF3A9AD4CF4298D2CF429AD0CF3B98DC -:100F3000CECF3B9ACCCF4398CACF439AC8CF3C98E8 -:100F4000C6CF3C9AC4CF4498C2CF449AC0CF3D98F4 -:100F5000BECF3D9ABCCF4598BACF459AB8CF3E9800 -:100F6000B6CF3E9AB4CF4698B2CF469AB0CF3F980C -:100F7000AECF3F9AACCF479AAACF8AB184718AB9D3 -:100F8000A6CF8BB184718BB9A2CF8BB18B6EFBCF07 -:100F900050989DCF5898509A9ACF5098589A97CF7A -:100FA0005098589894CF519892CF519A90CF599881 -:100FB0008ECF599A8CCF53988ACF539A88CF5B980B -:100FC00086CF5B9A84CF559882CF559A80CF5D9813 -:100FD0007ECF5D9A7CCF56987ACF569A78CF5E981E -:100FE00076CF5E9A74CF579872CF579A70CF5F9A28 -:100FF0006ECF5F9A5F986BCF479A479868CF8CE81F -:10100000089590E0FC01E058F109EB30F10508F09B -:101010003FC0E35FF74F0C947B0C18081D081B08BA -:101020001F0826082C082E08300832083C083E0805 -:1010300062B980E008958FEF84B965B9FACF8FEF78 -:1010400084B965B9479A479814B8F3CF8FEF84B93C -:1010500065B95F9A5F98F8CF61B9EBCF64B9E9CF12 -:1010600067B9E7CF9AB1862F846189238AB98AB19B -:101070006B7E682B6AB9DDCF68B9DBCF9BB1862F59 -:10108000846189238BB98BB16B7E682B6BB9D1CF0F -:101090008DE80895813A69F0823AC1F0803A11F5FD -:1010A0008FEF84B965B9479A479814B842B980E080 -:1010B00008958FEF84B965B9479A479814B842B933 -:1010C00067FF02C04198F3CF419AF1CF42B98FEF49 -:1010D00084B9603228F415B8479A479814B8E7CF16 -:1010E00065B9FACF8EE80895803B61F422B98FEF9D -:1010F00084B945B9479A479865B95F9A5F9814B81B -:1011000080E008958FE80895DB01482F50E0FA0150 -:10111000E05CF109EC30F10550F5EF56F74F0C9417 -:101120007B0C9D08A108A308A508A708A908AB087F -:10113000AD08AF08B108B308B50880B18C9380E062 -:10114000089583B1FBCF86B1F9CF89B1F7CF82B1D2 -:10115000F5CF85B1F3CF88B1F1CF8BB1EFCF81B1AE -:10116000EDCF84B1EBCF87B1E9CF8AB1E7CF80E98A -:1011700008950F93811111C0589A8FEF84B922B945 -:1011800045B9479A479805B9459800000000459A27 -:10119000419A14B858980F9108955898EECF0F932C -:1011A000CF93C82F022F813079F020F08230A1F048 -:1011B000CAEA06C0242F462F6FEF81E00E94B908CB -:1011C0008C2FCF910F910895242F462F6FEF80E041 -:1011D0000E94B908C0E0F4CF242F462F60E0F7CF7B -:1011E0000F93811116C0589A8FEF84B902B925B9AF -:1011F000479A479845B95F9A5F9814B84498000099 -:1012000000000000000083B1449A419A58980F9161 -:1012100008955898E9CF0F931F93CF93DF93E80178 -:10122000813891F08238B1F08038C9F4022F242F30 -:10123000462F6FEF81E00E94F008888380E0DF9105 -:10124000CF911F910F910895022F242F462F6FEFFA -:1012500080E0F1CF022F242F462F60E0F9CF8BEAF8 -:10126000EECF0F931F93CF93DF931F92CDB7DEB7CF -:10127000DC0181E191E090939703809396031982BA -:101280008C9187FF02C081E089831196EC911197C0 -:101290004E2F50E0FA013197E730F10508F0ACC06D -:1012A000EC5AF64F0C947B0C5B098C09A209BC0923 -:1012B000D909E609F30912968C911297803B48F4FC -:1012C000803AC8F4803890F40E94FD0680931101A2 -:1012D00032C0803CC0F414962C91149715964C9112 -:1012E000159713966C910E947408F0CF14966C9128 -:1012F0000E940108EBCF14964C91149715966C91AF -:101300000E944A08E3CF62E171E00E948408809362 -:10131000110189818F5F0EC012968C91803818F46C -:101320000E949C04D3CF62E171E00E94DF048093AD -:10133000110188E0898389810F90DF91CF911F91FE -:101340000F91089512968C911297803858F4139645 -:101350002C91139714964C91149715966C910E94AA -:101360005805B4CF22E131E014964C9114971596AC -:101370006C910E94A805CBCF12968C911297803861 -:1013800058F413962C91139714964C911497159624 -:101390006C910E94CF089ACF02E111E014962C9133 -:1013A000149715964C91159713966C910E940B0902 -:1013B000AECFAE014F5F5F4F61E171E0CD010E94A2 -:1013C00015029093970380939603B5CF1092110165 -:1013D00010921201E0916D03F0916E03828180936F -:1013E000130183E0A7CFAE014F5F5F4F61E171E072 -:1013F000CD010E94AA06E5CF80E868CFE0916D0399 -:10140000F0916E03248140815181322F360F2313D6 -:1014100012C0E0916D03F0916E038481860F848386 -:1014200080913C01861B80933C0181110DC088E9AD -:10143000838381E00895FC017191CF01FA01E20FED -:10144000F11D70832F5FE3CF80E00895CF93DF938A -:1014500060919803635067FD91C080919503CCE043 -:10146000D0E0C81BD109C456DC4F809194038D3263 -:1014700009F0CFC0683009F07FC083EC8093880307 -:101480008AE580930301109219018881807679F0B2 -:10149000CE010E9431098F3F09F466C09F819111EE -:1014A00069C09E81981708F065C0892F63C02A81A2 -:1014B00010929103998191110AC01092920321E92F -:1014C00033E082E03093970320939603E7CF953083 -:1014D00029F42093990321E933E0F4CF963099F56C -:1014E0009B81913059F48EE890E09093970380931C -:1014F000960382E190E490931901D0CF923019F4D1 -:101500008CE790E0F2CF9330A9F7211108C088EE64 -:1015100090E0909397038093960384E0EBCF213083 -:1015200041F48EEB90E090939703809396038AE2C8 -:10153000E1CF2230F9F680EA90E090939703809310 -:1015400096038EE1D7CF983059F0993019F4209353 -:101550009B03C1CF81E09A3009F4BDCF80E0BBCFBF -:101560002BE933E081E0AECF988197FD8E8190E842 -:1015700090931901809302011092980380910301C6 -:1015800084FF3AC0809102018F3FB1F1C82F8930AA -:1015900008F0C8E08C1B809302018091880398E8D2 -:1015A000892780938803CC23D1F080919603909172 -:1015B00097032091190126FF3FC0A9E8B3E0FC0181 -:1015C0002C2F34913D9331962150D9F701962FEF6E -:1015D0002C0F820F911D90939703809396036C2F8D -:1015E00089E893E00E94410BCC5FCC3019F08FEF7B -:1015F00080930201C093030184E199B1947131F4A5 -:101600008150D9F71092990310929303DF91CF91F3 -:1016100008958091190187FFAFCFCE010E94FE0986 -:101620008F3F21F48EE180930301A6CF882309F434 -:10163000A3CF10920201A0CFE9E8F3E0DC012C2F48 -:101640003D9131932150E1F7C1CFE9E6F0E080818F -:1016500082608083E89A0895A82FB92F80E090E0F7 -:1016600041E050EA609530E009C02D9182279795BE -:10167000879510F084279527305EC8F36F5FA8F335 -:101680000895EADF8D939D930895CF93CFB7CF93BD -:10169000DF93C3954C9BE9F74C9B0BC04C9B09C057 -:1016A0004C9B07C04C9B05C04C9B03C04C9B01C08E -:1016B00089C06F93C0919503DD27C456DC4F2F93EB -:1016C00065E54C9B03C02F916F91E6CF0F931F935D -:1016D0004F9320E040E15F9309B1047104FB27F9C7 -:1016E0003F9350E03BE039C0147140642F77012FE5 -:1016F0005F5F1EC0406819B114712F7752501FC030 -:10170000406409B12F770471D1F15F5F00C023C03D -:10171000406219B12F77147191F15F5F00C025C04D -:1017200004711027515012F45D5F0000115027958D -:101730002C3F19B1C8F614710127015027952C3F91 -:10174000C8F64227499309B1047110274F7311500D -:1017500027952C3FA8F64695469519B1147179F056 -:101760000127015027952C3F98F66B5A60F33150B2 -:1017700009B1B0F600C011E01CBB002717C03B50F8 -:101780003195C31BD04011E01CBB0881033CF9F02C -:101790000B34E9F0209193031981110F1213EDCF4F -:1017A000093651F10D3211F0013E39F700939A03D9 -:1017B0003F915F914F911F910F912F916F91CCB3FA -:1017C000C0FD67CFDF91CF91CFBFCF91189520910A -:1017D0009A03222369F310919803112339F53430C9 -:1017E0003AF13093980320939403109195033BE0D2 -:1017F000311B309395031CC0009198030130B4F461 -:101800000AE53091030134FD14C000930301C8E8D8 -:10181000D3E013C0052710E000C000000BB91AC0C8 -:10182000052710E0221F1DC010E021C04AE502C0BC -:1018300032ED432FC4E1D0E032E01AB114615C9A7A -:101840000BB11AB954E120E865E320FF05270BB975 -:10185000279517951C3FF0F66695B8F7B1F720FF6E -:1018600005270BB9279517951C3FD0F62795179597 -:1018700017FF052700001C3F0BB9B0F629913A95D8 -:1018800019F70B7E10919903110FC651D0400BB977 -:1018900011F01093930311E01CBB00611AB11B7E81 -:1018A000402F4B7E54E05A95F1F70BB91AB94BB95A -:1018B0007FCF9EE088E10FB6F894A89580936000F2 -:1018C0000FBE909360000E94250B549A80E08150D7 -:1018D00051F454980E9450047894A8950E94260AC6 -:1018E0000E940F03FACFA895EFE9FFE03197F1F7D7 -:1018F00000C00000ECCFEE0FFF1F0590F491E02D2B -:061900000994F894FFCFEA -:101906006F03FF5AE80448052205F504100536055D +:1000F000CFEFD4E0DEBFCDBF11E0A0E0B1E0E8ED8E +:10010000F5E002C005900D92A230B107D9F721E0C9 +:10011000A2E0B1E001C01D92AD32B207E1F70E944A +:10012000CC020C94EA020C94000080E0089580E078 +:100130000895CF93DF9360911301635067FD91C0E1 +:1001400080911001CCE0D0E0C81BD109C95EDE4F20 +:1001500080910F018D3209F0CFC0683009F07FC067 +:1001600083EC809303018AE58093010110920201E0 +:100170008881807679F0CE010E9495008F3F09F446 +:1001800066C09F81911169C09E81981708F065C073 +:10019000892F63C02A8110920C01998191110AC0A4 +:1001A00010920D012CE031E082E030931201209397 +:1001B0001101E7CF953029F4209314012CE031E0B0 +:1001C000F4CF963099F59B81913059F48EE890E008 +:1001D000909312018093110182E190E490930201C7 +:1001E000D0CF923019F48CE790E0F2CF9330A9F79A +:1001F000211108C088EE90E09093120180931101C4 +:1002000084E0EBCF213041F48EEB90E0909312012B +:10021000809311018AE2E1CF2230F9F680EA90E082 +:1002200090931201809311018EE1D7CF983059F04D +:10023000993019F420931601C1CF81E09A3009F466 +:10024000BDCF80E0BBCF26E131E081E0AECF988129 +:1002500097FD8E8190E890930201809300011092A7 +:1002600013018091010184FF3AC0809100018F3F0A +:10027000B1F1C82F893008F0C8E08C1B80930001D1 +:100280008091030198E8892780930301CC23D1F062 +:1002900080911101909112012091020126FF3FC02F +:1002A000A4E0B1E0FC012C2F34913D933196215014 +:1002B000D9F701962FEF2C0F820F911D9093120109 +:1002C000809311016C2F84E091E00E94B401CC5F17 +:1002D000CC3019F08FEF80930001C093010184E1CD +:1002E00099B1947131F48150D9F7109214011092A0 +:1002F0000E01DF91CF9108958091020187FFAFCF6A +:10030000CE010E9497008F3F21F48EE1809301017E +:10031000A6CF882309F4A3CF10920001A0CFE4E078 +:10032000F1E0DC012C2F3D9131932150E1F7C1CF59 +:10033000E9E6F0E0808182608083E89A0895A82F42 +:10034000B92F80E090E041E050EA609530E009C0CC +:100350002D9182279795879510F084279527305EF9 +:10036000C8F36F5FA8F30895EADF8D939D93089516 +:10037000CF93CFB7CF93DF93C3954C9BE9F74C9BBB +:100380000BC04C9B09C04C9B07C04C9B05C04C9BB1 +:1003900003C04C9B01C089C06F93C0911001DD2741 +:1003A000C95EDE4F2F9365E54C9B03C02F916F9183 +:1003B000E6CF0F931F934F9320E040E15F9309B185 +:1003C000047104FB27F93F9350E03BE039C01471FE +:1003D00040642F77012F5F5F1EC0406819B1147110 +:1003E0002F7752501FC0406409B12F770471D1F1AB +:1003F0005F5F00C023C0406219B12F77147191F183 +:100400005F5F00C025C004711027515012F45D5F7A +:100410000000115027952C3F19B1C8F6147101271F +:10042000015027952C3FC8F64227499309B1047122 +:1004300010274F73115027952C3FA8F646954695E7 +:1004400019B1147179F00127015027952C3F98F6C6 +:100450006B5A60F3315009B1B0F600C011E01CBB1B +:10046000002717C03B503195C31BD04011E01CBB87 +:100470000881033CF9F00B34E9F020910E01198159 +:10048000110F1213EDCF093651F10D3211F0013E6B +:1004900039F7009315013F915F914F911F910F9193 +:1004A0002F916F91CCB3C0FD67CFDF91CF91CFBFBC +:1004B000CF91189520911501222369F31091130112 +:1004C000112339F534303AF13093130120930F01A1 +:1004D000109110013BE0311B309310011CC00091C2 +:1004E00013010130B4F40AE53091010134FD14C068 +:1004F00000930101C3E0D1E013C0052710E000C064 +:1005000000000BB91AC0052710E0221F1DC010E023 +:1005100021C04AE502C032ED432FC4E1D0E032E011 +:100520001AB114615C9A0BB11AB954E120E865E381 +:1005300020FF05270BB9279517951C3FF0F6669508 +:10054000B8F7B1F720FF05270BB9279517951C3F82 +:10055000D0F62795179517FF052700001C3F0BB90C +:10056000B0F629913A9519F70B7E10911401110FED +:10057000C651D0400BB911F010930E0111E01CBB15 +:1005800000611AB11B7E402F4B7E54E05A95F1F763 +:100590000BB91AB94BB97FCF9EE088E10FB6F8943A +:1005A000A895809360000FBE909360000E94980110 +:1005B000549A80E0815031F454987894A8950E9420 +:1005C0009900FCCFA895EFE9FFE03197F1F700C063 +:0805D0000000F0CFF894FFCF0A +:0205D800FF5AC8 :00000001FF diff --git a/firmware/main_green_v1_2.hex b/firmware/avr_release/main_green_v1_2.hex similarity index 100% rename from firmware/main_green_v1_2.hex rename to firmware/avr_release/main_green_v1_2.hex diff --git a/firmware/main_purple_v1_1_v3_0.hex b/firmware/avr_release/main_purple_v1_1_v3_0.hex similarity index 100% rename from firmware/main_purple_v1_1_v3_0.hex rename to firmware/avr_release/main_purple_v1_1_v3_0.hex diff --git a/firmware/main_v1_2b-v1_4.hex b/firmware/avr_release/main_v1_2b-v1_4.hex similarity index 100% rename from firmware/main_v1_2b-v1_4.hex rename to firmware/avr_release/main_v1_2b-v1_4.hex diff --git a/firmware/source/main.c b/firmware/source/main.c index e90d425..2dd4230 100644 --- a/firmware/source/main.c +++ b/firmware/source/main.c @@ -3,9 +3,9 @@ #include #include "usbdrv.h" -#include "io.h" -#include "pinport.h" -#include "buffer.h" +//#include "io.h" +//#include "pinport.h" +//#include "buffer.h" int main(void) { @@ -39,7 +39,7 @@ int main(void) usbDeviceConnect(); //intialize i/o and LED to pullup state - io_reset(); +// io_reset(); //enable interrupts sei(); @@ -67,6 +67,6 @@ int main(void) //+ cpu operations that can't be hid behind flash wait time //another thought would be to call usbPoll mid programming //a few times to prevent incoming data from being delayed too long - update_buffers(); +// update_buffers(); } } diff --git a/firmware/source/buffer.c b/firmware/source/old/buffer.c similarity index 100% rename from firmware/source/buffer.c rename to firmware/source/old/buffer.c diff --git a/firmware/source/buffer.h b/firmware/source/old/buffer.h similarity index 100% rename from firmware/source/buffer.h rename to firmware/source/old/buffer.h diff --git a/firmware/source/dump.c b/firmware/source/old/dump.c similarity index 100% rename from firmware/source/dump.c rename to firmware/source/old/dump.c diff --git a/firmware/source/dump.h b/firmware/source/old/dump.h similarity index 100% rename from firmware/source/dump.h rename to firmware/source/old/dump.h diff --git a/firmware/source/flash.c b/firmware/source/old/flash.c similarity index 100% rename from firmware/source/flash.c rename to firmware/source/old/flash.c diff --git a/firmware/source/flash.h b/firmware/source/old/flash.h similarity index 100% rename from firmware/source/flash.h rename to firmware/source/old/flash.h diff --git a/firmware/source/io.c b/firmware/source/old/io.c similarity index 100% rename from firmware/source/io.c rename to firmware/source/old/io.c diff --git a/firmware/source/io.h b/firmware/source/old/io.h similarity index 100% rename from firmware/source/io.h rename to firmware/source/old/io.h diff --git a/firmware/source/logic.h b/firmware/source/old/logic.h similarity index 100% rename from firmware/source/logic.h rename to firmware/source/old/logic.h diff --git a/firmware/source/old/main.c b/firmware/source/old/main.c new file mode 100644 index 0000000..281e53e --- /dev/null +++ b/firmware/source/old/main.c @@ -0,0 +1,72 @@ +#include +#include +#include + +#include "usbdrv.h" +#include "io.h" +#include "pinport.h" +#include "buffer.h" + +int main(void) +{ + + //set watch dog timer with 1 second timer + wdt_enable(WDTO_1S); + /* Even if you don't use the watchdog, turn it off here. On newer devices, + * the status of the watchdog (on/off, period) is PRESERVED OVER RESET! + */ + /* RESET status: all port bits are inputs without pull-up. + * That's the way we need D+ and D-. Therefore we don't need any + * additional hardware initialization. + */ + + //odDebugInit(); //intialize debuging printing via serial port + //DBG1(0x00, 0, 0); //debug serial op: main starts + + //initialize V-usb driver before interupts enabled and entering main loop + usbInit(); + //disconnect from host enforce re-enumeration, interupts must be disabled during this. + usbDeviceDisconnect(); + + //fake USB disconnect for over 250ms + uint8_t index = 0; + while(--index){ //loop 256 times + wdt_reset(); //keep wdt happy during this time + _delay_ms(1); //delay 256msec + } + + //reconnect to host + usbDeviceConnect(); + + //intialize i/o and LED to pullup state + io_reset(); + + //enable interrupts + sei(); + + //================= + //MAIN LOOP + //================= + while (1) { + + //pet the watch doggie to keep him happy + wdt_reset(); + + //must call at regular intervals no longer than 50msec + //checks for setup packets from what I understand + usbPoll(); + + //check buffer status' and instruct them to + //flash/dump as needed to keep data moving + //currently assuming this operation doesn't take longer + //than 50msec to meet usbPoll's req't + //considering using a timer counter interupt to call + //usbPoll more often but going to see how speed is + //impacted first.. + //256Bytes * 20usec Tbp = 5.12msec programming time + //+ cpu operations that can't be hid behind flash wait time + //another thought would be to call usbPoll mid programming + //a few times to prevent incoming data from being delayed too long + update_buffers(); + } +} diff --git a/firmware/source/nes.c b/firmware/source/old/nes.c similarity index 100% rename from firmware/source/nes.c rename to firmware/source/old/nes.c diff --git a/firmware/source/nes.h b/firmware/source/old/nes.h similarity index 100% rename from firmware/source/nes.h rename to firmware/source/old/nes.h diff --git a/firmware/source/operation.c b/firmware/source/old/operation.c similarity index 100% rename from firmware/source/operation.c rename to firmware/source/old/operation.c diff --git a/firmware/source/operation.h b/firmware/source/old/operation.h similarity index 100% rename from firmware/source/operation.h rename to firmware/source/old/operation.h diff --git a/firmware/source/pinport.c b/firmware/source/old/pinport.c similarity index 100% rename from firmware/source/pinport.c rename to firmware/source/old/pinport.c diff --git a/firmware/source/pinport.h b/firmware/source/old/pinport.h similarity index 100% rename from firmware/source/pinport.h rename to firmware/source/old/pinport.h diff --git a/firmware/source/snes.c b/firmware/source/old/snes.c similarity index 100% rename from firmware/source/snes.c rename to firmware/source/old/snes.c diff --git a/firmware/source/snes.h b/firmware/source/old/snes.h similarity index 100% rename from firmware/source/snes.h rename to firmware/source/old/snes.h diff --git a/firmware/source/types.h b/firmware/source/old/types.h similarity index 100% rename from firmware/source/types.h rename to firmware/source/old/types.h diff --git a/firmware/source/old/usb.c b/firmware/source/old/usb.c new file mode 100644 index 0000000..004fe48 --- /dev/null +++ b/firmware/source/old/usb.c @@ -0,0 +1,334 @@ + +#include "usb.h" + +//used to store success/error code of last transfer for debugging +static uint8_t usbWrite_status; + +//USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]); +/* This function is called when the driver receives a SETUP transaction from + * the host which is not answered by the driver itself (in practice: class and + * vendor requests). All control transfers start with a SETUP transaction where + * the host communicates the parameters of the following (optional) data + * transfer. The SETUP data is available in the 'data' parameter which can + * (and should) be casted to 'usbRequest_t *' for a more user-friendly access + * to parameters. + * + * If the SETUP indicates a control-in transfer, you should provide the + * requested data to the driver. There are two ways to transfer this data: + * (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data + * block and return the length of the data in 'usbFunctionSetup()'. The driver + * will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The + * driver will then call 'usbFunctionRead()' when data is needed. See the + * documentation for usbFunctionRead() for details. + * + * If the SETUP indicates a control-out transfer, the only way to receive the + * data from the host is through the 'usbFunctionWrite()' call. If you + * implement this function, you must return USB_NO_MSG in 'usbFunctionSetup()' + * to indicate that 'usbFunctionWrite()' should be used. See the documentation + * of this function for more information. If you just want to ignore the data + * sent by the host, return 0 in 'usbFunctionSetup()'. + * + * Note that calls to the functions usbFunctionRead() and usbFunctionWrite() + * are only done if enabled by the configuration in usbconfig.h. + */ + + //typedef struct usbRequest{ + // uchar bmRequestType; + // uchar bRequest; + // usbWord_t wValue; + // usbWord_t wIndex; + // usbWord_t wLength; + //}usbRequest_t; + + + +USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) { + + //defined and controled by buffer.c + extern buffer *cur_usb_load_buff; + + //cast incoming data into the the usb setup packet it is + setup_packet *spacket = (void *)data; + + //8 Byte buffer to be used for returning error code and return values + //must be static so V-USB driver can still access after function return + static uint8_t rv[RETURN_BUFF_SIZE]; + //rv[RV_ERR_IDX] contains opcode success/error code + //rv[1-7] available for return data, start with index 1 + //rv[RETURN_BUFF_FIRST_IDX-RETURN_BUFFER_LAST_IDX] + + /* (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data + * block and return the length of the data in 'usbFunctionSetup()'. The driver + * will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The + * driver will then call 'usbFunctionRead()' when data is needed. See the + */ + //by default want to return some portion of the 8 byte rv "return value" + //buffer. If no return data requested from host rlen = 0, so this wouldn't matter + //Some dictionaries/opcodes that want to return larger buffers though + //this function will set usbMsgPtr to point to that larger buffer when supported + //avr-gcc doesn't like this and gives warning + //source/usb.c:64: warning: assignment makes integer from pointer without a cast + //tried casting it to usbMsgPtr + usbMsgPtr = (usbMsgPtr_t)rv; + +//#if USB_CFG_LONG_TRANSFERS +// //number of bytes to return to host +// //16bit meets max possible 16KBytes with V-USB long transfers enabled + //uint16_t rlen = 0; //the speed loss doesn't make long transfers worth it for now +//#else +// //8bit is enough for 254 bit non-long xfrs +// //also gives ~0.7KBps speed up compared to 16bit rlen + uint8_t rlen = 0; +//#endif + + //determine endpoint IN/OUT + if ( (spacket->bmRequestType & ENDPOINT_BIT) == ENDPOINT_IN ) { + //read from device request + //send error code and return value + rlen = 1; //min value of error code + } else { + //write to device request + //host doesn't want to waste time with reading back error codes + rlen = 0; + //must also come here if opcode has payload coming in data packets to follow + //in that case host would have to send follow up read request to get error code + } + + + switch(spacket->bRequest) { + case DICT_PINPORT: + switch (spacket->opcode) { + case PP_OPCODE_ONLY_MIN ... PP_OPCODE_ONLY_MAX: + rv[RV_ERR_IDX] = pinport_opcode_only( spacket->opcode ); + break; + case PP_OPCODE_8BOP_MIN ... PP_OPCODE_8BOP_MAX: + rv[RV_ERR_IDX] = pinport_opcode_8b_operand( + spacket->opcode, spacket->operandLSB ); + break; + case PP_OPCODE_16BOP_MIN ... PP_OPCODE_16BOP_MAX: + rv[RV_ERR_IDX] = pinport_opcode_16b_operand( + spacket->opcode, spacket->operandMSB, spacket->operandLSB ); + break; + case PP_OPCODE_24BOP_MIN ... PP_OPCODE_24BOP_MAX: + rv[RV_ERR_IDX] = pinport_opcode_24b_operand( spacket->opcode, + spacket->miscdata, spacket->operandMSB, spacket->operandLSB ); + break; + case PP_OPCODE_8BRV_MIN ... PP_OPCODE_8BRV_MAX: + rv[RV_ERR_IDX] = pinport_opcode_8b_return( spacket->opcode, &rv[RV_DATA0_IDX]); + rlen ++; + break; + default: //pinport opcode min/max definition error + rv[RV_ERR_IDX] = ERR_BAD_PP_OP_MINMAX; + } + break; //end of PINPORT + + case DICT_IO: + switch (spacket->opcode) { + case IO_OPCODE_ONLY_MIN ... IO_OPCODE_ONLY_MAX: + rv[RV_ERR_IDX] = io_opcode_only( spacket->opcode ); + break; + case IO_OPCODE_RTN_MIN ... IO_OPCODE_RTN_MAX: + rv[RV_ERR_IDX] = io_opcode_return( + spacket->opcode, &rv[RV_DATA0_IDX] ); + rlen = 8; + break; + default: //io opcode min/max definition error + rv[RV_ERR_IDX] = ERR_BAD_IO_OP_MINMAX; + } + break; //end of IO + + case DICT_NES: + switch (spacket->opcode) { + case NES_OPCODE_24BOP_MIN ... NES_OPCODE_24BOP_MAX: + rv[RV_ERR_IDX] = nes_opcode_24b_operand( spacket->opcode, + spacket->operandMSB, spacket->operandLSB, spacket->miscdata ); + break; + case NES_OPCODE_16BOP_8BRV_MIN ... NES_OPCODE_16BOP_8BRV_MAX: + rv[RV_ERR_IDX] = nes_opcode_16b_operand_8b_return( spacket->opcode, + spacket->operandMSB, spacket->operandLSB, &rv[RV_DATA0_IDX]); + rlen++; + break; + default: //nes opcode min/max definition error + rv[RV_ERR_IDX] = ERR_BAD_NES_OP_MINMAX; + } + break; //end of NES + + case DICT_SNES: + switch (spacket->opcode) { + case SNES_OPCODE_24BOP_MIN ... SNES_OPCODE_24BOP_MAX: + rv[RV_ERR_IDX] = snes_opcode_24b_operand( spacket->opcode, + spacket->operandMSB, spacket->operandLSB, spacket->miscdata ); + break; + case SNES_OPCODE_24BOP_8BRV_MIN ... SNES_OPCODE_24BOP_8BRV_MAX: + rv[RV_ERR_IDX] = snes_opcode_24b_operand_8b_return( spacket->opcode, + spacket->miscdata, spacket->operandMSB, spacket->operandLSB, &rv[RV_DATA0_IDX]); + rlen++; + break; + default: //snes opcode min/max definition error + rv[RV_ERR_IDX] = ERR_BAD_SNES_OP_MINMAX; + } + break; //end of SNES + + case DICT_BUFFER: + //just give buffer.c the setup packet and let it figure things out for itself + usbMsgPtr = (usbMsgPtr_t)buffer_usb_call( spacket, rv, &rlen ); + break; //end of BUFFER + + case DICT_USB: + //currently just a simple way to read back usbFunctionWrite status SUCCESS/ERROR + //if there are future status' to read back may have to create some functions + rv[RV_ERR_IDX] = SUCCESS; + rv[RV_DATA0_IDX] = usbWrite_status; + rv[RV_DATA0_IDX+1] = cur_usb_load_buff->last_idx; + rlen = 3; + break; //end of USB + + case DICT_OPER: + //just give operation.c the setup packet and let it figure things out for itself + usbMsgPtr = (usbMsgPtr_t)operation_usb_call( spacket, rv, &rlen ); + break; //end of OPER + + default: + //request (aka dictionary) is unknown + rv[RV_ERR_IDX] = ERR_UNKN_DICTIONARY; + } + + //TODO add check that verifies rlen == setup packet return lenght request + //current state has error checking somewhat embeded in the fact the host + //will detect when return length differs from requested + return rlen; + + //need to return USB_NO_MSG for OUT transfers to make usbFunctionWrite called + + //return USB_NO_MSG; //if want usbFunctionRead called during IN token data packets + //Don't have a use for usbFunctionRead yet.. Not expecting to anytime soon + //probably easier and perhaps faster to send cart dump commands and store rom image + //in a buffer to be returned here. +} + + +//USB_PUBLIC uchar usbFunctionRead(uchar *data, uchar len); +/* This function is called by the driver to ask the application for a control + * transfer's payload data (control-in). It is called in chunks of up to 8 + * bytes each. You should copy the data to the location given by 'data' and + * return the actual number of bytes copied. If you return less than requested, + * the control-in transfer is terminated. If you return 0xff, the driver aborts + * the transfer with a STALL token. + * In order to get usbFunctionRead() called, define USB_CFG_IMPLEMENT_FN_READ + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ +//USB_PUBLIC uchar usbFunctionRead(uchar *data, uchar len) { +// //this function should only get called if usbFunctionSetup returns USB_NO_MSG +// return len; +//} + + +// V-USB description of this function: +//USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len); +/* This function is called by the driver to provide a control transfer's + * payload data (control-out). It is called in chunks of up to 8 bytes. The + * total count provided in the current control transfer can be obtained from + * the 'length' property in the setup data. If an error occurred during + * processing, return 0xff (== -1). The driver will answer the entire transfer + * with a STALL token in this case. If you have received the entire payload + * successfully, return 1. If you expect more data, return 0. If you don't + * know whether the host will send more data (you should know, the total is + * provided in the usbFunctionSetup() call!), return 1. + * NOTE: If you return 0xff for STALL, 'usbFunctionWrite()' may still be called + * for the remaining data. You must continue to return 0xff for STALL in these + * calls. + * In order to get usbFunctionWrite() called, define USB_CFG_IMPLEMENT_FN_WRITE + * to 1 in usbconfig.h and return 0xff in usbFunctionSetup().. + */ + +/* Desc:USB Write routine for OUT transfers + * the V-USB drivers call this function on OUT tokens + * and provide upto 8 byte data packet's payload + * for payloads longer than 8Bytes this gets called multiple times + * until all bytes have been transferred. Real thing to understand + * is that this function gets called once per data packet (max 8bytes) + * based on USB 1.1 low speed standard. + * buffer.c is the govnerning module for what buffer gets filled + * Pre: buffer.c must have set current usb loading buffer with global var + * the current buffer must have enough room for incoming data + * possible to use mutliple buffers for a single transfer, but + * buffer.c must orchestrate the swap to new buffer object. + * buffer.c sets global incoming bytes remain so it can keep + * track of this function's progress + * buffer object must be initialized, allocated, and status USB_LOADING + * Post:usbWrite_status updated with SUCCESS/ERROR number + * incoming data packet copied to cur_usb_load_buff + * global incoming_bytes_remain updated + * cur_usb_load_buff cur_byte updated based on data length + * cur_usb_load_buff status updated when it's full + * Rtn: message to V-USB driver so it can respond to host + */ + +//removing checks from this function speeds up transfers by ~1KBps +//this data is based on doing nothing with data once it arrives +//long transfers disabled, and using 254 byte transfers with 2 bytes stuffed in setup packet +// with checks: 512KByte = 18.7sec = 27.4KBps +// w/o checks: 512KByte = 17.9sec = 28.5KBps +// w/o checks: using 8bit rlen = 17.5sec = 29.2KBps +// with checks: using 8bit rlen = 18sec = 28.3KBps +//#define MAKECHECKS 0 + +USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) { + + //defined and controled by buffer.c + extern buffer *cur_usb_load_buff; + extern uint8_t incoming_bytes_remain; + + uint8_t data_cur = 0; //current incoming byte to copy + uint8_t buf_cur = cur_usb_load_buff->cur_byte; //current buffer byte + uint8_t *buf_data = cur_usb_load_buff->data; //current buffer data array + +#ifdef MAKECHECKS + //check that current buffer's status is USB_LOADING + if (cur_usb_load_buff->status != USB_LOADING) { + usbWrite_status = ERR_OUT_CURLDBUF_STATUS; + return STALL; + } + //check that current buffer's has enough room + if ( ((cur_usb_load_buff->last_idx) + 1 - buf_cur) < len ) { + usbWrite_status = ERR_OUT_CURLDBUF_TO_SMALL; + return STALL; + } +#endif + + //copy 1-8bytes of payload into buffer + while ( data_cur < len ) { + buf_data[buf_cur] = data[data_cur]; + buf_cur++; + data_cur++; + } + +#ifdef MAKECHECKS + //need to account for the fact that cur_byte will roll over being 8bit value + if ( cur_usb_load_buff->last_idx == (cur_usb_load_buff->cur_byte + len - 1) ) { + //this signals to buffer.c so it can update cur_usb_load_buf + //and start tasking this buffer to programming + cur_usb_load_buff->status = USB_FULL; + } +#endif + + + //update counters and status + cur_usb_load_buff->cur_byte += len; + incoming_bytes_remain -= len; + //usbWrite_status = SUCCESS; + + //want this function to be as fast as possible, so buffer.c checks if + //the buffer is full 'behind the scenes' outside of this function. + + + if ( incoming_bytes_remain == 0 ) { //done with OUT transfer + //alternate to MAKECHECKS should be faster but require transfer sizes to match buffer size + cur_usb_load_buff->status = USB_FULL; + return PAYLD_DONE; + } else { //more data packets remain to complete OUT transfer + return NOT_DONE; + } + +} + diff --git a/firmware/source/old/usb.h b/firmware/source/old/usb.h new file mode 100644 index 0000000..422e7c8 --- /dev/null +++ b/firmware/source/old/usb.h @@ -0,0 +1,31 @@ +#ifndef _usb_h +#define _usb_h + +#include + +#include "usbdrv.h" +#include "logic.h" +#include "types.h" +#include "shared_dictionaries.h" +#include "shared_errors.h" +#include "pinport.h" +#include "io.h" +#include "nes.h" +#include "snes.h" +#include "buffer.h" + +#define ENDPOINT_BIT 0x80 //Bit 7 of bmRequest type determines endpoint +#define ENDPOINT_IN 0x80 //In: device-to-host. +#define ENDPOINT_OUT 0x00 //Out: host-to-device. + +//usbFunctionWrite return values +//return 0xFF (-1) "STALL" if error +//return 1 if entire payload received successfully +//return 0 if more data expected to complete transfer +#define STALL 0xFF +#define PAYLD_DONE 1 +#define NOT_DONE 0 + + + +#endif diff --git a/firmware/source/usb.c b/firmware/source/usb.c index 5f47ee9..84042f0 100644 --- a/firmware/source/usb.c +++ b/firmware/source/usb.c @@ -45,17 +45,17 @@ static uint8_t usbWrite_status; USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) { //defined and controled by buffer.c - extern buffer *cur_usb_load_buff; - - //cast incoming data into the the usb setup packet it is - setup_packet *spacket = (void *)data; - - //8 Byte buffer to be used for returning error code and return values - //must be static so V-USB driver can still access after function return - static uint8_t rv[RETURN_BUFF_SIZE]; - //rv[RV_ERR_IDX] contains opcode success/error code - //rv[1-7] available for return data, start with index 1 - //rv[RETURN_BUFF_FIRST_IDX-RETURN_BUFFER_LAST_IDX] +// extern buffer *cur_usb_load_buff; +// +// //cast incoming data into the the usb setup packet it is +// setup_packet *spacket = (void *)data; +// +// //8 Byte buffer to be used for returning error code and return values +// //must be static so V-USB driver can still access after function return +// static uint8_t rv[RETURN_BUFF_SIZE]; +// //rv[RV_ERR_IDX] contains opcode success/error code +// //rv[1-7] available for return data, start with index 1 +// //rv[RETURN_BUFF_FIRST_IDX-RETURN_BUFFER_LAST_IDX] /* (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data * block and return the length of the data in 'usbFunctionSetup()'. The driver @@ -69,7 +69,7 @@ USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) { //avr-gcc doesn't like this and gives warning //source/usb.c:64: warning: assignment makes integer from pointer without a cast //tried casting it to usbMsgPtr - usbMsgPtr = (usbMsgPtr_t)rv; +// usbMsgPtr = (usbMsgPtr_t)rv; //#if USB_CFG_LONG_TRANSFERS // //number of bytes to return to host @@ -81,6 +81,7 @@ USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) { uint8_t rlen = 0; //#endif +/* //determine endpoint IN/OUT if ( (spacket->bmRequestType & ENDPOINT_BIT) == ENDPOINT_IN ) { //read from device request @@ -192,6 +193,7 @@ USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) { //request (aka dictionary) is unknown rv[RV_ERR_IDX] = ERR_UNKN_DICTIONARY; } +*/ //TODO add check that verifies rlen == setup packet return lenght request //current state has error checking somewhat embeded in the fact the host @@ -275,6 +277,7 @@ USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]) { USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) { +/* //defined and controled by buffer.c extern buffer *cur_usb_load_buff; extern uint8_t incoming_bytes_remain; @@ -330,5 +333,8 @@ USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) { return NOT_DONE; } +*/ + + return 0; } diff --git a/firmware/source/usb.h b/firmware/source/usb.h index 422e7c8..bce00ff 100644 --- a/firmware/source/usb.h +++ b/firmware/source/usb.h @@ -4,6 +4,7 @@ #include #include "usbdrv.h" +/* #include "logic.h" #include "types.h" #include "shared_dictionaries.h" @@ -13,6 +14,7 @@ #include "nes.h" #include "snes.h" #include "buffer.h" +*/ #define ENDPOINT_BIT 0x80 //Bit 7 of bmRequest type determines endpoint #define ENDPOINT_IN 0x80 //In: device-to-host.