SPI驱动的移植(Linux2.6.24)

2024-01-25 16:48
文章标签 驱动 移植 24 spi linux2.6

本文主要是介绍SPI驱动的移植(Linux2.6.24),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主题 : SPI驱动的移植(Linux2.6.24) 复制链接 | 浏览器收藏 | 打印
aoohoo
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  3083
精华:  0
发帖:  36
金钱:  360 两
威望:  360 点
贡献值:  0 点
综合积分:  72 分
注册时间:  2008-12-25
最后登录:  2009-12-19
楼主   发表于: 2009-07-07 17:42
只看楼主 |  小  中  大 

 SPI驱动的移植(Linux2.6.24)

为了使用SPI 驱动,必须在配置Linux 编译选项时,开启相应的SPI 选项,如下所示 
    -> Device Drivers 
      -> SPI support 
       SPI support 
          *** SPI Master Controller Drivers *** 
      -*- Bitbanging SPI master 
      <*> Samsung S3C24XX series SPI 
      < > Samsung S3C24XX series SPI by GPIO 
          *** SPI Protocol Masters *** 
      < > SPI EEPROMs from most vendors 
      <*> User mode SPI device driver support 
      < > Infineon TLE62X0 (for power switching) 
    选择SPI support 是使Linux  内核提供SPI 支持,选择该选项会默认选择Bitbanging SPImaster,还需选择Samsung  S3C24XX   series   SPI,告诉内核使用S3C2440A的SPI 控制器驱动。

首先在 devs.c中,增加板子信息
  1. /* 2009/06/30 jwpan add by spi begin */
  2. static struct spi_board_info s3c2410_spi0_board[] = {
  3.         [0] = {
  4.                 .modalias         = "spidev",    /*跟spidev.ko驱动名要相同,不然挂载不上*/
  5.                 .platform_data         = NULL,
  6.                 .bus_num        = 0,    /*使用的第一条BUS线,2410支持0,1两根*/
  7.                 .chip_select        = 1, /*片选信号,和上面结合,在/dev 里面可以看到spidev0.1*/
  8.                 .max_speed_hz         = 500*1000, /CLK频率*/
  9.         },
  10. };

  11. static struct s3c2410_spi_info s3c2410_spi0_platdata = {
  12.         .pin_cs = S3C2410_GPB1,
  13.         .board_info = s3c2410_spi0_board,
  14.         .board_size = ARRAY_SIZE(s3c2410_spi0_board),
  15. };
  16. /* 2009/06/30 jwpan add by spi end */
复制代码
  1. struct platform_device s3c_device_spi0 = {
  2.         .name                  = "s3c2410-spi",
  3.         .id                  = 0,
  4.         .num_resources          = ARRAY_SIZE(s3c_spi0_resource),
  5.         .resource          = s3c_spi0_resource,
  6.         .dev              = {
  7.                 .dma_mask = &s3c_device_spi0_dmamask,
  8.                 /* 2009/06/30 jwpan add by spi begin */
  9.         //.coherent_dma_mask = 0xffffffffUL
  10.                 .coherent_dma_mask = 0xffffffffUL,
  11.                 .platform_data = &s3c2410_spi0_platdata,
  12.                 /* 2009/06/30 jwpan add by spi end */
  13.         }
  14. };
复制代码增加初始化代码,也可以加到mach-smdk2410.c里面
  1. static struct platform_device __initdata *smdk_devs[] = {
  2.     &s3c_device_nand,
  3.     &smdk_led4,
  4.     &smdk_led5,
  5.     &smdk_led6,
  6.     &smdk_led7,
  7. /* 2009/06/30 jwpan add by dm9000 spi begin */
  8.      &s3c_device_spi0,
  9. /* 2009/06/30 jwpan add by dm9000 spi end */
  10. };
复制代码在spi.c的spi_register_master函数里面,有这么一个判断:
  1. if(master->num_chipselect == 0)
  2.    return -EINVAL;
复制代码本以为master->num_chipselect这个值可以通过硬件检测拿到,或者驱动有这样的设置.
万万没有想到,这个值就是没有初始化.

需要在spi_s3c24xx.c里面增加一句代码:
  1. hw->bitbang.txrx_bufs = s3c24xx_spi_txrx;
  2. hw->bitbang.master->num_chipselect = 2;  /* add */
  3. dev_dbg(hw->dev,"bitbang at %p\n",hw->bitbang);
复制代码另外,在 *spi_new_device函数里面,还有一个判断的bug,num_chipselect也是从0开始的,>=的话就不对了.
  1. //if (chip->chip_select >= master->num_chipselect) {
  2. if (chip->chip_select > master->num_chipselect) {
复制代码编译内核,启动后可以在/dev/下面看到spidev.0.1

之后,就可以使用spidev_test ,spidev_fdx程序进行测试了,这两个文件在linux2.6.30的Documentation/Spi目录下面有。

最后,提示一下:
I2C/SPI支持“线与”,允许多个设备互连。所以协议规定:在无数据传输(开始前、结束后)时,时钟和数据线都处于“释放”状态,也就是“高阻”状态。 
在“释放”状态,如果有上拉电阻(内部或外部的),用外用表测会是高电平(1);如果没有上拉电阻,用万用表测是低电平(0)。

简单一点就是说:SPI的CLK只有在有数据通信时,才会测得出波形,千万别以为SPI出问题了。

Linux2.6.24.7以后,SPI有变化,不知道怎么移植.
顶端 
  • 回复
  • 引用
xmh800813
求真知!去浮躁!
 
级别: 侠客
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  6514
精华:  0
发帖:  84
金钱:  760 两
威望:  640 点
贡献值:  0 点
综合积分:  168 分
注册时间:  2009-06-04
最后登录:  2013-05-03
1楼   发表于: 2009-07-07 22:26
只看该作者 |  小  中  大 
不错,支持原创!!
顶端 
  • 回复
  • 引用
aoohoo
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  3083
精华:  0
发帖:  36
金钱:  360 两
威望:  360 点
贡献值:  0 点
综合积分:  72 分
注册时间:  2008-12-25
最后登录:  2009-12-19
2楼   发表于: 2009-07-12 22:57
只看该作者 |  小  中  大 
<*> Samsung S3C24XX series SPI  是spi master驱动
<*> User mode SPI device driver support  是spi dev驱动
也就是说硬件连接好spi设备之后,不用写任何驱动,就可以使用.
之后使用spidev_test就可以测试一下了,正常连接之后,再在这个程序上面修改,加上自己设备的一些时序操作就可以了
顶端 
  • 回复
  • 引用
mutongxin
fighting
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  5937
精华:  0
发帖:  29
金钱:  205 两
威望:  112 点
贡献值:  0 点
综合积分:  58 分
注册时间:  2009-05-14
最后登录:  2012-07-23
3楼   发表于: 2009-09-06 21:01
只看该作者 |  小  中  大 
楼主好人啊
顶端 
  • 回复
  • 引用
师兴仔
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  6452
精华:  0
发帖:  30
金钱:  300 两
威望:  202 点
贡献值:  0 点
综合积分:  60 分
注册时间:  2009-06-02
最后登录:  2011-03-23
4楼   发表于: 2009-10-21 20:42
只看该作者 |  小  中  大 
为什么我编译的时候没有<*> Samsung S3C24XX series SPI 
      < > Samsung S3C24XX series SPI by GPIO 这两处选项?
顶端 
  • 回复
  • 引用
feiyangczm
 
级别: 骑士
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  4234
精华:  0
发帖:  152
金钱:  1420 两
威望:  1142 点
贡献值:  11 点
综合积分:  304 分
注册时间:  2009-03-05
最后登录:  2012-08-18
5楼   发表于: 2009-11-05 15:07
只看该作者 |  小  中  大 

 回 楼主(aoohoo) 的帖子

有没有尝试过左2个spi设备驱动的移植,我做了下,但发现有问题,具体情况:
http://www.arm9home.com/bbs/read.php?tid-3520.html
顶端 
  • 回复
  • 引用
stronghawk
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
  • QQ联系
UID:  15762
精华:  0
发帖:  2
金钱:  10 两
威望:  2 点
贡献值:  0 点
综合积分:  4 分
注册时间:  2010-03-09
最后登录:  2010-03-29
6楼   发表于: 2010-03-09 17:44
只看该作者 |  小  中  大 
顶,我正在做呢,不过我的内核版本更高啊,2.6.32的,很多东东不一样!有相同的联系我! 
顶端 
  • 回复
  • 引用
super_haihai
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
  • QQ联系
UID:  29618
精华:  0
发帖:  16
金钱:  80 两
威望:  16 点
贡献值:  0 点
综合积分:  32 分
注册时间:  2010-10-01
最后登录:  2010-11-17
7楼   发表于: 2010-11-04 14:23
只看该作者 |  小  中  大 

 回 6楼(stronghawk) 的帖子

我也是啊,问题很大
顶端 
  • 回复
  • 引用
zxw54007
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  26946
精华:  0
发帖:  14
金钱:  70 两
威望:  14 点
贡献值:  0 点
综合积分:  28 分
注册时间:  2010-08-17
最后登录:  2012-10-22
8楼   发表于: 2011-09-16 15:52
只看该作者 |  小  中  大 
谢谢,支持下
顶端 
  • 回复
  • 引用
iamjieer
 
级别: 新手上路
  • 作者资料
  • 发送短消息
  • 加为好友
UID:  81714
精华:  0
发帖:  9
金钱:  50 两
威望:  10 点
贡献值:  0 点
综合积分:  18 分
注册时间:  2012-11-13
最后登录:  2013-07-05
9楼   发表于: 2012-11-26 10:57
只看该作者 |  小  中  大 
MARK。。。还没搞成功。。。。。 

这篇关于SPI驱动的移植(Linux2.6.24)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643917

相关文章

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的