調試MPC8315E SPI EEPROM心得

調試MPC8315E SPI EEPROM心得


最近領導交代任務,說幫忙改一個MPC8315E的U-boot程序,添加幾個命令,主要是處理spi eeprom和nvram相關東西的。好吧,領導都開口了,我弄沒弄過u-boot都得直接上了。好吧,我以前沒有弄過。

從領導那里將u-boot的拷貝過來,用之前自己搭建8315開發(fā)環(huán)境,編譯直接過了。下載調試發(fā)現(xiàn)是工程上的源碼。好了,想想NVRAM就是直接操作內存啊,沒啥難度。就先搞spi eeprom了。


測試驅動

先看了看u-boot的源碼結構,源碼版本是u-boot1.3.4的,發(fā)現(xiàn)在 drivers/spi/mpc8xxx_spi.c 對比下發(fā)現(xiàn)適用于MPC8315E,好了先直接嘗試默認程序是否可用吧。這里就不賣關子了。主要操作我寫在下面:

  1. 在相關板子頭文件中添加相關定義,舉例如下: include/configs/MPC8315ERDB.h 添加下列定義:

     #define CONFIG_MPC8XXX_SPI 
     #define CONFIG_HARD_SPI   
    

如果添加的位置正確,相關的spi驅動會被編譯成*.o文件,這里我的驅動在編譯完成在: drivers/spi/mpc8xxx_spi.o 中。

  1. 由于該驅動框架貌似不完整,需要添加點內容,這里我在mpc8xxx_spi.c文件進行了補充如下:

     /*
      * The following are used to control the SPI chip selects for the SPI command.
      */
     #ifdef CONFIG_MPC8XXX_SPI
     
     #define SPI_CS_MASK    0x80000000
     
     int spi_cs_is_valid(unsigned int bus, unsigned int cs)
     {
         return bus == 0 && cs == 0;
     }
     
     void spi_cs_activate(struct spi_slave *slave)
     {
         volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0];  
     
         iopd->dir |=  SPI_CS_MASK;
         iopd->dat &= ~SPI_CS_MASK;
     }
     
     void spi_cs_deactivate(struct spi_slave *slave)
     {
         volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0]; 
         iopd->dat |=  SPI_CS_MASK;
     }
     #endif /* CONFIG_HARD_SPI */
    

說明如下,這里主要是操作片選,片選地址由SPI_CS_MASK宏定義決定,具體對應于哪個GPIO。相應修改即可。

  1. 驅動默認的初始化還是蠻合理的,在上面相關板子中定義宏定義后,芯片會在board.c文件中進行相關spi初始化。詳見 lib_ppc/borad.c文件。只是初始化函數(shù) spi_slave_init()有調用malloc的函數(shù),如果想用這個函數(shù)需要將該函數(shù)放在malloc功能初始化之后。我這里圖方便好找。放在了 board.c文件中board_init_r()函數(shù)最后面 main_loop上面。這里貼出來寫的 spi_slave_init()函數(shù):

     struct spi_slave *spi_slave_init(void)  
     {  
         struct spi_slave *slave;  
         unsigned int    bus = 0;  
         unsigned int    cs = 12;  
         unsigned int    mode = SPI_MODE_0;  
       
         slave = spi_setup_slave(bus, cs, 10000000, mode);  
         if (!slave) {  
             printf("Invalid device %d:%d\n", bus, cs);  
             return NULL;  
         } 
         spi_claim_bus(slave);  
       
         return slave;  
     }
    

同時在 spi_setup_slave 我嫌麻煩直接屏蔽了以下代碼:

    //    if (!spi_cs_is_valid(bus, cs))
    //        return NULL;    

由于SPI eeprom支持到20MHz速率。默認配置是16MHz速率。但是實際上使用起來還是有問題,這里我將速率直接降到5.33MHz。沒有啥問題了。相關代碼如下:

    spi->mode = 0| SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN | (1<<19); 
    spi->mode = (spi->mode & 0xfff0ffff) | (4 << 16); //  5.33mhz
  1. 為了測試方便,我這里直接在board.c中main_loop之前進行相關測試。包括有讀ID.讀狀態(tài),寫狀態(tài),改變寫保護,讀數(shù)據(jù),寫數(shù)據(jù)等等。均無誤。
  2. 下一步就是添加相關命令處理了。這里為了方便簡要敘述下添加命令的過程:

添加命令

  1. 在 include/configs/MPC8315ERDB.h 中添加相關命令定義:

     #define CONFIG_CMD_EEPROM_E
    
  2. 在 common/目錄中添加相關文件,這里我添加文件為 cmd_eeprom_e.c,參考目錄中其他相關cmd_xxx.c文件編寫相關命令,包括如何解析參數(shù),如何進行運行等。

  3. 在 common/Makefile 中添加下列內容:

     COBJS-$(CONFIG_CMD_EEPROM_E) += cmd_eeprom_e.o
    
  4. 這里貼一個簡要的cmd_eeprom_e.c 內容,讀者請自行發(fā)散。

     #include <common.h>
     #include <config.h>
     #include <command.h>
     #include <spi.h>
    
     #if defined(CONFIG_CMD_EEPROME_E)
     
     extern struct spi_slave *slave;  
     
     int do_eeprome(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  
     {  
         printf("hello world\n");
         return 1;
     }
     
     U_BOOT_CMD  
     (  
         eeprome, 1, 1, do_eeprome,  
         "eeprome - erase the whole eeprom \n",  
         "this command will erase entire eeprom \n" 
         "please make sure!!!!! \n"
     ); 
    
     #endif
    

分享完畢。fighting

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容