uboot移植SPIドライバ

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

おすすめ

転載: www.cnblogs.com/Ph-one/p/11539827.html