4. 応用例の説明
4.2 参考プログラムの説明
4.2.3 参考プログラムのフローチャート
(1) main()関数フローチャート
パワーオンリセットからLBSC、DBSC3の初期設定を実行した後、main()関数からの処理フローを示します。
スタート
< main() >
ピンファンクション設定
< pfc_init() >
SCIF0設定
< scif_init() >
コンソール表示(1)
Target Device Check ?
PCI Express初期設定
< pcie_init() >
PCI Expressコンフィグ空間読出し
コンソール表示(2)
コンソール表示(3)
Transmit Data Start ?
エンド ピンファンクションの設定
SCIF0を115200pbs, 8bitで設定
コンソール表示(1):
”SH7786 PCI Express DEMO Sample ROOT Port”を表示
コンソール表示に”Target Device Check? Y/N”と表示され、Target Deviceを チェックしたい場合は”Y”を、そうでない場合は”N”を入力
コンソール表示(2)
”No Check Device”と表示 PCIEC (Root Port) 初期設定
Target Device のコンフィグ空間を読出し
コンソール表示(3):Target DeviceのVenderIDとDeviceIDを表示 VID/DIDが “0xFF”の場合、”Device not detected on PCI Bus”を表示
コンソール表示に”Transmit Data Start? Y/N”と表示され、Target Deviceにテストデータ を送受信したい場合は”Y”を、そうでない場合は”N”を入力
N N
Y PCIEC ROOT port
or END point ?
PCIEC = END point ( CONFIG_PCIE_END = 1 )
PCIEC = Root port
( CONFIG_PCIE_ROOT = 0 )
B PCIEC (END point) 初期設定
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
for( i=0; i<4; i++ )
コンソール表示(5)
コンソール表示(6) A
コンソール表示(5):IO空間から読出したアドレスとテストデータを表示
コンソール表示(6):メモリ空間から読出したアドレスとテストデータを表示 メモリ空間への書込み
< pcie_mem_write() >
メモリ空間から読出し
< pcie_mem_read() >
Target Deviceのメモリ空間にテストデータ書込み
Target Deviceのメモリ空間からテストデータ読出し IO空間への書込み
< pcie_io_write() >
IO空間から読出し
< pcie_io_read() >
Target DeviceのIO空間にテストデータ書込み
Target DeviceのIO空間からテストデータ読出し
コンソール表示(11)
エンド
コンソール表示(11):”PCI Express Demo Sample End”を表示 転送データの初期化 DMA転送用テストデータ(64byte)をSDRAMに展開
コンソール表示(7) コンソール表示(7):”DMA Start WRITE(SuperHyway->PCI)”を表示
メモリ空間にDMA転送(Write)
< pcie_start_dma() > SDRAMから64byteのテストデータをTarget Deviceのメモリ空間にDMA転送
コンソール表示(8) コンソール表示(8):”Transfer Data”と表示し、転送元のSDRAMアドレスとテスト データ64byte分を表示
コンソール表示(9) コンソール表示(9):”READ(PCI->SuperHyway)”を表示
メモリ空間からDMA転送(Read)
< pcie_start_dma() > Target Deviceの同一メモリ空間から64byte分のテストデータをSDRAMにDMA転送
コンソール表示(10) コンソール表示(10):”Transfer Data”を表示し、転送先のSDRAMアドレスとテスト データ64byte分を表示
図4.2.4.1 mainフロー(PCI Express Root port)
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
コンソール表示(1)
PCI Express初期設定
< pcie_init() >
コンソール表示(2)
エンド
コンソール表示(1):”SH7786 PCI Express DEMO Sample END Point”を表示
PCIEC (End Point) 初期設定
コンソール表示(2):”PCI Express Demo Sample End”を表示 B
図4.2.4.2 mainフロー(PCI Express End point)
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(2) ピンファンクション設定フローチャート
ピンファンクション設定の処理フローを示します。
図4.2.4.3 ピンファンクション設定フロー
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(3) SCIF0初期設定フローチャート
シリアルコンソールとして使用するSCIF0初期設定の処理フローを示します。
スタート
< scif_init() >
シリアルコントロールレジスタ
SCSCR0の設定 TIE, RIE, TE, RE を"0"クリア
FIFOコントロールレジスタ SCFCR0の設定
シリアルステータスレジスタ SCFSR0の設定
ラインステータスレジスタ SCLSR0の設定
ソースクロック選択
シリアルコントロールレジスタ SCSCR0の設定
ビットレートレジスタ SCBRR0の設定
ソフトウェアウェイト
FIFOコントロールレジスタ SCFCR0の設定
エンド
シリアルコントロールレジスタ SCSCR0の設定 TX, RX の FIFO をクリア
BRK, DR, TR を"0"クリア
ORER を"0"クリア
EXT: SCK 入力 ボーレートに使用するソースクロックを選択
INI : PΦ, EXT : SCK外部入力
INI : PΦ
ソースクロックを PΦに設定
ソースクロックを SCK外部入力に設定
115200pbsに設定
1ビット期間待つためのソフトウェアウェイト
レシーブFIFOデータ数トリガ:1に設定 トランスミットFIFOデータ数トリガ:32に設定 TX, RXのFIFOをクリアしない設定 トランスミットイネーブル:1に設定 レシーブイネーブル:1に設定
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(4) PCI Express バス初期設定フローチャート
PCI Express バス初期設定の処理フローを示します。
スタート
< pcie_init() >
memset PCIECコンフィグレーションデータの初期化
PCIECソフトリセット
< pcie_soft_reset() > PCIECソフトウェアリセット
PCI Express物理層の初期化
< pcie_phy_init() > PCI Express物理層の初期化
PCI Expressの初期化
< pcie_trans_cont_init() > PCI Expressの初期化(コネクションの開始)
PCI Expressコンフィグレーションの設定 PCI Express
コンフィグレーション初期化
< pcie_config_init() >
エンド
図4.2.4.5 PCI Express バス初期設定フロー
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(5) PCIECソフトウェアリセットフローチャート
PCIECソフトウェアリセット処理フローを示します。
スタート
< pcie_soft_reset() >
ソフトリセット制御レジスタ
PCIESRSTRの設定 ソフトウェアリセット実行: SRST に"1"セット
転送コントロールレジスタ PCIETCTLRの設定
ソフトリセット制御レジスタ PCIESRSTRの設定
送信VC0ステータスレジスタ PCIETXVC0SRの設定
PCIEC内部レジスタ初期化: CFINIT ”0" にセット
ソフトウェアリセット解除: SRST に"0"セット
VC0送信バッファのクリア: TXBUFCLR に"1"セット
エンド
図4.2.4.6 PCIECソフトウェアリセットフロー
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(6) PCIEC物理層初期化フローチャート
PCIEC物理層初期化の処理フローを示します。
スタート
< pcie_phy_init() >
コンソール表示(1):”PCIe PHY During Initialization...”を表示
物理層レジスタ空間アクセスのクロック供給 PHYCKEに"1"セット
初期化順序
(1)物理層制御レジスタアドレス 0x60 に 0x004B_008B をセット (2)物理層制御レジスタアドレス 0x61 に 0x0000_7B41 をセット (3)物理層制御レジスタアドレス 0x64 に 0x00FF_4F00 をセット (4)物理層制御レジスタアドレス 0x65 に 0x0907_0907 をセット (5)物理層制御レジスタアドレス 0x66 に 0x0000_0010 をセット (6)物理層制御レジスタアドレス 0x74 に 0x0007_001C をセット (7)物理層制御レジスタアドレス 0x79 に 0x01FC_000D をセット (8)物理層制御レジスタアドレス 0xB0 に 0x0000_0610 をセット (9)物理層制御レジスタアドレス 0x67 に 0x0000_0400 をセット コンソール表示(1)
物理層制御レジスタ PCIEPHYCTLRの設定
コンソール表示(2):”PCIe PHY During Initialization...Finish”を表示 物理層制御レジスタの初期化
< phyreg_write() >
エンド コンソール表示(2)
物理層レジスタ空間アクセスのクロック停止 PHYCKEに"0"セット 物理層制御レジスタ
PCIEPHYCTLRの設定 PCIEC ROOT port
or END point ?
PCIEC = END point ( CONFIG_PCIE_END = 1 )
PCIEC = Root port
( CONFIG_PCIE_ROOT = 0 )
物理層制御レジスタの読出し
< phyreg_read() > 物理層制御レジスタアドレス 0x67 のデータを読出し
図4.2.4.7 PCIEC物理層初期化フロー
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(7) PCIEC初期化フローチャート
PCIEC初期化の処理フローを示します。
スタート
< pcie_trans_cont_init() >
コンソール表示(1):”PCIe Controller During Initialization...”を表示
ローカル(SuperHyway)アドレスレジスタ0に"0x0C000000"セット コンソール表示(1)
ローカルアドレスレジスタ0 PCIELAR0の設定
ローカルアドレスレジスタ2
PCIELAR2の設定 ローカル(SuperHyway)アドレスレジスタ2に"0x0D000000"セット
ローカルアドレスマスクレジスタ0 PCIELAMR0の設定
ローカル(SuperHyway)アドレスマスクレジスタ0に"0x000FFF01"セット LAMR0に1Mbyte、SPCSELに32ビットアドレス空間にメモリを確保、LARE にローカルアドレスイネーブルを指定
ローカルアドレスマスクレジスタ2 PCIELAMR2の設定
ローカル(SuperHyway)アドレスマスクレジスタ2に"0x000FFF11"セット LAMR2に1Mbyte、SPCSELに32ビットアドレス空間にI/Oを確保、LAREに ローカルアドレスイネーブルを指定
ID設定レジスタ1
PCIEIDSETR1の設定 ID設定レジスタ1 PCIEIDSETR1に"0x01234567"セット
ID設定レジスタ2
PCIEIDSETR2の設定 ID設定レジスタ2 PCIEIDSETR2に"0x89ABCDEF"セット
PCIコンフィグレーションレジスタ1 PCIEPCICONF1の設定
PCIコンフィグレーションレジスタ1 PCIEPCICONF1に"0x00000007"セット メモリ/IOリクエスト許可、メモリ空間アクセス許可、IO空間アクセス許可
転送コントロールレジスタ PCIETCTLRの設定
転送コントロールレジスタ PCIETCTLRに"0x00000001"セット LTSSM の起動(コネクション確立開始)
転送ステータスレジスタ PCIETSTR DLLACT=1?
Data Link Layer が アクティブ状態?
DLLACT=0
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(8) PCI Expressコンフィグレーションレジスタ初期設定フローチャート
PCI Expressコンフィグレーションレジスタ初期設定の処理フローを示します。
スタート
< pcie_config_init() >
PCI Expressコンフィグレーションレジスタのベンダー・プロダクトIDの取得 コンフィグレーションレジスタ読出し
< config_read() >
PI/Oコントロールレジスタ PCIEPCTLR CRS=1?
CRS を受信?
CRS=1 CRS=0
DeviceID = 0?
DeviceID /=0 DeviceID=0
エンド
デバイスIDの確認
コンフィグレーションレジスタ読出し
< config_read() > 接続先デバイスの MPSS (Max Payload Size Supported)を取得
CAP ID = 0x10?
コンフィグレーションレジスタ読出し
< config_read() >
PCI ExpressコンフィグレーションレジスタのPCI Express Capability Structure を取得
CAP ID /=0x10
CAP ID =0x10
PCI Expressケイパビリティレジスタ2 PCIEEXPCAP2の設定
MPSの取得
取得したPCI Express Capability Structureの MPS(Max Payload Size)と PCI Expressケイパビリティレジスタ1 PCIEEXPCAP1 のMPSを比較し、
より小さい値を MPS にする
コンフィグレーションレジスタ読出し
< config_read() >
PCI ExpressコンフィグレーションレジスタのPCI Express Capability Structure を取得
PCI ExpressコンフィグレーションレジスタのPCI Express Capability Structure の MPS に取得した MPS をセット
コンフィグレーションレジスタ書込み
< config_write() >
PCI Expressケイパビリティレジスタ2 PCIEEXPCAP2 に 取得した MPS を セット
コンフィグレーションレジスタ書込み
< config_write() >
PCI Expressコンフィグレーションレジスタのコマンド・レジスタに”0x00000007"
をセット
コンフィグレーションレジスタ読出し
< config_read() > PCI Expressコンフィグレーションレジスタのベースアドレスレジスタ0を取得
C
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
図4.2.4.9 PCI Expressコンフィグレーションレジスタ初期設定フロー
SH7786 グループ SH7786 PCI Express コントローラ(PCIEC)初期化設定例
(9) PCI Expressメモリ転送(Write)フローチャート
PCI Expressメモリ転送(Write)の処理フローを示します。
図4.2.4.10 PCI Expressメモリ転送(Write)フロー
(10) PCI Expressメモリ転送(Read)フローチャート
PCI Expressメモリ転送(Read)の処理フローを示します。
図4.2.4.11 PCI Expressメモリ転送(Read)フロー