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

2019-07-12 23:20发布

与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 
#include <asm/arch/spi.h>       //包含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,            //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.重新编译内核 启动信息中有如下内容,说明成功了: spi与can通信的设置 - zhaozhi_q - zhaozhi_q的博客   执行命令cat /proc/devices 显示252 mcp251x   添加设备文件 mknod /dev/mcp251x c 252 0(主次设备号参照 /drivers/spi/spidev.c  MAJOR:153 MINOR:32-256 ) 执行应用程序 ./can_test 显示如下 spi与can通信的设置 - zhaozhi_q - zhaozhi_q的博客
 基本完成,接下来是接上硬件调试了。