请教各位老大,现在我正在做一个项目,就是用Micro的SPI1连接接3个MCP2515,现在用的内核是友善2.6.32.2,从2.6.33复制mcp2515的驱动过来,可以编译,就是probe failed。移植过程参考网上如下:
1、在配置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)
设置完成保存。
2.驱动文件mcp251x.c mcp251x.h can.h
文件mcp251x.c放在目录drivers/net/can/下;
文件mcp251x.h放在目录include/linux/can/platform/下;
由2.6.33的文件用在2.6.32,要替换的文件有
3.添加配置文件drivers/net/can/Kconfig
在文件中添加
config CAN_MCP251X
tristate "Microchip 251x series SPI CAN Controller"
depends on CAN && SPI
default N
---help---
Say Y here if you want support for the Microchip 251x series of
SPI based CAN controllers.
4.在drivers/net/can/Makefile文件中添加编译文件
obj-$(CONFIG_CAN_MCP251X) += mcp251x.o
5. 修改文件arch/arm/mach-s3c2410/mach-smdk2410.c中添加spi板级启动信息
#include <linux/spi/spi.h>
#include <mach/spi.h> //包含s3c2410_spi_info结构体
#include <linux/can/platform/mcp251x.h> //包含struct mcp251x_platform_data结构体
static struct mcp251x_platform_data mcp251x_info = {
.oscillator_frequency = 12000000,
.board_specific_setup = &mcp251x_setup,
.power_enable = NULL, // .power_enable = mcp251x_power_enable,
.transceiver_enable = NULL,
};
static struct spi_board_info spi1_board_info[] = {
[0] = {
.modalias = "mcp2515",
.bus_num = 1,
.platform_data = &mcp251x_info,
.irq = IRQ_EINT0,
.max_speed_hz = 10*1000*1000,
.chip_select = 0,
},
[1] = {
.modalias = "mcp2515",
.bus_num = 1,
.platform_data = &mcp251x_info,
.irq = IRQ_EINT1,
.max_speed_hz = 10*1000*1000,
.chip_select = 1,
},
[2] = {
.modalias = "mcp2515",
.bus_num = 1,
.platform_data = &mcp251x_info,
.irq = IRQ_EINT2,
.max_speed_hz = 10*1000*1000,
.chip_select = 2,
},
[3] = {
.modalias = "mcp2515",
.bus_num = 1,
.platform_data = &mcp251x_info,
.irq = IRQ_EINT3,
.max_speed_hz = 10*1000*1000,
.chip_select = 3,
}
};
static struct s3c2410_spi_info spi1_platdata = {
.pin_cs = S3C2410_GPC(8), //我猜是指上面第一个片选对应的片选引脚,chip_select为0就对应S3C2410_GPC(8),不知对不对
.num_cs = 4, /* 这个应该是代表slave数量 */
.bus_num = 1,
};
smdk2410_devices数组中添加
&s3c_device_spi0,
smdk2410_init函数中添加
s3c_device_spi1.dev.platform_data= &spi1_platdata;
spi_register_board_info(spi1_board_info, ARRAY_SIZE(spi1_board_info));
问题:
查看<mach/spi.h> ,我觉得是tatic struct s3c2410_spi_info spi1_platdata赋值上有问题,但网上例子都是只对应一个从设备,没讲多个从设备如果切换片选,不知是不是自己写一个片选切换函数赋值到truct s3c2410_spi_info 的void (*set_cs)(struct s3c2410_spi_info *spi, int cs, int pol);,但cs跟pol是什么意思又不明确。
所以请各位高手指点一下,谢谢。