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
+
+
+/*!