http://armchina.cn/article.asp?id=124
MCP2510的linux驱动与SPI子系统的问题
作者:admin 日期:2009-04-20
这一阵发现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肯定也不会错。
网上找到一个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