请选择 进入手机版 | 继续访问电脑版

北南南北论坛

 找回密码
 立即注册
查看: 22|回复: 1

调试MPC8315E SPI EEPROM心得

[复制链接]

563

主题

950

帖子

2694

积分

金牌会员

Rank: 6Rank: 6

积分
2694
发表于 2018-1-8 14:52:12 | 显示全部楼层 |阅读模式
  最近领导交代任务,说帮忙改一个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,好了先直接尝试默认程序是否可用吧。这里就不卖关子了。主要操作我写在下面:

在相关板子头文件中添加相关定义,举例如下: include/configs/MPC8315ERDB.h 添加下列定义:

  1. #define CONFIG_MPC8XXX_SPI
  2. #define CONFIG_HARD_SPI
复制代码
如果添加的位置正确,相关的spi驱动会被编译成*.o文件,这里我的驱动在编译完成在: drivers/spi/mpc8xxx_spi.o 中。

由于该驱动框架貌似不完整,需要添加点内容,这里我在mpc8xxx_spi.c文件进行了补充如下:
  1. /*
  2.   * The following are used to control the SPI chip selects for the SPI command.
  3.   */
  4. #ifdef CONFIG_MPC8XXX_SPI

  5. #define SPI_CS_MASK    0x80000000

  6. int spi_cs_is_valid(unsigned int bus, unsigned int cs)
  7. {     return bus == 0 && cs == 0;
  8. } void spi_cs_activate(struct spi_slave *slave)
  9. {     volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0];  

  10.      iopd->dir |=  SPI_CS_MASK;
  11.      iopd->dat &= ~SPI_CS_MASK;
  12. } void spi_cs_deactivate(struct spi_slave *slave)
  13. {     volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0];
  14.      iopd->dat |=  SPI_CS_MASK;
  15. } #endif /* CONFIG_HARD_SPI */
复制代码


回复

使用道具 举报

563

主题

950

帖子

2694

积分

金牌会员

Rank: 6Rank: 6

积分
2694
 楼主| 发表于 2018-1-8 14:54:33 | 显示全部楼层
说明如下,这里主要是操作片选,片选地址由SPI_CS_MASK宏定义决定,具体对应于哪个GPIO。相应修改即可。

驱动默认的初始化还是蛮合理的,在上面相关板子中定义宏定义后,芯片会在board.c文件中进行相关spi初始化。详见 lib_ppc/borad.c文件。只是初始化函数 spi_slave_init()有调用malloc的函数,如果想用这个函数需要将该函数放在malloc功能初始化之后。我这里图方便好找。放在了 board.c文件中board_init_r()函数最后面 main_loop上面。这里贴出来写的 spi_slave_init()函数:

  1. struct spi_slave *spi_slave_init(void)  
  2. {  
  3.      struct spi_slave *slave;  
  4.      unsigned int    bus = 0;  
  5.      unsigned int    cs = 12;  
  6.      unsigned int    mode = SPI_MODE_0;  

  7.      slave = spi_setup_slave(bus, cs, 10000000, mode);  
  8.      if (!slave) {  
  9.          printf("Invalid device %d:%d\n", bus, cs);  
  10.          return NULL;  
  11.      }
  12.      spi_claim_bus(slave);  

  13.      return slave;  
  14. }
复制代码

同时在 spi_setup_slave 我嫌麻烦直接屏蔽了以下代码:

  1. //    if (!spi_cs_is_valid(bus, cs))
  2. //        return NULL;
复制代码

由于SPI eeprom支持到20MHz速率。默认配置是16MHz速率。但是实际上使用起来还是有问题,这里我将速率直接降到5.33MHz。没有啥问题了。相关代码如下:

  1. spi->mode = 0| SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN | (1<<19);
  2. spi->mode = (spi->mode & 0xfff0ffff) | (4 << 16); //  5.33mhz
复制代码

为了测试方便,我这里直接在board.c中main_loop之前进行相关测试。包括有读ID.读状态,写状态,改变写保护,读数据,写数据等等。均无误。

下一步就是添加相关命令处理了。这里为了方便简要叙述下添加命令的过程:

添加命令

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

  1. #define CONFIG_CMD_EEPROM_E
复制代码

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

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

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

  1. #include <common.h>
  2. #include <config.h>
  3. #include <command.h>
  4. #include <spi.h>

  5. #if defined(CONFIG_CMD_EEPROME_E)

  6. extern struct spi_slave *slave;  

  7. int do_eeprome(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  
  8. {  
  9.      printf("hello world\n");     return 1;
  10. }

  11. U_BOOT_CMD  
  12. (  
  13.      eeprome, 1, 1, do_eeprome,  
  14.      "eeprome - erase the whole eeprom \n",  
  15.      "this command will erase entire eeprom \n"
  16.      "please make sure!!!!! \n"
  17. );

  18. #endif
复制代码

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


手机版|北南南北论坛  

GMT+8, 2018-1-24 07:55 , Processed in 0.083414 second(s), 28 queries .

© 2001-2016 VxWorks6 Inc.

快速回复 返回顶部 返回列表