新手,嵌入式linux, CAN 驱动问题,如何产生can0等设备?

renyuxiao 2012-08-10 09:43:10
最近在做嵌入式linux,里面有CAN的数据传输。
不是很懂,发帖问各位大侠。

/dev/下面 没有can0,can1...can14等设备,如何创建?听说这个和cpu或板子的参数有关系。
处理器是:TI -Sitara AM3517 Coretex-A8 processor 600 MHz 板子是adlink的sp860,http://www.adlinktech.com/PD/web/PD_detail.php?cKind=&pid=1075

是mknod吗?主参数和副参数怎么看?
还有板子厂家已经提供了can的一些工具,如 ip,candump,cansend等

厂家资料里给了些命令
./ip link set can0 type can bitrate 9600 triple-sampling on loopback on
./ip link set can0 up
也不清楚是干什么的,我们要写一个so在python里用,没有can0等设备无法open和传输。


另外:现在基本不懂这方面,也缺少资料学习,是否有讲此的学习材料链接。
...全文
3323 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangsg_sz 2013-12-28
  • 打赏
  • 举报
回复
楼主,请教个问题:关于linux增加can0的项目,我用的是sunxi linux,通过menuconfig已经打开了can的模块,并且编译到内核,通过打印信息也看到模块都有启动,在interface文件里面也增加了你在帖子里说到的命令。但是问题是我无法用ifconfig -a看到can0的设备。只能看到eth0和lo等设备。请问这有可能是哪里出了问题?谢谢。如果方便,请回个邮件给我simon.zhangsg@gmail.com。 谢谢!
cf44sui 2012-08-31
  • 打赏
  • 举报
回复
楼主能加我QQ吗,刚好有个can驱动移植的问题请教您
QQ: 307793185
renyuxiao 2012-08-31
  • 打赏
  • 举报
回复
结贴了,前面是概念错误,只有一个can设备有了一个can0不应该再有can14之类的;和以前的dev字符设备混淆了。
我上面所说的步骤都是对的;编程方法也测试通过了;希望对后来者有用。
csdn最恶心的是自己只能发3次,发完3次不能发言了,以前想总结一下的机会都没有;分重点给最后2位了。
  • 打赏
  • 举报
回复
没作过这方面的, 以下为个人猜测:
如果你按照上面3步可以生成 can0 那把代码中的can0改成can1 不能生成can1?
你用 ifconfig -a 看下呢? 有可能是没有up .

对于你基本概念的问题:
1, 不论/dev/XX 还是 socketcan 都只是与设备驱动通信的方式罢了, 前面是字符型,后面是网络型,
只要你输出给仪器端的接口不变, 则仪器端就不用改动。

3,对于编译选项, 你可以多看下每个HELP, 既然网上有参考,就编进去试下呗
changing_better 2012-08-30
  • 打赏
  • 举报
回复
你把socketcan的驱动都加进去,我记得还是不少的,内核里面应该有关联的,需要选择socketcan,还有你需要打开ifconfigure can0 up吧,才可以看到。


can0/ can14的名称我不知道怎么产生的,一般不需要我们指定,socketcan里面会根据总线顺序生产can 设备的名称,从can0 ... 到n,
can是双向通信的,你硬件上是有一个can,还是有俩个,如果是一个的话,俩个可以名称一样,即可以输入也可以输出,如果是俩个的话,还是按系统给定的名称来分配输入和输出,要么不知道可以不可以硬-软链接?
renyuxiao 2012-08-21
  • 打赏
  • 举报
回复
有人啊,请教了。
更新下问题。

adlink的sp860板子,am3517的。是将客户仪器上原来的老程序升级,原来是用/dev/can0发,/dev/can14收。
换新的板子后用到了socketcan。

我的做法是:
1. 重新编译内核,在make menuconfig中将相应的can驱动选上;
2. 在/etc/network/interfaces文件中加上
auto can0
iface can0 inet manual
pre-up /ip link set $IFACE type can bitrate 125000 triple-sampling on
up /sbin/ifconfig $IFACE up
down /sbin/ifconfig $IFACE down
使之产生can0设备,
3. 我是在python中调用so进行can通讯,在c程序中打开can0
sockfd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
strcpy(ifr.ifr_name, "can0" );
ioctl(sockfd, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));

附原来的/dev/can打开代码

#define INPUTDEVICE "/dev/can14"
#define OUTPUTDEVICE "/dev/can0"
if ((input = open(INPUTDEVICE, O_RDONLY)) == -1)
throw(IOError, INPUTDEVICE);
if ((output = open(OUTPUTDEVICE, O_WRONLY)) == -1)
{
close(input);
throw(IOError, OUTPUTDEVICE);
}




由于基本概念等不是很清楚,有几个问题:
1. 老的程序中用的/dev/can0做输出,/dev/can14做输入,仪器端是不能变,现在就是换个cpu板子,在socketcan中只要 can0节点就够了吗?是否需要仪器端的协议,我们那边有人说不需要的。
2. 以上3个步骤只能产生can0设备,如果在interfaces文件中增加can1,can14等设备,无法成功。是否上面三个步骤是不对的?
3. 除了make menuconfig中选择驱动,是否还需要其他can驱动?我在网上看到例如 ixcan等所谓的驱动。
renyuxiao 2012-08-13
  • 打赏
  • 举报
回复
还有个重要问题是,因为仪器不变,这次是改了arm的板子,character device改用SocketCAN。
仪器设备那边不变的话,能够平稳的在程序里改用SocketCAN吗?就是说同一个仪器的输出,在开发板上既可以用/dev/can0这种character device接收,又能用SocketCAN接收吗?
有看到网上的设置,很迷惑,我们的设备上can接口是2个端子的。
auto can0
iface can0 inet static
address 127.42.23.180
netmask 255.255.255.0
pre-up canconfig can0 bitrate 250000
renyuxiao 2012-08-13
  • 打赏
  • 举报
回复
谢谢各位,现在搞清楚了一些,原来是新的设备不用character device了,改用SocketCAN了。
现在遇到的问题是ifconfig时没有像eth0那样的设备,在interfaces文件中加了下面代码也没反应,
auto can0
iface can0 inet manual
#pre-up ip link set $IFACE type can bitrate 125000 listen-only off
pre-up /ip link set $IFACE type can bitrate 125000 triple-sampling on
up /sbin/ifconfig $IFACE up
down /sbin/ifconfig $IFACE down


另外就是原来有传输的代码了,基于character device,如何改到基于SocketCAN?


zhengmeifu 2012-08-12
  • 打赏
  • 举报
回复
产生can0设备,要看源码是编译成模块吗?还是直接编译进内核了,若是模块就要先加载模块,然后再mknod,看是字符设备还是块设备。若直接编译进内核应该能找到设备的。看看dev/block/下有没有。
liaolion4 2012-08-11
  • 打赏
  • 举报
回复
我看你是在做移植,你可以在/proc下面的网络设备中找,找到对应CAN0 CAN1 ....对应的主从设备号,然后mknod,你要是有内核源代码可以直接看代码,./ip link set can0 type can bitrate 9600 triple-sampling on loopback on是设置波特率,等属性,CAN设备必须在相同的波特率下才能进行通信。这个你可以看芯片手册。里面有波特率与几个段的计算方法(在编译内核时候有一个选项,可以让内核自动计算,或自己设置),当时和不同的CAN设备通信,计算这几个段郁闷了一段时间。CAN驱动现在分两类,一类是以socket方式调用,一类是传统的字符驱动,其实CAN0 CAN1 相当于eth0 eth2 差不多。
SZ阿辉 2012-08-10
  • 打赏
  • 举报
回复
配置内核的时候相关驱动选上应该会自动产生CAN0的,我最近也在搞CAN通讯 但CAN1 CAN2 CAN3...那些我也不知道怎么产生的
woshi_ziyu 2012-08-10
  • 打赏
  • 举报
回复
厂家资料里给了些命令
./ip link set can0 type can bitrate 9600 triple-sampling on loopback on
./ip link set can0 up

设置can的属性

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧