(2014.01.09)
USBリファレンス・ハードウェア(USB機能の付いたマイコンボード、これです)を入手し、アプリケーション・ライブラリの”USB Device CDC-Basic Demo”に手を入れて、XC8で動くUSBリファレンス・ソフトウェアを用意することにしました。

XC8でコンパイルするとエラーになる部分に修正を加え、何とかコンパイルが通りました。
----------------------------------------
ご参考までに修正の概要を以下に記します。

#ifdef __XC8
  #include 
  #ifndef __18CXX
    #define __18CXX
  #endif
  #ifndef __18F14K50
    #define __18F14K50
  #endi
  #define ROM const
  #define FAR 
#endif

@main.c
#ifdef __XC8
        void High_ISR (void) @0x08
	{
	     asm(" goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS ");
	}
	void Low_ISR (void) @0x18
	{
	     asm(" goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS ");
	}
	extern void _startup (void);        // See c018i.c in your C18 compiler dir
	void _reset (void) @REMAPPED_RESET_VECTOR_ADDRESS
	{
	    asm(" goto _startup ");
	}
	void Remapped_High_ISR (void) @REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
	{
	     asm(" goto _YourHighPriorityISRCode ");
	}
	void Remapped_Low_ISR (void) @REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
	{
	     asm(" goto _YourLowPriorityISRCode ");
	}
      	void interrupt YourHighPriorityISRCode()
	{
        #if defined(USB_INTERRUPT)
	        USBDeviceTasks();
        #endif
	}
	void interrupt low_priority YourLowPriorityISRCode()
	{

	}
#else
  オリジナル・コード
#endif

---------------------------------------
プログラムをビルドし、USBリファレンス・ハードウェアに書き込んで動かしてみると、やはり”Unkown Device”になります。動かないのは残念ですが、重要な手がかりです。動作実績のあるハードウェアに問題は無く、ソフトウェアのどこかにXC8とC18で異なる部分がある筈です。

最初にXC8とC18のマップ・ファイルを比較しましたが、記述の違いが大きくてギブアップしました。やむを得ずソース・ファイルを一つ一つ比較することにしたのですが、親族SNS管理人には有る筈の違いが見つかリません。orz

途方に暮れてWEB上の情報を探していたところ、こちらの方のサイトに行き着きました。
同じ事を試みて成功されたようです。有り難いことにソース・コードを公開(これです)されています。早速、ダウンロードしてソース・コードを比較してみると・・・

@usb_device.c
<拝見したコード>
// バッファ ディスクリプタ テーブルの確保を行う(EP0/EP1/EP2)
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] @USB_BDT_ADDRESS; // 4レジスタ x 12個(48byte)
// EP0用の受信データバッファの確保を行う
volatile CTRL_TRF_SETUP SetupPkt @CTRL_TRF_SETUP_ADDR_TAG; // 8byte
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] @CTRL_TRF_DATA_ADDR_TAG; // 8byte

<XC8で動かないオリジナル・コード>
volatile BDT_ENTRY BDT[BDT_NUM_ENTRIES] BDT_BASE_ADDR_TAG;
volatile CTRL_TRF_SETUP SetupPkt CTRL_TRF_SETUP_ADDR_TAG;
volatile BYTE CtrlTrfData[USB_EP0_BUFF_SIZE] CTRL_TRF_DATA_ADDR_TAG;

シミュレータでアドレスを調べると、動かないコードの方はBDT配列がUSBRAM上に配置されていません!
ようやく不具合の首ねっこを捕まえました。

原因はusb_hal_pic18.hにある以下の記述です。
//----- Defintions for BDT address --------------------------------------------
#if defined(__18CXX)
    #if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50)
        #define USB_BDT_ADDRESS 0x200
        #define CTRL_TRF_SETUP_ADDR 0x230 <== 追加
        #define CTRL_TRF_DATA_ADDR 0x238  <== 追加
    #else
        #define USB_BDT_ADDRESS 0x400
        #define CTRL_TRF_SETUP_ADDR 0x430 <== 追加
        #define CTRL_TRF_DATA_ADDR 0x438  <== 追加
    #endif
#endif

#ifdef __XC8
#define BDT_BASE_ADDR_TAG   @USB_BDT_ADDRESS
#define CTRL_TRF_SETUP_ADDR_TAG  @CTRL_TRF_SETUP_ADDR
#define CTRL_TRF_DATA_ADDR_TAG @CTRL_TRF_DATA_ADDR
#else
#define BDT_BASE_ADDR_TAG   __attribute__ ((aligned (512)))  <==元のコード
#define CTRL_TRF_SETUP_ADDR_TAG      <==元のコード
#define CTRL_TRF_DATA_ADDR_TAG       <==元のコード
#endif


この修正で、ようやく”USB Device CDC-Basic Demo”がXC8でも動くようになりました。
さらに、PIC18F25k50用に修正したものをタッチ・マウス基板に書き込むと、こちらでも動くことが確認できました。
(パチパチパチ~)

どうやらXC8で動くUSBリファレンス・ソフトウェアが完成したようです。
ヤレヤレ

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ