记录一下在uboot内移植spi驱动的过程

芯片:freescale Mpc8308

uboot版本:u-boot-2009.11-rc1.2

需求:我们需要在uboot下通过spi配置一个时钟芯片(dpll)用来给fpga提供时钟

要移植spi驱动,前提是要通过手册了解该cpu的spi的结构和寄存器描述,一般作为cpu的外围设备,spi是有一个spi控制器的

简单看一下8308的spi模块结构

spi的四根线,MOSI,MISO,CS,CLK

CS以外的几根线是从Master上引出来的

而CS是由cpu的gpio来扮演的

驱动方面

uboot中产品的配置文件我的在include/configs/MPC8308EDD.h

这个是修改过的,

在u-boot-2009.11-rc1.2/driver/spi中找到mpc8xxx_spi.c文件,我们姑且认为这个就是最相近的驱动了(根据芯片名称与文件名称)

相关Makefile

  1. COBJS-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.

在lib_ppc/board.c(不通uboot,目录不同)中有spi_init()的初始化调用,如下

  1. #if defined(CONFIG_HARD_SPI)
  2. static int init_func_spi (void)
  3. {
  4. puts ("SPI: ");
  5. spi_init ();
  6. puts ("ready\n");
  7. return ();
  8. }
  9. #endif

将需要的宏添加到MPC8308EDD.h中

  1. /*
  2.  
  3. * eSPI - Enhanced SPI
  4. */
  5. #define CONFIG_HARD_SPI
  6. #define CONFIG_FSL_ESPI

现在spi模块驱动有了,初始化有了,但是我们还需要一个spi的对象,struct spi_slave

  1. struct spi_slave *spi_slave_init(void)
  2. {
  3.  
  4. struct spi_slave *slave;
  5. unsigned int bus = ;
  6. unsigned int cs = ;
  7. unsigned int mode = SPI_MODE_0;
  8.  
  9. slave = spi_setup_slave(bus, cs, , mode);
  10. if (!slave) {
  11. printf("Invalid device %d:%d\n", bus, cs);
  12. return NULL;
  13. }
  14.  
  15. spi_claim_bus(slave);
  16.  
  17. return slave;
  18. }
  19. static int spi_read_write(struct spi_slave *spi,
  20. const u8 *cmd, size_t cmd_len,
  21. const u8 *data_out, u8 *data_in,
  22. size_t data_len)
  23. {
  24. unsigned long flags = SPI_XFER_BEGIN;
  25. int ret;
  26.  
  27. if (data_len == )
  28. flags |= SPI_XFER_END;
  29.  
  30. ret = spi_xfer(spi, cmd_len * , cmd, NULL, flags);
  31. if (ret) {
  32. debug("SF: Failed to send command (%zu bytes): %d\n",
  33. cmd_len, ret);
  34. } else if (data_len != ) {
  35. ret = spi_xfer(spi, data_len * , data_out, data_in, SPI_XFER_END);
  36. if (ret)
  37. debug("SF: Failed to transfer %zu bytes of data: %d\n",
  38. data_len, ret);
  39. }
  40.  
  41. return ret;
  42. }

这个spi_read_write是根据我的读写需求后补的
在lib_ppc/board.c函数board_init_r最后添加spi的slave初始化
        struct spi_slave *slave;

slave = spi_slave_init();
目前为止,spi驱动理论上移植完了,一次ok的可能性太小了^_^,后面讲问题

1.一切配置正常但从设备并没有工作

初始化正常,从设备也配置了,而且spi的各引脚信号都能测到,从设备是一个时钟芯片,并没有时钟输出

信号能测到那么检查信号的正确性了,按照时钟芯片的要求,将spi的初始化模式修改

- spi->mode = SPI_MODE_REV | SPI_MODE_MS | SPI_MODE_EN;
- spi->mode = (spi->mode & 0xfff0ffff) | (1 << 16); /* Use SYSCLK / 8
-     (16.67MHz typ.) */
+ spi->mode = 0;
+ spi->mode = SPMODE_INIT_VAL | SPMODE_ENABLE;
+// spi->mode = (spi->mode & 0xfff0ffff) | (1 << 16); /* Use SYSCLK / 8   (16.67MHz typ.) */
  spi->event = 0xffffffff; /* Clear all SPI events */
  spi->mask = 0x00000000; /* Mask  all SPI interrupts */
  spi->com = 0; /* LST bit doesn't do anything, so disregard */
+ printf("mode = 0x%x\n",spi->mode);
  spi->com = 0; /* LST bit doesn't do anything, so disregard */
+ printf("mode = 0x%x\n",spi->mode);

原文链接:https://blog.csdn.net/davion_zhang/article/details/50883806

uboot移植spi驱动的更多相关文章

  1. uboot的硬件驱动

    1.uboot借用(移植)了linux驱动(1)linux驱动本身做了模块化设计.linux驱动本身和linux内核不是强耦合的,这是linux驱动可以被uboot借用(移植)的关键.(2)uboot ...

  2. Linux Spi驱动移植小结

    2012-01-07 22:21:29 效果图: 理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了. 1,  make menuconfig添加 ...

  3. X-010 FriendlyARM tiny4412 uboot移植之移植网卡驱动TFTP用起来

    <<<<<<<<<<<<<<<<<<<<<<<<< ...

  4. 小白自制Linux开发板 二. u-boot移植

    上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB  中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...

  5. 基于TQ2440的SPI驱动学习(OLED)

    平台简介 开发板:TQ2440 (NandFlash:256M  内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...

  6. u-boot移植 II

    下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...

  7. 基于mini2440的uboot移植(一)

    一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体 ...

  8. u-boot移植总结(四)u-boot-2010.09框架分析

    (一)本次移植是基于FL2440,板子的基本硬件: CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB ...

  9. 【转】uboot移植(一)BootLoader基本概念

    原文网址:http://blog.chinaunix.net/uid-25445243-id-3869348.html 一.BootLoader简介1.1.嵌入式Linux软件结构与分布 在一般情况下 ...

随机推荐

  1. Date与String的相互转换

    构造函数 日期:new Date();//获取当前日期,精确到毫秒. 日期:new Date(long date);//即1970 年 1 月 1 日 00:00:00 GMT(Greenwich M ...

  2. STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结

    文章结构: ——> 一.定时器基本介绍 ——> 二.普通定时器详细介绍TIM2-TIM5 ——> 三.定时器代码实例 一.定时器基本介绍  之前有用过野火的学习板上面讲解很详细,所以 ...

  3. css详解2

    1.伪类选择器 1.1.a标签的爱恨准则 LoVe HAte .一个冒号连接 1.2.a标签的示例 给a标签设置个颜色,生效了 <html lang="en"> < ...

  4. 使用Dell iDRAC服务器远程控制安装操作系统简要图解

    使用Dell iDRAC服务器远程控制安装操作系统简要图解 iDARC tools   iDRAC又称为Integrated Dell Remote Access Controller,也就是集成戴尔 ...

  5. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

  6. C#常用控件和属性

    目录1.窗体(Form)2.Label (标签)控件3.TextBox(文本框)控件4.RichTextBox控件5.NumericUpDown控件6.Button(按钮)控件7.GroupBox(分 ...

  7. 基于TCP协议套接字,服务端实现接收客户端的连接并发

    基于TCP协议套接字,服务端实现接收客户端的连接并发 服务端 import socket from multiprocessing import Process server=socket.socke ...

  8. LOJ 2452 对称 Antisymmetry——用hash求回文串数

    概念 用hash求最长回文串/回文串数 首先,易知,回文串具有单调性. 如果字符串 $s[l...r]$ 为回文串串,那么 $s[x...y]$($l < x, y < r$ 且 $|l- ...

  9. 17.组件页面应用和vue项目生成

    基本示例 这里有一个 Vue 组件的示例: // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function ...

  10. Python3连接MySQL数据库实战

    Python3连接MySQL数据库实战 第三方库 :pymysql 数据库连接 def connect(): try: #建立数据库连接,从左至右参数依次为 # ip地址 我用的是云端数据库 如果为本 ...