diff --git a/DAPLink.uvoptx b/DAPLink.uvoptx index f8a3acf..9685e72 100644 --- a/DAPLink.uvoptx +++ b/DAPLink.uvoptx @@ -120,7 +120,7 @@ 0 DLGUARM - d + 0 @@ -135,7 +135,7 @@ 0 JL2CM3 - -U59509350 -O206 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC2000 -FN1 -FF0M481_AP_512.FLM -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM) + -U59607536 -O206 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC2000 -FN1 -FF0M481_AP_512.FLM -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM) 0 @@ -153,40 +153,7 @@ - - - 0 - 0 - 249 - 1 -
2812
- 0 - 0 - 0 - 0 - 0 - 1 - D:\寰帶鍒跺櫒\DAPLink\src\DAP_config.h - - \\DAPLink\src/DAP/DAP.c\249 -
- - 1 - 0 - 1481 - 1 -
4930
- 0 - 0 - 0 - 0 - 0 - 1 - D:\寰帶鍒跺櫒\DAPLink\src\DAP\DAP.c - - \\DAPLink\src/DAP/DAP.c\1481 -
-
+ 0 @@ -246,7 +213,7 @@ APP - 0 + 1 0 0 0 @@ -413,18 +380,6 @@ 0 0 0 - .\src\CSL\NUCM480_StdPeriph_Driver\i2c.c - i2c.c - 0 - 0 - - - 4 - 13 - 1 - 0 - 0 - 0 .\src\CSL\NUCM480_StdPeriph_Driver\pdma.c pdma.c 0 @@ -432,31 +387,7 @@ 4 - 14 - 1 - 0 - 0 - 0 - .\src\CSL\NUCM480_StdPeriph_Driver\retarget.c - retarget.c - 0 - 0 - - - 4 - 15 - 1 - 0 - 0 - 0 - .\src\CSL\NUCM480_StdPeriph_Driver\spi.c - spi.c - 0 - 0 - - - 4 - 16 + 13 1 0 0 @@ -468,7 +399,7 @@ 4 - 17 + 14 1 0 0 @@ -480,7 +411,7 @@ 4 - 18 + 15 1 0 0 @@ -492,7 +423,7 @@ 4 - 19 + 16 1 0 0 @@ -512,7 +443,7 @@ 0 5 - 20 + 17 1 0 0 @@ -524,7 +455,7 @@ 5 - 21 + 18 2 0 0 diff --git a/DAPLink.uvprojx b/DAPLink.uvprojx index 63ac65c..524976c 100644 --- a/DAPLink.uvprojx +++ b/DAPLink.uvprojx @@ -453,77 +453,11 @@ 1 .\src\CSL\NUCM480_StdPeriph_Driver\gpio.c - - i2c.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\i2c.c - pdma.c 1 .\src\CSL\NUCM480_StdPeriph_Driver\pdma.c - - retarget.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\retarget.c - - - 2 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - spi.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\spi.c - sys.c 1 diff --git a/out/DAPLink.bin b/out/DAPLink.bin deleted file mode 100644 index 799ab47..0000000 Binary files a/out/DAPLink.bin and /dev/null differ diff --git a/out/DAPLink.hex b/out/DAPLink.hex deleted file mode 100644 index 384f599..0000000 --- a/out/DAPLink.hex +++ /dev/null @@ -1,927 +0,0 @@ -:020000040000FA -:10000000204E0020ED3600002D3700002F37000075 -:1000100031370000333700003537000000000000A2 -:100020000000000000000000000000003737000062 -:1000300039370000000000003B3700003D3700006A -:100040003F3700003F3700003F3700003F370000D8 -:100050003F3700003F3700003F3700003F370000C8 -:100060003F3700003F3700003F3700003F370000B8 -:100070003F3700003F3700003F3700003F370000A8 -:100080003F3700003F3700003F3700003F37000098 -:100090003F3700003F3700003F3700003F37000088 -:1000A0003F3700003F3700003F3700003F37000078 -:1000B0003F3700003F3700003F3700003F37000068 -:1000C0003F3700003F3700003F3700003F37000058 -:1000D0003F3700003F3700003F3700003F37000048 -:1000E0003F3700003F3700003F3700003F37000038 -:1000F0003F3700003F3700003F3700003F37000028 -:10010000870800003F3700003F3700003F370000FE -:100110003F370000410400003F3700003F37000038 -:100120003F3700003F3700003F3700003F370000F7 -:100130003F3700003F3700003F3700003F370000E7 -:100140003F3700003F3700003F3700003F370000D7 -:100150003F3700003F3700003F3700003F370000C7 -:100160003F3700003F3700003F3700003F370000B7 -:100170003F3700003F3700003F3700003F370000A7 -:100180003F3700003F3700003F3700003F37000097 -:100190003F3700003F3700003F3700003F37000087 -:1001A0003F3700003F3700003F3700003F37000077 -:1001B0003F3700003F370000DFF810D003F0EEFAC1 -:1001C00000480047CD020000AFF30080204E002021 -:1001D00010B500F0ACF84FF08044606B5C4908400B -:1001E0006063606B5B4908436063E06A20F0030072 -:1001F00040F48270E062D4F8200220F0F00040F079 -:100200003000C4F82002544802F0C3F90020C4F8BA -:10021000000100225149524802F036FF00F092F9E5 -:1002200000F0C6FA02F041FFBDE81040352000F0B2 -:1002300073B810B5012211464A4802F0DFFC4FF0B6 -:100240008040816B21F0FF018163816B41F0770178 -:100250008163454C00221146204602F068F9204691 -:1002600002F097F9414C4FF4E131204602F015FDC0 -:10027000616841F013016160BDE81040302000F07A -:100280004BB870B500F053F84FF08044E06D20F4A7 -:100290007F40E065E06D40F42A40E065012002F017 -:1002A00093FB012002F032FA314D284602F045FB63 -:1002B0001121C4F834120021C4F800112D490D6039 -:1002C0002D482E49B5FBF0F0086070BDFFF7D9FF4F -:1002D000FFF7AFFF01F09FF8FFF77AFF214C0122F3 -:1002E00040341146204602F03DFC01220221204606 -:1002F00002F038FC224D1D4C2E1D00F0CAF900F012 -:1003000013FBA06940F34070401C2860A06940F3D3 -:100310000070401C3060F0E700F01F0201219140A6 -:100320004009800000F1E020C0F80011704710B5CE -:100330005921880716228823C0F80011C0F800212F -:10034000C0F80031D0F80041002CF5D010BD0000FD -:10035000FFFF00F00000EE0E1B00004093050000C0 -:100360003438000040400040123C8C7700200740A9 -:1003700000B0710B8001002040420F00840100207A -:100380008048004070B5034601251878072815D02D -:10039000F34C607818B16068A268904210D0F148C0 -:1003A000626800EB82100A46194603F0D3F96068D0 -:1003B000401C60606068102803D004E0EA480570C3 -:1003C00070BD002060606068A1688842F8D16570E7 -:1003D00070BD10B5E5480068E5490844E34C241DAC -:1003E0002168FFF7CFFF4020206010BD10B5DC4C26 -:1003F0002069E168884201D1A078E8B1DD4821692F -:1004000000EB8111D94810380268D94810444022C5 -:1004100000F081F9D54940200C3908602069401C62 -:10042000206121690020102900D120612169E26842 -:10043000914200D1A07010BD0120207010BDD5E701 -:1004400070B5CD4D6C68286900F00F0660070DD5BA -:10045000042068606869C00704D0286940F4FA6025 -:10046000286103E0286920F080002861E00715D0AA -:1004700001206860F00705D0286940F4FA6028611F -:1004800003F0A4F8B00703D5286920F01000286114 -:10049000700703D5286940F4FA602861200701D568 -:1004A00008206860A0074CD5002C10DA4FF00040FF -:1004B0006860AE482438016841F001010160AB4832 -:1004C0001438016841F00101016002F0EEFFE00321 -:1004D00004D54FF48030686003F013F8A0030DD505 -:1004E0004FF40030686003F052F8A44841782029A6 -:1004F00004D10079012801D100F077F9600304D517 -:100500004FF480206860FFF79AFF200304D54FF472 -:1005100000206860FFF75DFFE00202D54FF4801015 -:100520006860A00204D54FF40010686000F02EF956 -:10053000600206D54FF480006860BDE8704000F0AE -:100540002AB970BD8C490020886188494FF4107029 -:10055000283908608549082030390860834A4FF4FB -:100560000871183A11608149203908607F4941209B -:10057000083908607D494820103908607B492120EE -:10058000083108607949882008604020091D08600A -:1005900070477CB5684602F09AFD9DF80000784CE3 -:1005A0000006A4F1040529D59DF80100012809D011 -:1005B000022807D0032805D0212807D0002000F00A -:1005C000B9F87CBD002000F0B5F87CBD9DF80400B2 -:1005D000012808D16A48083800686549072208449C -:1005E000684900F098F8206840F0800020600720FB -:1005F00028600021084602F06FFD7CBD9DF80100D7 -:1006000000260B2820D004DC09280AD00A2804D1AF -:1006100014E020282FD022281AD0002000F08AF8D9 -:100620007CBD9DF803000328FAD1554810300168BD -:1006300041F080010160001F06607CBD206840F031 -:10064000800020602E607CBD002000F073F87CBD2F -:100650009DF80400012808D19DF802009DF80310C0 -:1006600040EA01204849A1F80C04206840F08000CD -:1006700020602E607CBD9DF80400012803D1072175 -:10068000404802F029FD206840F0800020602E6084 -:100690007CBD70B5324CA0686168884201D1607839 -:1006A000B0B3344DE068A26805EB80112D4800EB33 -:1006B000821000F023FEA068401C102800D100200A -:1006C000A060A16862680020914200D1607021782A -:1006D00081B12070E06805EB801124481038006873 -:1006E000234A1044402200F016F8204940200C39DB -:1006F00008600BE0E068401C102800D10020E0609A -:10070000E0682169884201D10120A070012070BDFC -:10071000FFE70020FBE718B50023009306E0009BED -:10072000009CCB5C0355009B5B1C0093521E531C2A -:10073000F5D118BD0021124B03EB0112126802F033 -:100740000F02824208D10E48001D00EB0110016823 -:1007500041F0020101607047491C0C29ECD370473D -:1007600010010020AC0100202B01002030050C40BE -:1007700000010C40AC05002000000C407801002076 -:1007800008050C4024010020AC090020BB490020D2 -:10079000A1F84E047047BA480168BA488180B84948 -:1007A000091F0968B84A114401600121C1807047DE -:1007B000B34942201C390860B149C8202439086077 -:1007C000AF4943200C390860AD49D0201439086086 -:1007D000AB492320091D0860A9494FF48870091FFF -:1007E00008604020091D08607047F8B5A74D4FF418 -:1007F0008034C5F88041A649002008804880888060 -:10080000A1F80602A1F80802A1F80A02A1480321F2 -:100810008160A14EB17905290ED006290ED0072995 -:100820000ED008290ED003227179052916D2DFE8EF -:1008300001F00B0D0F1113000022F5E70122F3E781 -:100840000222F1E70322EFE7002308E0082306E095 -:10085000182304E0282302E0382300E00023317944 -:1008600059B101290BD002290BD000210091316828 -:1008700002F0AFFAC5F80041F8BD0021F6E7042107 -:10088000F4E70421F2E770B5824BD8697B4AC007D0 -:100890004FF400754FF000041AD1D869C00617D480 -:1008A00019E01868C1B2B2F80002A84210D2B2F83A -:1008B0000402461CA2F804621154B2F80402A842D1 -:1008C00001D3A2F80442B2F80002401CA2F80002D0 -:1008D00098694004E5D5D86980071FD5B2F80604A9 -:1008E000E8B1B2F80604102816DB102014E0B2F8C4 -:1008F00008144E1CA2F80864114491F806121960FD -:10090000B2F80814A94201D3A2F80844B2F80614B8 -:10091000491EA2F80614401E0028E8D170BD586890 -:1009200020F00200586070BD2DE9F841534AB2F83A -:100930004E0400244FF40075002844D1B2F80002A0 -:100940004F4E103ED0B3B2F80002402800DD4020E8 -:1009500000210FE0B2F802325F1CA2F80272D35CF1 -:10096000571887F80E34B2F80232AB4201D3A2F81E -:100970000242491C8142EDDB72B6B2F80012091A3C -:10098000A2F8001262B6A2F84E043D491439096873 -:100990003D4B01EB030C3B4B0146423B009408E00E -:1009A000009FDDF80080DF5D0CF80870009F7F1C61 -:1009B0000097491E4F1CF3D1306004E0FFE7306818 -:1009C000402800D13460B2F8560478B3B2F8540429 -:1009D000B2F80614C1F50071884227DC002011E04E -:1009E000D2F850140E5CB2F80A144B1CA2F80A3468 -:1009F000114481F80662B2F80A14A94201D3A2F8A0 -:100A00000A44401CB2F854148142E9DC72B6B2F8D0 -:100A10000604B2F854140844A2F8060462B6A2F818 -:100A20005444A2F85644164940200860B2F806041F -:100A3000002821D01749486880071DD4B2F808045F -:100A4000431CA2F80834104490F806020860B2F87B -:100A50000804A84201D3A2F80844012080F31088BA -:100A6000B2F80604401EA2F80604002080F31088A5 -:100A7000486840F002004860BDE8F881AC090020F9 -:100A800064050C40FC0D002000010C4004E000E077 -:100A9000AC0B0020002007402401002070B54FF06F -:100AA000402501220221284602F05CF8FE4901247B -:100AB0000C6001221146284602F054F8FA49091F39 -:100AC0000C6001220421284602F04CF82846BDE8BB -:100AD00070400122042102F045B810B54FF04024C7 -:100AE00000220221204602F03DF820460022BDE807 -:100AF0001040012102F036B8EFE710B5EB49EC48A1 -:100B000001F021F9012010BD0022062824D006DCC6 -:100B1000052821D2DFE800F0202020200C00F0285A -:100B20000DD0FD2818D0FE2813D0FF2814D10AE0DC -:100B3000E04802680A600079087105220CE0112083 -:100B40000870012208E0402008700020487002224E -:100B500002E0102008700122104670474FF47A41DD -:100B60004843401EFDD170470278407842EA002099 -:100B70008001401EFDD10870CF48704710B5CA4BA8 -:100B800002781B1DCC4C002A05D0012A08D0FF207A -:100B90000870204610BD407800F00100186003E0A6 -:100BA000407800F00100186000200870204610BD59 -:100BB00070B50D460478002C00D10124012C04D01E -:100BC00000242C704FF0011070BDBC49012008704A -:100BD000FFF764FFF5E770B50446B84900250D70CE -:100BE000FFF77BFF2570012070BD10B50446FFF7AD -:100BF00084FF607000202070022010BD2DE9F047B6 -:100C00008946057844788178C27841EA02260179DC -:100C10004079090441EA00600643DFF88C82E1076D -:100C20004FF001004FF0000706D0E90702D0C8F8E6 -:100C3000000001E0C8F80070DFF884A2A10706D523 -:100C4000A90702D5CAF8000001E0CAF80070200622 -:100C500005D5E80918B99549954801F074F876B3B7 -:100C60009848864200D906464FF0E0218F6106EB96 -:100C700046008001486105200861E00703D0D8F8EC -:100C80000000A84215D1A00704D5DAF80000B0EBA7 -:100C9000550F0ED1600702D5B7EB950F09D1A0060D -:100CA00002D5B7EB551F04D1200607D5B7EBD51FEA -:100CB00004D00869C0F300400028DED00F61D8F8E6 -:100CC0000000DAF8001040EA410089F800007E4890 -:100CD000BDE8F08730B50278437842EA0322837892 -:100CE000C0781B0443EA006002437848002A08D019 -:100CF000774D0024714BAA4206D301225A705A60E4 -:100D00000FE0FF220A7030BD5C70724D1544B5FBD8 -:100D1000F2F2022A03D90325B2FBF5F200E0012228 -:100D20005A600C7030BD70B50D4610F8014B01468D -:100D3000002C01D14FF48074204600F07FFB00208E -:100D40002870E41DE008401C0004401C70BD0078C1 -:100D50005A4A00F003035B1C1375C0F38000507502 -:100D6000002008704FF00110704710B5FF220A7084 -:100D70000122012410F8013B0AE010F8011B01F0E8 -:100D80003F0101B94021C91DC90808440A44521C49 -:100D90005B1E591CF1D1204662F31F4010BD007844 -:100DA000FF220A70401C0004401C7047FF2008709E -:100DB0004FF00110704710B5404A03781372437822 -:100DC000847843EA04235381C378007943EA0020FE -:100DD000908100200870404810BD2DE9F04F87B089 -:100DE000044606940020049005918D1CDFF8ECA0C9 -:100DF00000218AF80010002703916678A41C002EB9 -:100E000051D014F8018B5FEA887169D587B32B48FC -:100E1000B0F80A9008F0110001280DD101A9404650 -:100E200000F0A7FD022815D1B9F1010912D39AF8F3 -:100E300000100029F2D00DE001A90E2000F099FD6C -:100E4000022806D1B9F1010903D39AF8001000294C -:100E5000F2D00027012826D1019929700199090AA9 -:100E600069700199090CA9700199090EE9702D1D8D -:100E70005FEAC8616ED520786178E27840EA0120A7 -:100E8000A178090441EA026108430290241D0B483D -:100E9000B0F80CB05FEAC87030D00848B0F80A90DB -:100EA000002140461DE0A7E0044800400400FA0588 -:100EB0000CED00E05038000001000200040E00209C -:100EC00000480040C0C62D000100060001000400DB -:100ED000006CDC02FFD7B805010005002B010020E3 -:100EE0006EE000F046FD022806D1B9F1010903D3F6 -:100EF0009AF800100029D3D001287DD1F948B0F824 -:100F00000A9001A9404600F034FD022806D1B9F14B -:100F1000010903D39AF800100029F2D001280DD15D -:100F2000F049019A09691140029A914206D0BBF139 -:100F3000010B03D39AF800100029DFD0E949019A88 -:100F400009691140029A914201D040F01000012835 -:100F500052D132E0E349B1F80A905FEAC87111D08A -:100F60005FBB0021404600F004FD022806D1B9F124 -:100F7000010903D39AF800100029F2D0012872D198 -:100F800001271AE001A9404600F0F3FC022806D12F -:100F9000B9F1010903D39AF800100029F2D0012811 -:100FA00061D1019929700199090A69700199090CA7 -:100FB000A9700199090EE9702D1D0021039148E0E7 -:100FC00007B3C848B0F80A9001A90E2000F0D1FC80 -:100FD000022806D1B9F1010903D39AF800100029BB -:100FE000F2D001283FD1019828700198000A68705A -:100FF0000198000CA87000E035E00198000EE87040 -:101000002D1D002720786178E27840EA0120A17840 -:10101000090441EA026108430190241D5FEA8861E6 -:1010200003D5B0490861012013E0AE48B0F80A903A -:1010300001A9404600F09DFC022806D1B9F1010942 -:1010400003D39AF800100029F2D001280BD1012116 -:1010500003910499491C04919AF8001019B9761E5D -:10106000002E7FF4CEAE5EB114F8011B8A0703D5C3 -:10107000C90602D5241D00E0241D761E002EF3D1E2 -:1010800001282FD1EFB19748468901A90E2000F021 -:1010900070FC022806D1761E711C03D09AF800104D -:1010A0000029F2D001281DD1019929700199090A5E -:1010B00069700199090CA9700199090EE9702D1D3B -:1010C00010E0039971B18748468900210E2000F095 -:1010D00050FC022806D1761E711C03D09AF800102D -:1010E0000029F2D0DDE904121170059948700598C5 -:1010F000291A069807B0201A41EA0040BDE8F08F8F -:1011000030B504464278801C002A0BD010F8013B11 -:101110009D0703D5DB0602D5001D00E0001D521E11 -:10112000002AF3D100220A704A70001B0004801CC0 -:1011300030BD6C4A1278012A00D0E1E74DE62DE976 -:10114000F84F0446002600208946CF1CDFF898A1FE -:1011500000218AF80010641C2178627841EA022597 -:10116000A41C002D74D014F8018BDFF878B15FEA6D -:1011700088715BD55FEAC87135D0BBF80A400021A1 -:10118000404600F0F6FB022806D1641E611C03D025 -:101190009AF800100029F2D0012859D123E025B98E -:1011A0005FEAC87001D04FF00E08BBF80A406946EC -:1011B000404600F0DEFB022806D1641E611C03D00D -:1011C0009AF800100029F2D0012841D10099397015 -:1011D0000099090A79700099090CB9700099090EF3 -:1011E000F9703F1D761C6D1E691CD8D130E0207847 -:1011F0006178E27840EA0120A178090441EA0261BD -:1012000008430090241D3748B0F80AB069464046AC -:1012100000F0AFFB022806D1BBF1010B03D39AF813 -:1012200000100029F2D0012812D1761C6D1E681C16 -:10123000DDD12C48448900210E2000F09AFB0228C1 -:1012400006D1641E611C03D09AF800100029F2D068 -:1012500089F80060310A89F8011089F80200A7EBCB -:101260000900BDE8F88F10B504461E480078012833 -:101270000AD000200870487088700320E178890740 -:1012800006D540F4802010BD2046FFF758FFF5E753 -:101290006178A27841EA0221042202EB810140EA4E -:1012A000014010BD38B50C464178827841EA0222EF -:1012B000C1780079090441EA00600243009269465E -:1012C000002000F056FB00202070012038BD10B532 -:1012D000044A1278012A09D0FF200870012040F446 -:1012E000A02010BD040E00202B010020FFF7DAFF24 -:1012F000F5E7FF2008704FF00110704710B5027835 -:10130000A2F180031F2B02D8FFF7F3FFE9E701F8F2 -:10131000012B0C4610F8011B172957D2DFE801F00A -:101320000C14181C44484C565020245656565656F9 -:10133000282C3034383C40000078611CFFF7E4FB77 -:10134000207000F10210CCE72146FFF717FC3AE0CD -:101350002146FFF72DFC36E02046FFF73CFC32E04B -:101360002146FFF701FC2EE02046FFF73EFC2AE075 -:101370002146FFF743FC26E02146FFF7ABFC22E0C5 -:101380002146FFF7D0FC1EE02146FFF7E0FC1AE003 -:101390002146FFF7EAFC16E02146FFF700FD12E0C8 -:1013A0002146FFF703FD0EE02146FFF704FD0AE0AA -:1013B0002146FFF7BEFE06E02146FFF754FF02E09C -:1013C0002146FFF784FF00F101108AE7FF2004F8AF -:1013D000010C4FF0011084E72DE9F04102787F2ADB -:1013E00002D0BDE8F04189E70A704478851C4C7052 -:1013F0008E1C4FF0021708E031462846FFF77EFFAB -:10140000074405EB104580B20644641E601CF3D10E -:101410003846BDE8F081084800210170417016226D -:101420004260017264224281818101610122027560 -:101430004175FFF761BB0000040E00202DE9F0416B -:1014400000220023FF4CFE4E00274FF0010C06F156 -:101450000408656815E013B911F8012B0823D407B7 -:1014600002D0C6F800C000E03760C8F800702C4613 -:10147000641EFDD1C8F800C02C46641EFDD1520880 -:101480005B1E401E441CE6D1BDE8F0812DE9F05FF3 -:10149000834689460120DFF8A883C8F8000008F1D8 -:1014A000040500262E6001272F60C8F800B02E60CA -:1014B0002F604FEA5B00C8F800002E602F600BEB36 -:1014C00000014FEA9B00C8F800002E602F60014425 -:1014D0004FEADB00C8F800002E602F600844C8F80F -:1014E00000002E602F60C8F800602E602F60C8F8E2 -:1014F00000702E602F60002201214FF0402001F08B -:1015000031FBDFF840A39AF81410080004D02E60D5 -:101510002F60491E0029FAD12E60D8F800102F60E4 -:101520002E60D8F800202F6041EA42022E60D8F8E1 -:1015300000102F6042EA8104012C12D0022C62D0EC -:10154000042C60D0213020B12E602F60401E002876 -:10155000FAD100F014FA0120C8F80000E0B2BDE8AA -:10156000F09F5FEA8B7125D50022002120202E609C -:10157000D8F800302F601944520842EAC372401E66 -:101580000028F4D12E60D8F800002F604140C80731 -:1015900000D00824B9F1000F01D0C9F800209AF852 -:1015A000140020B12E602F60401E0028FAD100F0F8 -:1015B000E6F918E020B12E602F60401E0028FAD115 -:1015C00000F0DDF9D9F8000000222021C8F8000061 -:1015D0002E602F6002444008491E0029F6D1C8F849 -:1015E00000202E602F609AF8080038B10021C8F85A -:1015F00000102E602F60401E0028FAD10120C8F88C -:101600000000E0B2ABE79AF8151041B15FEA8B71C8 -:1016100005D521212E602F60491E0029FAD120B165 -:101620002E602F60401E0028FAD100F0A8F99AF829 -:10163000150058B15FEA8B7008D40020C8F800008C -:1016400021202E602F60401E0028FAD10120C8F80A -:101650000000E0B283E72DE9F05F82468B4600226E -:101660000120774E3060371D4FF00008C7F800802A -:10167000DFF8D091D9F804000146491EFDD10124BC -:101680003C600146491EFDD1C6F800A0C7F80080A5 -:101690000146491EFDD13C600146491EFDD102EBC9 -:1016A0000A034FEA5A023260C7F800800146491E19 -:1016B000FDD13C600146491EFDD113444FEA9A0218 -:1016C0003260C7F800800146491EFDD13C600146EA -:1016D000491EFDD113444FEADA023260C7F8008098 -:1016E0000146491EFDD13C600146491EFDD19918B5 -:1016F0003160C7F800800146491EFDD13C600146BB -:10170000491EFDD13160C7F800800146491EFDD158 -:101710003C600146491EFDD101213160C7F80080BF -:101720000146491EFDD13C60401EFDD10022012131 -:101730004FF0402001F016FA99F8143019000DD03E -:10174000D9F80450C7F800802846401EFDD13C60FF -:101750002A46521EFDD15B1E002BF3D1C7F8008034 -:10176000D9F804000246521EFDD132683C6003469F -:101770005B1EFDD1C7F8008003465B1EFDD13368B8 -:101780003C6005466D1EFDD142EA4302C7F8008069 -:1017900003465B1EFDD133683C6005466D1EFDD1DE -:1017A00042EA8305012D17D0022D7DD0042D7BD078 -:1017B000213159B1C7F800800246521EFDD13C606C -:1017C0000246521EFDD1491E0029F3D100F0D7F880 -:1017D00001203060E8B2C2E65FEA8A7243D54FF07A -:1017E000000C00232022C7F800800146491EFDD1CD -:1017F000D6F800A03C600146491EFDD153444FEA93 -:101800005C0141EACA7C521E002AECD13A46C7F874 -:101810000080CE460146491EFDD131681460401E4D -:10182000FDD14B40D80700D00825BBF1000F01D0F7 -:10183000CBF800C09EF8143093B1DEF804C003E08A -:1018400000480040040E0020C2F800806046401EA0 -:10185000FDD114606146491EFDD15B1E002BEED107 -:1018600000F08DF831E059B1C7F800800246521EF1 -:10187000FDD13C600246521EFDD1491E0029F3D124 -:1018800000F07DF8DBF800004FF0000C2023D9F8C1 -:1018900004203060C7F800801146491EFDD13C602D -:1018A0001146491EFDD100E026E0844440085B1E3D -:1018B000002BEED1C6F800C03946C7F800801046AC -:1018C000401EFDD10C60521EFDD199F8081079B16F -:1018D00000203060D9F80420C7F800801046401E70 -:1018E000FDD13C601046401EFDD1491E0029F3D1B8 -:1018F00001203060E8B232E699F815207AB15FEA4B -:101900008A720CD52123C7F800800246521EFDD1F1 -:101910003C600246521EFDD15B1E002BF3D159B133 -:10192000C7F800800246521EFDD13C600246521E9E -:10193000FDD1491E0029F3D100F021F899F81500D6 -:1019400098B15FEA8A7010D4002030602121D9F864 -:101950000420C7F800801046401EFDD13C601046B0 -:10196000401EFDD1491E0029F3D101203060E8B2AC -:10197000F5E5064A5278002A00D087E56BE6012299 -:1019800011464FF0402001F0EDB80000040E002099 -:1019900070B54FF0402501220221284601F0E2F8FF -:1019A000FD4901240C6001221146284601F0DAF8B5 -:1019B000F949091F0C6001220421284601F0D2F8E0 -:1019C0002846BDE870400122042101F0CBB810B5D3 -:1019D0004FF0402400220221204601F0C3F82046A7 -:1019E0000022BDE81040012101F0BCB8EB494FF4E2 -:1019F0007A620968B1FBF2F14143002001E000BFC7 -:101A0000401C8842FBD3704710B5002305E0DC0082 -:101A100021FA04F4C4545B1CDBB29342F7D310BD2B -:101A200070B505460E46002431462846FFF7A1FF53 -:101A3000022803D1641CE4B20A2CF5D370BD10B5A2 -:101A4000FFF7E9FCFFF7A4FF012010BD10B5FFF779 -:101A5000BEFF012010BD38B50C4600F00C00801C04 -:101A60006946FFF7DDFF002222609DF8031042EA7D -:101A7000016121609DF8022041EA024121609DF848 -:101A8000012041EA022121609DF8002011432160DC -:101A9000012800D0002038BD38B5082806D1C04A3A -:101AA00013688B4201D1012038BD116000F00C0495 -:101AB00004226846FFF7A8FF69462046FFF7B0FFFB -:101AC0000128F1D0002038BD38B505460C4605F098 -:101AD0007F4105F0F00001430820FFF7DDFF18B358 -:101AE00005F00C05ED1C69462846FFF799FF69468D -:101AF0002846FFF795FF002222609DF8031042EA76 -:101B0000016121609DF8022041EA024121609DF8B7 -:101B1000012041EA022121609DF80020114321604B -:101B2000012800D0002038BD002038BD38B504465B -:101B30000D4604F07F4104F0F00001430820FFF758 -:101B4000ABFF08B14CB901E0002038BD94484168B2 -:101B5000A94201D1012038BD456004F00C04641C89 -:101B6000042229466846FFF74FFF69462046FFF7E3 -:101B700057FF012801D0002038BD0E200021FFF7BB -:101B80004FFF0128F8D0002038BDF8B507460D46B4 -:101B9000002A13D0960883490020FFF7C7FF78B1C9 -:101BA0000524042239466846FFF72EFF6946204681 -:101BB000FFF736FF012805D00020F8BD0020F8BD52 -:101BC0000020F8BD0D27002409E029463846FFF71C -:101BD00027FF012801D00020F8BD2D1D641CB44250 -:101BE000F3D30E200021FFF71BFF0128F4D00020C3 -:101BF000F8BDF8B507460D46002A13D09608694986 -:101C00000020FFF793FF78B1052404223946684687 -:101C1000FFF7FAFE69462046FFF702FF012805D0CC -:101C20000020F8BD0020F8BD0020F8BD0F270021DE -:101C30003846FFF7F5FE012801D00020F8BD00244A -:101C4000761E09E029463846FFF7EAFE012801D052 -:101C50000020F8BD2D1D641CB442F3D30E2029468C -:101C6000FFF7DEFE0128F4D00020F8BD1CB50C46BD -:101C70000146042201A8FFF7C7FE052001A9FFF7CE -:101C8000CFFE012801D000201CBD0F206946FFF7C0 -:101C9000C7FE012801D000201CBD0E206946FFF7B9 -:101CA000BFFE002222609DF8031042EA016121601C -:101CB0009DF8022041EA024121609DF8012041EA9D -:101CC000022121609DF80020114321600128E3D00A -:101CD00000201CBD38B50C46014604226846FFF7BB -:101CE00093FE05206946FFF79BFE012801D00020E6 -:101CF00038BD042221466846FFF786FE0D2069465E -:101D0000FFF78EFE012801D0002038BD0E200021F3 -:101D1000FFF786FE012801D0002038BD012038BD24 -:101D200070B504460D461F490020FFF7FFFE30B195 -:101D300029462046FFF79AFF18B1012070BD002008 -:101D400070BD002070BD70B504460D4615490020D9 -:101D5000FFF7ECFE30B129462046FFF7BBFF18B174 -:101D6000012070BD002070BD002070BD38B5054653 -:101D70000C460C490020891EFFF7D8FEA0B1694629 -:101D80002846FFF773FF88B1A807C20E0098D0401D -:101D90002070012038BD0000044800408001002070 -:101DA00030010020520000230020F3E70020F1E77B -:101DB00070B505460C46F7490020FFF7B7FE48B15D -:101DC000A807C00E04FA00F12846FFF783FF18B1F8 -:101DD000012070BD002070BD002070BD2DE9F041D4 -:101DE00005460E46144607E031462846FFF7BEFF7B -:101DF00040B16D1C761C641E0CB1A807F4D1DFF84D -:101E0000988314E00020BDE8F081D8F80000411E5E -:101E10002940471ABC4201D224F003073A46314612 -:101E20002846FFF7E6FE28B13D443E44E41B032C60 -:101E3000EBD809E00020E6E731462846FFF796FF99 -:101E400030B16D1C761C641E002CF5D10120DAE740 -:101E50000020D8E72DE9F04105460E46144607E07C -:101E600031782846FFF7A4FF40B16D1C761C641E34 -:101E70000CB1A807F4D1DFF8208313E00020C2E7FB -:101E8000D8F80000411E2940471ABC4201D224F074 -:101E900003073A4631462846FFF777FE28B13D440E -:101EA0003E44E41B032CEBD809E00020ABE731787B -:101EB0002846FFF77DFF30B16D1C761C641E002C98 -:101EC000F5D101209FE700209DE773B50646002469 -:101ED0006425B2480199FFF736FF48B1AF4846F490 -:101EE0008031001FFFF72FFF20B1AC4E083E10E0FD -:101EF00000207CBD00207CBD01A93046FFF710FF0B -:101F000020B10198C00303D501207CBD00207CBD19 -:101F1000641CAC42F0DB00207CBD38B505460021D6 -:101F20000820FFF7B9FD70B30024204655F82410AF -:101F3000FFF7CBFF40B3641C042CF6D30920696A79 -:101F4000FFF7C3FF28B30D24204655F82410FFF7F0 -:101F5000BCFF00B3641C102CF6D31020296CFFF7D3 -:101F6000B4FFD0B18D488E490838FFF7ECFEB0B110 -:101F700069460420FFF76FFD98B1009810F0A00F9C -:101F800011D0002006E700E001E0002002E7002079 -:101F900000E70020FEE60020FCE60020FAE6002034 -:101FA000F8E60020F6E60120F4E62DE9F0410E46C1 -:101FB0000024642501467948001FFFF7C4FE10B1D4 -:101FC000764F083F0AE000201DE731463846FFF70C -:101FD000A7FE48B13068C00302D4641CAC42F4DBF5 -:101FE000AC4203D100200EE700200CE731466B48DD -:101FF000FFF796FE08B1012005E7002003E7F8B5DA -:10200000684D0024654E083E0CE069463046FFF7F7 -:1020100087FE20B10098800303D50120F8BD002081 -:10202000F8BD641CAC42F0D30020F8BD2DE9F043AC -:1020300091B00446DDE91878894615461E464421CC -:10204000684601F0A0FB009501960297CDF80C8040 -:1020500060680990A0680D9020680E90CDF83C90C3 -:102060004FF0807010906846FFF757FF68B1FFF798 -:10207000C6FF60B169460020FFF797FF48B100989E -:1020800048B1002011B0BDE8F0830020FAE700203D -:10209000F8E70020F6E70120F4E71CB500206A46C7 -:1020A000FF211154401CC0B20828FAD369463320DE -:1020B000FFF7C4F901201CBD08B58DF80000000A27 -:1020C0008DF8010069461020FFF7B8F9012008BD1E -:1020D0001CB504460020019001A90820FFF7AEF9C5 -:1020E00069460020FFF7B7FC012801D000201CBD85 -:1020F0009DF800009DF803109DF8012040EA016062 -:102100009DF80210090441EA0221084320600120E1 -:102110001CBD08B500200090FFF7BFFF68B14EF26C -:102120009E70FFF7C9FF50B1FFF7B7FF48B168468F -:10213000FFF7CEFF38B1012008BD002008BD002008 -:1021400008BD002008BD002008BDF8B500200090A3 -:10215000002464251049401E091D08604860FFF7EF -:102160006EFCFFF7D6FF90B11E210020FFF794FC14 -:10217000D0B100210820FFF78FFCB8B14FF0A0418B -:102180000420FFF789FC98B14FF020461CE00020A6 -:10219000F8BD0000500000232C010020F8ED00E005 -:1021A00001005FA040420F000020F1E70020EFE7B0 -:1021B0000020EDE769460420FFF74DFC50B100997F -:1021C00036EA010002D0641CAC42F3DBAC4203D11E -:1021D0000020DDE70020DBE7C9490420FFF75CFCB5 -:1021E00030B100210820FFF757FC18B10120CFE7DC -:1021F0000020CDE70020CBE7002806D1C1480168C8 -:10220000C14A01F4E06111439DE57047F8B5054608 -:102210000224062D01D0FFF712FCBC49B94E4F1C19 -:10222000E436072D7DD2DFE805F00417085D6387EB -:10223000A2000120FFF7E0FF95E00120FFF7DCFF9F -:102240001420FFF7D3FB0020FFF7D6FF1420FFF781 -:10225000CDFBFFF7FBFB86E0FFF777FF08B13546C4 -:1022600013E0002094E7641E64B2002C01DC00201F -:102270008EE70120FFF7C0FF1420FFF7B7FB002017 -:10228000FFF7BAFF1420FFF7B1FB39462846FFF7E6 -:102290005AFD0028E7D09B4C0121F0342046FFF77F -:1022A00052FDC8B10120FFF7A7FF1420FFF79EFBE6 -:1022B0000020FFF7A1FF1420FFF798FB694628468E -:1022C000FFF72EFD50B100988003F7D5002120467E -:1022D000FFF739FD20B146E0002059E7002057E71D -:1022E000002055E73046FFF72EFD78BB00204FE772 -:1022F000FFF70FFFB0B11E210020FFF7CDFB98B113 -:1023000000210820FFF7C8FB80B14FF0A041042056 -:10231000FFF7C2FB60B139463046FFF714FD48B104 -:1023200021E02AE0002033E7002031E700202FE7FA -:1023300000202DE700202BE7FFF707FF38B1734996 -:102340003046C91CFFF7FFFC18B104E00BE0002089 -:102350001EE700201CE769463046FFF7E1FC20B18C -:1023600000988003F7D5012012E7002010E73046DF -:10237000FFF7E9FC18B1FFF769FB002008E7002030 -:1023800006E7F8B50446062C01D0FFF758FB5F4E70 -:102390005C4DF61CF11EE435072C7DD2DFE804F01D -:1023A00004170860668CA6000120FFF725FF99E05E -:1023B0000120FFF721FF1420FFF718FB0020FFF793 -:1023C0001BFF1420FFF712FBFFF740FB8AE0FFF72B -:1023D000BCFE30B12C4631462046FFF7B4FC10B1AC -:1023E00003E00020D4E60020D2E669462046FFF74D -:1023F00097FC48B300988003F7D5424D0121F03592 -:102400002846FFF7A0FC08B33E4E69463046FFF76A -:1024100087FCE8B1009800F4E0613B480143304696 -:10242000FFF791FCB0B11420FFF7E0FA69462046AF -:10243000FFF776FC80B100988003F7D5002128468D -:10244000FFF781FC50B14DE00020A1E600209FE69F -:1024500000209DE600209BE6002099E6002097E6FC -:102460002846FFF770FC80BB002091E6FFF751FE85 -:10247000C0B11E210020FFF70FFBA8B100210820EA -:10248000FFF70AFB90B14FF0A0410420FFF704FBD7 -:1024900070B11E49491C00E02EE02846FFF753FCAE -:1024A00040B11FE0002073E6002071E600206FE6D7 -:1024B00000206DE600206BE6FFF747FE30B13146A5 -:1024C0002846FFF740FC18B104E00BE000205FE66F -:1024D00000205DE669462846FFF722FC20B10098FF -:1024E0008003F7D5012053E6002051E62846FFF788 -:1024F0002AFC18B1FFF7AAFA002049E6002047E6B7 -:10250000000F00500CED00E00400FA0500005FA091 -:1025100000F01F0201219140C943F84A800F02EBED -:10252000800002680A4002607047F548F0E770B525 -:1025300010F47F3F14D0C0F38143022B23D06FEA05 -:102540009044A40722D0ED4C1C3404EB83031C6898 -:10255000C0F38725C0F34416B540AC4314431C6058 -:10256000420E52070ED0E54BC0F301720C3303EB61 -:1025700082021468C0F34263C0F3045083409C435A -:102580000C43146070BDDD4B2833E0E7DB4B2C338C -:10259000DDE700F01F0201219140D84A800F02EBD5 -:1025A000800002680A430260704710B5044641EAA1 -:1025B0004210D24940F010005C310860D04B184600 -:1025C000FFF7E7FF2146BDE8104000221846AEE7BE -:1025D000CC48016841F004010160C848001F01684F -:1025E00041F08001016030BF7047C648016821F0AA -:1025F00004010160C148001F016821F080010160F1 -:1026000030BF7047BD48001F0068C00701D0BE48FA -:10261000704700207047B948001F0068800702D546 -:102620004FF4004070470020704710B501F00CF8DF -:102630004FF08041D1F834024207B44819D0D1F8A4 -:10264000342202F00702012A15D0D1F8342202F018 -:102650000702022A12D0D1F8342202F00702032A1C -:102660000FD0D1F8341201F0070104290CD0006812 -:1026700010BD006810BD0068400810BD00688008EB -:1026800010BD0068C00810BD0068000910BD10B57D -:1026900000F0DAFF4FF08041D1F8340210F0700FF3 -:1026A0009A4819D0D1F83422C2F30212012A15D067 -:1026B000D1F83422C2F30212022A12D0D1F8342205 -:1026C000C2F30212032A0FD0D1F83412C1F302115F -:1026D00004290CD0006810BD006810BD00684008D7 -:1026E00010BD0068800810BD0068C00810BD0068FB -:1026F000000910BD10B500F0A7FF8448006810BDA8 -:1027000010B500F0A1FF8148006810BD30B5054646 -:102710007F490124A20705E0081EA1F1010101DCA7 -:10272000002404E0D2F8503235EA0300F4D1204608 -:1027300030BD2DE9F04107460E46704C241F206D38 -:1027400000F01005206840F0040020601020FFF722 -:10275000DDFF206940F007002061206A20F00F02B1 -:1027600032432262206920F0070139432161A4F538 -:10277000007400F069FF002D05D1D4F8000220F0AC -:102780000400C4F80002BDE8F08108B5002061A192 -:102790000968009159493C31096811F4A02F13D1FF -:1027A00059488A0310D4C1F381321DF80220C1F3C5 -:1027B0000800801CC1F34421491C574B584311FBAE -:1027C00002F1B0FBF1F0C00008BD4C483C3001689C -:1027D00041F48031016070472DE9F84F04460D4601 -:1027E000FFF7F3FFDFF8209104B34448001F0168AE -:1027F00041F0040101601020FFF788FF4FF4002032 -:10280000009046484649284488426BD84FF0FF3133 -:1028100000274FF000080026AB460123A9B3032B85 -:1028200045D0042B0ED0022B0FD010E03348001FF0 -:10283000016841F0010101600120FFF767FF0020FE -:102840000090DEE74FEA8B0501E04FEA4B050222DC -:1028500069B3B9FBF2F0334CDFF8C8C00444CCF1E3 -:10286000000C644520D80224DFF8BCE0C0F35D0A08 -:102870000AFB04F0DFF8A4C08444F4450FD8B0EBA1 -:10288000950F03D9A0EB950C02E013E0C0EB950C7B -:102890008C4504D261461746A0461E4621B1641CF1 -:1028A00040F201208442E3D9521C202AD0D95B1C7B -:1028B000042BB3D90098711E40EA8131781E41EA99 -:1028C0004020A8F1020108430C493C310860042073 -:1028D000FFF71CFF7E43B9FBF6F000FB08F0400059 -:1028E000BDE8F88F4CB1054810493C300160042028 -:1028F000FFF70CFFBDE8F84F47E719E0040200407E -:102900000600C05710ED00E0001BB700800100205A -:1029100080F5200001020204C0C62D00800F05FDD5 -:102920008074D21A00F7C2FFC06878041E42080003 -:10293000854844F21E210160D9E770B506464FF084 -:102940008044D4F8500200F010058048864200D937 -:10295000064604F50074206840F004002060102052 -:10296000FFF7D4FE206940F007002061206A20F0C4 -:102970000F0020622068A4F50074C00705D031461E -:102980000020FFF729FF064609E031464FF40020FA -:10299000FFF722FF0646D4F8500200F01005002190 -:1029A0000220FFF7C6FE2DB9D4F8000220F0040083 -:1029B000C4F80002304670BD634930390A6822F01D -:1029C000380202430A6070475F4940390A6802438F -:1029D0000A6070475C4940390A6882430A60704760 -:1029E00030B54FF0E0220024146104280DD0564D7C -:1029F000303D2B6823F0380303432B605161946111 -:102A0000106940F00300106130BD106940F004000F -:102A10001061F3E74FF0E02100200861704730B506 -:102A200004464FF08045042C01D0052C08D1D5F880 -:102A3000000240F00800C5F800020820FFF766FE1B -:102A4000D5F8900220F007002043C5F8900230BD71 -:102A50003D4950310A6822F4403202430A6070470F -:102A6000394854300068704730B5374C603404EB57 -:102A70008000046840F2F715AC4344EA01111143A9 -:102A8000194341F00101016030BD1FB5304991E8A3 -:102A90001C00C9688DE81C0003912E4A91069042E3 -:102AA00005D1D1F8180200F0010004B010BD2A4A87 -:102AB000904204D1D1F81802C0F34000F5E7274A4C -:102AC000904204D1D1F81802C0F30020EDE7244A67 -:102AD000904204D1D1F81802C0F34020E5E7410E3E -:102AE000490710D0C0F301725DF82210164A303A3F -:102AF00011440968C0F34262C0F30450824011409F -:102B000021FA00F0D1E70020CFE71FB51049D1E945 -:102B100005340A69C9698DE81C00039110F47F3FF0 -:102B200010D0C0F381425DF82210074A203A1144C8 -:102B30000968C0F38722C0F344108240114021FA93 -:102B400000F0B2E70020B0E74002004000B0710B97 -:102B500058380000100000A2110010A2120080A23C -:102B6000130090A2F0B500230127032607FA03F40F -:102B70008C4309D105685C0006FA04FC25EA0C05C3 -:102B800002FA04F4254305605B1C102BEED3F0BD64 -:102B900010B5836901248C40A343140E8C40234359 -:102BA0008361C3694FF001148C4022F07F42A3433C -:102BB0008A401343C36110BD826901238B409A434D -:102BC0008261C2694FF001138B409A43C261704722 -:102BD000F0B500230127032607FA03F40C4209D0BD -:102BE000856A5C0006FA04FC25EA0C0502FA04F486 -:102BF000254385625B1C102BEED3F0BDF0B500239E -:102C00000127032607FA03F40C4209D0056B5C0088 -:102C100006FA04FC25EA0C0502FA04F425430563D0 -:102C20005B1C102BEED3F0BD4A0503D570228261E8 -:102C3000082282610A0503D5426942F0010242611D -:102C40008A0401D5F94A82614A0401D51F224264EF -:102C5000090404D58021C16140F20F3181637047BE -:102C6000002141607047416821F440514160704744 -:102C700042688A4342607047016941F40071016112 -:102C8000416941F480714161416841F440514160C2 -:102C9000704742680A43426070472DE9FF4104468D -:102CA0000F4600250026E24890E80E00C0688DE837 -:102CB0000E000390DF494FF080408C4208D1D0F8DD -:102CC0001412C1F30165D0F82002C0F3032639E0E5 -:102CD000D9498C4208D1D0F81412C1F38165D0F8DB -:102CE0002002C0F303362DE0D4498C4208D1D0F83D -:102CF0001C12C1F30165D0F8300200F00F0621E08C -:102D0000CF498C4208D1D0F81C12C1F38165D0F8AC -:102D10003002C0F3031615E0CA498C4208D1D0F83E -:102D20001C12C1F30175D0F83002C0F3032609E08C -:102D3000C5498C4206D1D0F81C128D0FD0F8300254 -:102D4000C0F30336002020630320E060A068BF4981 -:102D50000840A060E846012D02D1FFF716FD019062 -:102D6000002F17D058F82510761CB1FBF6F000EBB9 -:102D70005700B0FBF7F0801EB0F5803F0CD3B1FBDD -:102D8000F6F000EBC700B0FBF7F06FF0010101EBCC -:102D900010106062BDE8FF8140F040506062F9E7CA -:102DA000F0B50446002600204FF080470EE00023D7 -:102DB00004E05B1CBB4201D3012602E0A5696D045F -:102DC000F7D4012E04D023680B54401C9042EED35C -:102DD000F0BD2DE9FF5F0446DDF838A00F469046B0 -:102DE0009946002500269248D0E905230169C0696B -:102DF0008DE80E0003908F494FF080408C4208D13F -:102E0000D0F81412C1F30165D0F82002C0F30326F4 -:102E100039E089498C4208D1D0F81412C1F3816598 -:102E2000D0F82002C0F303362DE084498C4208D14B -:102E3000D0F81C12C1F30165D0F8300200F00F0683 -:102E400021E07F498C4208D1D0F81C12C1F3816582 -:102E5000D0F83002C0F3031615E07A498C4208D14D -:102E6000D0F81C12C1F30175D0F83002C0F303266C -:102E700009E075498C4206D1D0F81C128D0FD0F8AC -:102E80003002C0F30336EB46012D02D1FFF77DFC83 -:102E90000190DFB15BF82510761CB1FBF6F000EB7A -:102EA0005700B0FBF7F0801EB0F5803F0BD3B1FBAD -:102EB000F6F000EBC700B0FBF7F06FF0010101EB9B -:102EC0001010606202E040F04050606248EA090879 -:102ED00048EA0A08C4F80C80BDE8FF9F026A22F0A5 -:102EE000FF020A430262416841F400614160704799 -:102EF0002DE9FF4704460F469046002500264C4822 -:102F0000D0E90923016AC06A8DE80E00039002200F -:102F10002063484940078C4208D1D0F81412C1F30D -:102F20000165D0F82002C0F3032639E042498C4203 -:102F300008D1D0F81412C1F38165D0F82002C0F393 -:102F400003362DE03D498C4208D1D0F81C12C1F364 -:102F50000165D0F8300200F00F0621E038498C42BC -:102F600008D1D0F81C12C1F38165D0F83002C0F34B -:102F7000031615E033498C4208D1D0F81C12C1F376 -:102F80000175D0F83002C0F3032609E02E498C42C7 -:102F900006D1D0F81C128D0FD0F83002C0F30336E2 -:102FA000E946012D02D1FFF7F0FB019087B159F8F6 -:102FB0002500761CB0FBF6F000EBC700B0FBF7F085 -:102FC0006FF0010101EB1010090C884200D2606221 -:102FD000B8F1000F09D0A06A20F02000A062A06A1A -:102FE00040F00200A062BDE8FF87A06A40F0400008 -:102FF000A062A06A20F00200A062F4E710B50323EB -:103000000363C36A124C2340C362C36A41EA02618C -:103010000B43C36210BD01230363C36A23F0CF03D4 -:10302000C362C36A11430B43C362704701000001CE -:1030300078380000000007400010074000200740DB -:103040000030074000400740005007400FFFF0FFEE -:10305000FFF8FF00F0B50446002600204FF080473F -:103060000EE0002304E05B1CBB4201D3012602E01A -:10307000A569ED00F7D5012E04D00B5C2360401C40 -:103080009042EED1F0BD0000F74BD863D9621A63CD -:103090000068C0791862F5484FF4DA6140F8041C02 -:1030A000C16F41F00101C1677047F0481438D0F892 -:1030B000901021F00101C0F890104FF4FA61016105 -:1030C00040F20F11416002680A4302607047E6490E -:1030D0000822403100F0A1BAE34A9060002010615C -:1030E0005161106AE249086070472DE9F0410346DA -:1030F0000D46DD4C216ADE48DD4ADC4F0C38143ABF -:10310000EC37061F8D4213D9216A19446160216A88 -:10311000691AE160016841F080010160106838447B -:10312000226A194600F079FA206A3060BDE8F08121 -:1031300000216160E160016841F080010160106878 -:1031400038442A46194600F068FA3560EEE730B494 -:10315000C54B4033D879000299790144C248C44C28 -:10316000C34DDA78083C0835C06B0F2A28D006DC3E -:10317000012A15D0022A19D0032A07D13BE0BA4B05 -:103180004033212A1B7921D0222A29D0206840F0FF -:1031900002002060286840F00200286030BC7047C0 -:1031A000122900D31221006830BC9EE74068C27823 -:1031B000837803EB0222914200D3114630BC94E79E -:1031C0000C2900D30C21006930BC8EE7092900D3FB -:1031D0000921826952F82320406830BC104484E7FA -:1031E000426952F823208A4200D81146C06850F83C -:1031F000230030BC79E79A78042A08D2806850F816 -:10320000220002788A4200D8114630BC6DE720685F -:1032100040F002002060286840F002002860BDE70E -:103220002DE9F05F904A00255560D56002F1400914 -:10323000494699F800308F4E0879DFF83CC2DFF834 -:103240003CB249785FEA036A00F00F074FF00108CB -:1032500006F104046FD5DFF814A2A6F104090AF1FF -:10326000EC0AD1B3062921D008290FD00A2924D08D -:10327000DCF8000040F00200CCF80000DBF80000B1 -:1032800040F00200CBF80000BDE8F09FD9F8000044 -:103290005044D1690170206840F080002060C6F879 -:1032A0000080BDE8F05F0021084615E7FFF74FFFFB -:1032B000BDE8F05F002108460EE7D9F80000504451 -:1032C000516A0170206840F080002060C6F80080DC -:1032D000BDE8F05F00210846FEE6FFE7802B04D042 -:1032E000812B14D0822B17D031E00020D16B49689C -:1032F000C9794B0600D50120890603D51178490606 -:1033000040EA1160D9F80010514408701FE0D9F864 -:103310000000504405701AE0D9F8000000EB0A03E1 -:10332000002004EB00110A6802F00F02BA4203D138 -:103330000CEB001103E01BE0401C0C28F1D30868E3 -:1033400010F0020F01D0012000E000201870D9F821 -:1033500000004649ED3108440570206840F08000C7 -:10336000206002203060BDE8F05F00210846B3E62F -:103370003D4840300529807841D004DC012913D034 -:10338000032904D14CE0092940D00B296BD0DCF88B -:10339000000040F00200CCF80000DBF8000040F034 -:1033A0000200CBF800006FE710B1012820D020E028 -:1033B0000020D2F838C02D4A143A02EB0011D1F89F -:1033C000083503F00F03BB420ED108FA00F313EAED -:1033D0000C0F09D101F5A1614B6823F002034B608A -:1033E0000B6823F080030B60401C0C28E5D300E041 -:1033F0001570206840F080002060356044E79061DF -:10340000206840F08000206035603DE7D061506B5F -:1034100000B18047206840F080002060356033E7CD -:10342000190709D1032807D199F8031021B91449C4 -:103430000B6843F006030B6010B1012822D023E093 -:10344000002004EB0011096801F00F01B94206D118 -:103450000CEB0010016841F00201016014E0401C17 -:103460000C28EED310E015E03801002014000C40C9 -:1034700014050C4004050C400C050C401C050C40C8 -:1034800000D0044082F80080206840F08000206076 -:103490003560F9E65062116B09B1506A88472068BF -:1034A00040F0800020603560EEE610B508226249E9 -:1034B000624800F0B2F86148007810F0600011D066 -:1034C0005E494039202810D0402814D05C4801685B -:1034D00041F0020101605A481030016841F00201D8 -:1034E000016010BDBDE810409AE6C86A0028F8D017 -:1034F000BDE810400047886A0028F2D0BDE81040BF -:1035000000472DE9F0414D4C403CE0684C4D002611 -:10351000083D002827D0E368276A2146281F464A2D -:103520004968BB420FD900681044226A00F075F860 -:10353000206A2860216A606808446060E068216A47 -:10354000401AE060F2E500681044E26800F065F8B7 -:10355000E0682860E068216A884201D1012060703B -:103560006660E660E2E53548017851B940780528A3 -:1035700007D134498868A269904202D008B9A0698D -:10358000886060780028DDD02E606670CEE570B56A -:103590002A4C403C20696169884216D2284E083680 -:1035A0003568301F0068244901442A46A06800F0AD -:1035B00034F8A0682844A06020692844206120696C -:1035C0006169884201D2206A306070BD10B51B4825 -:1035D000002240384260C2608260026142618263C0 -:1035E000026442640020174B03EB0011D1F8084538 -:1035F00024F08004C1F80845401C0C28F4D39A60DC -:1036000010BD0E494039886270470C494039486303 -:1036100070470A4940398863704718B50023009302 -:1036200006E0009B009CCB5C0355009B5B1C009359 -:10363000521E531CF5D118BD00010C40780100202A -:103640000C050C4000000C4010B5FFF79EF8214A15 -:1036500090604FF08043D3F8101201F00701022967 -:1036600003D002F10C0050F82100D3F8201201F031 -:103670000F01491CB0FBF1F01060174908444900E4 -:10368000B0FBF1F0506010BD1448C16C21F00F0187 -:1036900041F00801C1641248D0F8901041F4802133 -:1036A000C0F89010016841F0020101600D490A68FC -:1036B00002F0F7320A604A6802F0F7324A600168A5 -:1036C00021F0020101600848016821F0F001016069 -:1036D000704700008001002020A1070000C00040CA -:1036E00008020040041104404041004014484FF0DB -:1036F000590101604FF0160101604FF0880101602F -:103700001048416841F4804141600F48416841F0F0 -:1037100002014160416841F0040141600B4880476B -:1037200007484FF00001016009480047FEE7FEE747 -:10373000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE761 -:103740000001004000020040007000408936000087 -:10375000B901000040EA01039B0703D009E008C952 -:10376000121F08C0042AFAD203E011F8013B00F846 -:10377000013B521EF9D27047D2B201E000F8012B92 -:10378000491EFBD270470022F6E710B513460A46E1 -:1037900004461946FFF7F0FF204610BD064C074DC2 -:1037A00006E0E06840F0010394E807009847103411 -:1037B000AC42F6D3FCF704FDA8380000C83800007E -:1037C00070B58C1810F8015B15F0070301D110F8E3 -:1037D000013B2A1106D110F8012B03E010F8016B10 -:1037E00001F8016B5B1EF9D12B0705D40023521E93 -:1037F0000DD401F8013BFAE710F8013BCB1A921CFB -:1038000003E013F8015B01F8015B521EF9D5A142F8 -:10381000D8D3002070BD02E008C8121F08C1002ADA -:10382000FAD170477047002001E001C1121F002A41 -:10383000FBD170471D0000202F000020D000002089 -:10384000E000002004010020EC000020F80000202F -:10385000312E3130000000000000000004000000A4 -:10386000080000000C000000000000000400000040 -:103870000800000010000000001BB700000000005E -:1038800000800000001BB700001BB7000000000014 -:1038900000800000001BB700001BB7000000000004 -:1038A00000800000001BB700C838000000000020A6 -:1038B000AC010000C0370000BC390000AC010020A2 -:1038C000744C0000263800001206100BFF0901A1FD -:1038D0000119012940151326FF1675089540812905 -:1038E0000F129114C0120132021640160421501416 -:1038F000010102150109026B230301246409043349 -:10390000020315092110011401221D160705810368 -:10391000402D01070501071008080B0102020201F2 -:103920001B09041E29091305241D10010524521C1E -:103930000424020E10090601020705820308150A75 -:1039400009040233020A2E0705830240072A0307EF -:1039500010080403090412035812491256124E1299 -:1039600031123912381237141E034D1A340A12302C -:1039700012201243124D1A53201253122D124412C8 -:10398000413250229A1B209E041AB004716908111A -:10399000B21DB2121C050F0CB82B1002EC19DC0181 -:1039A000122AC2162208022A10192E0126131BB74A -:0C39B0005A0C08390462800B1010272804 -:04000005000001B93D -:00000001FF diff --git a/src/descriptors.c b/src/descriptors.c index b624336..2f0b899 100644 --- a/src/descriptors.c +++ b/src/descriptors.c @@ -1,5 +1,4 @@ #include "NuMicro.h" -#include "vcom_serial.h" #include "hid_transfer.h" @@ -45,9 +44,10 @@ uint8_t gu8ConfigDescriptor[] = { LEN_CONFIG, // bLength DESC_CONFIG, // bDescriptorType -#define TOTAL_LEN (LEN_CONFIG + (LEN_INTERFACE + LEN_HID + LEN_ENDPOINT + LEN_ENDPOINT) + (8 + LEN_INTERFACE + 5 + 5 + 4 + 5 + LEN_ENDPOINT + LEN_INTERFACE + LEN_ENDPOINT + LEN_ENDPOINT)) +#define TOTAL_LEN (LEN_CONFIG + (LEN_INTERFACE + LEN_HID + LEN_ENDPOINT + LEN_ENDPOINT) + \ + (8 + LEN_INTERFACE + 5 + 5 + 4 + 5 + LEN_ENDPOINT + LEN_INTERFACE + LEN_ENDPOINT + LEN_ENDPOINT)) TOTAL_LEN & 0xFF, TOTAL_LEN >> 8, // wTotalLength - 0x03, // bNumInterfaces + 0x03, // bNumInterfaces 0x01, // bConfigurationValue 0x00, // iConfiguration 0x00, // bmAttributes, D6: self power D5: remote wake-up @@ -174,7 +174,7 @@ uint8_t gu8ConfigDescriptor[] = }; -uint8_t gu8StringLang[4] = +uint8_t gu8StringLang[] = { 4, DESC_STRING, @@ -195,7 +195,7 @@ uint8_t gu8ProductStringDesc[] = 'M', 0, '4', 0, '8', 0, '0', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0, 'P', 0 }; -uint8_t *gpu8UsbString[4] = +uint8_t *gpu8UsbString[] = { gu8StringLang, gu8VendorStringDesc, @@ -204,26 +204,22 @@ uint8_t *gpu8UsbString[4] = }; -uint8_t *gu8UsbHidReport[3] = +uint8_t *gu8UsbHidReport[] = { HID_DeviceReportDescriptor, NULL, - NULL, }; -uint32_t gu32UsbHidReportLen[3] = +uint32_t gu32UsbHidReportLen[] = { sizeof(HID_DeviceReportDescriptor), 0, - 0, }; - -uint32_t gu32ConfigHidDescIdx[3] = +uint32_t gu32ConfigHidDescIdx[] = { (LEN_CONFIG + LEN_INTERFACE), 0, - 0, }; @@ -231,14 +227,14 @@ uint8_t gu8BOSDescriptor[] = { LEN_BOS, DESC_BOS, - 0x0C & 0x00FF, ((0x0C & 0xFF00) >> 8), // wTotalLength - 0x01, // bNumDeviceCaps + 0x0C, // wTotalLength + 0x01, // bNumDeviceCaps /* Device Capability */ - LEN_BOSCAP, // bLength - DESC_CAPABILITY, // bDescriptorType - CAP_USB20_EXT, // bDevCapabilityType - 0x02, 0x00, 0x00, 0x00 // bmAttributes + LEN_BOSCAP, // bLength + DESC_CAPABILITY, // bDescriptorType + CAP_USB20_EXT, // bDevCapabilityType + 0x02, 0x00, 0x00, 0x00 // bmAttributes }; diff --git a/src/hid_transfer.c b/src/hid_transfer.c index a048988..4e21b24 100644 --- a/src/hid_transfer.c +++ b/src/hid_transfer.c @@ -1,68 +1,111 @@ -#include -#include #include "NuMicro.h" #include "vcom_serial.h" #include "hid_transfer.h" +void HID_Init(void) +{ + /* Init setup packet buffer */ + USBD->STBUFSEG = SETUP_BUF_BASE; + + /*****************************************************/ + /* EP0 ==> control IN endpoint, address 0 */ + USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0); + USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE); + + /* EP1 ==> control OUT endpoint, address 0 */ + USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0); + USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE); + + /*****************************************************/ + /* EP2 ==> Interrupt IN endpoint, address 1 */ + USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | HID_INT_IN_EP); + USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE); + + /* EP3 ==> Interrupt OUT endpoint, address 1 */ + USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | HID_INT_OUT_EP); + USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE); + /* trigger to receive OUT data */ + USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); + + /*****************************************************/ + /* EP4 ==> Interrupt IN endpoint, address 2 */ + USBD_CONFIG_EP(EP4, USBD_CFG_EPMODE_IN | CDC_INT_IN_EP); + USBD_SET_EP_BUF_ADDR(EP4, EP4_BUF_BASE); + + /* EP5 ==> Bulk IN endpoint, address 3 */ + USBD_CONFIG_EP(EP5, USBD_CFG_EPMODE_IN | CDC_BULK_IN_EP); + USBD_SET_EP_BUF_ADDR(EP5, EP5_BUF_BASE); + + /* EP6 ==> Bulk Out endpoint, address 3 */ + USBD_CONFIG_EP(EP6, USBD_CFG_EPMODE_OUT | CDC_BULK_OUT_EP); + USBD_SET_EP_BUF_ADDR(EP6, EP6_BUF_BASE); + /* trigger receive OUT data */ + USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); +} + + +void EP2_Handler(void) // Interrupt IN +{ + HID_SetInReport(); +} + +void EP3_Handler(void) // Interrupt OUT +{ + uint8_t *ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP3)); + + HID_GetOutReport(ptr, USBD_GET_PAYLOAD_LEN(EP3)); + + USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); +} + void USBD_IRQHandler(void) { uint32_t u32IntSts = USBD_GET_INT_FLAG(); uint32_t u32State = USBD_GET_BUS_STATE(); -//------------------------------------------------------------------ - if(u32IntSts & USBD_INTSTS_FLDET) + if(u32IntSts & USBD_INTSTS_FLDET) // Floating detect { - // Floating detect USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); - if(USBD_IS_ATTACHED()) + if(USBD_IS_ATTACHED()) // USB Plug In { - /* USB Plug In */ USBD_ENABLE_USB(); } - else + else // USB Un-plug { - /* USB Un-plug */ USBD_DISABLE_USB(); } } - -//------------------------------------------------------------------ + if(u32IntSts & USBD_INTSTS_BUS) { USBD_CLR_INT_FLAG(USBD_INTSTS_BUS); - if(u32State & USBD_STATE_USBRST) + if(u32State & USBD_STATE_USBRST) // Bus reset { - /* Bus reset */ USBD_ENABLE_USB(); USBD_SwReset(); } - if(u32State & USBD_STATE_SUSPEND) + if(u32State & USBD_STATE_SUSPEND) // Suspend { - /* Enable USB but disable PHY */ USBD_DISABLE_PHY(); } - if(u32State & USBD_STATE_RESUME) + if(u32State & USBD_STATE_RESUME) // Resume { - /* Enable USB and enable PHY */ USBD_ENABLE_USB(); } } - -//------------------------------------------------------------------ - if(u32IntSts & USBD_INTSTS_WAKEUP) + + if(u32IntSts & USBD_INTSTS_WAKEUP) // Wakeup { USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); } - -//------------------------------------------------------------------ + if(u32IntSts & USBD_INTSTS_USB) { if(u32IntSts & USBD_INTSTS_SETUP) { - // Setup packet USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); /* Clear the data IN/OUT ready flag of control end-points */ @@ -72,14 +115,14 @@ void USBD_IRQHandler(void) USBD_ProcessSetupPacket(); } - if(u32IntSts & USBD_INTSTS_EP0) // control IN + if(u32IntSts & USBD_INTSTS_EP0) // Control IN { USBD_CLR_INT_FLAG(USBD_INTSTS_EP0); USBD_CtrlIn(); } - if(u32IntSts & USBD_INTSTS_EP1) // control OUT + if(u32IntSts & USBD_INTSTS_EP1) // Control OUT { USBD_CLR_INT_FLAG(USBD_INTSTS_EP1); @@ -89,8 +132,7 @@ void USBD_IRQHandler(void) extern uint8_t g_usbd_SetupPacket[]; if(g_usbd_SetupPacket[1] == SET_LINE_CODE) { - if(g_usbd_SetupPacket[4] == 1) // Interface number - VCOM_LineCoding(); + VCOM_LineCoding(); } } @@ -130,55 +172,6 @@ void USBD_IRQHandler(void) } -void EP2_Handler(void) // Interrupt IN handler -{ - HID_SetInReport(); -} - - -void EP3_Handler(void) // Interrupt OUT handler -{ - uint8_t *ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP3)); - - HID_GetOutReport(ptr, USBD_GET_PAYLOAD_LEN(EP3)); - - USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); -} - - -void HID_Init(void) -{ - /* Init setup packet buffer */ - /* Buffer range for setup packet -> [0 ~ 0x7] */ - USBD->STBUFSEG = SETUP_BUF_BASE; - - /*****************************************************/ - /* EP0 ==> control IN endpoint, address 0 */ - USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0); - /* Buffer range for EP0 */ - USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE); - - /* EP1 ==> control OUT endpoint, address 0 */ - USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0); - /* Buffer range for EP1 */ - USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE); - - /*****************************************************/ - /* EP2 ==> Interrupt IN endpoint, address 1 */ - USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | HID_INT_IN_EP); - /* Buffer range for EP2 */ - USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE); - - /* EP3 ==> Interrupt OUT endpoint, address 1 */ - USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | HID_INT_OUT_EP); - /* Buffer range for EP3 */ - USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE); - /* trigger to receive OUT data */ - USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); - -} - - void HID_ClassRequest(void) { uint8_t buf[8]; @@ -192,17 +185,11 @@ void HID_ClassRequest(void) case GET_REPORT: case GET_IDLE: case GET_PROTOCOL: - /* Setup error, stall the device */ USBD_SetStall(0); break; case GET_LINE_CODE: - if(buf[4] == 1) - { - USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)), (uint8_t *)&LineCfg, 7); - } - - /* Data stage */ + USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)), (uint8_t *)&LineCfg, 7); USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 7); @@ -236,25 +223,20 @@ void HID_ClassRequest(void) break; case SET_PROTOCOL: - /* Setup error, stall the device */ USBD_SetStall(0); break; - case SET_CONTROL_LINE_STATE: - if(buf[4] == 1) - { - vcom.hw_flow = (buf[3] << 8) | buf[2]; - } - + case SET_LINE_CODE: + USBD_PrepareCtrlOut((uint8_t *)&LineCfg, 7); + /* Status stage */ USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 0); break; - - case SET_LINE_CODE: - if(buf[4] == 1) - USBD_PrepareCtrlOut((uint8_t *)&LineCfg, 7); - + + case SET_CONTROL_LINE: + Vcom.hw_flow = (buf[3] << 8) | buf[2]; + /* Status stage */ USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 0); @@ -290,7 +272,6 @@ uint8_t usbd_hid_process(void) { uint32_t n; - // Process pending requests if((USB_RequestOut != USB_RequestIn) || USB_RequestFlag) { DAP_ProcessCommand(USB_Request[USB_RequestOut], USB_Response[USB_ResponseIn]); @@ -305,24 +286,26 @@ uint8_t usbd_hid_process(void) USB_RequestFlag = 0; if(USB_ResponseIdle) - { // Request that data is send back to host + { USB_ResponseIdle = 0; USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP2)), USB_Response[USB_ResponseIn], DAP_PACKET_SIZE); USBD_SET_PAYLOAD_LEN(EP2, DAP_PACKET_SIZE); } else - { // Update response index and flag + { n = USB_ResponseIn + 1; - if (n == DAP_PACKET_COUNT) + if(n == DAP_PACKET_COUNT) n = 0; USB_ResponseIn = n; - if (USB_ResponseIn == USB_ResponseOut) + if(USB_ResponseIn == USB_ResponseOut) USB_ResponseFlag = 1; } + return 1; } + return 0; } @@ -339,7 +322,7 @@ void HID_GetOutReport(uint8_t *EpBuf, uint32_t len) return; // Discard packet when buffer is full // Store data into request packet buffer - memcpy(USB_Request[USB_RequestIn], EpBuf, len); + USBD_MemCopy(USB_Request[USB_RequestIn], EpBuf, len); USB_RequestIn++; if(USB_RequestIn == DAP_PACKET_COUNT) diff --git a/src/hid_transfer.h b/src/hid_transfer.h index d8c7708..e51d468 100644 --- a/src/hid_transfer.h +++ b/src/hid_transfer.h @@ -1,5 +1,5 @@ -#ifndef __USBD_HID_H__ -#define __USBD_HID_H__ +#ifndef __HID_TRANSFER_H__ +#define __HID_TRANSFER_H__ #define USBD_VID 0x0416 @@ -9,6 +9,9 @@ /* Define the EP number */ #define HID_INT_IN_EP 1 #define HID_INT_OUT_EP 1 +#define CDC_INT_IN_EP 2 +#define CDC_BULK_IN_EP 3 +#define CDC_BULK_OUT_EP 3 /* Define EP maximum packet size */ @@ -16,40 +19,38 @@ #define EP1_MAX_PKT_SIZE EP0_MAX_PKT_SIZE #define EP2_MAX_PKT_SIZE 64 #define EP3_MAX_PKT_SIZE 64 +#define EP4_MAX_PKT_SIZE 8 +#define EP5_MAX_PKT_SIZE 64 +#define EP6_MAX_PKT_SIZE 64 #define SETUP_BUF_BASE 0 -#define SETUP_BUF_LEN 8 -#define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) -#define EP0_BUF_LEN EP0_MAX_PKT_SIZE -#define EP1_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) -#define EP1_BUF_LEN EP1_MAX_PKT_SIZE -#define EP2_BUF_BASE (EP1_BUF_BASE + EP1_BUF_LEN) -#define EP2_BUF_LEN EP2_MAX_PKT_SIZE -#define EP3_BUF_BASE (EP2_BUF_BASE + EP2_BUF_LEN) -#define EP3_BUF_LEN EP3_MAX_PKT_SIZE - +#define SETUP_BUF_SIZE 8 +#define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_SIZE) +#define EP1_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_SIZE) +#define EP2_BUF_BASE (EP1_BUF_BASE + EP1_MAX_PKT_SIZE) +#define EP3_BUF_BASE (EP2_BUF_BASE + EP2_MAX_PKT_SIZE) +#define EP4_BUF_BASE (EP3_BUF_BASE + EP3_MAX_PKT_SIZE) +#define EP5_BUF_BASE (EP4_BUF_BASE + EP4_MAX_PKT_SIZE) +#define EP6_BUF_BASE (EP5_BUF_BASE + EP5_MAX_PKT_SIZE) /* HID Class Specific Request */ -#define GET_REPORT 0x01 -#define GET_IDLE 0x02 -#define GET_PROTOCOL 0x03 -#define SET_REPORT 0x09 -#define SET_IDLE 0x0A -#define SET_PROTOCOL 0x0B +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B void HID_Init(void); void HID_ClassRequest(void); +uint8_t usbd_hid_process(void); -void EP2_Handler(void); -void EP3_Handler(void); void HID_SetInReport(void); void HID_GetOutReport(uint8_t *pu8EpBuf, uint32_t u32Size); -uint8_t usbd_hid_process(void); - #endif diff --git a/src/main.c b/src/main.c index 8f026d6..bb993e5 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,3 @@ -#include #include "NuMicro.h" #include "vcom_serial.h" #include "hid_transfer.h" @@ -7,15 +6,12 @@ void systemInit(void); -void SerialInit(void); void USB_Config(void); int main(void) -{ +{ systemInit(); - SerialInit(); - DAP_Setup(); USB_Config(); @@ -35,34 +31,6 @@ int main(void) } -void USB_Config(void) -{ - SYS_UnlockReg(); - - SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA14MFP_Msk); - SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA12MFP_USB_VBUS | SYS_GPA_MFPH_PA13MFP_USB_D_N | SYS_GPA_MFPH_PA14MFP_USB_D_P); - - SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk; - - CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_USBDIV_Msk) | CLK_CLKDIV0_USB(4); - - CLK_EnableModuleClock(USBD_MODULE); - - SYS_LockReg(); - - - USBD_Open(&gsInfo, HID_ClassRequest, NULL); - - HID_Init(); // Endpoint configuration - - VCOM_Init(); // Endpoint configuration - - USBD_Start(); - - NVIC_EnableIRQ(USBD_IRQn); -} - - void systemInit(void) { SYS_UnlockReg(); @@ -74,7 +42,6 @@ void systemInit(void) CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); // ȴHXTȶ CLK_SetCoreClock(192000000); // PLLָƵΪϵͳʱ - // HXTʹܣPLLʱԴѡHXTʵ޸__HXTֵ CLK->PCLKDIV = (CLK_PCLKDIV_PCLK0DIV2 | CLK_PCLKDIV_PCLK1DIV2); @@ -86,17 +53,29 @@ void systemInit(void) } -void SerialInit(void) -{ - GPIO_SetPullCtl(PB, BIT0, GPIO_PUSEL_PULL_UP); - SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB0MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk); - SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB0MFP_UART2_RXD | SYS_GPB_MFPL_PB1MFP_UART2_TXD); +void USB_Config(void) +{ + SYS_UnlockReg(); + + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA14MFP_Msk); + SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA12MFP_USB_VBUS | SYS_GPA_MFPH_PA13MFP_USB_D_N | SYS_GPA_MFPH_PA14MFP_USB_D_P); + + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk; + + CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_USBDIV_Msk) | CLK_CLKDIV0_USB(4); + + CLK_EnableModuleClock(USBD_MODULE); + + SYS_LockReg(); - CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL3_UART2SEL_HXT, CLK_CLKDIV4_UART2(1)); - CLK_EnableModuleClock(UART2_MODULE); - UART_Open(UART2, 115200); - UART_ENABLE_INT(UART2, (UART_INTEN_RDAIEN_Msk | UART_INTEN_THREIEN_Msk | UART_INTEN_RXTOIEN_Msk)); + USBD_Open(&gsInfo, HID_ClassRequest, NULL); + + HID_Init(); + + VCOM_Init(); + + USBD_Start(); - NVIC_EnableIRQ(UART2_IRQn); + NVIC_EnableIRQ(USBD_IRQn); } diff --git a/src/vcom_serial.c b/src/vcom_serial.c index 174577e..1cd7cf1 100644 --- a/src/vcom_serial.c +++ b/src/vcom_serial.c @@ -1,61 +1,45 @@ -#include #include "NuMicro.h" #include "vcom_serial.h" +#include "hid_transfer.h" +void VCOM_Init(void) +{ + GPIO_SetPullCtl(PB, BIT0, GPIO_PUSEL_PULL_UP); + SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB0MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk); + SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB0MFP_UART2_RXD | SYS_GPB_MFPL_PB1MFP_UART2_TXD); + + CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL3_UART2SEL_HXT, CLK_CLKDIV4_UART2(1)); + CLK_EnableModuleClock(UART2_MODULE); + + UART_Open(UART2, 115200); + UART_ENABLE_INT(UART2, (UART_INTEN_RDAIEN_Msk | UART_INTEN_THREIEN_Msk | UART_INTEN_RXTOIEN_Msk)); + + NVIC_EnableIRQ(UART2_IRQn); +} + + +volatile VCOM Vcom; + void EP5_Handler(void) // Bulk IN { - vcom.in_bytes = 0; + Vcom.in_bytes = 0; } void EP6_Handler(void) // Bulk OUT { - vcom.out_bytes = USBD_GET_PAYLOAD_LEN(EP6); - vcom.out_ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP6)); + Vcom.out_bytes = USBD_GET_PAYLOAD_LEN(EP6); + Vcom.out_ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP6)); - vcom.out_ready = 1; + Vcom.out_ready = 1; } -void VCOM_Init(void) -{ - /*****************************************************/ - /* EP4 ==> Interrupt IN endpoint, address 3 */ - USBD_CONFIG_EP(EP4, USBD_CFG_EPMODE_IN | CDC_INT_IN_EP); - /* Buffer offset for EP4 -> */ - USBD_SET_EP_BUF_ADDR(EP4, EP4_BUF_BASE); - - /* EP5 ==> Bulk IN endpoint, address 4 */ - USBD_CONFIG_EP(EP5, USBD_CFG_EPMODE_IN | CDC_BULK_IN_EP); - /* Buffer offset for EP5 */ - USBD_SET_EP_BUF_ADDR(EP5, EP5_BUF_BASE); - - /* EP6 ==> Bulk Out endpoint, address 5 */ - USBD_CONFIG_EP(EP6, USBD_CFG_EPMODE_OUT | CDC_BULK_OUT_EP); - /* Buffer offset for EP6 */ - USBD_SET_EP_BUF_ADDR(EP6, EP6_BUF_BASE); - /* trigger receive OUT data */ - USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); -} - +VCOM_LINE_CODING LineCfg = {115200, 0, 0, 8}; // Baud rate, stop bits, parity bits, data bits void VCOM_LineCoding(void) { uint32_t data_len, parity, stop_len; - - NVIC_DisableIRQ(UART2_IRQn); - - // Reset software FIFO - vcom.rx_bytes = 0; - vcom.rx_head = 0; - vcom.rx_tail = 0; - - vcom.tx_bytes = 0; - vcom.tx_head = 0; - vcom.tx_tail = 0; - - // Reset hardware FIFO - UART2->FIFO = 0x3; switch(LineCfg.u8DataBits) { @@ -84,18 +68,26 @@ void VCOM_LineCoding(void) default: stop_len = UART_STOP_BIT_1; break; } - UART_SetLineConfig(UART2, LineCfg.u32DTERate, data_len, parity, stop_len); + NVIC_DisableIRQ(UART2_IRQn); + + // Reset software FIFO + Vcom.rx_bytes = 0; + Vcom.rx_head = 0; + Vcom.rx_tail = 0; + + Vcom.tx_bytes = 0; + Vcom.tx_head = 0; + Vcom.tx_tail = 0; + // Reset hardware FIFO + UART2->FIFO = 0x3; + + UART_SetLineConfig(UART2, LineCfg.u32DTERate, data_len, parity, stop_len); + NVIC_EnableIRQ(UART2_IRQn); } -STR_VCOM_LINE_CODING LineCfg = {115200, 0, 0, 8}; // Baud rate : 115200, stop bits, parity bits, data bits - - -volatile VCOM vcom; - - void UART2_IRQHandler(void) { uint8_t chr; @@ -107,22 +99,22 @@ void UART2_IRQHandler(void) { chr = UART2->DAT; - if(vcom.rx_bytes < RX_BUFF_SIZE) // Check if buffer full + if(Vcom.rx_bytes < RX_BUFF_SIZE) // Check if buffer full { - vcom.rx_buff[vcom.rx_tail++] = chr; - if(vcom.rx_tail >= RX_BUFF_SIZE) - vcom.rx_tail = 0; - vcom.rx_bytes++; + Vcom.rx_buff[Vcom.rx_tail++] = chr; + if(Vcom.rx_tail >= RX_BUFF_SIZE) + Vcom.rx_tail = 0; + Vcom.rx_bytes++; } } } if(UART2->INTSTS & UART_INTSTS_THREIF_Msk) { - if(vcom.tx_bytes) + if(Vcom.tx_bytes) { /* Fill the Tx FIFO */ - size = vcom.tx_bytes; + size = Vcom.tx_bytes; if(size >= TX_FIFO_SIZE) { size = TX_FIFO_SIZE; @@ -130,10 +122,10 @@ void UART2_IRQHandler(void) while(size) { - UART2->DAT = vcom.tx_buff[vcom.tx_head++]; - if(vcom.tx_head >= TX_BUFF_SIZE) - vcom.tx_head = 0; - vcom.tx_bytes--; + UART2->DAT = Vcom.tx_buff[Vcom.tx_head++]; + if(Vcom.tx_head >= TX_BUFF_SIZE) + Vcom.tx_head = 0; + Vcom.tx_bytes--; size--; } } @@ -151,33 +143,33 @@ void VCOM_TransferData(void) int32_t i, len; /* Check whether USB is ready for next packet or not */ - if(vcom.in_bytes == 0) + if(Vcom.in_bytes == 0) { /* Check whether we have new COM Rx data to send to USB or not */ - if(vcom.rx_bytes) + if(Vcom.rx_bytes) { - len = vcom.rx_bytes; + len = Vcom.rx_bytes; if(len > EP5_MAX_PKT_SIZE) len = EP5_MAX_PKT_SIZE; for(i = 0; i < len; i++) { - vcom.in_buff[i] = vcom.rx_buff[vcom.rx_head++]; - if(vcom.rx_head >= RX_BUFF_SIZE) - vcom.rx_head = 0; + Vcom.in_buff[i] = Vcom.rx_buff[Vcom.rx_head++]; + if(Vcom.rx_head >= RX_BUFF_SIZE) + Vcom.rx_head = 0; } __disable_irq(); - vcom.rx_bytes -= len; + Vcom.rx_bytes -= len; __enable_irq(); - vcom.in_bytes = len; - USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP5)), (uint8_t *)vcom.in_buff, len); + Vcom.in_bytes = len; + USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP5)), (uint8_t *)Vcom.in_buff, len); USBD_SET_PAYLOAD_LEN(EP5, len); } else { - /* Prepare a zero packet if previous packet size is EP2_MAX_PKT_SIZE and + /* Prepare a zero packet if previous packet size is EP5_MAX_PKT_SIZE and no more data to send at this moment to note Host the transfer has been done */ len = USBD_GET_PAYLOAD_LEN(EP5); if(len == EP5_MAX_PKT_SIZE) @@ -186,40 +178,40 @@ void VCOM_TransferData(void) } /* Process the Bulk out data when bulk out data is ready. */ - if(vcom.out_ready && (vcom.out_bytes <= TX_BUFF_SIZE - vcom.tx_bytes)) + if(Vcom.out_ready && (Vcom.out_bytes <= TX_BUFF_SIZE - Vcom.tx_bytes)) { - for(i = 0; i < vcom.out_bytes; i++) + for(i = 0; i < Vcom.out_bytes; i++) { - vcom.tx_buff[vcom.tx_tail++] = vcom.out_ptr[i]; - if(vcom.tx_tail >= TX_BUFF_SIZE) - vcom.tx_tail = 0; + Vcom.tx_buff[Vcom.tx_tail++] = Vcom.out_ptr[i]; + if(Vcom.tx_tail >= TX_BUFF_SIZE) + Vcom.tx_tail = 0; } __disable_irq(); - vcom.tx_bytes += vcom.out_bytes; + Vcom.tx_bytes += Vcom.out_bytes; __enable_irq(); - vcom.out_bytes = 0; - vcom.out_ready = 0; /* Clear bulk out ready flag */ + Vcom.out_bytes = 0; + Vcom.out_ready = 0; /* Ready to get next BULK out */ USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); } /* Process the software Tx FIFO */ - if(vcom.tx_bytes) + if(Vcom.tx_bytes) { /* Check if Tx is working */ if((UART2->INTEN & UART_INTEN_THREIEN_Msk) == 0) { /* Send one bytes out */ - UART2->DAT = vcom.tx_buff[vcom.tx_head++]; - if(vcom.tx_head >= TX_BUFF_SIZE) - vcom.tx_head = 0; + UART2->DAT = Vcom.tx_buff[Vcom.tx_head++]; + if(Vcom.tx_head >= TX_BUFF_SIZE) + Vcom.tx_head = 0; - __set_PRIMASK(1); - vcom.tx_bytes--; - __set_PRIMASK(0); + __disable_irq(); + Vcom.tx_bytes--; + __enable_irq(); /* Enable Tx Empty Interrupt. (Trigger first one) */ UART2->INTEN |= UART_INTEN_THREIEN_Msk; diff --git a/src/vcom_serial.h b/src/vcom_serial.h index 8cb2aef..75a8db9 100644 --- a/src/vcom_serial.h +++ b/src/vcom_serial.h @@ -1,42 +1,22 @@ -#ifndef __USBD_CDC_H__ -#define __USBD_CDC_H__ +#ifndef __VCOM_SERIAL_H__ +#define __VCOM_SERIAL_H__ -/* Define the EP number */ -#define CDC_INT_IN_EP 2 -#define CDC_BULK_IN_EP 3 -#define CDC_BULK_OUT_EP 3 - - -/* Define EP maximum packet size */ -#define EP4_MAX_PKT_SIZE 8 -#define EP5_MAX_PKT_SIZE 64 -#define EP6_MAX_PKT_SIZE 64 - - -#define EP4_BUF_BASE (8 + 64 + 64 + 64) -#define EP4_BUF_LEN EP4_MAX_PKT_SIZE -#define EP5_BUF_BASE (EP4_BUF_BASE + EP4_BUF_LEN) -#define EP5_BUF_LEN EP5_MAX_PKT_SIZE -#define EP6_BUF_BASE (EP5_BUF_BASE + EP5_BUF_LEN) -#define EP6_BUF_LEN EP6_MAX_PKT_SIZE - - -/*!