add CDC support

pull/13/head
XIVN1987 4 years ago
parent 1a9894350d
commit 3986ed7bf2
  1. 1
      .gitignore
  2. 90
      DAPLink.uvoptx
  3. 30
      DAPLink.uvprojx
  4. 14
      README.md
  5. BIN
      doc/DAPLink.pcapng
  6. BIN
      out/DAPLink.bin
  7. 737
      out/DAPLink.hex
  8. 52
      src/DAP_config.h
  9. 240
      src/descriptors.c
  10. 163
      src/hid_transfer.c
  11. 47
      src/hid_transfer.h
  12. 48
      src/main.c
  13. 228
      src/vcom_serial.c
  14. 81
      src/vcom_serial.h
  15. 1
      项目说明.txt

1
.gitignore vendored

@ -34,7 +34,6 @@
*.app *.app
*.i*86 *.i*86
*.x86_64 *.x86_64
*.hex
# Debug files # Debug files
*.dSYM/ *.dSYM/

@ -10,7 +10,7 @@
<aExt>*.s*; *.src; *.a*</aExt> <aExt>*.s*; *.src; *.a*</aExt>
<oExt>*.obj; *.o</oExt> <oExt>*.obj; *.o</oExt>
<lExt>*.lib</lExt> <lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc</tExt> <tExt>*.txt; *.h; *.inc; *.md</tExt>
<pExt>*.plm</pExt> <pExt>*.plm</pExt>
<CppX>*.cpp</CppX> <CppX>*.cpp</CppX>
<nMigrate>0</nMigrate> <nMigrate>0</nMigrate>
@ -119,18 +119,28 @@
<TargetDriverDllRegistry> <TargetDriverDllRegistry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>ARMRTXEVENTFLAGS</Key> <Key>DLGUARM</Key>
<Name>-L70 -Z18 -C0 -M0 -T1</Name> <Name>d</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>CMSIS_AGDI</Key>
<Name>-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)</Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>UL2CM3</Key> <Key>UL2CM3</Key>
<Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0M481_AP_512 -FL080000 -FS00 -FP0($$Device:M482LIDAE$Flash\M481_AP_512.FLM)</Name> <Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0M481_AP_512 -FL080000 -FS00 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM)</Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>JL2CM3</Key> <Key>JL2CM3</Key>
<Name>-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)</Name> <Name>-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)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMRTXEVENTFLAGS</Key>
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
@ -162,7 +172,7 @@
<DebugFlag> <DebugFlag>
<trace>0</trace> <trace>0</trace>
<periodic>1</periodic> <periodic>1</periodic>
<aLwin>0</aLwin> <aLwin>1</aLwin>
<aCover>0</aCover> <aCover>0</aCover>
<aSer1>0</aSer1> <aSer1>0</aSer1>
<aSer2>0</aSer2> <aSer2>0</aSer2>
@ -243,6 +253,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\vcom_serial.c</PathWithFileName>
<FilenameWithoutPath>vcom_serial.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -253,7 +275,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber> <FileNumber>5</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -265,7 +287,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber> <FileNumber>6</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -277,9 +299,9 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber> <FileNumber>7</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>.\src\DAP\JTAG_DP.c</PathWithFileName> <PathWithFileName>.\src\DAP\JTAG_DP.c</PathWithFileName>
@ -289,7 +311,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber> <FileNumber>8</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -309,7 +331,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>8</FileNumber> <FileNumber>9</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -319,18 +341,6 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\CSL\NUCM480_StdPeriph_Driver\dac.c</PathWithFileName>
<FilenameWithoutPath>dac.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber> <FileNumber>10</FileNumber>
@ -338,18 +348,6 @@
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>.\src\CSL\NUCM480_StdPeriph_Driver\eadc.c</PathWithFileName>
<FilenameWithoutPath>eadc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\CSL\NUCM480_StdPeriph_Driver\gpio.c</PathWithFileName> <PathWithFileName>.\src\CSL\NUCM480_StdPeriph_Driver\gpio.c</PathWithFileName>
<FilenameWithoutPath>gpio.c</FilenameWithoutPath> <FilenameWithoutPath>gpio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
@ -357,7 +355,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber> <FileNumber>11</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -369,7 +367,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>13</FileNumber> <FileNumber>12</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -381,7 +379,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber> <FileNumber>13</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -393,7 +391,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber> <FileNumber>14</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -405,7 +403,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber> <FileNumber>15</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -417,7 +415,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber> <FileNumber>16</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -429,7 +427,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber> <FileNumber>17</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -441,7 +439,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber> <FileNumber>18</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -461,7 +459,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>20</FileNumber> <FileNumber>19</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -473,7 +471,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>21</FileNumber> <FileNumber>20</FileNumber>
<FileType>2</FileType> <FileType>2</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>

@ -10,18 +10,18 @@
<TargetName>NUCM480</TargetName> <TargetName>NUCM480</TargetName>
<ToolsetNumber>0x4</ToolsetNumber> <ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName> <ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed> <pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
<uAC6>0</uAC6> <uAC6>0</uAC6>
<TargetOption> <TargetOption>
<TargetCommonOption> <TargetCommonOption>
<Device>M482LIDAE</Device> <Device>M482ZIDAE</Device>
<Vendor>Nuvoton</Vendor> <Vendor>Nuvoton</Vendor>
<PackID>Nuvoton.NuMicro_DFP.1.3.1</PackID> <PackID>Nuvoton.NuMicro_DFP.1.3.1</PackID>
<PackURL>http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack</PackURL> <PackURL>http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack</PackURL>
<Cpu>IRAM(0x20000000,0x28000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000)</Cpu> <Cpu>IRAM(0x20000000,0x28000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000)</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile> <StartupFile></StartupFile>
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M481_AP_512 -FS00 -FL080000 -FP0($$Device:M482LIDAE$Flash\M481_AP_512.FLM))</FlashDriverDll> <FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M481_AP_512 -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM))</FlashDriverDll>
<DeviceId>0</DeviceId> <DeviceId>0</DeviceId>
<RegisterFile></RegisterFile> <RegisterFile></RegisterFile>
<MemoryEnv></MemoryEnv> <MemoryEnv></MemoryEnv>
@ -33,7 +33,7 @@
<SLE66CMisc></SLE66CMisc> <SLE66CMisc></SLE66CMisc>
<SLE66AMisc></SLE66AMisc> <SLE66AMisc></SLE66AMisc>
<SLE66LinkerMisc></SLE66LinkerMisc> <SLE66LinkerMisc></SLE66LinkerMisc>
<SFDFile>$$Device:M482LIDAE$SVD\Nuvoton\M481_v1.svd</SFDFile> <SFDFile>$$Device:M482ZIDAE$SVD\Nuvoton\M481_v1.svd</SFDFile>
<bCustSvd>0</bCustSvd> <bCustSvd>0</bCustSvd>
<UseEnv>0</UseEnv> <UseEnv>0</UseEnv>
<BinPath></BinPath> <BinPath></BinPath>
@ -80,8 +80,8 @@
<nStopB2X>0</nStopB2X> <nStopB2X>0</nStopB2X>
</BeforeMake> </BeforeMake>
<AfterMake> <AfterMake>
<RunUserProg1>0</RunUserProg1> <RunUserProg1>1</RunUserProg1>
<RunUserProg2>0</RunUserProg2> <RunUserProg2>1</RunUserProg2>
<UserProg1Name>fromelf --bin -o "$L@L.bin" "#L"</UserProg1Name> <UserProg1Name>fromelf --bin -o "$L@L.bin" "#L"</UserProg1Name>
<UserProg2Name>fromelf --text -a -c -o "$L@L.dis" "#L"</UserProg2Name> <UserProg2Name>fromelf --text -a -c -o "$L@L.dis" "#L"</UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode> <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
@ -185,6 +185,7 @@
<uocXRam>0</uocXRam> <uocXRam>0</uocXRam>
<RvdsVP>1</RvdsVP> <RvdsVP>1</RvdsVP>
<RvdsMve>0</RvdsMve> <RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>0</hadIRAM2> <hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2> <hadIROM2>0</hadIROM2>
<StupSel>8</StupSel> <StupSel>8</StupSel>
@ -351,7 +352,7 @@
<NoWarn>0</NoWarn> <NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc> <uSurpInc>0</uSurpInc>
<useXO>0</useXO> <useXO>0</useXO>
<uClangAs>0</uClangAs> <ClangAsOpt>4</ClangAsOpt>
<VariousControls> <VariousControls>
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define></Define> <Define></Define>
@ -397,6 +398,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>.\src\hid_transfer.c</FilePath> <FilePath>.\src\hid_transfer.c</FilePath>
</File> </File>
<File>
<FileName>vcom_serial.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\vcom_serial.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -432,16 +438,6 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>.\src\CSL\NUCM480_StdPeriph_Driver\clk.c</FilePath> <FilePath>.\src\CSL\NUCM480_StdPeriph_Driver\clk.c</FilePath>
</File> </File>
<File>
<FileName>dac.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\CSL\NUCM480_StdPeriph_Driver\dac.c</FilePath>
</File>
<File>
<FileName>eadc.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\CSL\NUCM480_StdPeriph_Driver\eadc.c</FilePath>
</File>
<File> <File>
<FileName>gpio.c</FileName> <FileName>gpio.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>

@ -1,2 +1,12 @@
# DAPLink ## DAPLink
CMSIS-DAP (DAPLink) porting to Nuvoton M480 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

Binary file not shown.

Binary file not shown.

@ -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

@ -26,7 +26,7 @@
#define DAP_PACKET_SIZE 64 ///< USB: 64 = Full-Speed, 1024 = High-Speed. #define DAP_PACKET_SIZE 64 ///< USB: 64 = Full-Speed, 1024 = High-Speed.
/// Maximum Package Buffers for Command and Response data. /// 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. /// 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 ------------------------------ // Configure DAP I/O pins ------------------------------
#define SWD_GPIO PA #define SWCLK_PORT PA
#define SWD_SWCLK PA4 #define SWCLK_PIN 1
#define SWD_SWDIO PA5 #define SWDIO_PORT PA
#define PIN_SWCLK 4 #define SWDIO_PIN 0
#define PIN_SWDIO 5
#define MSK_SWCLK (1 << PIN_SWCLK) #define SWD_SWCLK PA1
#define MSK_SWDIO (1 << PIN_SWDIO) #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. /** 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. - 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) static void PORT_SWD_SETUP(void)
{ {
GPIO_SetMode(SWD_GPIO, MSK_SWCLK, GPIO_MODE_OUTPUT); GPIO_SetMode(SWCLK_PORT, (1 << SWCLK_PIN), GPIO_MODE_OUTPUT); SWD_SWCLK = 1;
GPIO_SetMode(SWD_GPIO, MSK_SWDIO, GPIO_MODE_OUTPUT); 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. /** Disable JTAG/SWD I/O Pins.
@ -95,8 +106,8 @@ static void PORT_SWD_SETUP(void)
*/ */
static void PORT_OFF(void) static void PORT_OFF(void)
{ {
GPIO_SetMode(SWD_GPIO, MSK_SWCLK, GPIO_MODE_INPUT); GPIO_SetMode(SWCLK_PORT, (1 << SWCLK_PIN), GPIO_MODE_INPUT);
GPIO_SetMode(SWD_GPIO, MSK_SWDIO, 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 // Current status of the SWCLK/TCK DAP hardware I/O pin
static __inline uint32_t PIN_SWCLK_TCK_IN(void) 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) 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 // Current status of the SWDIO/TMS DAP hardware I/O pin
static __inline uint32_t PIN_SWDIO_TMS_IN(void) 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) 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) static __inline uint32_t PIN_SWDIO_IN(void)
{ {
return SWD_SWDIO; return SWD_SWDIO;
@ -150,13 +163,12 @@ static __inline void PIN_SWDIO_OUT(uint32_t bit)
static __inline void PIN_SWDIO_OUT_ENABLE(void) static __inline void PIN_SWDIO_OUT_ENABLE(void)
{ {
GPIO_SetMode(SWD_GPIO, MSK_SWDIO, GPIO_MODE_OUTPUT); GPIO_SetMode(SWDIO_PORT, (1 << SWDIO_PIN), GPIO_MODE_OUTPUT);
SWD_SWDIO = 0;
} }
static __inline void PIN_SWDIO_OUT_DISABLE(void) 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) static __inline void LED_CONNECTED_OUT(uint32_t bit)
{ {
LED_CONNECTED = bit;
} }
static __inline void LED_RUNNING_OUT(uint32_t 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) 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
} }

@ -1,4 +1,5 @@
#include "NuMicro.h" #include "NuMicro.h"
#include "vcom_serial.h"
#include "hid_transfer.h" #include "hid_transfer.h"
@ -23,77 +24,160 @@ uint8_t HID_DeviceReportDescriptor[] =
uint8_t gu8DeviceDescriptor[] = uint8_t gu8DeviceDescriptor[] =
{ {
LEN_DEVICE, /* bLength */ LEN_DEVICE, // bLength
DESC_DEVICE, /* bDescriptorType */ DESC_DEVICE, // bDescriptorType
0x10, 0x01, /* bcdUSB */ 0x00, 0x02, // bcdUSB
0x00, /* bDeviceClass */ 0x00, // bDeviceClass
0x00, /* bDeviceSubClass */ 0x00, // bDeviceSubClass
0x00, /* bDeviceProtocol */ 0x00, // bDeviceProtocol
EP0_MAX_PKT_SIZE, /* bMaxPacketSize0 */ EP0_MAX_PKT_SIZE, // bMaxPacketSize0
USBD_VID & 0x00FF, ((USBD_VID & 0xFF00) >> 8), /* idVendor */ USBD_VID & 0xFF, USBD_VID >> 8, // idVendor
USBD_PID & 0x00FF, ((USBD_PID & 0xFF00) >> 8), /* idProduct */ USBD_PID & 0xFF, USBD_PID >> 8, // idProduct
0x00, 0x00, /* bcdDevice */ 0x00, 0x01, // bcdDevice
0x01, /* iManufacture */ 0x01, // iManufacture
0x02, /* iProduct */ 0x02, // iProduct
0x00, /* iSerialNumber - no serial */ 0x00, // iSerialNumber - no serial
0x01 /* bNumConfigurations */ 0x01 // bNumConfigurations
}; };
uint8_t gu8ConfigDescriptor[] = uint8_t gu8ConfigDescriptor[] =
{ {
LEN_CONFIG, /* bLength */ LEN_CONFIG, // bLength
DESC_CONFIG, /* bDescriptorType */ 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 */ #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))
0x01, /* bNumInterfaces */ TOTAL_LEN & 0xFF, TOTAL_LEN >> 8, // wTotalLength
0x01, /* bConfigurationValue */ 0x03, // bNumInterfaces
0x00, /* iConfiguration */ 0x01, // bConfigurationValue
0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5), /* bmAttributes */ 0x00, // iConfiguration
USBD_MAX_POWER, /* MaxPower */ 0x00, // bmAttributes, D6: self power D5: remote wake-up
0x64, // MaxPower, 100 * 2mA = 200mA
/* I/F descr: HID */
LEN_INTERFACE, /* bLength */ // I/F descriptor: HID
DESC_INTERFACE, /* bDescriptorType */ LEN_INTERFACE, // bLength
0x00, /* bInterfaceNumber */ DESC_INTERFACE, // bDescriptorType
0x00, /* bAlternateSetting */ 0x00, // bInterfaceNumber
0x02, /* bNumEndpoints */ 0x00, // bAlternateSetting
0x03, /* bInterfaceClass */ 0x02, // bNumEndpoints
0x00, /* bInterfaceSubClass */ 0x03, // bInterfaceClass
0x00, /* bInterfaceProtocol */ 0x00, // bInterfaceSubClass
0x00, /* iInterface */ 0x00, // bInterfaceProtocol
0x00, // iInterface
/* HID Descriptor */
LEN_HID, /* Size of this descriptor in UINT8s. */ // HID Descriptor
DESC_HID, /* HID descriptor type. */ LEN_HID, // bLength
0x10, 0x01, /* HID Class Spec. release number. */ DESC_HID, // bDescriptorType
0x00, /* H/W target country. */ 0x10, 0x01, // HID Class Spec
0x01, /* Number of HID class descriptors to follow. */ 0x00, // H/W target country.
DESC_HID_RPT, /* Descriptor type. */ 0x01, // Number of HID class descriptors to follow.
sizeof(HID_DeviceReportDescriptor) & 0x00FF, ((sizeof(HID_DeviceReportDescriptor) & 0xFF00) >> 8), /* Total length of report descriptor. */ 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 */ // EP Descriptor: interrupt in.
DESC_ENDPOINT, /* bDescriptorType */ LEN_ENDPOINT, // bLength
(INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */ DESC_ENDPOINT, // bDescriptorType
EP_INT, /* bmAttributes */ (EP_INPUT | HID_INT_IN_EP), // bEndpointAddress
EP2_MAX_PKT_SIZE & 0x00FF, ((EP2_MAX_PKT_SIZE & 0xFF00) >> 8), /* wMaxPacketSize */ EP_INT, // bmAttributes
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */ EP2_MAX_PKT_SIZE, 0x00, // wMaxPacketSize
1, // bInterval
/* EP Descriptor: interrupt out. */
LEN_ENDPOINT, /* bLength */ // EP Descriptor: interrupt out.
DESC_ENDPOINT, /* bDescriptorType */ LEN_ENDPOINT, // bLength
(INT_OUT_EP_NUM | EP_OUTPUT), /* bEndpointAddress */ DESC_ENDPOINT, // bDescriptorType
EP_INT, /* bmAttributes */ (EP_OUTPUT | HID_INT_OUT_EP), // bEndpointAddress
EP3_MAX_PKT_SIZE & 0x00FF, ((EP3_MAX_PKT_SIZE & 0xFF00) >> 8), /* wMaxPacketSize */ EP_INT, // bmAttributes
HID_DEFAULT_INT_IN_INTERVAL /* bInterval */ 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
}; };
/*!<USB Language String Descriptor */
uint8_t gu8StringLang[4] = uint8_t gu8StringLang[4] =
{ {
4, /* bLength */ 4,
DESC_STRING, /* bDescriptorType */ DESC_STRING,
0x09, 0x04 0x09, 0x04
}; };
@ -106,8 +190,8 @@ uint8_t gu8VendorStringDesc[] =
uint8_t gu8ProductStringDesc[] = uint8_t gu8ProductStringDesc[] =
{ {
30, /* bLength */ 30,
DESC_STRING, /* bDescriptorType */ DESC_STRING,
'M', 0, '4', 0, '8', 0, '0', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0, 'P', 0 'M', 0, '4', 0, '8', 0, '0', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0, 'P', 0
}; };
@ -135,26 +219,26 @@ uint32_t gu32UsbHidReportLen[3] =
}; };
uint8_t gu8BOSDescriptor[] = uint32_t gu32ConfigHidDescIdx[3] =
{ {
LEN_BOS, /* bLength */ (LEN_CONFIG + LEN_INTERFACE),
DESC_BOS, /* bDescriptorType */ 0,
0x0C & 0x00FF, ((0x0C & 0xFF00) >> 8), /* wTotalLength */ 0,
0x01, /* bNumDeviceCaps */
/* Device Capability */
LEN_BOSCAP, /* bLength */
DESC_CAPABILITY, /* bDescriptorType */
CAP_USB20_EXT, /* bDevCapabilityType */
0x02, 0x00, 0x00, 0x00 /* bmAttributes */
}; };
uint32_t gu32ConfigHidDescIdx[3] = uint8_t gu8BOSDescriptor[] =
{ {
(LEN_CONFIG+LEN_INTERFACE), LEN_BOS,
0, DESC_BOS,
0, 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
}; };

@ -1,6 +1,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "NuMicro.h" #include "NuMicro.h"
#include "vcom_serial.h"
#include "hid_transfer.h" #include "hid_transfer.h"
@ -10,12 +11,12 @@ void USBD_IRQHandler(void)
uint32_t u32State = USBD_GET_BUS_STATE(); uint32_t u32State = USBD_GET_BUS_STATE();
//------------------------------------------------------------------ //------------------------------------------------------------------
if (u32IntSts & USBD_INTSTS_FLDET) if(u32IntSts & USBD_INTSTS_FLDET)
{ {
// Floating detect // Floating detect
USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET);
if (USBD_IS_ATTACHED()) if(USBD_IS_ATTACHED())
{ {
/* USB Plug In */ /* USB Plug In */
USBD_ENABLE_USB(); 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); USBD_CLR_INT_FLAG(USBD_INTSTS_BUS);
if (u32State & USBD_STATE_USBRST) if(u32State & USBD_STATE_USBRST)
{ {
/* Bus reset */ /* Bus reset */
USBD_ENABLE_USB(); USBD_ENABLE_USB();
USBD_SwReset(); USBD_SwReset();
} }
if (u32State & USBD_STATE_SUSPEND) if(u32State & USBD_STATE_SUSPEND)
{ {
/* Enable USB but disable PHY */ /* Enable USB but disable PHY */
USBD_DISABLE_PHY(); USBD_DISABLE_PHY();
} }
if (u32State & USBD_STATE_RESUME) if(u32State & USBD_STATE_RESUME)
{ {
/* Enable USB and enable PHY */ /* Enable USB and enable PHY */
USBD_ENABLE_USB(); USBD_ENABLE_USB();
@ -54,18 +54,15 @@ void USBD_IRQHandler(void)
//------------------------------------------------------------------ //------------------------------------------------------------------
if(u32IntSts & USBD_INTSTS_WAKEUP) if(u32IntSts & USBD_INTSTS_WAKEUP)
{ {
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); 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 // Setup packet
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP);
/* Clear the data IN/OUT ready flag of control end-points */ /* Clear the data IN/OUT ready flag of control end-points */
@ -75,72 +72,71 @@ void USBD_IRQHandler(void)
USBD_ProcessSetupPacket(); USBD_ProcessSetupPacket();
} }
// EP events if(u32IntSts & USBD_INTSTS_EP0) // control IN
if (u32IntSts & USBD_INTSTS_EP0)
{ {
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP0); USBD_CLR_INT_FLAG(USBD_INTSTS_EP0);
// control IN
USBD_CtrlIn(); USBD_CtrlIn();
} }
if (u32IntSts & USBD_INTSTS_EP1) if(u32IntSts & USBD_INTSTS_EP1) // control OUT
{ {
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP1); USBD_CLR_INT_FLAG(USBD_INTSTS_EP1);
// control OUT
USBD_CtrlOut(); 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); USBD_CLR_INT_FLAG(USBD_INTSTS_EP2);
// Interrupt IN
EP2_Handler(); EP2_Handler();
} }
if (u32IntSts & USBD_INTSTS_EP3) if(u32IntSts & USBD_INTSTS_EP3) // Interrupt OUT
{ {
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP3); USBD_CLR_INT_FLAG(USBD_INTSTS_EP3);
// Interrupt OUT
EP3_Handler(); EP3_Handler();
} }
if (u32IntSts & USBD_INTSTS_EP4) if(u32IntSts & USBD_INTSTS_EP4)
{ {
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP4); 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); 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); USBD_CLR_INT_FLAG(USBD_INTSTS_EP6);
}
if (u32IntSts & USBD_INTSTS_EP7) EP6_Handler();
{
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP7);
} }
} }
} }
void EP2_Handler(void) /* Interrupt IN handler */
void EP2_Handler(void) // Interrupt IN handler
{ {
HID_SetInReport(); 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)); 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) void HID_Init(void)
{ {
/* Init setup packet buffer */ /* Init setup packet buffer */
@ -175,12 +165,12 @@ void HID_Init(void)
/*****************************************************/ /*****************************************************/
/* EP2 ==> Interrupt IN endpoint, address 1 */ /* 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 */ /* Buffer range for EP2 */
USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE); USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE);
/* EP3 ==> Interrupt OUT endpoint, address 2 */ /* EP3 ==> Interrupt OUT endpoint, address 1 */
USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | INT_OUT_EP_NUM); USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | HID_INT_OUT_EP);
/* Buffer range for EP3 */ /* Buffer range for EP3 */
USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE); USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE);
/* trigger to receive OUT data */ /* trigger to receive OUT data */
@ -188,74 +178,97 @@ void HID_Init(void)
} }
void HID_ClassRequest(void) void HID_ClassRequest(void)
{ {
uint8_t buf[8]; uint8_t buf[8];
USBD_GetSetupPacket(buf); 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: case GET_REPORT:
// {
// break;
// }
case GET_IDLE: case GET_IDLE:
// {
// break;
// }
case GET_PROTOCOL: case GET_PROTOCOL:
// {
// break;
// }
default:
{
/* Setup error, stall the device */ /* Setup error, stall the device */
USBD_SetStall(0); USBD_SetStall(0);
break; 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: case SET_REPORT:
{ if(buf[3] == 3)
if (buf[3] == 3)
{ {
/* Request Type = Feature */ /* Request Type = Feature */
USBD_SET_DATA1(EP1); USBD_SET_DATA1(EP1);
USBD_SET_PAYLOAD_LEN(EP1, 0); USBD_SET_PAYLOAD_LEN(EP1, 0);
} }
break; break;
}
case SET_IDLE: case SET_IDLE:
{
/* Status stage */ /* Status stage */
USBD_SET_DATA1(EP0); USBD_SET_DATA1(EP0);
USBD_SET_PAYLOAD_LEN(EP0, 0); USBD_SET_PAYLOAD_LEN(EP0, 0);
break; break;
}
case SET_PROTOCOL: case SET_PROTOCOL:
// {
// break;
// }
default:
{
// Stall
/* Setup error, stall the device */ /* Setup error, stall the device */
USBD_SetStall(0); USBD_SetStall(0);
break; 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:
/* Setup error, stall the device */
USBD_SetStall(0);
break;
} }
} }
} }
/***************************************************************/ /***************************************************************/
#include "DAP_Config.h" #include "DAP_Config.h"
#include "DAP.h" #include "DAP.h"

@ -1,35 +1,23 @@
#ifndef __USBD_HID_H__ #ifndef __USBD_HID_H__
#define __USBD_HID_H__ #define __USBD_HID_H__
/* Define the vendor id and product id */
#define USBD_VID 0x0416 #define USBD_VID 0x0416
#define USBD_PID 0x5020 #define USBD_PID 0x5021
/*!<Define HID Class Specific Request */
#define GET_REPORT 0x01
#define GET_IDLE 0x02
#define GET_PROTOCOL 0x03
#define SET_REPORT 0x09
#define SET_IDLE 0x0A
#define SET_PROTOCOL 0x0B
/*!<USB HID Interface Class protocol */ /* Define the EP number */
#define HID_NONE 0x00 #define HID_INT_IN_EP 1
#define HID_KEYBOARD 0x01 #define HID_INT_OUT_EP 1
#define HID_MOUSE 0x02
/*!<USB HID Class Report Type */
#define HID_RPT_TYPE_INPUT 0x01
#define HID_RPT_TYPE_OUTPUT 0x02
#define HID_RPT_TYPE_FEATURE 0x03
/*-------------------------------------------------------------*/
/* Define EP maximum packet size */ /* Define EP maximum packet size */
#define EP0_MAX_PKT_SIZE 8 #define EP0_MAX_PKT_SIZE 64
#define EP1_MAX_PKT_SIZE EP0_MAX_PKT_SIZE #define EP1_MAX_PKT_SIZE EP0_MAX_PKT_SIZE
#define EP2_MAX_PKT_SIZE 64 #define EP2_MAX_PKT_SIZE 64
#define EP3_MAX_PKT_SIZE 64 #define EP3_MAX_PKT_SIZE 64
#define SETUP_BUF_BASE 0 #define SETUP_BUF_BASE 0
#define SETUP_BUF_LEN 8 #define SETUP_BUF_LEN 8
#define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) #define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN)
@ -41,22 +29,18 @@
#define EP3_BUF_BASE (EP2_BUF_BASE + EP2_BUF_LEN) #define EP3_BUF_BASE (EP2_BUF_BASE + EP2_BUF_LEN)
#define EP3_BUF_LEN EP3_MAX_PKT_SIZE #define EP3_BUF_LEN EP3_MAX_PKT_SIZE
/* Define the EP number */
#define INT_IN_EP_NUM 0x01
#define INT_OUT_EP_NUM 0x02
/* Define Descriptor information */
#define HID_DEFAULT_INT_IN_INTERVAL 1
#define USBD_SELF_POWERED 0
#define USBD_REMOTE_WAKEUP 0
#define USBD_MAX_POWER 50 /* The unit is in 2mA. ex: 50 * 2mA = 100mA */
#define LEN_CONFIG_AND_SUBORDINATE (LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT) /* HID Class Specific Request */
#define GET_REPORT 0x01
#define GET_IDLE 0x02
#define GET_PROTOCOL 0x03
#define SET_REPORT 0x09
#define SET_IDLE 0x0A
#define SET_PROTOCOL 0x0B
/*-------------------------------------------------------------*/
/*-------------------------------------------------------------*/
void HID_Init(void); void HID_Init(void);
void HID_ClassRequest(void); void HID_ClassRequest(void);
@ -67,4 +51,5 @@ void HID_GetOutReport(uint8_t *pu8EpBuf, uint32_t u32Size);
uint8_t usbd_hid_process(void); uint8_t usbd_hid_process(void);
#endif /* __USBD_HID_H_ */
#endif

@ -1,17 +1,17 @@
#include <stdio.h> #include <stdio.h>
#include "M480.h" #include "NuMicro.h"
#include "vcom_serial.h"
#include "hid_transfer.h" #include "hid_transfer.h"
#include "DAP.h" #include "DAP.h"
void systemInit(void); void systemInit(void);
void SerialInit(void); void SerialInit(void);
void USB_Config(void); void USB_Config(void);
int main(void) int main(void)
{ {
uint32_t i;
systemInit(); systemInit();
SerialInit(); SerialInit();
@ -20,13 +20,17 @@ int main(void)
USB_Config(); 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) while(1)
{ {
usbd_hid_process(); 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_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_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_GPA_MFPH_PA15MFP_USB_OTG_ID); 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; 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 HID_Init(); // Endpoint configuration
VCOM_Init(); // Endpoint configuration
USBD_Start(); USBD_Start();
NVIC_EnableIRQ(USBD_IRQn); NVIC_EnableIRQ(USBD_IRQn);
@ -82,27 +88,15 @@ void systemInit(void)
void SerialInit(void) void SerialInit(void)
{ {
SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA0MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk); GPIO_SetPullCtl(PB, BIT0, GPIO_PUSEL_PULL_UP);
SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA0MFP_UART0_RXD | SYS_GPA_MFPL_PA1MFP_UART0_TXD); 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(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));
UART_Open(UART0, 115200); CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL3_UART2SEL_HXT, CLK_CLKDIV4_UART2(1));
} CLK_EnableModuleClock(UART2_MODULE);
int fputc(int ch, FILE *stream)
{
while(UART0->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) __NOP();
UART0->DAT = ch;
if(ch == '\n') UART_Open(UART2, 115200);
{ UART_ENABLE_INT(UART2, (UART_INTEN_RDAIEN_Msk | UART_INTEN_THREIEN_Msk | UART_INTEN_RXTOIEN_Msk));
while(UART0->FIFOSTS & UART_FIFOSTS_TXFULL_Msk) __NOP();
UART0->DAT = '\r';
}
return ch; NVIC_EnableIRQ(UART2_IRQn);
} }

@ -0,0 +1,228 @@
#include <string.h>
#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;
}
}
}

@ -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
/*!<Define CDC Class Specific Request */
#define SET_LINE_CODE 0x20
#define GET_LINE_CODE 0x21
#define SET_CONTROL_LINE_STATE 0x22
typedef struct __attribute__((packed)) {
uint32_t u32DTERate; // Baud rate
uint8_t u8CharFormat; // stop bit: 0 - 1 Stop bit, 1 - 1.5 Stop bits, 2 - 2 Stop bits
uint8_t u8ParityType; // parity: 0 - None, 1 - Odd, 2 - Even, 3 - Mark, 4 - Space
uint8_t u8DataBits; // data bits: 5, 6, 7, 8, 16
} STR_VCOM_LINE_CODING;
extern STR_VCOM_LINE_CODING LineCfg;
#define RX_BUFF_SIZE 512 // RX buffer size
#define TX_BUFF_SIZE 512 // RX buffer size
#define TX_FIFO_SIZE 16 // TX Hardware FIFO size
typedef struct {
uint8_t rx_buff[RX_BUFF_SIZE];
uint16_t rx_bytes;
uint16_t rx_head;
uint16_t rx_tail;
uint8_t tx_buff[TX_BUFF_SIZE];
uint16_t tx_bytes;
uint16_t tx_head;
uint16_t tx_tail;
uint16_t hw_flow; // BIT0: DTR(Data Terminal Ready) , BIT1: RTS(Request To Send)
uint8_t in_buff[64];
uint16_t in_bytes;
uint8_t *out_ptr;
uint16_t out_bytes;
uint16_t out_ready;
} VCOM;
extern volatile VCOM vcom;
/*-------------------------------------------------------------*/
void VCOM_Init(void);
void EP4_Handler(void);
void EP5_Handler(void);
void EP6_Handler(void);
void VCOM_LineCoding(void);
void VCOM_TransferData(void);
#endif

@ -1 +0,0 @@
基于M482的DAPLink(CMSIS-DAP)调试器
Loading…
Cancel
Save