いんくらyochさんの日記

興味あることの備忘録

avrhppパラレルライター_mega32U4版

先日製作した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する。
  1. gcc\makeファイルの37行目にmicrochip studioのincludeディレクトリを追記
  2. usb_descriptors.cの code S_なんとかの codeの後にconstを追記
  3. usb_specific_request.hの code S_なんとかの codeの後にconstを追記
  4. usb_specific_request.cの code S_なんとかの codeの後にconstを追記
  5. gccフォルダ内にdefault\depフォルダを作成
  6. 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];
	}