先日製作したmega32U4のパラレルライターが正常に動かない件を調査した。
WireSharkとNcapとUSBPcapをインストールして、ホストからの信号をキャプチャしたが、これはコードから見える仕様と一致していた。

ホストからエンドポイントに対して64バイトのデータを送信するが、はじめに電源投入コマンドの0x06、modeが0x01、quickが0x00、シーケンス番号の順で送られており、以降続くコマンドとデータ列は正常であった。
次にデバイス側でどう受け取っているか、chaNさんのソフトUARTを組み込み、空きポートからシリアル出力させて確認してみたところ、電源投入コマンド0x06を受けて、続くmodeとquickの2バイトを順に読み込んで引数とするところで、modeとquickが逆順になって受信していることが判明した。
正)cmd: 0x06 mode: 0x01 quick: 0x00 誤)cmd: 0x06 mode: 0x00 quick: 0x01

SET_BYTEコマンド0x07でも同様だったが、逆になる理由がわからないので、手っ取り早く引数を逆順にしてビルド・焼き込みにて、正常に動くようになった。
動くようになったものの、順序がおかしくなる部分が特定できないので、hid_task.cの信号受信時に1バイトづつ読み込むUSB_read_byte()の部分は削除して、指定バイトを一括で読むusb_read_packet()に置き換えることで、逆順になる部分は解決した。
■2025年度にavrhppをビルドする際のオリジナルとの差異
- MicrochipStudio v.7
- GnuWin32.Make v3.81
- HIDのサンプルコードはAVR.jpのだとビルドエラーになるので、本家よりAN7599をDLする。
- gcc\makeファイルの37行目にmicrochip studioのincludeディレクトリを追記
- usb_descriptors.cの code S_なんとかの codeの後にconstを追記
- usb_specific_request.hの code S_なんとかの codeの後にconstを追記
- usb_specific_request.cの code S_なんとかの codeの後にconstを追記
- gccフォルダ内にdefault\depフォルダを作成
- hid_task.cのhid_report_out()を以下に修正
//Ishida add 2010.7.10
U8 rx_buf[40];
usb_read_packet(EP_HID_OUT, rx_buf, 40);
if (rx_buf[0] == HVS_DAT) xfer8(rx_buf[1], rx_buf[2]);
if (rx_buf[0] == USB_POW) power_on(rx_buf[1], rx_buf[2]);
if (rx_buf[0] == SET_BYTE) set_byte(rx_buf[1], rx_buf[2]);
if (rx_buf[0] == RCV_BYTE) rcv_byte(rx_buf[1]);
if (rx_buf[0] == STB_PAGEL) stb_pagel();
if (rx_buf[0] == STB_WR) stb_wr(rx_buf[1], rx_buf[2]);
if (rx_buf[0] == RFL_PP || rx_buf[0] == REE_PP || rx_buf[0] == RFL_HVS || rx_buf[0] == REE_HVS)
read_block(rx_buf[0], rx_buf[1], rx_buf[2]);
if (rx_buf[0] == WFL_PP || rx_buf[0] == WEE_PP || rx_buf[0] == WFL_HVS || rx_buf[0] == WEE_HVS){
U8 flag_bk = rx_buf[1];
U8 block_bk = rx_buf[2];
U8 g_count_bk = rx_buf[3];
g_page_adr = ((U32)rx_buf[4] << 24);
g_page_adr |= ((U32)rx_buf[5] << 16);
g_page_adr |= ((U32)rx_buf[6] << 8);
g_page_adr |= (U32)rx_buf[7];
U8 i;
for (i = 0; i < 32; i++){
g_data_buff[i] = rx_buf[i + 8];
}
write_block(rx_buf[0], flag_bk, block_bk);
g_count = g_count_bk;
}else{
g_count = rx_buf[3];
}