SPI to CAN

 

 

http://armchina.cn/article.asp?id=124

 

MCP2510的linux驱动与SPI子系统的问题

这一阵发现linux内核开始逐步加入CAN总线的内容了。有vcan的驱动,似乎是做成了网络设备。
网上找到一个MCP251x的驱动。
这两天正好要在2440上调一调mcp2510,我用的内核2.6.26.3的。发现有不少问题。弄了几天,也很崩溃。
最后终于调通了MCP2510的linux驱动。

驱动是根据网上mcp251x的驱动,我重新写的。不使用网络部分,而是用SPI子系统,再做成char的字符型驱动接口,参考spidev.c驱动以及ads7846的驱动。

首先参考的是doc下的spi summary,How do I write an "SPI Protocol Driver"节。
很容易实现出一个spi的驱动,但是他仅仅是能用spi层而已,所以还要实现字符驱动的接口,参考spidev.c了。

最后改写完成,调试,发现很多问题。
首先mcp2510是不支持INSTRUCTION_LOAD_TXB和INSTRUCTION_LOAD_RXB指令的,而且一部分寄存器也不支持改写bit的指令。
另外mcp2510支持的模式是SPI_MODE_0,另外好像也支持SPI_MODE_3,网上另外一个版本的SPI_MODE_2应该是不对的。
调试的时候发现读寄存器始终不对,而且出现过问题,后来发现使用spi_sync中,需要
struct spi_transfer t;
对于2440来说,驱动s3c24xx_spi.c中
s3c24xx_spi_setupxfer函数,每次需要指定
t->bits_per_word
t->speed_hz

后来我想,spi_read和spi_write函数似乎也是会有问题的。

所以索性改一下s3c24xx_spi_setupxfer函数中
bpw = t ? t->bits_per_word : spi->bits_per_word;
hz  = t ? t->speed_hz : spi->max_speed_hz;
直接改成spi->bits_per_word和spi->max_speed_hz肯定也不会错。

 

参考http://lwn.net/Articles/168961/
http://linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg09132.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值