注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小盒子的小盒

知道的越多不知道的就越多

 
 
 

日志

 
 

【转】SPI驱动的移植  

2011-02-18 10:42:52|  分类: ARM9 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
为了使用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出问题了。
  评论这张
 
阅读(1035)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017