Linux Spi驱动移植小结
2012-01-07 22:21:29
效果图:
理论学习后,主要是linux中spi子系统设备框架的了解后,主控制器与设备分离的思想,那么我要开始动手了。
1, make menuconfig添加spi配置
2,platform_driver及platform_device数据结构都有了。于是在mach-tq2440.c中tq2440_devices[]结构添加里 &s3c_device_spi1,//by apple
3,接着开始make zImage。
出错,发现串口信息显示
<3>s3c2410-spi s3c2410-spi.1: No platform data supplied
s3c2410-spi: probe of s3c2410-spi.1 failed with error -2
于是查看源代码如下。
hw->master = spi_master_get(master);
hw->pdata = pdata = pdev->dev.platform_data;
hw->dev = &pdev->dev;
if (pdata == NULL) {
dev_err(&pdev->dev, "No platform data supplied\n");
err = -ENOENT;
goto err_no_pdata;
}
说明s3c24xx_spi_probe函数中的pdev->dev.platform_data没有赋值。
Pdata到底应该赋什么值呢?继续从代码中找线索
master->num_chipselect = hw->pdata->num_cs;
master->bus_num = pdata->bus_num;
搜索了下num_cs及bus_num都是属于s3c2410_spi_info结构的。于是乎,之前网上也查找过相关移植。需要加s3c2410_spi_info结构的数据。于是在devs.c中添加如下代码。
//add by apple
#include <mach/spi.h>
#include <mach/regs-gpio.h>
//add by apple
static struct s3c2410_spi_info s3c2410_spi1_platdata = {
.pin_cs = S3C2410_GPG3,
.num_cs = 1,
.bus_num = 0,
};
struct platform_device s3c_device_spi1 = {
.name = "s3c2410-spi",
.id = 1,
.num_resources = ARRAY_SIZE(s3c_spi1_resource),
.resource = s3c_spi1_resource,
.dev = {
.dma_mask = &s3c_device_spi1_dmamask,
.coherent_dma_mask = 0xffffffffUL,
.platform_data = & s3c2410_spi1_platdata, //add by apple
}
};
4,重新make zImage,下载后,串口没有提示任何spi的信息。于是下载文件系统。在sys/bus/platform/device看到了spi的设备文件信息。但是/dev下确实没有spi设备信息。
5,编译了spidev_test.c
方法如下:
修改头文件#include <linux/spi/spidev.h>为
#include </study/opt/EmbedSky/linux-2.6.30.4/include/linux/spi/spidev.h>
于是保存退出,执行arm-linux-gcc spidev_test.c -o spidev_test命令即可产生一个spidev_test的可执行文件。从linux虚拟中Copy到PC上。当然也可以用如下方法
arm-linux-gcc –I /study/opt/EmbedSky/linux-2.6.30.4/include spidev_test.c -o spidev_test就不用修改头文件路径了。
6,copy到文件系统。通过“传输”->“zmodem上传列表”中选spidev_test后点击“确定”,启动开发板,进入sbin文件夹或其他文件夹后,选中“传输”->“开始上传zmodem列表”即可完成上传文件至开发板了。然后需要用命令chmod 777 spidev_test来修改权限。
7,./spidev_test即可执行测试程序。果然显示出错。
can't open device: No such file or directory
Aborted
8,再来,我做了如下修改,把spi设备及平台都添加了。
A, 在tq2440_machine_init函数中,添加
spi_register_board_info(s3c2410_spi1_board, ARRAY_SIZE(s3c2410_spi1_board));//by apple
s3c24xx_fb_set_platdata(&tq2440_fb_info);
B, 在mach-tq2440.c中添加数据
static struct spi_board_info s3c2410_spi1_board[] = {
[0] = {
.modalias = "spidev",
.bus_num = 1,
.chip_select = 0,
.irq = IRQ_EINT9,
.max_speed_hz = 500*1000,
},
};
C, 添加头文件
#include <linux/spi/spi.h>
#include <mach/spi.h>
D, 把devs.c中的.bus_num统一改成1
E, 编译make zImage 通过。烧录到开发板。
9,查看/dev文件夹下信息。有了是spidev1.0
10,下载并运行spidev_test测试程序。但是同样显示
can't open device: No such file or directory
Aborted
怎么可能呢?我的dev下都找到设备号了呀!于是再看源码中有提示,默认的设备是/dev/spidev1.1.所以我该了下-D参数。Linux下Spi驱动回路测试成功!
Linux Spi驱动移植小结的更多相关文章
- linux驱动基础系列--linux spi驱动框架分析
前言 主要是想对Linux 下spi驱动框架有一个整体的把控,因此会忽略某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型等也不进行详细说明原理.如果有任何错误地方,请指出,谢谢! spi ...
- linux驱动基础系列--linux spi驱动框架分析(续)
前言 这篇文章是对linux驱动基础系列--linux spi驱动框架分析的补充,主要是添加了最新的linux内核里设备树相关内容. spi设备树相关信息 如之前的文章里所述,控制器的device和s ...
- Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)
一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...
- linux网卡驱动移植
这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层.DM9000A将MAC和PHY做到一起,也可 ...
- linux spi驱动开发学习-----spidev.c和spi test app
一.spidev.c文件 看一个设备驱动的方法: module_init标识的入口初始化函数spidev_init,(module_exit标识的出口函数) 设备与设备驱动匹配时候调用的probe方法 ...
- Linux SPI驱动(一)
转载:http://www.cnblogs.com/lknlfy/p/3265019.html (原作者注:)根据我个人所知道的,Linux SPI一直是处于被“忽略”的角色,市场上大部分板子在板级文 ...
- Linux网卡驱动移植--Dm9000网卡驱动分析
1. Linux网络体系结构由以下5部分组成 ① 系统调用接口: 位于Linux网络子系统的顶部,为应用程序提供访问内核网络子系统的方法,主要指socket系统调用. ② 协议无关接口: 实现一组基于 ...
- Linux VGA驱动移植实验【转】
本文转载自:http://m.blog.csdn.net/bzw73/article/details/46564275 有了前面的LCD驱动的框架,再移植VGA驱动就相当的容易了.默认在光盘中已经支持 ...
- linux SPI驱动——简单的gpio模拟SPI驱动测试 (二)
1: /* 2: * Add by xuyonghong for duotin car radio fm 3: * Copyright (C) 2016-5-24 xuyonghong@duotin. ...
随机推荐
- Grunt connect
使用connect打开指定html方法 由于localhost会直接链接到了index.html,所以我们可以通过base选项设置打开html,这是我的目录,我要打开根目录下的test.html co ...
- poj1106
极角排序扫一圈. 今天没什么状态写个水题减轻负罪感(大雾) #include <cstdio> #include <cmath> #include <cstring> ...
- vue全选与取消全选
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 洛谷P3385 【模板】负环
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入输出格式 输入格式: 第一行一个正整数T表示数据组 ...
- js 中数组的遍历
var x = ['a','b','c'] x.forEach(function(val,k){ console.log(val + '--' +k); }) a--0 b-- 1 c-- 2 var ...
- table表格设置边框线为单实线
设置table表格边框为单实线的方法有两种 第一种方法就是利用table标签cellspacing=0属性来实现,cellspacing是内边框和外边框的距离,这种方法实现的看起来是单实线,其实是内边 ...
- spring boot异常积累
1.异常:Error resolving template "xxx", template might not exist or might not be accessible.. ...
- Python 学习笔记2 变量
Python变量的一些命名规则和指南 每种编程语言都需要变量, 这些变量的命名,我们一般会遵守一些公认的规则. 已达到方便自己,他人阅读的好处. 变量只能包含字母.数字和下划线.变量可以以字母和下划线 ...
- 干货|爱奇艺CDN巡检系统技术解析
小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...
- Oracle 表空间恢复
为啥要写这个呢,因为之前遇到个场景.操作系统为Solaris的,oracle11.2.0.4. 一个运维把一张关键表drop了.然后发现recyclebin是off的,然后..然后好像只能从备份里面找 ...