与can相关的文件有
1. linux3.0.1源码包中的:
drivers/net/can/mcp251x.c与Kconfig文件(将mcp251x.c中spi_board_info[] 中的.modalias="mcp2510"设为"mcp2515")是不是此处原因待查!
drivers/spi/spi_s3c64xx.c
net/can 所有文件
Document/spi
Document/can.txt 有关于socket CAN 编程的相关知识
2. linux 3.0.1系统中的相关操作
ifconfig
不出现can0网卡
more /proc/net/dev
有can0网卡
ifconfig can0 up
出现
[root@FORLINX6410]# ifconfig can0 up
mcp2515 spi1.0: bit-timing not yet defined
mcp2515 spi1.0: unable to set initial baudrate!
根据linux3.0.1用户手册进行波特率设置
up link set can0 up type can bitrate 250000
ifconfig
出现can0网卡
ifconfig can0 up
之后根据Document/can.txt 有关于socket CAN 编程的相关知识进行网络编程。
但是在开发板/dev目录下始终没有生成spi设备文件?????why??????
使用linux自带的spi_s3c24xx.c驱动后,/dev无法找到自动创建的接点,/proc/devices中也没有,但是把spidev.c文件编译模块后,/proc/devices中就有了major=153的设备了
spi_s3c24xx.c本身并没有生成设备节点,spidev.c的任务就是为了再user space访问spi设备而设,就是通过它来进行spi设备的读写。详细方法请阅读内核Documents/spi目录下的例子。
在加载spidev.ko后,生成spidev0.1 153 0接点了
附外解决方法:(参考)
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/下;
文件can.h放在目录include/linux/can/下
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 <asm/arch/spi.h> //包含s3c2410_spi_info结构体
#include <linux/can/platform/mcp251x.h> //包含struct mcp251x_platform_data结构体
static struct mcp251x_platform_data mcp251x_info = {
.f_osc = 16000000,
//.oscillator_frequency = 19000000,
//.board_specific_setup = myboard_mcp251x_initfunc,
//.device_reset = myboard_mcp251x_reset,
//.transceiver_enable = NULL,
};
static struct spi_board_info spi_board_info[] __initdata = {
[0]=
{
.modalias = "mcp251x", //这个名称一定要与mcp251x.c驱动中
//proc函数中的.name要一致
.platform_data = &mcp251x_info, //上面的结构体
.irq = IRQ_EINT3, 中断端口号
.max_speed_hz = 8000000, //spi最大的速度
.bus_num = 0, //spi0,1中选择spi0口
.chip_select = 0, //多个芯片选择
},
};
static struct s3c2410_spi_info s3c2410_spi0_platdata = {
.pin_cs = S3C2410_GPG2, //片选端口指定
.num_cs = 1, //总共端口数
// .bus_num = 0,
};
smdk2410_devices数组中添加
&s3c_device_spi0,
smdk2410_init函数中添加
s3c_device_spi0.dev.platform_data= &s3c2410_spi0_platdata;
spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
4.重新编译内核
启动信息中有如下内容,说明成功了:
5 执行命令cat /proc/devices
显示252 mcp251x
添加设备文件 mknod /dev/mcp251x c 252 0(主次设备号参照 /drivers/spi/spidev.c MAJOR:153 MINOR:32-256 )
执行应用程序
./can_test
显示如下