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 ();
}
#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 = ;
unsigned int cs = ;
unsigned int mode = SPI_MODE_0; slave = spi_setup_slave(bus, cs, , 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 == )
flags |= SPI_XFER_END; ret = spi_xfer(spi, cmd_len * , cmd, NULL, flags);
if (ret) {
debug("SF: Failed to send command (%zu bytes): %d\n",
cmd_len, ret);
} else if (data_len != ) {
ret = spi_xfer(spi, data_len * , 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
uboot移植spi驱动的更多相关文章
- uboot的硬件驱动
1.uboot借用(移植)了linux驱动(1)linux驱动本身做了模块化设计.linux驱动本身和linux内核不是强耦合的,这是linux驱动可以被uboot借用(移植)的关键.(2)uboot ...
- Linux Spi驱动移植小结
2012-01-07 22:21:29 效果图: 理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了. 1, make menuconfig添加 ...
- X-010 FriendlyARM tiny4412 uboot移植之移植网卡驱动TFTP用起来
<<<<<<<<<<<<<<<<<<<<<<<<< ...
- 小白自制Linux开发板 二. u-boot移植
上一篇:小白自制Linux开发板 一. 瞎抄原理图与乱画PCB 中我们做了一个小型而没用的开发板,用的是Licheepi Nano的镜像,那从本篇开始我们开始自己构建它的灵魂吧. 我们都知道,PC在 ...
- 基于TQ2440的SPI驱动学习(OLED)
平台简介 开发板:TQ2440 (NandFlash:256M 内存:64M) u-boot版本:u-boot-2015.04 内核版本:Linux-3.14 作者:彭东林 邮箱:pengdongl ...
- u-boot移植 II
下面是韦老师的uboot移植攻略: A. 开发板的相关拷贝与修改 1. 在board文件夹下面, 将原来的smdk2410复制为100ask24x0目录, 并将smdk2410.c改名为100ask2 ...
- 基于mini2440的uboot移植(一)
一.移植环境 虚拟机:ubuntu12.04 uboot源码:u-boot-2008.10.tar.bz2 交叉编译:arm-linux-gcc-4.4.3 简单的记录下编译uboot的过程,要想具体 ...
- u-boot移植总结(四)u-boot-2010.09框架分析
(一)本次移植是基于FL2440,板子的基本硬件: CPU 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz SDRAM H57V2562GTR-75C 2片*32MB ...
- 【转】uboot移植(一)BootLoader基本概念
原文网址:http://blog.chinaunix.net/uid-25445243-id-3869348.html 一.BootLoader简介1.1.嵌入式Linux软件结构与分布 在一般情况下 ...
随机推荐
- ubuntu18.04 安装idea
首先从官网下载idea:IntelliJ IDEA (在安装IDEA前应先安装jdk环境) 得到ideaIU-2019.2.4.tar.gz 将安装包移动到/usr/local,这样可以让所有用 ...
- 拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
一.引言 本来想记录一下关于用户登陆和登陆之后的权限管理.菜单管理的问题,想到解决这个问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序 ...
- linux网络编程之system v消息队列(一)
经过上次对于进程通讯的一些理论的认识之后,接下来会通过实验来进一步加深对进程通讯的认识,话不多说,进入正题: 其实还可以通过管道,但是,管道是基于字节流的,所以通常会将它称为流管道,数据与数据之间是没 ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)解决方案
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql. ...
- MySQL 空间数据 简单操作
在做的项目中需要,自己绘制区域图形,并存储起来,后面还有更新的需要,存文件不方面,想到现在数据库都支持空间数据库. 现在用的就是 MySQL ,就继续用 MySQL 来存储.管理空间数据.下面就做一些 ...
- BLOB和TEXT
区别: BLOB存储的是二进制数据,没有排序规则或字符集. TEXT存储的是字符,有排序规则和字符集. 因为Memory引擎不支持BLOB和TEXT类型,最好的解决方案避免使用BLOB和TEXT类型. ...
- JavaScript this 的指向问题
原文作者:SegmentFault ——写bug 原文链接:https://segmentfault.com/a/1190000015438195 this的指向已经是一个老生常谈的问题,每逢面试都要 ...
- Java多线程下载初试
一.服务端/客户端代码的实现 服务端配置config @ConfigurationProperties("storage") public class StoragePropert ...
- pip 安装包 不行 自己下载whl 包自己安装
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted