diff --git a/.gitignore b/.gitignore index c6127b3..ac42009 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,6 @@ *.app *.i*86 *.x86_64 -*.hex # Debug files *.dSYM/ diff --git a/DAPLink.uvoptx b/DAPLink.uvoptx index 3b6ad87..b56536b 100644 --- a/DAPLink.uvoptx +++ b/DAPLink.uvoptx @@ -10,7 +10,7 @@ *.s*; *.src; *.a* *.obj; *.o *.lib - *.txt; *.h; *.inc + *.txt; *.h; *.inc; *.md *.plm *.cpp 0 @@ -119,18 +119,28 @@ 0 - ARMRTXEVENTFLAGS - -L70 -Z18 -C0 -M0 -T1 + DLGUARM + d + + + 0 + CMSIS_AGDI + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC4000 -FN1 -FF0M481_AP_512.FLM -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM) 0 UL2CM3 - UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0M481_AP_512 -FL080000 -FS00 -FP0($$Device:M482LIDAE$Flash\M481_AP_512.FLM) + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0M481_AP_512 -FL080000 -FS00 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM) 0 JL2CM3 - -U59400001 -O206 -S2 -ZTIFSpeedSel5000 -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:M482LIDAE$Flash\M481_AP_512.FLM) + -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) + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 0 @@ -162,7 +172,7 @@ 0 1 - 0 + 1 0 0 0 @@ -243,6 +253,18 @@ 0 0 + + 1 + 4 + 1 + 0 + 0 + 0 + .\src\vcom_serial.c + vcom_serial.c + 0 + 0 + @@ -253,7 +275,7 @@ 0 2 - 4 + 5 1 0 0 @@ -265,7 +287,7 @@ 2 - 5 + 6 1 0 0 @@ -277,9 +299,9 @@ 2 - 6 + 7 1 - 0 + 1 0 0 .\src\DAP\JTAG_DP.c @@ -289,7 +311,7 @@ 2 - 7 + 8 1 0 0 @@ -309,7 +331,7 @@ 0 3 - 8 + 9 1 0 0 @@ -319,18 +341,6 @@ 0 0 - - 3 - 9 - 1 - 0 - 0 - 0 - .\src\CSL\NUCM480_StdPeriph_Driver\dac.c - dac.c - 0 - 0 - 3 10 @@ -338,18 +348,6 @@ 0 0 0 - .\src\CSL\NUCM480_StdPeriph_Driver\eadc.c - eadc.c - 0 - 0 - - - 3 - 11 - 1 - 0 - 0 - 0 .\src\CSL\NUCM480_StdPeriph_Driver\gpio.c gpio.c 0 @@ -357,7 +355,7 @@ 3 - 12 + 11 1 0 0 @@ -369,7 +367,7 @@ 3 - 13 + 12 1 0 0 @@ -381,7 +379,7 @@ 3 - 14 + 13 1 0 0 @@ -393,7 +391,7 @@ 3 - 15 + 14 1 0 0 @@ -405,7 +403,7 @@ 3 - 16 + 15 1 0 0 @@ -417,7 +415,7 @@ 3 - 17 + 16 1 0 0 @@ -429,7 +427,7 @@ 3 - 18 + 17 1 0 0 @@ -441,7 +439,7 @@ 3 - 19 + 18 1 0 0 @@ -461,7 +459,7 @@ 0 4 - 20 + 19 1 0 0 @@ -473,7 +471,7 @@ 4 - 21 + 20 2 0 0 diff --git a/DAPLink.uvprojx b/DAPLink.uvprojx index 15cf8d4..b83827b 100644 --- a/DAPLink.uvprojx +++ b/DAPLink.uvprojx @@ -10,18 +10,18 @@ NUCM480 0x4 ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC + 5060960::V5.06 update 7 (build 960)::.\ARMCC 0 - M482LIDAE + M482ZIDAE Nuvoton Nuvoton.NuMicro_DFP.1.3.1 http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack IRAM(0x20000000,0x28000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M481_AP_512 -FS00 -FL080000 -FP0($$Device:M482LIDAE$Flash\M481_AP_512.FLM)) + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M481_AP_512 -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM)) 0 @@ -33,7 +33,7 @@ - $$Device:M482LIDAE$SVD\Nuvoton\M481_v1.svd + $$Device:M482ZIDAE$SVD\Nuvoton\M481_v1.svd 0 0 @@ -80,8 +80,8 @@ 0 - 0 - 0 + 1 + 1 fromelf --bin -o "$L@L.bin" "#L" fromelf --text -a -c -o "$L@L.dis" "#L" 0 @@ -185,6 +185,7 @@ 0 1 0 + 0 0 0 8 @@ -351,7 +352,7 @@ 0 0 0 - 0 + 4 @@ -397,6 +398,11 @@ 1 .\src\hid_transfer.c + + vcom_serial.c + 1 + .\src\vcom_serial.c + @@ -432,16 +438,6 @@ 1 .\src\CSL\NUCM480_StdPeriph_Driver\clk.c - - dac.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\dac.c - - - eadc.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\eadc.c - gpio.c 1 diff --git a/README.md b/README.md index e2cdb48..a34ea46 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ -# DAPLink -CMSIS-DAP (DAPLink) porting to Nuvoton M480 +## DAPLink +DAPLink (CMSIS-DAP) based on Nuvoton M480, supports SWD and CDC. + +SWD_CLK => PA.1 +SWD_DIO => PA.0 + +CDC_TXD => PB.1 +CDC_RXD => PB.0 + +LED_SWD => PA.2 +LED_TXD => PC.1 +LED_RXD => PC.0 diff --git a/doc/DAPLink.pcapng b/doc/DAPLink.pcapng new file mode 100644 index 0000000..e6526da Binary files /dev/null and b/doc/DAPLink.pcapng differ diff --git a/out/DAPLink.bin b/out/DAPLink.bin new file mode 100644 index 0000000..1ae0c10 Binary files /dev/null and b/out/DAPLink.bin differ diff --git a/out/DAPLink.hex b/out/DAPLink.hex new file mode 100644 index 0000000..661e304 --- /dev/null +++ b/out/DAPLink.hex @@ -0,0 +1,737 @@ +:020000040000FA +:10000000104E0020312B0000712B0000732B0000DC +:10001000752B0000772B0000792B000000000000FA +:100020000000000000000000000000007B2B00002A +:100030007D2B0000000000007F2B0000812B0000C2 +:10004000832B0000832B0000832B0000832B0000F8 +:10005000832B0000832B0000832B0000832B0000E8 +:10006000832B0000832B0000832B0000832B0000D8 +:10007000832B0000832B0000832B0000832B0000C8 +:10008000832B0000832B0000832B0000832B0000B8 +:10009000832B0000832B0000832B0000832B0000A8 +:1000A000832B0000832B0000832B0000832B000098 +:1000B000832B0000832B0000832B0000832B000088 +:1000C000832B0000832B0000832B0000832B000078 +:1000D000832B0000832B0000832B0000832B000068 +:1000E000832B0000832B0000832B0000832B000058 +:1000F000832B0000832B0000832B0000832B000048 +:1001000087080000832B0000832B0000832B000056 +:10011000832B000041040000832B0000832B000090 +:10012000832B0000832B0000832B0000832B000017 +:10013000832B0000832B0000832B0000832B000007 +:10014000832B0000832B0000832B0000832B0000F7 +:10015000832B0000832B0000832B0000832B0000E7 +:10016000832B0000832B0000832B0000832B0000D7 +:10017000832B0000832B0000832B0000832B0000C7 +:10018000832B0000832B0000832B0000832B0000B7 +:10019000832B0000832B0000832B0000832B0000A7 +:1001A000832B0000832B0000832B0000832B000097 +:1001B000832B0000832B0000DFF810D002F0FEFC40 +:1001C00000480047CD020000AFF30080104E002031 +:1001D00010B500F0ACF84FF08044606B5C4908400B +:1001E0006063606B5B4908436063E06A20F0030072 +:1001F00040F48270E062D4F8200220F0F00040F079 +:100200003000C4F82002544801F0E5FB0020C4F897 +:10021000000100225149524802F058F900F092F9C9 +:1002200000F0C6FA02F063F9BDE81040352000F096 +:1002300073B810B5012211464A4801F001FF4FF092 +:100240008040816B21F0FF018163816B41F0770178 +:100250008163454C00221146204601F08AFB20466E +:1002600001F0B9FB414C4FF4E131204601F037FF7A +:10027000616841F013016160BDE81040302000F07A +:100280004BB870B500F053F84FF08044E06D20F4A7 +:100290007F40E065E06D40F42A40E065012001F018 +:1002A000B5FD012001F054FC314D284601F067FDF9 +:1002B0001121C4F834120021C4F800112D490D6039 +:1002C0002D482E49B5FBF0F0086070BDFFF7D9FF4F +:1002D000FFF7AFFF01F082F8FFF77AFF214C012210 +:1002E00040341146204601F05FFE012202212046E3 +:1002F00001F05AFE224D1D4C2E1D00F0CAF900F0EF +:1003000013FBA06940F34070401C2860A06940F3D3 +:100310000070401C3060F0E700F01F0201219140A6 +:100320004009800000F1E020C0F80011704710B5CE +:100330005921880716228823C0F80011C0F800212F +:10034000C0F80031D0F80041002CF5D010BD0000FD +:10035000FFFF00F00000EE0E1B00004093050000C0 +:10036000542C000040400040123C8C770020074095 +:1003700000B0710B7401002040420F007801002092 +:100380008048004070B5034601251878072815D02D +:10039000F34C607818B16068A268904210D0F148C0 +:1003A000626800EB82100A46194602F0F5FB6068AD +:1003B000401C60606068102803D004E0EA480570C3 +:1003C00070BD002060606068A1688842F8D16570E7 +:1003D00070BD10B5E5480068E5490844E34C241DAC +:1003E0002168FFF7CFFF4020206010BD10B5DC4C26 +:1003F0002069E168884201D1A078E8B1DD4821692F +:1004000000EB8111D94810380268D94810444022C5 +:1004100000F081F9D54940200C3908602069401C62 +:10042000206121690020102900D120612169E26842 +:10043000914200D1A07010BD0120207010BDD5E701 +:1004400070B5CD4D6C68286900F00F0660070DD5BA +:10045000042068606869C00704D0286940F4FA6025 +:10046000286103E0286920F080002861E00715D0AA +:1004700001206860F00705D0286940F4FA6028611F +:1004800002F0C6FAB00703D5286920F010002861F1 +:10049000700703D5286940F4FA602861200701D568 +:1004A00008206860A0074CD5002C10DA4FF00040FF +:1004B0006860AE482438016841F001010160AB4832 +:1004C0001438016841F00101016002F010FAE00304 +:1004D00004D54FF48030686002F035FAA0030DD5E2 +:1004E0004FF40030686002F074FAA4484178202983 +:1004F00004D10079012801D100F077F9600304D517 +:100500004FF480206860FFF79AFF200304D54FF472 +:1005100000206860FFF75DFFE00202D54FF4801015 +:100520006860A00204D54FF40010686000F02EF956 +:10053000600206D54FF480006860BDE8704000F0AE +:100540002AB970BD8C490020886188494FF4107029 +:10055000283908608549082030390860834A4FF4FB +:100560000871183A11608149203908607F4941209B +:10057000083908607D494820103908607B492120EE +:10058000083108607949882008604020091D08600A +:1005900070477CB5684601F0BCFF9DF80000784CC0 +:1005A0000006A4F1040529D59DF80100012809D011 +:1005B000022807D0032805D0212807D0002000F00A +:1005C000B9F87CBD002000F0B5F87CBD9DF80400B2 +:1005D000012808D16A48083800686549072208449C +:1005E000684900F098F8206840F0800020600720FB +:1005F00028600021084601F091FF7CBD9DF80100B4 +:1006000000260B2820D004DC09280AD00A2804D1AF +:1006100014E020282FD022281AD0002000F08AF8D9 +:100620007CBD9DF803000328FAD1554810300168BD +:1006300041F080010160001F06607CBD206840F031 +:10064000800020602E607CBD002000F073F87CBD2F +:100650009DF80400012808D19DF802009DF80310C0 +:1006600040EA01204849A1F80C04206840F08000CD +:1006700020602E607CBD9DF80400012803D1072175 +:10068000404801F04BFF206840F0800020602E6061 +:100690007CBD70B5324CA0686168884201D1607839 +:1006A000B0B3344DE068A26805EB80112D4800EB33 +:1006B000821000F002FEA068401C102800D100202B +:1006C000A060A16862680020914200D1607021782A +:1006D00081B12070E06805EB801124481038006873 +:1006E000234A1044402200F016F8204940200C39DB +:1006F00008600BE0E068401C102800D10020E0609A +:10070000E0682169884201D10120A070012070BDFC +:10071000FFE70020FBE718B50023009306E0009BED +:10072000009CCB5C0355009B5B1C0093521E531C2A +:10073000F5D118BD0021124B03EB0112126802F033 +:100740000F02824208D10E48001D00EB0110016823 +:1007500041F0020101607047491C0C29ECD370473D +:1007600010010020A00100202B01002030050C40CA +:1007700000010C40A005002000000C406C0100208E +:1007800008050C4024010020A0090020BB490020DE +:10079000A1F84E047047BA480168BA488180B84948 +:1007A000091F0968B84A114401600121C1807047DE +:1007B000B34942201C390860B149C8202439086077 +:1007C000AF4943200C390860AD49D0201439086086 +:1007D000AB492320091D0860A9494FF48870091FFF +:1007E00008604020091D08607047F8B5A74D4FF418 +:1007F0008034C5F88041A649002008804880888060 +:10080000A1F80602A1F80802A1F80A02A1480321F2 +:100810008160A14EB17905290ED006290ED0072995 +:100820000ED008290ED003227179052916D2DFE8EF +:1008300001F00B0D0F1113000022F5E70122F3E781 +:100840000222F1E70322EFE7002308E0082306E095 +:10085000182304E0282302E0382300E00023317944 +:1008600059B101290BD002290BD000210091316828 +:1008700001F0D1FCC5F80041F8BD0021F6E70421E4 +: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 +:100A7000486840F002004860BDE8F881A009002005 +:100A800064050C40F00D002000010C4004E000E083 +:100A9000A00B0020002007402401002070B54FF07B +:100AA000402501220221284601F07EFAFE49012458 +:100AB0000C6001221146284601F076FAFA49091F16 +:100AC0000C6001220421284601F06EFA2846BDE898 +:100AD00070400122042101F067BA10B54FF04024A4 +:100AE00000220221204601F05FFA20460022BDE8E4 +:100AF0001040012101F058BAEFE7002070470022B2 +:100B0000062824D006DC052821D2DFE800F02020CA +:100B100020200C00F0280DD0FD2818D0FE2813D07E +:100B2000FF2814D10AE0E14802680A6000790871E0 +:100B300005220CE011200870012208E04020087016 +:100B400000204870022202E01020087001221046A6 +:100B500070474FF47A414843401EFDD170470278F8 +:100B6000407842EA00208001401EFDD10870D04844 +:100B7000704710B5CC4B02781B1DCD4C002A05D018 +:100B8000012A08D0FF200870204610BD407800F0F0 +:100B90000100186003E0407800F0010018600020B8 +:100BA0000870204610BD70B50D460478002C00D1A9 +:100BB0000124012C04D000242C704FF0011070BDD2 +:100BC000BC4901200870FFF769FFF5E770B50446DE +:100BD000B84900250D70FFF780FF2570012070BD1A +:100BE00010B50446FFF789FF6070002020700220D6 +:100BF00010BDF0B5037842788478C57844EA0524BE +:100C0000057940792D0445EA00600443A64DD607D6 +:100C10004FF001074FF0000004D0DE0701D02F6035 +:100C200000E02860A44E5FEA827C05D55FEA837C01 +:100C300001D5376000E0306064B3A04FBC4200D9FA +:100C40003C464FF0E027B86104EB4404A4017C610A +:100C500005243C61D40702D02C689C4214D194072F +:100C600003D53468B4EB530F0ED1540702D5B0EB63 +:100C7000930F09D1940602D5B0EB531F04D114068B +:100C800007D5B0EBD31F04D03C69C4F30044002C5B +:100C9000E0D038612868326840EA4200087088482D +:100CA000F0BD30B50278437842EA03228378C078F9 +:100CB0001B0443EA006002438248002A08D0824DA8 +:100CC00000247C4BAA4206D301225A705A600FE0DE +:100CD000FF220A7030BD5C707C4D1544B5FBF2F20A +:100CE000022A03D90325B2FBF5F200E001225A6083 +:100CF0000C7030BD70B50D4610F8014B0146002C4C +:100D000001D14FF48074204600F07AFB0020287057 +:100D1000E41DE008401C0004401C70BD0078654ADA +:100D200000F003035B1C1375C0F3800050750020B6 +:100D300008704FF00110704710B5FF220A700122B1 +:100D4000012410F8013B0AE010F8011B01F03F01FB +:100D500001B94021C91DC90808440A44521C5B1E40 +:100D6000591CF1D1204662F31F4010BD0078FF22CC +:100D70000A70401C0004401C7047FF2008704FF0B0 +:100D80000110704710B54B4A03781372437884788A +:100D900043EA04235381C378007943EA0020908119 +:100DA000002008704A4810BD2DE9F04F87B0044676 +:100DB00006940020049005918D1CDFF818A10021F5 +:100DC0008AF80010002703916678A41C002E69D0D1 +:100DD00014F8018B5FEA887165D587B33548B0F8A0 +:100DE0000A9008F0110001280DD101A9404600F039 +:100DF000A2FD022815D1B9F1010912D39AF8001009 +:100E00000029F2D00DE001A90E2000F094FD022887 +:100E100006D1B9F1010903D39AF800100029F2D0E4 +:100E2000002701283ED1019929700199090A6970AA +:100E30000199090CA9700199090EE9702D1D5FEA4D +:100E4000C8616AD520786178E27840EA0120A1780B +:100E5000090441EA026108430290241D1548B0F8D4 +:100E60000CB05FEAC87011D01248B0F80A900021A7 +:100E7000404600F060FD022806D1B9F1010903D314 +:100E80009AF800100029F2D001280BD10948B0F8D7 +:100E90000A9001A9404600F04EFD022821D1B9F187 +:100EA000010919E0B6E06EE004480040702C000033 +:100EB00001000200F80D002000480040C0C62D00CF +:100EC0000100060001000400006CDC02FFD7B80539 +:100ED000010005002B01002003D39AF8001000291F +:100EE000D7D001280DD1F949019A09691140029A18 +:100EF000914206D0BBF1010B03D39AF800100029F0 +:100F0000C4D0F249019A09691140029A914201D074 +:100F100040F0100001287DD132E0EC49B1F80A9090 +:100F20005FEAC87111D05FBB0021404600F003FDAD +:100F3000022806D1B9F1010903D39AF8001000295B +:100F4000F2D0012872D101271AE001A9404600F031 +:100F5000F2FC022806D1B9F1010903D39AF8001076 +:100F60000029F2D0012861D1019929700199090A5B +:100F700069700199090CA9700199090EE9702D1D7C +:100F80000021039148E0F7B1D048B0F80A9001A9D8 +:100F90000E2000F0D0FC022806D1B9F1010903D3DC +:100FA0009AF800100029F2D001283FD1019828704A +:100FB0000198000A68700198000CA8700198000E52 +:100FC000E8702D1D002720786178E27840EA012042 +:100FD000A178090441EA026108430190241D5FEAF7 +:100FE000886103D5B9490861012015E0B748B0F818 +:100FF0000A9001A9404600F09EFC022806D1B9F1F2 +:10100000010903D39AF800100029F2D001280DD16C +:10101000012100E00AE003910499491C04919AF827 +:10102000001019B9761E002E7FF4D2AE5EB114F80E +:10103000011B8A0703D5C90602D5241D00E0241D23 +:10104000761E002EF3D101282FD1EFB19F4846899B +:1010500001A90E2000F06FFC022806D1761E711C3B +:1010600003D09AF800100029F2D001281DD101996F +:1010700029700199090A69700199090CA9700199EF +:10108000090EE9702D1D10E0039971B18F48468952 +:1010900000210E2000F04FFC022806D1761E711CA4 +:1010A00003D09AF800100029F2D0DDE90412117083 +:1010B000059948700598291A069807B0201A41EA40 +:1010C0000040BDE8F08F30B504464278801C002A0D +:1010D0000BD010F8013B9D0703D5DB0602D5001DA0 +:1010E00000E0001D521E002AF3D100220A704A704F +:1010F000001B0004801C30BD744A1278012A00D005 +:10110000E1E751E62DE9F84F044600260020894624 +:10111000CF1CDFF8BCA100218AF80010641C2178E4 +:10112000627841EA0225A41C002D74D014F8018BCA +:10113000DFF898B15FEA88715BD55FEAC87135D096 +:10114000BBF80A400021404600F0F5FB022806D11A +:10115000641E611C03D09AF800100029F2D0012807 +:1011600059D123E025B95FEAC87001D04FF00E08CD +:10117000BBF80A406946404600F0DDFB022806D174 +:10118000641E611C03D09AF800100029F2D00128D7 +:1011900041D1009939700099090A79700099090CB8 +:1011A000B9700099090EF9703F1D761C6D1E691CFF +:1011B000D8D130E020786178E27840EA0120A17847 +:1011C000090441EA026108430090241D3F48B0F839 +:1011D0000AB06946404600F0AEFB022806D1BBF1DA +:1011E000010B03D39AF800100029F2D0012812D184 +:1011F000761C6D1E681CDDD13448448900210E2008 +:1012000000F099FB022806D1641E611C03D09AF8F5 +:1012100000100029F2D089F80060310A89F8011025 +:1012200089F80200A7EB0900BDE8F88F10B5044665 +:101230002648007801280AD000200870487088707D +:101240000320E178890706D540F4802010BD2046B0 +:10125000FFF758FFF5E76178A27841EA02210422FE +:1012600002EB810140EA014010BD38B50C464178DF +:10127000827841EA0222C1780079090441EA0060DB +:10128000024300926946002000F055FB00202070C8 +:10129000012038BD10B50D4A1278012A05D0FF2073 +:1012A0000870012040F4A02010BDFFF7DEFFF9E731 +:1012B000FF2008704FF00110704710B50278A2F1BE +:1012C00080031F2B06D8FFF7F3FF10BDF80D002099 +:1012D0002B01002001F8012B0C4610F8011B1729E7 +:1012E00057D2DFE801F00C14181C44484C5650202B +:1012F000245656565656282C3034383C4000007838 +:10130000611CFFF7FCFB207000F10210DDE72146B5 +:10131000FFF72FFC3AE02146FFF745FC36E0204678 +:10132000FFF754FC32E02146FFF719FC2EE020467F +:10133000FFF756FC2AE02146FFF75BFC26E021463A +:10134000FFF7AFFC22E02146FFF7D4FC1EE0214668 +:10135000FFF7E4FC1AE02146FFF7EEFC16E0214619 +:10136000FFF704FD12E02146FFF707FD0EE02146DE +:10137000FFF708FD0AE02146FFF7BEFE06E0214622 +:10138000FFF754FF02E02146FFF784FF00F1011050 +:101390009BE7FF2004F8010C4FF0011095E72DE9C1 +:1013A000F04102787F2A02D0BDE8F04185E70A705B +:1013B0004478851C4C708E1C4FF0021708E03146B3 +:1013C0002846FFF77AFF074405EB104580B2064434 +:1013D000641E601CF3D13846BDE8F0810748002147 +:1013E0000170417016224260017264224281818143 +:1013F0000161012202754175FFF77EBBF80D0020E7 +:101400002DE9F04100220023FF4CFE4E00274FF053 +:10141000010C06F10408656815E013B911F8012BF9 +:101420000823D40702D0C6F800C000E03760C8F82F +:1014300000702C46641EFDD1C8F800C02C46641E06 +:10144000FDD152085B1E401E441CE6D1BDE8F08170 +:101450002DE9F05F834689460120DFF8A883C8F8AC +:10146000000008F1040500262E6001272F60C8F84F +:1014700000B02E602F604FEA5B00C8F800002E60BD +:101480002F600BEB00014FEA9B00C8F800002E60B4 +:101490002F6001444FEADB00C8F800002E602F6087 +:1014A0000844C8F800002E602F60C8F800602E6065 +:1014B0002F60C8F800702E602F60002201214FF0CD +:1014C000402000F071FDDFF840A39AF814100800E6 +:1014D00004D02E602F60491E0029FAD12E60D8F862 +:1014E00000102F602E60D8F800202F6041EA4202E1 +:1014F0002E60D8F800102F6042EA8104012C12D02F +:10150000022C62D0042C60D0213020B12E602F60DC +:10151000401E0028FAD100F014FA0120C8F800009B +:10152000E0B2BDE8F09F5FEA8B7125D50022002173 +:1015300020202E60D8F800302F601944520842EA6B +:10154000C372401E0028F4D12E60D8F800002F602E +:101550004140C80700D00824B9F1000F01D0C9F8F4 +:1015600000209AF8140020B12E602F60401E002841 +:10157000FAD100F0E6F918E020B12E602F60401E8D +:101580000028FAD100F0DDF9D9F80000002220216E +:10159000C8F800002E602F6002444008491E002950 +:1015A000F6D1C8F800202E602F609AF8080038B1F4 +:1015B0000021C8F800102E602F60401E0028FAD1CC +:1015C0000120C8F80000E0B2ABE79AF8151041B16D +:1015D0005FEA8B7105D521212E602F60491E0029FD +:1015E000FAD120B12E602F60401E0028FAD100F001 +:1015F000A8F99AF8150058B15FEA8B7008D400205A +:10160000C8F8000021202E602F60401E0028FAD16B +:101610000120C8F80000E0B283E72DE9F05F8246C0 +:101620008B4600220120774E3060371D4FF00008B6 +:10163000C7F80080DFF8D091D9F804000146491EB0 +:10164000FDD101243C600146491EFDD1C6F800A031 +:10165000C7F800800146491EFDD13C600146491E85 +:10166000FDD102EB0A034FEA5A023260C7F800804C +:101670000146491EFDD13C600146491EFDD113447F +:101680004FEA9A023260C7F800800146491EFDD138 +:101690003C600146491EFDD113444FEADA02326034 +:1016A000C7F800800146491EFDD13C600146491E35 +:1016B000FDD199183160C7F800800146491EFDD15F +:1016C0003C600146491EFDD13160C7F800800146EB +:1016D000491EFDD13C600146491EFDD1012131600A +:1016E000C7F800800146491EFDD13C60401EFDD177 +:1016F000002201214FF0402000F056FC99F81430F0 +:1017000019000DD0D9F80450C7F800802846401EB3 +:10171000FDD13C602A46521EFDD15B1E002BF3D149 +:10172000C7F80080D9F804000246521EFDD1326885 +:101730003C6003465B1EFDD1C7F8008003465B1E7C +:10174000FDD133683C6005466D1EFDD142EA43027F +:10175000C7F8008003465B1EFDD133683C60054638 +:101760006D1EFDD142EA8305012D17D0022D7DD0DB +:10177000042D7BD0213159B1C7F800800246521E9A +:10178000FDD13C600246521EFDD1491E0029F3D115 +:1017900000F0D7F801203060E8B2C2E65FEA8A7252 +:1017A00043D54FF0000C00232022C7F800800146EB +:1017B000491EFDD1D6F800A03C600146491EFDD16E +:1017C00053444FEA5C0141EACA7C521E002AECD124 +:1017D0003A46C7F80080CE460146491EFDD1316821 +:1017E0001460401EFDD14B40D80700D00825BBF146 +:1017F000000F01D0CBF800C09EF8143093B1DEF892 +:1018000004C003E000480040F80D0020C2F800804A +:101810006046401EFDD114606146491EFDD15B1E2D +:10182000002BEED100F08DF831E059B1C7F80080FF +:101830000246521EFDD13C600246521EFDD1491E99 +:101840000029F3D100F07DF8DBF800004FF0000C28 +:101850002023D9F804203060C7F800801146491EC3 +:10186000FDD13C601146491EFDD100E026E08444D4 +:1018700040085B1E002BEED1C6F800C03946C7F801 +:1018800000801046401EFDD10C60521EFDD199F81B +:10189000081079B100203060D9F80420C7F8008022 +:1018A0001046401EFDD13C601046401EFDD1491E31 +:1018B0000029F3D101203060E8B232E699F8152012 +:1018C0007AB15FEA8A720CD52123C7F800800246FC +:1018D000521EFDD13C600246521EFDD15B1E002B04 +:1018E000F3D159B1C7F800800246521EFDD13C60C9 +:1018F0000246521EFDD1491E0029F3D100F021F805 +:1019000099F8150098B15FEA8A7010D40020306011 +:101910002121D9F80420C7F800801046401EFDD1CF +:101920003C601046401EFDD1491E0029F3D1012024 +:101930003060E8B2F5E5064A5278002A00D087E523 +:101940006BE6012211464FF0402000F02DBB000055 +:10195000F80D002000F01F0201219140C943F84A10 +:10196000800F02EB800002680A4002607047F54871 +:10197000F0E770B510F47F3F14D0C0F38143022B21 +:1019800023D06FEA9044A40722D0ED4C1C3404EB22 +:1019900083031C68C0F38725C0F34416B540AC43ED +:1019A00014431C60420E52070ED0E54BC0F3017287 +:1019B0000C3303EB82021468C0F34263C0F304509B +:1019C00083409C430C43146070BDDD4B2833E0E73B +:1019D000DB4B2C33DDE700F01F0201219140D84A98 +:1019E000800F02EB800002680A430260704710B566 +:1019F000044641EA4210D24940F010005C310860D0 +:101A0000D04B1846FFF7E7FF2146BDE81040002203 +:101A10001846AEE7CC48016841F004010160C848AF +:101A2000001F016841F08001016030BF7047C64867 +:101A3000016821F004010160C148001F016821F024 +:101A40008001016030BF7047BD48001F0068C007BB +:101A500001D0BE48704700207047B948001F006899 +:101A6000800702D54FF4004070470020704710B542 +:101A700001F00CF84FF08041D1F834024207B4482D +:101A800019D0D1F8342202F00702012A15D0D1F87A +:101A9000342202F00702022A12D0D1F8342202F0D6 +:101AA0000702032A0FD0D1F8341201F007010429EC +:101AB0000CD0006810BD006810BD0068400810BD63 +:101AC0000068800810BD0068C00810BD00680009EB +:101AD00010BD10B500F0DAFF4FF08041D1F83402AC +:101AE00010F0700F9A4819D0D1F83422C2F30212C4 +:101AF000012A15D0D1F83422C2F30212022A12D0E0 +:101B0000D1F83422C2F30212032A0FD0D1F83412D2 +:101B1000C1F3021104290CD0006810BD006810BD8B +:101B20000068400810BD0068800810BD0068C0084B +:101B300010BD0068000910BD10B500F0A7FF844873 +:101B4000006810BD10B500F0A1FF8148006810BD0D +:101B500030B505467F490124A20705E0081EA1F122 +:101B6000010101DC002404E0D2F8503235EA030020 +:101B7000F4D1204630BD2DE9F04107460E46704CA9 +:101B8000241F206D00F01005206840F00400206044 +:101B90001020FFF7DDFF206940F007002061206A78 +:101BA00020F00F0232432262206920F007013943FE +:101BB0002161A4F5007400F069FF002D05D1D4F86F +:101BC000000220F00400C4F80002BDE8F08108B56E +:101BD000002061A10968009159493C31096811F45C +:101BE000A02F13D159488A0310D4C1F381321DF8B4 +:101BF0000220C1F30800801CC1F34421491C574B4B +:101C0000584311FB02F1B0FBF1F0C00008BD4C4895 +:101C10003C30016841F48031016070472DE9F84F94 +:101C200004460D46FFF7F3FFDFF8209104B3444864 +:101C3000001F016841F0040101601020FFF788FFD8 +:101C40004FF40020009046484649284488426BD80B +:101C50004FF0FF3100274FF000080026AB4601236C +:101C6000A9B3032B45D0042B0ED0022B0FD010E0CC +:101C70003348001F016841F0010101600120FFF7B6 +:101C800067FF00200090DEE74FEA8B0501E04FEA96 +:101C90004B05022269B3B9FBF2F0334CDFF8C8C040 +:101CA0000444CCF1000C644520D80224DFF8BCE0E9 +:101CB000C0F35D0A0AFB04F0DFF8A4C08444F445D5 +:101CC0000FD8B0EB950F03D9A0EB950C02E013E011 +:101CD000C0EB950C8C4504D261461746A0461E46C3 +:101CE00021B1641C40F201208442E3D9521C202A15 +:101CF000D0D95B1C042BB3D90098711E40EA813106 +:101D0000781E41EA4020A8F1020108430C493C3109 +:101D100008600420FFF71CFF7E43B9FBF6F000FBD0 +:101D200008F04000BDE8F88F4CB1054810493C3040 +:101D300001600420FFF70CFFBDE8F84F47E719E00A +:101D4000040200400600C05710ED00E0001BB70081 +:101D50007401002080F5200001020204C0C62D009D +:101D6000800F05FD8074D21A00F7C2FFC0687804A6 +:101D70001E420800854844F21E210160D9E770B573 +:101D800006464FF08044D4F8500200F01005804819 +:101D9000864200D9064604F50074206840F004002D +:101DA00020601020FFF7D4FE206940F0070020617A +:101DB000206A20F00F0020622068A4F50074C0079C +:101DC00005D031460020FFF729FF064609E03146DD +:101DD0004FF40020FFF722FF0646D4F8500200F02F +:101DE000100500210220FFF7C6FE2DB9D4F800022D +:101DF00020F00400C4F80002304670BD6349303959 +:101E00000A6822F0380202430A6070475F4940398D +:101E10000A6802430A6070475C4940390A68824395 +:101E20000A60704730B54FF0E022002414610428A6 +:101E30000DD0564D303D2B6823F0380303432B6003 +:101E400051619461106940F00300106130BD106968 +:101E500040F004001061F3E74FF0E021002008613A +:101E6000704730B504464FF08045042C01D0052C56 +:101E700008D1D5F8000240F00800C5F8000208209B +:101E8000FFF766FED5F8900220F007002043C5F862 +:101E9000900230BD3D4950310A6822F4403202437D +:101EA0000A607047394854300068704730B5374C85 +:101EB000603404EB8000046840F2F715AC4344EA58 +:101EC00001111143194341F00101016030BD1FB5FB +:101ED000304991E81C00C9688DE81C0003912E4A26 +:101EE0009106904205D1D1F8180200F0010004B02B +:101EF00010BD2A4A904204D1D1F81802C0F3400024 +:101F0000F5E7274A904204D1D1F81802C0F3002027 +:101F1000EDE7244A904204D1D1F81802C0F34020E2 +:101F2000E5E7410E490710D0C0F301725DF82210B9 +:101F3000164A303A11440968C0F34262C0F30450B3 +:101F40008240114021FA00F0D1E70020CFE71FB511 +:101F50001049D1E905340A69C9698DE81C0003916B +:101F600010F47F3F10D0C0F381425DF82210074A81 +:101F7000203A11440968C0F38722C0F3441082401C +:101F8000114021FA00F0B2E70020B0E74002004023 +:101F900000B0710B782C0000100000A2110010A2FC +:101FA000120080A2130090A2F0B50023012703269F +:101FB00007FA03F48C4309D105685C0006FA04FCB7 +:101FC00025EA0C0502FA04F4254305605B1C102B7E +:101FD000EED3F0BD10B5836901248C40A343140EE9 +:101FE0008C4023438361C3694FF001148C4022F07D +:101FF0007F42A3438A401343C36110BD826901231A +:102000008B409A438261C2694FF001138B409A431F +:10201000C2617047F0B500230127032607FA03F4D5 +:102020000C4209D0856A5C0006FA04FC25EA0C051E +:1020300002FA04F4254385625B1C102BEED3F0BD3D +:10204000F0B500230127032607FA03F40C4209D058 +:10205000056B5C0006FA04FC25EA0C0502FA04F4A0 +:10206000254305635B1C102BEED3F0BD4A0503D559 +:1020700070228261082282610A0503D5426942F01A +:10208000010242618A0401D5F94A82614A0401D5FC +:102090001F224264090404D58021C16140F20F313E +:1020A00081637047002141607047416821F44051CD +:1020B0004160704742688A4342607047016941F459 +:1020C00000710161416941F480714161416841F4ED +:1020D00040514160704742680A43426070472DE9B1 +:1020E000FF4104460F4600250026E24890E80E0016 +:1020F000C0688DE80E000390DF494FF080408C42AD +:1021000008D1D0F81412C1F30165D0F82002C0F351 +:10211000032639E0D9498C4208D1D0F81412C1F312 +:102120008165D0F82002C0F303362DE0D4498C42FB +:1021300008D1D0F81C12C1F30165D0F8300200F0CC +:102140000F0621E0CF498C4208D1D0F81C12C1F310 +:102150008165D0F83002C0F3031615E0CA498C42FD +:1021600008D1D0F81C12C1F30175D0F83002C0F3C9 +:10217000032609E0C5498C4206D1D0F81C128D0F08 +:10218000D0F83002C0F30336002020630320E06063 +:10219000A068BF490840A060E846012D02D1FFF7C2 +:1021A00016FD0190002F17D058F82510761CB1FBB2 +:1021B000F6F000EB5700B0FBF7F0801EB0F5803F63 +:1021C0000CD3B1FBF6F000EBC700B0FBF7F06FF0FB +:1021D000010101EB10106062BDE8FF8140F040504A +:1021E0006062F9E7F0B50446002600204FF0804712 +:1021F0000EE0002304E05B1CBB4201D3012602E099 +:10220000A5696D04F7D4012E04D023680B54401C3B +:102210009042EED3F0BD2DE9FF5F0446DDF838A013 +:102220000F4690469946002500269248D0E905239E +:102230000169C0698DE80E0003908F494FF080401E +:102240008C4208D1D0F81412C1F30165D0F82002F5 +:10225000C0F3032639E089498C4208D1D0F8141222 +:10226000C1F38165D0F82002C0F303362DE0844924 +:102270008C4208D1D0F81C12C1F30165D0F83002AD +:1022800000F00F0621E07F498C4208D1D0F81C12E3 +:10229000C1F38165D0F83002C0F3031615E07A4926 +:1022A0008C4208D1D0F81C12C1F30175D0F830026D +:1022B000C0F3032609E075498C4206D1D0F81C1200 +:1022C0008D0FD0F83002C0F30336EB46012D02D15A +:1022D000FFF77DFC0190DFB15BF82510761CB1FBA8 +:1022E000F6F000EB5700B0FBF7F0801EB0F5803F32 +:1022F0000BD3B1FBF6F000EBC700B0FBF7F06FF0CB +:10230000010101EB1010606202E040F04050606299 +:1023100048EA090848EA0A08C4F80C80BDE8FF9FAB +:10232000026A22F0FF020A430262416841F400613E +:10233000416070472DE9FF4704460F46904600254F +:1023400000264C48D0E90923016AC06A8DE80E00D6 +:10235000039002202063484940078C4208D1D0F8FE +:102360001412C1F30165D0F82002C0F3032639E04E +:1023700042498C4208D1D0F81412C1F38165D0F8DB +:102380002002C0F303362DE03D498C4208D1D0F83D +:102390001C12C1F30165D0F8300200F00F0621E0F5 +:1023A00038498C4208D1D0F81C12C1F38165D0F8AD +:1023B0003002C0F3031615E033498C4208D1D0F83F +:1023C0001C12C1F30175D0F83002C0F3032609E0F6 +:1023D0002E498C4206D1D0F81C128D0FD0F8300255 +:1023E000C0F30336E946012D02D1FFF7F0FB01905F +:1023F00087B159F82500761CB0FBF6F000EBC7005A +:10240000B0FBF7F06FF0010101EB1010090C8842EE +:1024100000D26062B8F1000F09D0A06A20F020005D +:10242000A062A06A40F00200A062BDE8FF87A06A37 +:1024300040F04000A062A06A20F00200A062F4E731 +:1024400010B503230363C36A124C2340C362C36AFB +:1024500041EA02610B43C36210BD01230363C36AF7 +:1024600023F0CF03C362C36A11430B43C3627047B7 +:1024700001000001982C00000000074000100740F8 +:102480000020074000300740004007400050074050 +:102490000FFFF0FFFFF8FF00F0B504460026002014 +:1024A0004FF080470EE0002304E05B1CBB4201D3E9 +:1024B000012602E0A569ED00F7D5012E04D00B5CE2 +:1024C0002360401C9042EED1F0BD0000F74BD86372 +:1024D000D9621A630068C0791862F5484FF4DA616E +:1024E00040F8041CC16F41F00101C1677047F0481A +:1024F0001438D0F8901021F00101C0F890104FF47A +:10250000FA61016140F20F11416002680A43026002 +:102510007047E6490822403100F0A1BAE34A9060D2 +:10252000002010615161106AE249086070472DE98E +:10253000F04103460D46DD4C216ADE48DD4ADC4FA2 +:102540000C38143AEC37061F8D4213D9216A19440E +:102550006160216A691AE160016841F080010160EF +:1025600010683844226A194600F079FA206A30600F +:10257000BDE8F08100216160E160016841F0800107 +:102580000160106838442A46194600F068FA356040 +:10259000EEE730B4C54B4033D87900029979014455 +:1025A000C248C44CC34DDA78083C0835C06B0F2ACA +:1025B00028D006DC012A15D0022A19D0032A07D117 +:1025C0003BE0BA4B4033212A1B7921D0222A29D063 +:1025D000206840F002002060286840F00200286077 +:1025E00030BC7047122900D31221006830BC9EE72E +:1025F0004068C278837803EB0222914200D31146EF +:1026000030BC94E70C2900D30C21006930BC8EE764 +:10261000092900D30921826952F82320406830BC7F +:10262000104484E7426952F823208A4200D81146B8 +:10263000C06850F8230030BC79E79A78042A08D2A1 +:10264000806850F8220002788A4200D8114630BCD7 +:102650006DE7206840F002002060286840F002002A +:102660002860BDE72DE9F05F904A00255560D560F0 +:1026700002F14009494699F800308F4E0879DFF899 +:102680003CC2DFF83CB249785FEA036A00F00F070A +:102690004FF0010806F104046FD5DFF814A2A6F18B +:1026A00004090AF1EC0AD1B3062921D008290FD078 +:1026B0000A2924D0DCF8000040F00200CCF8000029 +:1026C000DBF8000040F00200CBF80000BDE8F09F0E +:1026D000D9F800005044D1690170206840F08000B2 +:1026E0002060C6F80080BDE8F05F0021084615E7CD +:1026F000FFF74FFFBDE8F05F002108460EE7D9F86D +:1027000000005044516A0170206840F08000206051 +:10271000C6F80080BDE8F05F00210846FEE6FFE74E +:10272000802B04D0812B14D0822B17D031E00020D5 +:10273000D16B4968C9794B0600D50120890603D5BC +:102740001178490640EA1160D9F800105144087028 +:102750001FE0D9F80000504405701AE0D9F80000D5 +:1027600000EB0A03002004EB00110A6802F00F02DC +:10277000BA4203D10CEB001103E01BE0401C0C2813 +:10278000F1D3086810F0020F01D0012000E0002012 +:102790001870D9F800004649ED31084405702068EA +:1027A00040F08000206002203060BDE8F05F002132 +:1027B0000846B3E63D4840300529807841D004DC26 +:1027C000012913D0032904D14CE0092940D00B2959 +:1027D0006BD0DCF8000040F00200CCF80000DBF821 +:1027E000000040F00200CBF800006FE710B10128B4 +:1027F00020D020E00020D2F838C02D4A143A02EB55 +:102800000011D1F8083503F00F03BB420ED108FACE +:1028100000F313EA0C0F09D101F5A1614B6823F015 +:1028200002034B600B6823F080030B60401C0C28F4 +:10283000E5D300E01570206840F08000206035602E +:1028400044E79061206840F08000206035603DE7FB +:10285000D061506B00B18047206840F0800020605C +:10286000356033E7190709D1032807D199F8031018 +:1028700021B914490B6843F006030B6010B101281D +:1028800022D023E0002004EB0011096801F00F01C1 +:10289000B94206D10CEB0010016841F00201016061 +:1028A00014E0401C0C28EED310E015E02C010020B1 +:1028B00014000C4014050C4004050C400C050C40A1 +:1028C0001C050C4000D0044082F80080206840F0D5 +:1028D000800020603560F9E65062116B09B1506AE2 +:1028E0008847206840F0800020603560EEE610B533 +:1028F00008226249624800F0B2F86148007810F09E +:10290000600011D05E494039202810D0402814D0F2 +:102910005C48016841F0020101605A4810300168CA +:1029200041F00201016010BDBDE810409AE6C86A9E +:102930000028F8D0BDE810400047886A0028F2D08F +:10294000BDE8104000472DE9F0414D4C403CE068A7 +:102950004C4D0026083D002827D0E368276A214611 +:10296000281F464A4968BB420FD900681044226AB2 +:1029700000F075F8206A2860216A60680844606089 +:10298000E068216A401AE060F2E500681044E268FD +:1029900000F065F8E0682860E068216A884201D1AB +:1029A000012060706660E660E2E53548017851B963 +:1029B0004078052807D134498868A269904202D03E +:1029C00008B9A069886060780028DDD02E60667044 +:1029D000CEE570B52A4C403C20696169884216D228 +:1029E000284E08363568301F0068244901442A46BD +:1029F000A06800F034F8A0682844A060206928444A +:102A0000206120696169884201D2206A306070BD0E +:102A100010B51B48002240384260C26082600261EB +:102A200042618263026442640020174B03EB001191 +:102A3000D1F8084524F08004C1F80845401C0C2852 +:102A4000F4D39A6010BD0E494039886270470C4932 +:102A50004039486370470A4940398863704718B560 +:102A60000023009306E0009B009CCB5C0355009B79 +:102A70005B1C0093521E531CF5D118BD00010C4085 +:102A80006C0100200C050C4000000C4010B5FFF755 +:102A90009EF8214A90604FF08043D3F8101201F065 +:102AA0000701022903D002F10C0050F82100D3F8ED +:102AB000201201F00F01491CB0FBF1F01060174922 +:102AC00008444900B0FBF1F0506010BD1448C16CDF +:102AD00021F00F0141F00801C1641248D0F89010B4 +:102AE00041F48021C0F89010016841F002010160BA +:102AF0000D490A6802F0F7320A604A6802F0F732BC +:102B00004A60016821F0020101600848016821F073 +:102B1000F0010160704700007401002020A107004F +:102B200000C0004008020040041104404041004041 +:102B300014484FF0590101604FF0160101604FF049 +:102B4000880101601048416841F4804141600F48AC +:102B5000416841F002014160416841F00401416077 +:102B60000B48804707484FF00001016009480047C3 +:102B7000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE72D +:102B8000FEE7FEE700010040000200400070004048 +:102B9000CD2A0000B901000040EA01039B0703D0E1 +:102BA00009E008C9121F08C0042AFAD203E011F88C +:102BB000013B00F8013B521EF9D27047064C074D0D +:102BC00006E0E06840F0010394E8070098471034FD +:102BD000AC42F6D3FDF7F4FAC82C0000E82C000054 +:102BE00070B58C1810F8015B15F0070301D110F8CF +:102BF000013B2A1106D110F8012B03E010F8016BFC +:102C000001F8016B5B1EF9D12B0705D40023521E7E +:102C10000DD401F8013BFAE710F8013BCB1A921CE6 +:102C200003E013F8015B01F8015B521EF9D5A142E4 +:102C3000D8D3002070BD02E008C8121F08C1002AC6 +:102C4000FAD170477047002001E001C1121F002A2D +:102C5000FBD170471D0000202F000020D000002075 +:102C6000E000002004010020EC000020F80000201B +:102C7000312E313000000000000000000400000090 +:102C8000080000000C00000000000000040000002C +:102C90000800000010000000001BB700000000004A +:102CA00000800000001BB700001BB7000000000000 +:102CB00000800000001BB700001BB70000000000F0 +:102CC00000800000001BB700E82C0000000000207E +:102CD000A0010000E02B0000DC2D0000A00100207E +:102CE000704C0000462C00001206100BFF0901A1D9 +:102CF0000119012940151326FF16750895408129F1 +:102D00000F129114C0120132021640160421501401 +:102D1000010102150109026B230301246409043334 +:102D2000020315092110011401221D160705810354 +:102D3000402D01070501071008080B0102020201DE +:102D40001B09041E29091305241D10010524521C0A +:102D50000424020E10090601020705820308150A61 +:102D600009040233020A2E0705830240072A0307DB +:102D700010080403090412035812491256124E1285 +:102D800031123912381237141E034D1A340A123018 +:102D900012201243124D1A53201253122D124412B4 +:102DA000413250229A1B209E041AB0047169081106 +:102DB000B21DB2121C050F0CB82B1002EC19DC016D +:102DC000122AC21602210809202271131BB75A0CBD +:0C2DD00008390462800B10102728000056 +:04000005000001B93D +:00000001FF diff --git a/src/DAP_config.h b/src/DAP_config.h index 6fda206..051b569 100644 --- a/src/DAP_config.h +++ b/src/DAP_config.h @@ -26,7 +26,7 @@ #define DAP_PACKET_SIZE 64 ///< USB: 64 = Full-Speed, 1024 = High-Speed. /// Maximum Package Buffers for Command and Response data. -#define DAP_PACKET_COUNT 1 ///< Buffers: 64 = Full-Speed, 4 = High-Speed. +#define DAP_PACKET_COUNT 16 ///< Buffers: 64 = Full-Speed, 4 = High-Speed. /// Indicate that UART Serial Wire Output (SWO) trace is available. @@ -63,13 +63,21 @@ DAP Hardware I/O Pin Access Functions // Configure DAP I/O pins ------------------------------ -#define SWD_GPIO PA -#define SWD_SWCLK PA4 -#define SWD_SWDIO PA5 -#define PIN_SWCLK 4 -#define PIN_SWDIO 5 -#define MSK_SWCLK (1 << PIN_SWCLK) -#define MSK_SWDIO (1 << PIN_SWDIO) +#define SWCLK_PORT PA +#define SWCLK_PIN 1 +#define SWDIO_PORT PA +#define SWDIO_PIN 0 + +#define SWD_SWCLK PA1 +#define SWD_SWDIO PA0 + +#define LED_CONNECTED_PORT PA +#define LED_CONNECTED_PIN 2 +#define LED_RUNNING_PORT PA +#define LED_RUNNING_PIN 2 + +#define LED_CONNECTED PA2 +#define LED_RUNNING PA2 /** Setup JTAG I/O pins: TCK, TMS, TDI, TDO, nTRST, and nRESET. - TCK, TMS, TDI, nTRST, nRESET to output mode and set to high level. @@ -86,8 +94,11 @@ static void PORT_JTAG_SETUP(void) */ static void PORT_SWD_SETUP(void) { - GPIO_SetMode(SWD_GPIO, MSK_SWCLK, GPIO_MODE_OUTPUT); - GPIO_SetMode(SWD_GPIO, MSK_SWDIO, GPIO_MODE_OUTPUT); + GPIO_SetMode(SWCLK_PORT, (1 << SWCLK_PIN), GPIO_MODE_OUTPUT); SWD_SWCLK = 1; + GPIO_SetMode(SWDIO_PORT, (1 << SWDIO_PIN), GPIO_MODE_OUTPUT); SWD_SWDIO = 1; + + GPIO_SetMode(LED_CONNECTED_PORT, (1 << LED_CONNECTED_PIN), GPIO_MODE_OUTPUT); + GPIO_SetMode(LED_RUNNING_PORT, (1 << LED_RUNNING_PIN), GPIO_MODE_OUTPUT); } /** Disable JTAG/SWD I/O Pins. @@ -95,8 +106,8 @@ static void PORT_SWD_SETUP(void) */ static void PORT_OFF(void) { - GPIO_SetMode(SWD_GPIO, MSK_SWCLK, GPIO_MODE_INPUT); - GPIO_SetMode(SWD_GPIO, MSK_SWDIO, GPIO_MODE_INPUT); + GPIO_SetMode(SWCLK_PORT, (1 << SWCLK_PIN), GPIO_MODE_INPUT); + GPIO_SetMode(SWDIO_PORT, (1 << SWDIO_PIN), GPIO_MODE_INPUT); } @@ -105,7 +116,7 @@ static void PORT_OFF(void) // Current status of the SWCLK/TCK DAP hardware I/O pin static __inline uint32_t PIN_SWCLK_TCK_IN(void) { - return (SWD_GPIO->MODE & (3 << (PIN_SWCLK << 1))) ? 1 : 0; + return SWD_SWCLK; } static __inline void PIN_SWCLK_TCK_SET(void) @@ -119,12 +130,12 @@ static __inline void PIN_SWCLK_TCK_CLR(void) } -// SWDIO/TMS Pin I/O -------------------------------------- +// SWDIO/TMS I/O Pin -------------------------------------- // Current status of the SWDIO/TMS DAP hardware I/O pin static __inline uint32_t PIN_SWDIO_TMS_IN(void) { - return (SWD_GPIO->MODE & (3 << (PIN_SWDIO << 1))) ? 1 : 0; + return SWD_SWDIO; } static __inline void PIN_SWDIO_TMS_SET(void) @@ -138,6 +149,8 @@ static __inline void PIN_SWDIO_TMS_CLR(void) } +// SWDIO I/O pin (used in SWD mode only) ------------------ + static __inline uint32_t PIN_SWDIO_IN(void) { return SWD_SWDIO; @@ -150,13 +163,12 @@ static __inline void PIN_SWDIO_OUT(uint32_t bit) static __inline void PIN_SWDIO_OUT_ENABLE(void) { - GPIO_SetMode(SWD_GPIO, MSK_SWDIO, GPIO_MODE_OUTPUT); - SWD_SWDIO = 0; + GPIO_SetMode(SWDIO_PORT, (1 << SWDIO_PIN), GPIO_MODE_OUTPUT); } static __inline void PIN_SWDIO_OUT_DISABLE(void) { - GPIO_SetMode(SWD_GPIO, MSK_SWDIO, GPIO_MODE_INPUT); + GPIO_SetMode(SWDIO_PORT, (1 << SWDIO_PIN), GPIO_MODE_INPUT); } @@ -215,10 +227,12 @@ static __inline void PIN_nRESET_OUT(uint32_t bit) static __inline void LED_CONNECTED_OUT(uint32_t bit) { + LED_CONNECTED = bit; } static __inline void LED_RUNNING_OUT(uint32_t bit) { + LED_RUNNING = bit; } @@ -231,7 +245,7 @@ static void DAP_SETUP(void) static uint32_t RESET_TARGET(void) { - return (0); // change to '1' when a device reset sequence is implemented + return 0; // change to '1' when a device reset sequence is implemented } diff --git a/src/descriptors.c b/src/descriptors.c index 6414d78..b624336 100644 --- a/src/descriptors.c +++ b/src/descriptors.c @@ -1,4 +1,5 @@ #include "NuMicro.h" +#include "vcom_serial.h" #include "hid_transfer.h" @@ -23,77 +24,160 @@ uint8_t HID_DeviceReportDescriptor[] = uint8_t gu8DeviceDescriptor[] = { - LEN_DEVICE, /* bLength */ - DESC_DEVICE, /* bDescriptorType */ - 0x10, 0x01, /* bcdUSB */ - 0x00, /* bDeviceClass */ - 0x00, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - EP0_MAX_PKT_SIZE, /* bMaxPacketSize0 */ - USBD_VID & 0x00FF, ((USBD_VID & 0xFF00) >> 8), /* idVendor */ - USBD_PID & 0x00FF, ((USBD_PID & 0xFF00) >> 8), /* idProduct */ - 0x00, 0x00, /* bcdDevice */ - 0x01, /* iManufacture */ - 0x02, /* iProduct */ - 0x00, /* iSerialNumber - no serial */ - 0x01 /* bNumConfigurations */ + LEN_DEVICE, // bLength + DESC_DEVICE, // bDescriptorType + 0x00, 0x02, // bcdUSB + 0x00, // bDeviceClass + 0x00, // bDeviceSubClass + 0x00, // bDeviceProtocol + EP0_MAX_PKT_SIZE, // bMaxPacketSize0 + USBD_VID & 0xFF, USBD_VID >> 8, // idVendor + USBD_PID & 0xFF, USBD_PID >> 8, // idProduct + 0x00, 0x01, // bcdDevice + 0x01, // iManufacture + 0x02, // iProduct + 0x00, // iSerialNumber - no serial + 0x01 // bNumConfigurations }; uint8_t gu8ConfigDescriptor[] = { - LEN_CONFIG, /* bLength */ - DESC_CONFIG, /* bDescriptorType */ - (LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT*2) & 0x00FF, (((LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT*2) & 0xFF00) >> 8), /* wTotalLength */ - 0x01, /* bNumInterfaces */ - 0x01, /* bConfigurationValue */ - 0x00, /* iConfiguration */ - 0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5), /* bmAttributes */ - USBD_MAX_POWER, /* MaxPower */ - - /* I/F descr: HID */ - LEN_INTERFACE, /* bLength */ - DESC_INTERFACE, /* bDescriptorType */ - 0x00, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x02, /* bNumEndpoints */ - 0x03, /* bInterfaceClass */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - - /* HID Descriptor */ - LEN_HID, /* Size of this descriptor in UINT8s. */ - DESC_HID, /* HID descriptor type. */ - 0x10, 0x01, /* HID Class Spec. release number. */ - 0x00, /* H/W target country. */ - 0x01, /* Number of HID class descriptors to follow. */ - DESC_HID_RPT, /* Descriptor type. */ - sizeof(HID_DeviceReportDescriptor) & 0x00FF, ((sizeof(HID_DeviceReportDescriptor) & 0xFF00) >> 8), /* Total length of report descriptor. */ - - /* EP Descriptor: interrupt in. */ - LEN_ENDPOINT, /* bLength */ - DESC_ENDPOINT, /* bDescriptorType */ - (INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */ - EP_INT, /* bmAttributes */ - EP2_MAX_PKT_SIZE & 0x00FF, ((EP2_MAX_PKT_SIZE & 0xFF00) >> 8), /* wMaxPacketSize */ - HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */ - - /* EP Descriptor: interrupt out. */ - LEN_ENDPOINT, /* bLength */ - DESC_ENDPOINT, /* bDescriptorType */ - (INT_OUT_EP_NUM | EP_OUTPUT), /* bEndpointAddress */ - EP_INT, /* bmAttributes */ - EP3_MAX_PKT_SIZE & 0x00FF, ((EP3_MAX_PKT_SIZE & 0xFF00) >> 8), /* wMaxPacketSize */ - HID_DEFAULT_INT_IN_INTERVAL /* bInterval */ + 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)) + TOTAL_LEN & 0xFF, TOTAL_LEN >> 8, // wTotalLength + 0x03, // bNumInterfaces + 0x01, // bConfigurationValue + 0x00, // iConfiguration + 0x00, // bmAttributes, D6: self power D5: remote wake-up + 0x64, // MaxPower, 100 * 2mA = 200mA + + // I/F descriptor: HID + LEN_INTERFACE, // bLength + DESC_INTERFACE, // bDescriptorType + 0x00, // bInterfaceNumber + 0x00, // bAlternateSetting + 0x02, // bNumEndpoints + 0x03, // bInterfaceClass + 0x00, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0x00, // iInterface + + // HID Descriptor + LEN_HID, // bLength + DESC_HID, // bDescriptorType + 0x10, 0x01, // HID Class Spec + 0x00, // H/W target country. + 0x01, // Number of HID class descriptors to follow. + DESC_HID_RPT, // Descriptor type. + sizeof(HID_DeviceReportDescriptor) & 0xFF, sizeof(HID_DeviceReportDescriptor) >> 8, // Total length of report descriptor. + + // EP Descriptor: interrupt in. + LEN_ENDPOINT, // bLength + DESC_ENDPOINT, // bDescriptorType + (EP_INPUT | HID_INT_IN_EP), // bEndpointAddress + EP_INT, // bmAttributes + EP2_MAX_PKT_SIZE, 0x00, // wMaxPacketSize + 1, // bInterval + + // EP Descriptor: interrupt out. + LEN_ENDPOINT, // bLength + DESC_ENDPOINT, // bDescriptorType + (EP_OUTPUT | HID_INT_OUT_EP), // bEndpointAddress + EP_INT, // bmAttributes + EP3_MAX_PKT_SIZE, 0x00, // wMaxPacketSize + 1, // bInterval + + // Interface Association Descriptor (IAD) + 0x08, // bLength + 0x0B, // bDescriptorType: IAD + 0x01, // bFirstInterface + 0x02, // bInterfaceCount + 0x02, // bFunctionClass: CDC + 0x02, // bFunctionSubClass + 0x01, // bFunctionProtocol + 0x00, // iFunction, ÃèÊö×Ö·û´®Ë÷Òý + + // I/F descriptor: VCOM + LEN_INTERFACE, // bLength + DESC_INTERFACE, // bDescriptorType + 0x01, // bInterfaceNumber + 0x00, // bAlternateSetting + 0x01, // bNumEndpoints + 0x02, // bInterfaceClass + 0x02, // bInterfaceSubClass + 0x01, // bInterfaceProtocol + 0x00, // iInterface + + // Communication Class Specified INTERFACE descriptor + 0x05, // Size of the descriptor, in bytes + 0x24, // CS_INTERFACE descriptor type + 0x00, // Header functional descriptor subtype + 0x10, 0x01, // Communication device compliant to the communication spec. ver. 1.10 + + // Communication Class Specified INTERFACE descriptor + 0x05, // Size of the descriptor, in bytes + 0x24, // CS_INTERFACE descriptor type + 0x01, // Call management functional descriptor + 0x00, // BIT0: Whether device handle call management itself. + // BIT1: Whether device can send/receive call management information over a Data Class Interface 0 + 0x02, // Interface number of data class interface optionally used for call management + + // Communication Class Specified INTERFACE descriptor + 0x04, // Size of the descriptor, in bytes + 0x24, // CS_INTERFACE descriptor type + 0x02, // Abstract control management functional descriptor subtype + 0x00, // bmCapabilities + + // Communication Class Specified INTERFACE descriptor + 0x05, // bLength + 0x24, // bDescriptorType: CS_INTERFACE descriptor type + 0x06, // bDescriptorSubType + 0x01, // bMasterInterface + 0x02, // bSlaveInterface0 + + // ENDPOINT descriptor + LEN_ENDPOINT, // bLength + DESC_ENDPOINT, // bDescriptorType + (EP_INPUT | CDC_INT_IN_EP), // bEndpointAddress + EP_INT, // bmAttributes + EP4_MAX_PKT_SIZE, 0x00, // wMaxPacketSize + 10, // bInterval + + // I/F descriptor + LEN_INTERFACE, // bLength + DESC_INTERFACE, // bDescriptorType + 0x02, // bInterfaceNumber + 0x00, // bAlternateSetting + 0x02, // bNumEndpoints + 0x0A, // bInterfaceClass + 0x00, // bInterfaceSubClass + 0x00, // bInterfaceProtocol + 0x00, // iInterface + + // ENDPOINT descriptor + LEN_ENDPOINT, // bLength + DESC_ENDPOINT, // bDescriptorType + (EP_INPUT | CDC_BULK_IN_EP), // bEndpointAddress + EP_BULK, // bmAttributes + EP5_MAX_PKT_SIZE, 0x00, // wMaxPacketSize + 0x00, // bInterval + + // ENDPOINT descriptor + LEN_ENDPOINT, // bLength + DESC_ENDPOINT, // bDescriptorType + (EP_OUTPUT | CDC_BULK_OUT_EP), // bEndpointAddress + EP_BULK, // bmAttributes + EP6_MAX_PKT_SIZE, 0x00, // wMaxPacketSize + 0x00, // bInterval }; -/*!> 8), /* wTotalLength */ - 0x01, /* bNumDeviceCaps */ - - /* Device Capability */ - LEN_BOSCAP, /* bLength */ - DESC_CAPABILITY, /* bDescriptorType */ - CAP_USB20_EXT, /* bDevCapabilityType */ - 0x02, 0x00, 0x00, 0x00 /* bmAttributes */ + (LEN_CONFIG + LEN_INTERFACE), + 0, + 0, }; -uint32_t gu32ConfigHidDescIdx[3] = +uint8_t gu8BOSDescriptor[] = { - (LEN_CONFIG+LEN_INTERFACE), - 0, - 0, + LEN_BOS, + DESC_BOS, + 0x0C & 0x00FF, ((0x0C & 0xFF00) >> 8), // wTotalLength + 0x01, // bNumDeviceCaps + + /* Device Capability */ + 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 bf6807b..a048988 100644 --- a/src/hid_transfer.c +++ b/src/hid_transfer.c @@ -1,6 +1,7 @@ #include #include #include "NuMicro.h" +#include "vcom_serial.h" #include "hid_transfer.h" @@ -10,12 +11,12 @@ void USBD_IRQHandler(void) uint32_t u32State = USBD_GET_BUS_STATE(); //------------------------------------------------------------------ - if (u32IntSts & USBD_INTSTS_FLDET) + if(u32IntSts & USBD_INTSTS_FLDET) { // Floating detect USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); - if (USBD_IS_ATTACHED()) + if(USBD_IS_ATTACHED()) { /* USB Plug In */ USBD_ENABLE_USB(); @@ -28,23 +29,22 @@ void USBD_IRQHandler(void) } //------------------------------------------------------------------ - if (u32IntSts & USBD_INTSTS_BUS) + if(u32IntSts & USBD_INTSTS_BUS) { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_BUS); - if (u32State & USBD_STATE_USBRST) + if(u32State & USBD_STATE_USBRST) { /* Bus reset */ USBD_ENABLE_USB(); USBD_SwReset(); } - if (u32State & USBD_STATE_SUSPEND) + if(u32State & USBD_STATE_SUSPEND) { /* Enable USB but disable PHY */ USBD_DISABLE_PHY(); } - if (u32State & USBD_STATE_RESUME) + if(u32State & USBD_STATE_RESUME) { /* Enable USB and enable PHY */ USBD_ENABLE_USB(); @@ -54,18 +54,15 @@ void USBD_IRQHandler(void) //------------------------------------------------------------------ if(u32IntSts & USBD_INTSTS_WAKEUP) { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); } //------------------------------------------------------------------ - if (u32IntSts & USBD_INTSTS_USB) + if(u32IntSts & USBD_INTSTS_USB) { - // USB event - if (u32IntSts & USBD_INTSTS_SETUP) + if(u32IntSts & USBD_INTSTS_SETUP) { // Setup packet - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); /* Clear the data IN/OUT ready flag of control end-points */ @@ -75,72 +72,71 @@ void USBD_IRQHandler(void) USBD_ProcessSetupPacket(); } - // EP events - if (u32IntSts & USBD_INTSTS_EP0) + if(u32IntSts & USBD_INTSTS_EP0) // control IN { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP0); - // control IN + USBD_CtrlIn(); } - if (u32IntSts & USBD_INTSTS_EP1) + if(u32IntSts & USBD_INTSTS_EP1) // control OUT { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP1); - // control OUT USBD_CtrlOut(); + + // In ACK of SET_LINE_CODE + extern uint8_t g_usbd_SetupPacket[]; + if(g_usbd_SetupPacket[1] == SET_LINE_CODE) + { + if(g_usbd_SetupPacket[4] == 1) // Interface number + VCOM_LineCoding(); + } } - if (u32IntSts & USBD_INTSTS_EP2) + if(u32IntSts & USBD_INTSTS_EP2) // Interrupt IN { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP2); - // Interrupt IN + EP2_Handler(); } - if (u32IntSts & USBD_INTSTS_EP3) + if(u32IntSts & USBD_INTSTS_EP3) // Interrupt OUT { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP3); - // Interrupt OUT + EP3_Handler(); } - if (u32IntSts & USBD_INTSTS_EP4) + if(u32IntSts & USBD_INTSTS_EP4) { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP4); } - if (u32IntSts & USBD_INTSTS_EP5) + if(u32IntSts & USBD_INTSTS_EP5) // Bulk IN { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP5); + + EP5_Handler(); } - if (u32IntSts & USBD_INTSTS_EP6) + if(u32IntSts & USBD_INTSTS_EP6) // Bulk OUT { - /* Clear event flag */ USBD_CLR_INT_FLAG(USBD_INTSTS_EP6); - } - - if (u32IntSts & USBD_INTSTS_EP7) - { - /* Clear event flag */ - USBD_CLR_INT_FLAG(USBD_INTSTS_EP7); + + EP6_Handler(); } } } -void EP2_Handler(void) /* Interrupt IN handler */ + +void EP2_Handler(void) // Interrupt IN handler { HID_SetInReport(); } -void EP3_Handler(void) /* Interrupt OUT handler */ + +void EP3_Handler(void) // Interrupt OUT handler { uint8_t *ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP3)); @@ -150,12 +146,6 @@ void EP3_Handler(void) /* Interrupt OUT handler */ } -/*--------------------------------------------------------------------------*/ -/** - * @brief USBD Endpoint Config. - * @param None. - * @retval None. - */ void HID_Init(void) { /* Init setup packet buffer */ @@ -175,12 +165,12 @@ void HID_Init(void) /*****************************************************/ /* EP2 ==> Interrupt IN endpoint, address 1 */ - USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | INT_IN_EP_NUM); + 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 2 */ - USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | INT_OUT_EP_NUM); + /* 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 */ @@ -188,74 +178,97 @@ void HID_Init(void) } + void HID_ClassRequest(void) { uint8_t buf[8]; USBD_GetSetupPacket(buf); - if (buf[0] & 0x80) /* request data transfer direction */ + if(buf[0] & 0x80) // Device to host { - // Device to host - switch (buf[1]) + switch(buf[1]) { case GET_REPORT: -// { -// break; -// } case GET_IDLE: -// { -// break; -// } case GET_PROTOCOL: -// { -// break; -// } + /* 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_SET_DATA1(EP0); + USBD_SET_PAYLOAD_LEN(EP0, 7); + + /* Status stage */ + USBD_PrepareCtrlOut(0,0); + break; + default: - { /* Setup error, stall the device */ USBD_SetStall(0); break; } - } } - else + else // Host to device { - // Host to device - switch (buf[1]) + switch(buf[1]) { case SET_REPORT: - { - if (buf[3] == 3) + if(buf[3] == 3) { /* Request Type = Feature */ USBD_SET_DATA1(EP1); USBD_SET_PAYLOAD_LEN(EP1, 0); } break; - } + case SET_IDLE: - { /* Status stage */ USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 0); break; - } - case SET_PROTOCOL: -// { -// 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]; + } + + /* 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); + + /* Status stage */ + USBD_SET_DATA1(EP0); + USBD_SET_PAYLOAD_LEN(EP0, 0); + break; + default: - { - // Stall /* Setup error, stall the device */ USBD_SetStall(0); break; } - } } } + /***************************************************************/ #include "DAP_Config.h" #include "DAP.h" diff --git a/src/hid_transfer.h b/src/hid_transfer.h index 08ddf3a..d8c7708 100644 --- a/src/hid_transfer.h +++ b/src/hid_transfer.h @@ -1,62 +1,46 @@ #ifndef __USBD_HID_H__ #define __USBD_HID_H__ -/* Define the vendor id and product id */ -#define USBD_VID 0x0416 -#define USBD_PID 0x5020 - -/*! -#include "M480.h" +#include "NuMicro.h" +#include "vcom_serial.h" #include "hid_transfer.h" #include "DAP.h" + void systemInit(void); void SerialInit(void); void USB_Config(void); int main(void) -{ - uint32_t i; - +{ systemInit(); SerialInit(); @@ -20,13 +20,17 @@ int main(void) USB_Config(); - GPIO_SetMode(PB, BIT14, GPIO_MODE_OUTPUT); + GPIO_SetMode(PC, (1 << 0), GPIO_MODE_OUTPUT); // PC0 => UART RXD ״ָ̬ʾ + GPIO_SetMode(PC, (1 << 1), GPIO_MODE_OUTPUT); // PC1 => UART TXD ״ָ̬ʾ while(1) - { + { usbd_hid_process(); - if(++i%100000 == 0) PB14 = 1 - PB14; + VCOM_TransferData(); + + PC0 = !(UART2->FIFOSTS & UART_FIFOSTS_RXIDLE_Msk); + PC1 = !(UART2->FIFOSTS & UART_FIFOSTS_TXEMPTYF_Msk); } } @@ -35,8 +39,8 @@ 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_PA15MFP_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_GPA_MFPH_PA15MFP_USB_OTG_ID); + 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; @@ -51,6 +55,8 @@ void USB_Config(void) HID_Init(); // Endpoint configuration + VCOM_Init(); // Endpoint configuration + USBD_Start(); NVIC_EnableIRQ(USBD_IRQn); @@ -82,27 +88,15 @@ void systemInit(void) void SerialInit(void) { - SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA0MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk); - SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA0MFP_UART0_RXD | SYS_GPA_MFPL_PA1MFP_UART0_TXD); + 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_EnableModuleClock(UART0_MODULE); + CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL3_UART2SEL_HXT, CLK_CLKDIV4_UART2(1)); + CLK_EnableModuleClock(UART2_MODULE); - CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1)); - - UART_Open(UART0, 115200); -} - + UART_Open(UART2, 115200); + UART_ENABLE_INT(UART2, (UART_INTEN_RDAIEN_Msk | UART_INTEN_THREIEN_Msk | UART_INTEN_RXTOIEN_Msk)); -int fputc(int ch, FILE *stream) -{ - while(UART0->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) __NOP(); - UART0->DAT = ch; - - if(ch == '\n') - { - while(UART0->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) __NOP(); - UART0->DAT = '\r'; - } - - return ch; + NVIC_EnableIRQ(UART2_IRQn); } diff --git a/src/vcom_serial.c b/src/vcom_serial.c new file mode 100644 index 0000000..174577e --- /dev/null +++ b/src/vcom_serial.c @@ -0,0 +1,228 @@ +#include +#include "NuMicro.h" +#include "vcom_serial.h" + + +void EP5_Handler(void) // Bulk IN +{ + 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_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); +} + + +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) + { + case 5: data_len = UART_WORD_LEN_5; break; + case 6: data_len = UART_WORD_LEN_6; break; + case 7: data_len = UART_WORD_LEN_7; break; + case 8: data_len = UART_WORD_LEN_8; break; + default: data_len = UART_WORD_LEN_8; break; + } + + switch(LineCfg.u8ParityType) + { + case 0: parity = UART_PARITY_NONE; break; + case 1: parity = UART_PARITY_ODD; break; + case 2: parity = UART_PARITY_EVEN; break; + case 3: parity = UART_PARITY_MARK; break; + case 4: parity = UART_PARITY_SPACE; break; + default: parity = UART_PARITY_NONE; break; + } + + switch(LineCfg.u8CharFormat) + { + case 0: stop_len = UART_STOP_BIT_1; break; + case 1: stop_len = UART_STOP_BIT_1_5; break; + case 2: stop_len = UART_STOP_BIT_2; break; + default: stop_len = UART_STOP_BIT_1; break; + } + + 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; + int32_t size; + + if((UART2->INTSTS & UART_INTSTS_RDAIF_Msk) || (UART2->INTSTS & UART_INTSTS_RXTOIF_Msk)) + { + while((UART2->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0) + { + chr = UART2->DAT; + + 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++; + } + } + } + + if(UART2->INTSTS & UART_INTSTS_THREIF_Msk) + { + if(vcom.tx_bytes) + { + /* Fill the Tx FIFO */ + size = vcom.tx_bytes; + if(size >= TX_FIFO_SIZE) + { + size = TX_FIFO_SIZE; + } + + while(size) + { + UART2->DAT = vcom.tx_buff[vcom.tx_head++]; + if(vcom.tx_head >= TX_BUFF_SIZE) + vcom.tx_head = 0; + vcom.tx_bytes--; + size--; + } + } + else + { + /* No more data, just stop Tx (Stop work) */ + UART2->INTEN &= ~UART_INTEN_THREIEN_Msk; + } + } +} + + +void VCOM_TransferData(void) +{ + int32_t i, len; + + /* Check whether USB is ready for next packet or not */ + if(vcom.in_bytes == 0) + { + /* Check whether we have new COM Rx data to send to USB or not */ + if(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; + } + + __disable_irq(); + 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); + USBD_SET_PAYLOAD_LEN(EP5, len); + } + else + { + /* Prepare a zero packet if previous packet size is EP2_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) + USBD_SET_PAYLOAD_LEN(EP5, 0); + } + } + + /* Process the Bulk out data when bulk out data is ready. */ + if(vcom.out_ready && (vcom.out_bytes <= TX_BUFF_SIZE - vcom.tx_bytes)) + { + 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; + } + + __disable_irq(); + vcom.tx_bytes += vcom.out_bytes; + __enable_irq(); + + vcom.out_bytes = 0; + vcom.out_ready = 0; /* Clear bulk out ready flag */ + + /* Ready to get next BULK out */ + USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); + } + + /* Process the software Tx FIFO */ + 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; + + __set_PRIMASK(1); + vcom.tx_bytes--; + __set_PRIMASK(0); + + /* 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 new file mode 100644 index 0000000..8cb2aef --- /dev/null +++ b/src/vcom_serial.h @@ -0,0 +1,81 @@ +#ifndef __USBD_CDC_H__ +#define __USBD_CDC_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 + + +/*!