ラベル CMSIS-DAP の投稿を表示しています。 すべての投稿を表示
ラベル CMSIS-DAP の投稿を表示しています。 すべての投稿を表示

2015年12月10日木曜日

"LPCXpresso1769/CD"互換機の試作



最新の「LPCXpresso 1769 with CMSIS-DAP」はデバッガーがLPC11U35に変更になりました。
まだ入手できそうもないので、互換機をTG-LPC11U35-501と旧版のLPCXpresso LPC1769 Rev.Bで作ってみました。

製品のファームウェアの詳細がわからないが、mbedインターフェースのを使えば書込み用のソフトウェアを使わずにドラッグ・アンド・ドロップでプログラムを書き込む事が出来ます。
ローカルストレージが付いていない mbed LPC1768 とほぼ同等になります。
イーサネットのPHYチップがLAN8720で違いますが、mbedライブラリが自動判定して動きます。

結線

TG-LPC11U35-501とLPCXpresso LPC1769を次のように繋げます。
TG-LPC11U35-501 LPCXpresso1769 Rev.B
TARGET_SWDIO CN1-6(PIO0_8) J4-4
TARGET_SWCLK CN1-8 (PIO0_7) J4-6
TARGET_NRESET CN2-11(PIO0_1) J4-12
TARGET_TXD CN1-10(PIO0_19) J6-21(P0_2)
TARGET_RXD CN1-9(PIO0_18) J6-22(P0_3)
TARGET_ISP CN2-15(PIO1_15) J6-51(P2_10)
ISP は使ってないがファームウェアの動作確認のために繋げておきます。
Flash Magic に対応して DTR/RTS で RESET/ISP を制御するのかもしれない。

回路図

ファームウェア

TG-LPC11U35-501に次のファームウェアをUSB ISPで書込みます。
(2015/12/10)
---

2015年8月16日日曜日

LPCScryptでLPC-Link2にCMSIS-DAPファームウェアの書込み



インストール
LPCScrypt(LPCScrypt_installer_1.5.2_588.exe)を次のサイトからダウンロードして実行する。
https://www.lpcware.com/lpcscrypt

セットアップウィザードに従えばいいが、シリアルドライバーはインストールしない。


ファームウェア書込み
LPC-Link2のJP1を外してUSBに接続する。(DFUモードでLPC-Link2を起動する)
C:\NXP\LPCScrypt\scripts に移動して、program_CMSIS.cmd NB を実行する。



LPC-Link2のJP1をショートする。(SPI Flashから起動する)

CMSIS-DAP確認
MDKを起動してDebugでCMSIS-DAPを認識できれば成功です。


トラブルシューティング
CMSIS-DAPはHIDデバイスなので専用のドライバは不要なのですが、
NXPのシリアルドライバーをインストールするとHIDより優先されるようで、MDKからは認識出来なかった。
シリアルドライバーを削除。シリアルポートなしのファームウェアを書き込んだところ認識されるようになりました。

(2015/8/16)
---

2015年8月14日金曜日

EmBitzでmbed LPC1768のデバッグ設定(暫定)

MDKのようなソースコードレベルでのデバッグはまだ出来ていませんが、
pyOCDバイナリ版のpyOCD_Winを使えばフラッシュ書込み、アセンブラレベルでのステップ実行くらいならできるようになったので設定方法です。

pyocd_win.exe を次のサイトからダウンロードします。
https://launchpad.net/gcc-arm-embedded-misc/pyocd-binary/

EmBitzのメニューDebug - interfacesでGDBサーバとしてpyOCDを設定します。
Generic
IP address: localhost
port: 3333
Executable: pyocd_win.exe
Pathはpyocd_win.exeをBrowse入力すると自動で設定されます。


メニューDebug - start sessionでデバッグを開始すると初回のみセキュリティ確認がでますが、
pyOCDが実行されてmbed LPC1768のデバッグが出来るようになります。


ただし、ソースコードレベルでブレークポイントで止めたりステップ実行は出来ない。
ディスアセンブル表示の中ではブレークポイント、ステップ実行は効きます。
EmBitz側で設定しなければならないところがあるのだろうと思います。

pyOCDなのでCMSIS-DAPのmbedなら同様にデバッグ出来そうだが未確認です。

参考:
pyOCD Binary Version
https://developer.mbed.org/blog/entry/pyOCD-Binary-Version/

(2015/8/14)
---

2014年4月27日日曜日

FRDM-KL25Z・FRDM-KL46Zをmbedインターフェースとして使う(更新)


ターゲットへの配線間違いを防ぐためにSWDとリセットのピンアサインを共通化してみました。
DAP_config.h

・uv4等でCMSIS-DAPが動かない時はSWDIO,SWCLKへの配線を確認。
・CMSIS-DAPは動くがドラッグアンドドロップ終了しない(MSC書込みLEDが点滅しない)時はリセットへの配線を確認。
・ドラッグアンドドロップが終了するがfail.txtが出来る時はSWDIO,SWCLKへの配線を確認。
・MBEDドライブが見えない時はUSB接続、ファームウェアの書込みを確認。
・ドラッグアンドドロップは出来るがシリアルポートが認識しない時はmbedWinSerial_16466.exeをインストール。

FRDM-KL25Z・FRDM-KL46Zをmbedインターフェースとして使う
http://mbed.org/users/va009039/notebook/frdm-kl25z-mbed-if/

(2014/4/27)
---

2013年12月5日木曜日

LPC800-MAX(LPC11U35)のファームウェアの作成


ELFファイルからバイナリーファイルを作成するようにする。
fromelf --bin -o lpc11u35_lpc1347_if.bin Obj\lpc11u35_lpc1347_if.axf
バイナリーファイルにチェックサムを付与するようにする。
c:\nxp\LPCXpresso_6.1.0_164\lpcxpresso\bin\checksum -d lpc11u35_lpc1347_if.bin


コードサイズを小さくするために最適化する。


ビルドする。

(2013/12/5)
---

2013年11月21日木曜日

LPC800-MAXでLPCXpresso LPC1347ボードを使う


LPC800-MAXに載っているLPC812を無効にするためにR23を外す。


有効にしたい時の為にJP2にピンヘッダを付けておく。


JP2のジャンパーピンを外して(JP2 OPEN)、LPC800-MAXにLPCXpresso LPC1347ボードを載せる。


SWD接続しているのでCMSIS-DAPでデバッグが出来ます。

ドラッグアンドドロップでのプログラムの書き込みは出来ません。ディスクにfail.txt(SWD ERROR)が作成されます。

(2013/11/21)
---

LPC800-MAX(LPC11U35)のファームウェアを変更する事によってドラッグアンドドロップでのプログラムの書き込みも出来るようになります。

使用例:


P0_7 LPC1347ボードの赤色LED
P0_22 LPC800-MAXボードの青色LED
P0_23 LPC800-MAXボードの緑色LED
P1_22 LPC800-MAXボードの赤色LED

(2013/12/30 追加)
---

2013年9月10日火曜日

mbedのセミホスティングを使用する方法

セミホスティングを使用する方法の補足メモ。

mbedとLPC1114FN28をSWD接続する。
mbedLPC1114FN28
p21 dp12(SWDIO)
p22 dp3(SWCLK)
mbed側はDigitalInOutが設定できるピンならどれでも変更可能です。
接続例:


mbedのオンラインコンパイラでLPC1114FN28のプログラムを作成する。
SWDで文字を表示したい場合はSWDSerialクラスを使って文字を表示します。
LocalFileSystemはmbedでマウントしたディレクトリにアクセスにいきます。mbed側でディレクトリは変更可能です。
プログラム例:

#include "mbed.h"
#include "SWDSerial.h"
SWDSerial pc;
LocalFileSystem local("local");

int main()
{
    FILE* fp = fopen("/local/MBED.HTM", "r"); // SYS_OPEN
    if (fp) {
        for(int i = 0; i < 176; i++) {
            pc.putc(fgetc(fp)); // SYS_READ,SYS_WRITEC
        }
        fclose(fp); // SYS_CLOSE
    }
    exit(0); // SYS_EXIT
}

LPC1114FN28にコンパイルしたバイナリーをダウンロードします。
 不安定ですが、mbedに 1114FN28.LPC で保存すれば起動時に書き込みます。

mbedをリセットします。フラッシュ書き込み、ソフトウェアリセット、LPC1114FN28のプログラムの実行、セミホスティングの実行。
実行例:

mbedのMBED.HTMファイルを読み取って表示しています。

注意:
表示速度はUARTより非常に遅いです。
ファイルアクセスも遅いです。1バイト単位でmbedへの問い合わせが発生しています。

関連記事:
mbedでセミホスティング

(2013/9/10)
---

2013年9月6日金曜日

flash_lpc11u24.pyを調べる(1/3)

pyOCDのflash_lpc11u24.py のFlashアルゴリズムの初期化ルーチンを逆アセンブルしてみた。
/keil/arm/flash/LPC_IAP/FlagPrg.c とほぼ同じでした。

pc_init
0x1000003C 494F      LDR      r1,[pc,#316]  ; @0x1000017C =4
0x1000003E 484E      LDR      r0,[pc,#312]  ; @0x10000178 =0x2ee0 =12000
0x10000040 4449      ADD      r1,r1,r9
0x10000042 6008      STR      r0,[r1,#0x00] ; CCLK in kHz
0x10000044 484E      LDR      r0,[pc,#312]  ; @0x10000180 =0x40048040
0x10000046 2100      MOVS     r1,#0x00
0x10000048 6301      STR      r1,[r0,#0x30] ; MAINCLKSEL(0x40048070)=0 Select Internal RC Oscillator
0x1000004A 2201      MOVS     r2,#0x01
0x1000004C 6342      STR      r2,[r0,#0x34] ; MAINCLKUEN(0x40048074)=1 Update Main Clock Source
0x1000004E 6341      STR      r1,[r0,#0x34] ; MAINCLKUEN = 0           Toggle Update Register
0x10000050 6342      STR      r2,[r0,#0x34] ; MAINCLKUEN = 1
0x10000052 6B41      LDR      r1,[r0,#0x34] ; read MAINCLKUEN
0x10000054 07C9      LSLS     r1,r1,#31
0x10000056 D0FC      BEQ      0x10000052
0x10000058 6382      STR      r2,[r0,#0x38] ; SYSAHBCLKDIV(0x40048078)=1 Set Main Clock divider to 1
0x1000005A 4949      LDR      r1,[pc,#292]  ; @0x10000180 =0x40048040
0x1000005C 2002      MOVS     r0,#0x02
0x1000005E 3940      SUBS     r1,r1,#0x40
0x10000060 7008      STRB     r0,[r1,#0x00] ; SYSMEMREMAP(0x40048000)=2 User Flash Mode
0x10000062 2000      MOVS     r0,#0x00
0x10000064 4770      BX       lr


(2013/9/6)
---

2013年9月2日月曜日

mbedで(pyOCD+CMSIS-DAP)のサブセット

mbedで(pyOCD+CMSIS-DAP)のサブセットを作ったでLPC1114FN28とSWDで直接接続できるようになりました。
フラッシュ書込とセミホスト発行検出だけを確認しています。

動作確認プログラム:
lpcterm2 - dumb-terminal with semihosting

SWDプロトコルについて
・SWDプロコトルに応答させるにはJTAGからSWDに切替えるコマンドを送る必要がある。
・アドレス範囲外アクセス等でエラーが発生すると、解消するにはDP_ABORTを送る。
・エラー状態でもDP_IDCODEだけは読み取れる。
・メモリー(レジスタ)の読み取りにはAP_DRWを空読みしてからDP_RDBUFFを読み取る。

IAPについて
・フラッシュアルゴリズムをRAMに置かずに、PCプログラムカウンタをIAPに、LRをbkptに指してresumeしている。
・resumeした時に割込みが悪影響しそうに思えるが、対策をしていないが動いている。
・フラッシュアルゴリズムのターゲットの初期化をしてない。クロック変更すると動かなくなるかも。
・先頭512バイトのベクターテーブルはユーザフラッシュに書き込めるが、読み取れない時がある。切り替わるタイミングが不明。

(2013/9/2)

先頭512バイトのベクターテーブルはユーザフラッシュに書き込めるが、読み取れない時があるのは、
プログラミングを実行すると、printf()がSerialクラスを使うとNVIC_SetVector()が
割込みベクターを書き換えるためにベクターテーブルをRAMにマッピングするので、書き込み時のユーザフラッシュが見えなる。

(2013/9/25追加)
---

2013年8月22日木曜日

flash_lpc11u24.pyを調べる(3/3)

pyOCDのflash_lpc11u24.pyのFlashアルゴリズムをディスアセンブルしてみました。
コメントはC:/Keil/ARM/Flash/LPC_IAP/FlashPrg.c に合わせました。

・セクター0を書き込むときにはベクターテーブルのチェックサムを再計算している。
・Code Read Protectionのコードは書き込まないようにしている。
pc_program_page
0x100000EC B5F8      PUSH     {r3-r7,lr}
0x100000EE 0006      MOVS     r6,r0
0x100000F0 4614      MOV      r4,r2
0x100000F2 D11E      BNE      0x10000132
0x100000F4 200B      MOVS     r0,#0x0B
0x100000F6 0180      LSLS     r0,r0,#6
0x100000F8 1820      ADDS     r0,r4,r0
0x100000FA 6BC1      LDR      r1,[r0,#0x3C] ; 0x000002fc Code Read Protection
0x100000FC 4823      LDR      r0,[pc,#140]  ; @0x1000018C =0x4e697370 =NO_ISP
0x100000FE 4281      CMP      r1,r0
0x10000100 D038      BEQ      0x10000174
0x10000102 4823      LDR      r0,[pc,#140]  ; @0x10000190 =0x12345678 =CRP1
0x10000104 4281      CMP      r1,r0
0x10000106 D035      BEQ      0x10000174
0x10000108 4822      LDR      r0,[pc,#136]  ; @0x10000194 =0x87654321 =CRP2
0x1000010A 4281      CMP      r1,r0
0x1000010C D032      BEQ      0x10000174
0x1000010E 4822      LDR      r0,[pc,#136]  ; @0x10000198 =0x43218765 =CRP3
0x10000110 4281      CMP      r1,r0
0x10000112 D02F      BEQ      0x10000174
0x10000114 6861      LDR      r1,[r4,#0x04]
0x10000116 6820      LDR      r0,[r4,#0x00]
0x10000118 68E2      LDR      r2,[r4,#0x0C]
0x1000011A 1840      ADDS     r0,r0,r1
0x1000011C 68A1      LDR      r1,[r4,#0x08]
0x1000011E 1889      ADDS     r1,r1,r2
0x10000120 1840      ADDS     r0,r0,r1
0x10000122 6921      LDR      r1,[r4,#0x10]
0x10000124 1840      ADDS     r0,r0,r1
0x10000126 6961      LDR      r1,[r4,#0x14]
0x10000128 1840      ADDS     r0,r0,r1
0x1000012A 69A1      LDR      r1,[r4,#0x18]
0x1000012C 1840      ADDS     r0,r0,r1
0x1000012E 4240      RSBS     r0,r0,#0
0x10000130 61E0      STR      r0,[r4,#0x1C]
0x10000132 4D14      LDR      r5,[pc,#80]  ; @0x10000184 =8
0x10000134 0B30      LSRS     r0,r6,#12
0x10000136 444D      ADD      r5,r5,r9
0x10000138 2132      MOVS     r1,#0x32     ; Prepare Sector for Write
0x1000013A 6068      STR      r0,[r5,#0x04]; Start Sector
0x1000013C 6029      STR      r1,[r5,#0x00]
0x1000013E 60A8      STR      r0,[r5,#0x08]; End Sector
0x10000140 4629      MOV      r1,r5
0x10000142 3114      ADDS     r1,r1,#0x14
0x10000144 4F10      LDR      r7,[pc,#64]  ; @0x10000188 =0x1fff1ff1
0x10000146 4628      MOV      r0,r5
0x10000148 9100      STR      r1,[sp,#0x00]
0x1000014A 47B8      BLX      r7           ; Call IAP Command
0x1000014C 6968      LDR      r0,[r5,#0x14]; IAP.stat
0x1000014E 2800      CMP      r0,#0x00     ; Command Failed ?
0x10000150 D110      BNE      0x10000174
0x10000152 606E      STR      r6,[r5,#0x04]
0x10000154 2033      MOVS     r0,#0x33     ; Copy RAM to Flash
0x10000156 60AC      STR      r4,[r5,#0x08]
0x10000158 6028      STR      r0,[r5,#0x00]
0x1000015A 2001      MOVS     r0,#0x01
0x1000015C 0280      LSLS     r0,r0,#10
0x1000015E 60E8      STR      r0,[r5,#0x0C]
0x10000160 4806      LDR      r0,[pc,#24]  ; @0x1000017C =4
0x10000162 4448      ADD      r0,r0,r9
0x10000164 6800      LDR      r0,[r0,#0x00]
0x10000166 6128      STR      r0,[r5,#0x10]; CCLK in kHz
0x10000168 4628      MOV      r0,r5        ; &IAP.cmd
0x1000016A 9900      LDR      r1,[sp,#0x00]; &IAP.stat
0x1000016C 47B8      BLX      r7           ; Call IAP Command
0x1000016E 6968      LDR      r0,[r5,#0x14]
0x10000170 2800      CMP      r0,#0x00
0x10000172 D000      BEQ      0x10000176
0x10000174 2001      MOVS     r0,#0x01
0x10000176 BDF8      POP      {r3-r7,pc}

(2013/8/22)
---

2013年4月18日木曜日

mbedアプリケーションボードをデバッグアダプタにする


USBミニBコネクタが載っていたのでmbedアプリケーションボードをCMSIS-DAPデバッグアダプタにしてみました。
しかし、空きポートが無かったので、サーボモータとxbeeのポートをSWDにしています。
例:p21 swdio, p22 swclk, p29 nReset


注意:mbedアプリケーションボードをUSBデバイスにするには上の写真のようにDIPスイッチで切り替えます。

試しにKeil uVision4にエクスポートして再コンパイルしてみたら、次のようなプログラムサイズになりました。
Program Size: Code=26682 RO-data=1898 RW-data=312 ZI-data=1216

32KB以内に収まっているのでデバッグも出来ます。
Running with Code Size Limit: 32K
Load "C:\\temp-lpc1768\\pms-CMSIS-DAP_uvision_lpc1768\\pms-CMSIS-DAP\\build\\pms-CMSIS-DAP.axf" 

*** Restricted Version with 32768 Byte Code Size Limit
*** Currently used: 28776 Bytes (87%)

参考:
mbedをデバッグアダプタにしてみた(mbed-Link)

(2013/4/18)

作り方をmbedのノートに書きました。
デバッグアダプタの作り方

(2013/4/20追加)
---

2013年4月17日水曜日

CMSIS-DAP debuggerの修正メモ。

AN11321: Porting the CMSIS-DAP debugger to the Cortex-M0 platform
をKL25Zで動くように修正した時のメモ。

SWDプロトコルをソフトウェアで実装している。
クロックの周期を作るのにCPUサイクル数を数えています。

SW_DP.cpp

void SWJ_Sequence (uint32_t count, uint8_t *data)
uint8_t SWD_Transfer(uint32_t request, uint32_t *data)

ループに必要なCPUサイクル数は数えていないようです。
Max Clock の設定より実際には低めのクロックで動いていると思う。

DAP_config.h

CPU_CLOCK 48000000
CPUのクロック 48MHz

IO_PORT_WRITE_CYCLES 1
I/Oポートに書きこむ時に必要なCPUサイクル数 は 2、Cortex-M0+は 1

DigitalOut を使った時のサイクル数がわからなかったし、他のmbedでも動くように
ワーストケースとして 1 にしている。

DAP.h

DELAY_SLOW_CYCLES 3
PIN_DELAY_SLOW(uint32_t delay) 関数でdelayあたりのCPUサイクル数

DELAY_FAST_CYCLES 0
PIN_DELAY_FAST(void)関数のCPUサイクル数、最適化されるので 0

DAP.cpp

static uint32_t DAP_SWJ_Clock(uint8_t *request, uint8_t *response)
SWDの Max Clock 最大クロックの設定

#define MAX_SWJ_CLOCK(delay_cycles) (CPU_CLOCK/2 / (IO_PORT_WRITE_CYCLES + delay_cycles))
MAX_SWJ_CLOCK(DELAY_FAST_CYCLES) は (48M/2/(1+0)) 24MHz になります。

最大クロックが MAX_SWJ_CLOCK(DELAY_FAST_CYCLES) 24MHz 以上の時は、
クロック作成で PIN_DELAY_FAST()関数を使います。ウェイトを作成しない。

SWD Max Clock で設定した時の delay, cycle の変化。
Max Clockdelaycycle
10MHz13
1MHz824
100kHz80240
10kHz8002400
5kHz16004800
Max Clock 5kHz に設定するとFlash書き込みはかなり遅くなります。
また、バッファリングしていないUSBHIDの場合はユーザインターフェースの反応が鈍くなります。
可能な限り Max Clock は多く設定するのがお勧めです。

(2013/4/17)

CPU_CLOCK CPUのクロックは uint32_t SystemCoreClock にした方がいいのかもしれない。
system_LPC17xx.c system_LPC11Uxx.c system_MKL25Z4.c で設定されている。

(2013/4/18追加)
---

2013年4月15日月曜日

CMSIS-DAPでLPC1114FN28に接続する





KL25ZのCMSIS-DAPがSWD出来るようになったので、LPC1114FN28に接続してみました。
LPC1114FN28のサンプルプログラムが見つからなかったので、
LPC1114の日本語ドキュメントを参考にして main.c を次のように書いてみました。
LEDチカチカです。
Debugモードに入って View - System Viewer - GPIO - GPIO0 でレジスタを直接変更出来て便利。
Peripherals でも同じように変更出来ます。

#include "LPC11xx.h"

void SystemInit()
{
}

void wait()
{
    __IO int i = 200000;
    while(i-- > 0)
            ;
}

int main()
{
    LPC_GPIO0->DIR = 1<<7; // PIO0_7 output
    while(1) {
        LPC_GPIO0->DATA ^= 1<<7;
        wait();
     }
}


参考:
mbedをデバッグアダプタにしてみた(mbed-Link)

(2013/4/15)
---

2013年4月12日金曜日

CMSIS-DAP用のUSBHIDの作り方

pyOCDはmbedのVID、PIDをみてHIDからCMSIS-DAPを探しているようだが、Keil uvison4はどうしているのだろうと調べていた時の副産物です。

Keil uvison4 が認識するように mbed の USBDeviceライブラリの USBHID を改造してみました。

/USBDevice/USBHID/USBHID.cpp の stringIproductDescriptor[] を CMSIS-DAP を含む文字列に書き換える。
例:

uint8_t * USBHID::stringIproductDesc() {
    static uint8_t stringIproductDescriptor[] = {
        32,                                                       //bLength
        STRING_DESCRIPTOR,                                        //bDescriptorType 0x03
        'K',0,'L',0,'2',0,'5',0,'Z',0,' ',0,'C',0,'M',0,'S',0,'I',0,'S',0,'-',0,'D',0,'A',0,'P',0 // KL25Z CMSIS-DAP
    };
    return stringIproductDescriptor;
}


/USBDevice/USBHID/USBHID.cpp の reportDescriptor[] の HIDリポートディスクリプタを書き換える。
例:(KL25Zのインターフェース3のHIDリポートディスクリプタです)

uint8_t * USBHID::reportDesc() {
    static uint8_t reportDescriptor[] = {
        0x06, 0x00, 0xff,
        0x09, 0x01,         // usage
        0xA1, 0x01,         // Collection 0x01
        0x15, 0x00,         // logical minimum = 0
        0x26, 0xFF, 0x00,   // logical maximum = 255
        0x75, 0x08,         // report size = 8 bits
        0x95, 0x40,         // report count
        0x09, 0x01,         // usage
        0x81, 0x02,         // Input (array)
        0x95, 0x40,         // report count
        0x09, 0x01,         // usage
        0x91, 0x02,         // Output (array)
        0x95, 0x01,         // report count
        0x09, 0x01,         // usage
        0xb1, 0x02,
        0xC0                // end collection
    };
    reportLength = sizeof(reportDescriptor);
    return reportDescriptor;
}

(2013/4/12)

usbd_user_hid.c を見てみるとusbd_hid_set_report()が非同期でパケットを受信しているようなので、
コネクト・ディスコネクトくらいのパケット数が少ないのは取りこぼすことは無かったが、
Flash書き込みで非同期で大量のパケットが送られてくると取りこぼすのかもしれません。
USBSerialのように割込みからパケットを受信するようにしないといけないのかもしれません。

(2013/4/15追加)

Flash書き込みでVerifyOKと表示されるから問題なく受信出来ているのであろう。
DAP.c を見ていたら、Infoコマンド(0x00) の DAP_ID_PACKET_COUNT(0xfe) で、
送受信可能のパケット数 DAP_PACKET_COUNT をホストに知らせている。
実際にはホスト側の実装に依存すると思うが、USBHIDのように1つのパケットをポーリングで送受信している場合は
DAP_PACKET_COUNT を 1 にしておけばより安全かもしれません。。

(2013/4/16追加)

USBDeviceライブラリを修正しなくても、USBHIDから継承すればいいかと考えたが、
stringIproductDesc()は仮想関数なので、実装するだけで文字列を変更できる。
しかし、reportDesc()は実装しても反映されないのでUSBHIDクラスをそのままコピーして
新しいクラスUSBDAPを作るようにしました。

(2013/4/17追加)
---