SPI驱动的移植(Linux2.6.24)

xiaoxiao2021-02-28  98

主题 : 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中,增加板子信息 /* 2009/06/30 jwpan add by spi begin */ static struct spi_board_info s3c2410_spi0_board[] = {         [0] = {                 .modalias         = "spidev",    /*跟spidev.ko驱动名要相同,不然挂载不上*/                 .platform_data         = NULL,                 .bus_num        = 0,    /*使用的第一条BUS线,2410支持0,1两根*/                 .chip_select        = 1, /*片选信号,和上面结合,在/dev 里面可以看到spidev0.1*/                 .max_speed_hz         = 500*1000, /CLK频率*/         }, }; static struct s3c2410_spi_info s3c2410_spi0_platdata = {         .pin_cs = S3C2410_GPB1,         .board_info = s3c2410_spi0_board,         .board_size = ARRAY_SIZE(s3c2410_spi0_board), }; /* 2009/06/30 jwpan add by spi end */ 复制代码 struct platform_device s3c_device_spi0 = {         .name                  = "s3c2410-spi",         .id                  = 0,         .num_resources          = ARRAY_SIZE(s3c_spi0_resource),         .resource          = s3c_spi0_resource,         .dev              = {                 .dma_mask = &s3c_device_spi0_dmamask,                 /* 2009/06/30 jwpan add by spi begin */         //.coherent_dma_mask = 0xffffffffUL                 .coherent_dma_mask = 0xffffffffUL,                 .platform_data = &s3c2410_spi0_platdata,                 /* 2009/06/30 jwpan add by spi end */         } }; 复制代码增加初始化代码,也可以加到mach-smdk2410.c里面 static struct platform_device __initdata *smdk_devs[] = {     &s3c_device_nand,     &smdk_led4,     &smdk_led5,     &smdk_led6,     &smdk_led7, /* 2009/06/30 jwpan add by dm9000 spi begin */      &s3c_device_spi0, /* 2009/06/30 jwpan add by dm9000 spi end */ }; 复制代码在spi.c的spi_register_master函数里面,有这么一个判断: if(master->num_chipselect == 0)    return -EINVAL; 复制代码本以为master->num_chipselect这个值可以通过硬件检测拿到,或者驱动有这样的设置. 万万没有想到,这个值就是没有初始化. 需要在spi_s3c24xx.c里面增加一句代码: hw->bitbang.txrx_bufs = s3c24xx_spi_txrx; hw->bitbang.master->num_chipselect = 2;  /* add */ dev_dbg(hw->dev,"bitbang at %p\n",hw->bitbang); 复制代码另外,在 *spi_new_device函数里面,还有一个判断的bug,num_chipselect也是从0开始的,>=的话就不对了. //if (chip->chip_select >= master->num_chipselect) { 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。。。还没搞成功。。。。。 
转载请注明原文地址: https://www.6miu.com/read-64992.html

最新回复(0)