ubootでの移植プロセスSPIドライバに関する記録
チップ:フリースケールMPC8308
ubootバージョン:uboot-2009.11-rc1.2
要件:私たちは、クロックFPGAを提供するために使用さubootにSPIによってクロックチップ(DPLL)を設定する必要があります
CPUレジスタおよびSPIのマニュアルを介して提供移植SPIドライブ、一般的にCPUの周辺装置として用いられる、構造を説明し、SPIのSPIコントローラがあります
単純に8308のSPIモジュールの構造を見て
SPI 4本のワイヤ、MOSI、MISO、CS、CLK
CSは、マスターから導出以外の数行です
CSは、GPIOを再生するためのCPUであります
運転席側
/のconfigsを含める/ MPC8308EDD.hでの私の製品プロファイルでuboot
これは修正され、
U-ブート-2009.11-rc1.2 /ドライバ/ SPIで見つかったMpc8xxx_spi.cファイルは、我々だけで、これが最も類似のドライブであると仮定(チップ名とファイル名に基づいて)
関連のMakefile
COBJS - $(CONFIG_MPC8XXX_SPI)+ = mpc8xxx_spi.o
(ubootバリア、異なるディレクトリ)lib_ppc / board.cで持ちSPI_Init()コールの初期化は、次の
#ifの定義(CONFIG_HARD_SPI) 静的 INT init_func_spi(ボイド) { プット(" SPI: " )。 spi_init(); プット(" 準備\ nを" ); リターン(0 )。 } #endifの
あなたはMPC8308EDD.hにマクロを追加する必要があります
/ * * ESPI -拡張SPI * / の#define CONFIG_HARD_SPI の#define CONFIG_FSL_ESPI
今、初期化であり、SPIモジュールドライブ、が、私たちは、SPIのターゲットを必要とする、構造体spi_slave
構造体 spi_slave * spi_slave_init(ボイド) { 構造体 spi_slave * スレーブ。 符号なしint型の バス= 0 ; 符号なし整数 CS = 3 ; 符号なし整数 モード= SPI_MODE_0。 スレーブ = spi_setup_slave(バス、CS、1000000 、モード)。 もし(!スレーブ){ のprintf(" 無効なデバイス%D:%Dを\ n " 、バス、CS)。 リターンNULL; } spi_claim_bus(スレーブ)。 リターンスレーブ; } 静的 int型 spi_read_write(構造体 spi_slave * SPI、 CONST U8 * CMD、size_tのcmd_len、 CONST U8 * DATA_OUT、U8 * DATA_IN、 size_tのDATA_LEN) { 符号なしのロングフラグ= SPI_XFER_BEGIN。 int型のRET; もし(DATA_LEN == 0 ) フラグ | = SPI_XFER_END。 RET = spi_xfer(* cmd_len SPI、8 、CMD、NULL、フラグ)。 もし(RET){ デバッグ(" SF:コマンド(%のZUバイト)の送信に失敗しました:%dは\ nを" 、 cmd_len、RET)。 }それ以外 の場合(DATA_LEN =!0 ){ RET = spi_xfer(* DATA_LEN SPI、8 、DATA_OUT、DATA_IN、SPI_XFER_END)。 もし(RET) デバッグ(" SF:データの%のZUのバイト転送に失敗しました:%dは\ nを" 、 DATA_LEN、RET)。 } 戻りRET。 }
このspi_read_writeは私の読書に基づいており、後に需要を書いている
lib_ppc / board.c機能board_init_rの中の最後の追加スレーブSPIの初期化
構造体spi_slave *スレーブ。
スレーブ= spi_slave_init();
これまでのところ、SPIドライバ理論移植上で、可能性は大丈夫^ _ ^話すの背後にある問題、小さすぎます
1.すべてが正しく設定されているが、デバイスが動作しませんでした
通常初期化、デバイスも配置され、ピンは、デバイスは、チップクロック、クロック出力とではないからの信号SPIは、ある検知することができます
チップクロックによって要求されるように、信号は、信号の正しさを確認するために測定することができ、初期化モードは、SPIを改変します
- SPI->モード= SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN;
- SPI->モード=(SPI->モード&0xfff0ffff)| (1 << 16)。/ *使用SYSCLK / 8
- (16.67MHz標準)* /
+、SPI>モード= 0。
+ SPI->モード= SPMODE_INIT_VAL | SPMODE_ENABLE;
+ // SPI->モード=(SPI->モード&0xfff0ffff)| (1 << 16)。/ *使用SYSCLK / 8(16.67MHz標準)* /
SPI->イベント= 0xFFFFFFFFの; / *すべてクリアSPIイベント* /
SPI->マスク= 0x00000000の。/ *すべてのSPI割り込みマスク* /
SPI-> COM = 0; / * LSTビットは何もし、そうしない無視* /
+のprintf( "モード= 0X%X \ n"は、SPI->モード)。
SPI-> COM = 0; / * LSTビットは何もし、そうしない無視* /
+のprintf( "モード= 0X%X \ n"は、SPI->モード)。
オリジナルリンクします。https://blog.csdn.net/davion_zhang/article/details/50883806