hirakuni45 です。
最近(既に数か月経過してるけど・・)、RXマイコン用、TinyUSB/Host ドライバーがコミットされたので、機能を試しています。
RX65N Envision Kit、RX72N Envision Kit での動作を確認しました。
そこで、USB の構成がほぼ同じ RX72T も試そうと思い、e2Studio/gcc でプロジェクトを作成し、出力された iodefine.h を利用しようとしましたが・・
iodefine.h が中途半端でgccのコンパイルに失敗します。
RX72N、RX65N では、ビットフィールドは、リトルエンディアンとビッグエンディアンで分かれていて、全ての定義があるので、gcc でも適切にコンパイル可能です。
ところが、RX72T 用の iodefine.h では、USB 関係のレジスタ定義が中途半端で、コンパイル出来ません・・
具体的には、表題の通り「IODEFINE_H_HISTORY」で囲まれていて、「ビッグエンディアン」の定義しか無い場合があります。
※レジスターによっては、RX72N と同じようにちゃんと定義されている場合もある。
何故、このような中途な状態になっているのか?、回避策などご存じの方がいれば教えて下さい。
※もちろん、RX72N 用のUSB部分を切り貼りすれば出来るでしょうが、iodefine.hを触りたくありません。
又、「IODEFINE_H_HISTORY」キーワードは、どのような意味があるのでしょうか?
RX72N iodefine.h USB 関係:
typedef struct st_usb0 { union { unsigned short WORD; struct { #ifdef __RX_LITTLE_ENDIAN__ unsigned short USBE : 1; unsigned short : 3; unsigned short DPRPU : 1; unsigned short DRPD : 1; unsigned short DCFM : 1; unsigned short : 3; unsigned short SCKE : 1; unsigned short : 5; #else unsigned short : 5; unsigned short SCKE : 1; unsigned short : 3; unsigned short DCFM : 1; unsigned short DRPD : 1; unsigned short DPRPU : 1; unsigned short : 3; unsigned short USBE : 1; #endif } BIT; } SYSCFG;
RX72T iodefine.h USB 関係:
typedef struct st_usb { union { unsigned short WORD; #ifdef IODEFINE_H_HISTORY struct { unsigned short :5; unsigned short SCKE:1; unsigned short :3; unsigned short DCFM:1; unsigned short DRPD:1; unsigned short DPRPU:1; unsigned short :3; unsigned short USBE:1; } BIT; #endif } SYSCFG;
> 具体的には、表題の通り「IODEFINE_H_HISTORY」で囲まれていて、「ビッグエンディアン」の定義しか無い場合があります。詳しい状況が分からないので推測ですが、元がCC-RXのプロジェクトでGCCコンバータを通して作られた iodefine.h であれば記述がおかしくなることは考えられなくもありません。いずれにせよ最初からGCCで作られたプロジェクトから持って来た iodefine.h に差し替えれば解決すると思います。
ほや さん、こんにちは。NoMaYです。hirakuni45さんは、CC-RXなど歯牙にも掛けません。e2 studioで生成したGCC向けiodefine.hの該当部分が最初からendianに対応していない構成で生成されてしまうのですよ。e2 studioのプロジェクトジェネレータの原本のフォルダのiodefine.hがそうなってしまっているのですよ。
> e2 studioのプロジェクトジェネレータの原本のフォルダのiodefine.hがそうなってしまっているあああー 確かに。