e-tipsmemo

ごった煮

EZ-USB FX2 Bulkloop

fw.cを見る

初期化があった後に(Bulkloop.cにある)

ここでDevice Descriptorをそれぞれの構造体へ読む。
EP0でコントロールコマンドが来た時に必要。

で割り込みを有効にしているらしいが、関数呼び出しかと思わせておいてdefineで定義されている単なるレジスタへの代入。

#define EZUSB_IRQ_ENABLE()   EUSB = 1
#define EZUSB_IRQ_DISABLE()   EUSB = 0

(なぜこのように書いているか)
レジスタへのアクセスは8bit単位はもちろん
SDCCへの拡張命令?でその中のビット単位でのアクセスが可能のようだ

__sfr __at (0xE8) EIE     ; // EIE Bit Values differ from Reg320
          /*  EIE  */
          __sbit __at (0xE8+0) EUSB     ;
          __sbit __at (0xE8+1) EI2C     ;
          __sbit __at (0xE8+2) EIEX4    ;
          __sbit __at (0xE8+3) EIEX5    ;
          __sbit __at (0xE8+4) EIEX6    ;

この幾つかのレジスタは8051には無いSpecial Function Registerとして機能しており、
Cypress EZ-USB FX2LP Technical Reference Manual
のp211には書いていなかった。項目が別にある。
f:id:katakanan:20180107020317p:plain

次も割り込みを許可する

これもレジスタアクセスだが8051のオリジナルレジスタである。
書き方がSFRの代入とは違うがこれはビット単位ではアクセスできない?代わりにビット代入のための定義がある。

/* Interrupt 2 & 4 Setup (INTSETUP) */
#define bmAV2EN      bmBIT3
#define INT4IN       bmBIT1
#define bmAV4EN      bmBIT0
#define bmBIT0   0x01
#define bmBIT1   0x02
#define bmBIT2   0x04
#define bmBIT3   0x08
#define bmBIT4   0x10
#define bmBIT5   0x20
#define bmBIT6   0x40
#define bmBIT7   0x80

これはUSB Control and Status Registerのようで、

http://www.cypress.com/file/113936/download
p6によると、

USBCSレジスタ (USB制御およびステータス) の2つの制御ビットは、DISCONおよびRENUMというReNumerationプロセスを制御します。
USBの切断をシミュレートするには、ファームウェアはDISCONを1にセットします。
再接続するには、 ファームウェアはDISCONを0にクリアします。
再接続前に、ファームウェアはRENUMビットを設定またはクリアし、
ファームウェアとデフォルトのUSBデバイスのいずれがエンドポイントゼロによってデバイス要求を処理するかを示します。
RENUMが0のときは、デフォルトのUSBデバイスがデバイス要求を処理し、RENUMが1のときは、 ファームウェアが要求を処理します。

コメントにはとくに何かが変わるわけではないとあるのでそのまま。

CKCON はSFRのうちの一つでClock Control Register
各タイマーのクロックソースを選択するようだ。

Stretchとは何だといことだが、
http://www.cypress.com/file/126446/download
のp177の
12.1.2
Stretch Memory Cyclesに書いてある。
Stretch Valueを入れることで外部の遅いもののMOVXで書き込むときに追加のクロックサイクルを調節してくれる?

ストレッチメモリサイクル機能により、EZ-USBファームウェアはプログラムメモリアクセスではなく、
データメモリアクセスの速度を調整することができます。
標準ストローブ幅タイミングを含む詳細は、テクニカルリファレンスマニュアルの12.1.2節をご参照ください。
アドレスサイクル幅はこれらから解釈することができます。

(アセンブリを見たらわかる気がする。が後で)

Sleepをfalseにクリアする
割り込みでSleepがTrueになるとメインループでスリープmodeに入る(のがオリジナルのコードだったが必要ないので消した。)

メインループ

GotSUDはグローバルな変数でEP0でコマンドが送られてきたときに割り込みでTrueになる。消してはいけない。

諸々の設定は最初にあったTD_Init()内にあるらしいので次回はそことTD_Poll(),SetupCommand()を見てゆく。