linux can 阻塞,嵌入式linux, CAN 驱动有关问题

与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 supportSPI support*** SPI Master Controller Drivers ***-*- Bitbanging SPI masterSamsung S3C24XX series SPISamsung S3C24XX series SPI by GPIO*** SPI Protocol Masters ***SPI EEPROMs from most vendorsUser mode SPI device driver supportInfineon 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#include //包含s3c2410_spi_info结构体

#include //包含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.重新编译内核

启动信息中有如下内容,说明成功了:

3f288ee285423cc6e29fa526842ca321.png

5 执行命令cat /proc/devices

显示252 mcp251x

添加设备文件 mknod /dev/mcp251x c 252 0(主次设备号参照 /drivers/spi/spidev.c  MAJOR:153 MINOR:32-256 )

执行应用程序

./can_test

显示如下

3f288ee285423cc6e29fa526842ca321.png

基本完成,接下来是接上硬件调试了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值