H8,SH,マイコン,ぼやき川柳,ダウンロード

コーディングは苦労したのですが、結局、USBの事は分からずじまい。トホホ・・

SH-2Aでサインカーブ

H8SX/1655で行ったサインカーブ描画、ターゲットをSH-2Aに変更してやってみます。Visual Studioの評価期間は終わっていて、PC側は修正できません。SH-2A側の動作を忠実にH8SX/1655に合わせる必要があります
 
 
 
VMWare Playerで動作させています。取り外し可能デバイスにベンダIDが表示されています
 
Descriptorをコピーすれば簡単に動くだろうと甘く見ていたのですが、無茶苦茶苦労しました。ベースは仮想シリアルのプロジェクトです。内部トレースをガンガンに入れて調査しました
・EPが2個しか起動されない(ControlとOutバルクのみ、InバルクのEPが起動されません)
・sin()がゴミを出力 ・・・ アホでした

PC側のトランジスタ特性測定用のダイアログはデバッグの事をよく考えて出来ています 

 
 

修正箇所

9割方は内部トーレースを追加しただけで、実際に意味のある修正箇所は多くないです(たぶん。忘れてしまいました)
フォルダ構成もよく意味が分かっておらず、覚えている限り、残しておきます
(編集が面倒なのでモジュール毎に大見出しを付けます)

 

main.c

Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.
 
USB起動のP_ModeInit()をP_Main()へ持っていきました。 エニュメレーションの過程を内部トレースで見る為です
 
 

P_Main.c

Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.
 
ベースにさせて頂いた、H8SXのソースはリングバッファから1コマンド分を切り出していました。SH-2A用のHEWなのでEC++のStringを使って切り出そうとしたのですが、メインC++とCのサブルーチン呼出がアドレス解決できずリンケージエラー。挫折しました
内部トレースを見る限り、スプリットされることもなく、1コマンド分読めていたので、切り出しを止めました
sin()は折角、FPUがあるので関数を使用しました。<math.h>をincludeしなくてもエラーになってなかったので、そのままにしていたのですが、実行時に不正値が却ってきました
 

p_descrip.c

Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.
 
Hi-Speed Descriptorは使用しませんが、残しています。バッファサイズは変更しましたが、意味はないと思います

 

p_def_ep.h

Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.
 
これも、バッファサイズを変更しましたが、意味はないと思います
これと、これを扱うモジュールは難解です
 
 

p_lib7264.c

これのvoid P_ResetEP()。EPの特性をSet Configurationに従って設定しているのでしょうか?何をやっているのか全く理解できません。無理やり、3回ループするように修正しました(コントロール、Outバルク、Inバルクの3回?)コメントも少なく、好きになれません 
 
Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.
 
 

p_usbint.c

Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.
 
トレースを入れただけです

 
 

c_dataio.c

Copyright (C) 2009. Renesas Technology Corp., All Rights Reserved.

トレースを入れただけです。但し、これのusb_write_buffer()
USB_U16 usb_write_buffer(USB_U16 pipe)
{
	USB_U16	status;
	USB_U16 usefifo;
//    int   i;                                                            // Debug	
//    const char fmt[]=                                                   // Debug	
//    "\nusb_write_buffer(): FIFO=xxxx, status=xxxx\n";
//    0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
//    0         1         2         3         4         5         6         7         8
    char buff[128];                                                     // Debug	


	PipeIgnore[pipe]	= 0;			/* Ignore count clear */
	usefifo = (USB_U16)(PipeTbl[pipe] & FIFO_USE);
	switch(usefifo){
		case	D0_FIFO_USE:
			status	= usb_write_buffer_d0(pipe);
			break;
		case	D1_FIFO_USE:
			status	= usb_write_buffer_d1(pipe);
			break;
//		case	D0_FIFO_DMA:
//			status	= usb_write_dma_d0(pipe);
//			break;
//		case	D1_FIFO_DMA:
//			status	= usb_write_dma_d1(pipe);
//			break;
		default:
			status	= usb_write_buffer_c(pipe);
			break;
	};

  略

//  ***** Debug Print *****	
//    for ( i=0; fmt[i] != 0x00; i++) buff[i] = fmt[i];                   // Debug
//    buff[i] = 0x00;                                                     // Debug
//    h2c( (char *)&usefifo, &buff[26], 2 );                              // Debug
//    h2c( (char *)&status,  &buff[39], 2 );                              // Debug
//    trc_put(buff);                                                      // Debug

	return	status;						/* End or Err or Continue */

}
 
はエラーも返さないのですが。本来「case D1_FIFO_USE:status = usb_write_buffer_d1(pipe)」を通るべき処、「default: status = usb_write_buffer_c(pipe)」を通っていました。この為、PC側はエラーダイアログ(確か、「Access Violation・・」)が出現。この調査でハマりました。疲れた
 
 

実行結果


不良が残っていますが、目一杯、内部トレースを取っている状態です
 
EPリセットが3回出るのが、正常な状態です
P_ResetEP(): pipe=0006, index=0000, PipeTbl=0081, num=0001,
P_ResetEP(): pipe=0001, index=0005, PipeTbl=1002, num=0001,
P_ResetEP(): pipe=0002, index=000A, PipeTbl=2083, num=0001,
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます