嵌入式linux, CAN 驱动有关问题
與can相關(guān)的文件有
1. linux3.0.1源碼包中的:
drivers/net/can/mcp251x.c與Kconfig文件(將mcp251x.c中spi_board_info[] 中的.modalias="mcp2510"設(shè)為"mcp2515")是不是此處原因待查!
drivers/spi/spi_s3c64xx.c
net/can 所有文件
Document/spi
Document/can.txt 有關(guān)于socket CAN 編程的相關(guān)知識(shí)
2. linux 3.0.1系統(tǒng)中的相關(guān)操作
ifconfig
不出現(xiàn)can0網(wǎng)卡
more /proc/net/dev
有can0網(wǎng)卡
ifconfig can0 up
出現(xiàn)
[root@FORLINX6410]# ifconfig can0 up
mcp2515 spi1.0: bit-timing not yet defined? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
mcp2515 spi1.0: unable to set initial baudrate!
根據(jù)linux3.0.1用戶手冊進(jìn)行波特率設(shè)置
?up link set can0 up type can bitrate 250000
ifconfig
出現(xiàn)can0網(wǎng)卡
ifconfig can0 up
之后根據(jù)Document/can.txt 有關(guān)于socket CAN 編程的相關(guān)知識(shí)進(jìn)行網(wǎng)絡(luò)編程。
?
但是在開發(fā)板/dev目錄下始終沒有生成spi設(shè)備文件?????why??????
使用linux自帶的spi_s3c24xx.c驅(qū)動(dòng)后,/dev無法找到自動(dòng)創(chuàng)建的接點(diǎn),/proc/devices中也沒有,但是把spidev.c文件編譯模塊后,/proc/devices中就有了major=153的設(shè)備了
?spi_s3c24xx.c本身并沒有生成設(shè)備節(jié)點(diǎn),spidev.c的任務(wù)就是為了再user?space訪問spi設(shè)備而設(shè),就是通過它來進(jìn)行spi設(shè)備的讀寫。詳細(xì)方法請閱讀內(nèi)核Documents/spi目錄下的例子。
?在加載spidev.ko后,生成spidev0.1?153?0接點(diǎn)了
附外解決方法:(參考)
1、在配置Linux?編譯選項(xiàng)時(shí),開啟相應(yīng)的SPI?選項(xiàng),如下所示?
????->?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)?
設(shè)置完成保存。
2.驅(qū)動(dòng)文件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板級啟動(dòng)信息
#include?<linux/spi/spi.h>
#include?<asm/arch/spi.h>???????//包含s3c2410_spi_info結(jié)構(gòu)體
#include?<linux/can/platform/mcp251x.h>??//包含struct?mcp251x_platform_data結(jié)構(gòu)體
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",?//這個(gè)名稱一定要與mcp251x.c驅(qū)動(dòng)中
//proc函數(shù)中的.name要一致
????????.platform_data??=?&mcp251x_info,??//上面的結(jié)構(gòu)體
????????.irq??????????????=?IRQ_EINT3,????????????中斷端口號
????????.max_speed_hz??=?8000000,????????????//spi最大的速度
????????.bus_num????????=?0,????????????//spi0,1中選擇spi0口
????????.chip_select??????=?0,????????????//多個(gè)芯片選擇
},
};
static?struct?s3c2410_spi_info?s3c2410_spi0_platdata?=?{
????????.pin_cs?=?S3C2410_GPG2,?????//片選端口指定
????????.num_cs?=?1,??????????????????//總共端口數(shù)
???????//?.bus_num?=?0,
};?
smdk2410_devices數(shù)組中添加
&s3c_device_spi0,
smdk2410_init函數(shù)中添加
s3c_device_spi0.dev.platform_data=?&s3c2410_spi0_platdata;
spi_register_board_info(spi_board_info,?ARRAY_SIZE(spi_board_info));
4.重新編譯內(nèi)核
啟動(dòng)信息中有如下內(nèi)容,說明成功了:
?
5?執(zhí)行命令cat?/proc/devices
顯示252?mcp251x
??添加設(shè)備文件?mknod?/dev/mcp251x?c?252?0(主次設(shè)備號參照 /drivers/spi/spidev.c ?MAJOR:153 MINOR:32-256 )
執(zhí)行應(yīng)用程序
./can_test
顯示如下
?基本完成,接下來是接上硬件調(diào)試了。
總結(jié)
以上是生活随笔為你收集整理的嵌入式linux, CAN 驱动有关问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tags的建立和使用
- 下一篇: linux 其他常用命令