调试MPC8315E SPI EEPROM心得

调试MPC8315E SPI EEPROM心得


最近领导交代任务,说帮忙改一个MPC8315E的U-boot程序,添加几个命令,主要是处理spi eeprom和nvram相关东西的。好吧,领导都开口了,我弄没弄过u-boot都得直接上了。好吧,我以前没有弄过。

从领导那里将u-boot的拷贝过来,用之前自己搭建8315开发环境,编译直接过了。下载调试发现是工程上的源码。好了,想想NVRAM就是直接操作内存啊,没啥难度。就先搞spi eeprom了。


测试驱动

先看了看u-boot的源码结构,源码版本是u-boot1.3.4的,发现在 drivers/spi/mpc8xxx_spi.c 对比下发现适用于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文件。只是初始化函数 spi_slave_init()有调用malloc的函数,如果想用这个函数需要将该函数放在malloc功能初始化之后。我这里图方便好找。放在了 board.c文件中board_init_r()函数最后面 main_loop上面。这里贴出来写的 spi_slave_init()函数:

     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.读状态,写状态,改变写保护,读数据,写数据等等。均无误。
  2. 下一步就是添加相关命令处理了。这里为了方便简要叙述下添加命令的过程:

添加命令

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

     #define CONFIG_CMD_EEPROM_E
    
  2. 在 common/目录中添加相关文件,这里我添加文件为 cmd_eeprom_e.c,参考目录中其他相关cmd_xxx.c文件编写相关命令,包括如何解析参数,如何进行运行等。

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

     COBJS-$(CONFIG_CMD_EEPROM_E) += cmd_eeprom_e.o
    
  4. 这里贴一个简要的cmd_eeprom_e.c 内容,读者请自行发散。

     #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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容