嵌入式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 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,            //spi01中选择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.重新编译内核

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

 

执行命令cat /proc/devices

显示252 mcp251x

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

执行应用程序

./can_test

显示如下


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

你可能感兴趣的:(socket,can)