当前位置: 首页 > news >正文

uboot移植spi驱动

记录一下在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

COBJS-$(CONFIG_MPC8XXX_SPI) += mpc8xxx_spi.o 

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

#if defined(CONFIG_HARD_SPI)
static int init_func_spi (void)
{
        puts ("SPI:   ");
        spi_init ();
        puts ("ready\n");
        return (0);
}
#endif

 

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

/*

 * eSPI - Enhanced SPI
 */
#define CONFIG_HARD_SPI
#define CONFIG_FSL_ESPI

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

struct spi_slave *spi_slave_init(void)
{

struct spi_slave *slave;
unsigned int    bus = 0;
unsigned int    cs = 3;
unsigned int    mode = SPI_MODE_0;

slave = spi_setup_slave(bus, cs, 1000000, mode);
if (!slave) {
printf("Invalid device %d:%d\n", bus, cs);
return NULL;
}

spi_claim_bus(slave);

return slave;
}
static int spi_read_write(struct spi_slave *spi,
const u8 *cmd, size_t cmd_len,
const u8 *data_out, u8 *data_in,
size_t data_len)
{
unsigned long flags = SPI_XFER_BEGIN;
int ret;

if (data_len == 0)
flags |= SPI_XFER_END;

ret = spi_xfer(spi, cmd_len * 8, cmd, NULL, flags);
if (ret) {
debug("SF: Failed to send command (%zu bytes): %d\n",
cmd_len, ret);
} else if (data_len != 0) {
ret = spi_xfer(spi, data_len * 8, data_out, data_in, SPI_XFER_END);
if (ret)
debug("SF: Failed to transfer %zu bytes of data: %d\n",
data_len, ret);
}

return ret;
}

这个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

转载于:https://www.cnblogs.com/Ph-one/p/11539827.html

相关文章:

  • 训练一个神经网络 能让她认得我
  • Matlab注释的几个方法
  • Matlab 图像平移、旋转、缩放、镜像
  • 调整图像大小调整图片大小
  • matlab图像灰度调整——imadjust函数的使用
  • Matlab实现直方图均衡化
  • 图像处理之图像的平滑与锐化
  • Matlab常用函数
  • 空间域平滑滤波器
  • github免费私有仓库使用
  • android.mk-include
  • imfilter
  • matlab fspecial 用法解释
  • 几种常见空间滤波器MATLAB实现
  • Matlab图像处理——中值滤波medfilt2问题解决
  • [LeetCode] Wiggle Sort
  • 4个实用的微服务测试策略
  • Babel配置的不完全指南
  • Bootstrap JS插件Alert源码分析
  • ES6核心特性
  • HomeBrew常规使用教程
  • nginx 配置多 域名 + 多 https
  • python学习笔记 - ThreadLocal
  • ReactNativeweexDeviceOne对比
  • session共享问题解决方案
  • SOFAMosn配置模型
  • Spark RDD学习: aggregate函数
  • underscore源码剖析之整体架构
  • uni-app项目数字滚动
  • vue:响应原理
  • zookeeper系列(七)实战分布式命名服务
  • 记一次删除Git记录中的大文件的过程
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 小试R空间处理新库sf
  • 一道闭包题引发的思考
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Z2294. 打印树的直径
  • #控制台大学课堂点名问题_课堂随机点名
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)(3.5) 遥测无线电区域条例
  • (zhuan) 一些RL的文献(及笔记)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (一)为什么要选择C++
  • (转)项目管理杂谈-我所期望的新人
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 简介:跨平台、开源、高性能的开发平台