在imx6q的3.14.52的BSP中已经有了CAN总线的驱动,驱动的源代码在drivers\net\can\flexcan.c
虽然imx6q的BSP里面已经支持了CAN总线的驱动,但是在针对SABRESD的板的DTS文件中确没有支持CAN,所以需要我们自己来增加。
下面是修改的部分。
在arch\arm\boot\dts\imx6qdl-sabresd.dtsi文件中增加IO口的定义
pinctrl_flexcan1: flexcan1grp {
fsl,pins = <
MX6QDL_PAD_GPIO_7__FLEXCAN1_TX 0x80000000
MX6QDL_PAD_GPIO_8__FLEXCAN1_RX 0x80000000
>;
};
这个是CAN总线的TX\RX的IO口的配置,这个是开发板上用到的两个口,如果是其他的口自行修改就好了。
这个添加的代码要放到&iomuxc 中。
然后增加CAN1的定义
&flexcan1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1>;
trx-stby-gpio = <&gpio4 5 GPIO_ACTIVE_LOW>;
status = "okay";
};
默认status是disable的,这里要设置为okay,否者驱动的probe函数探测不到了
pinctrl-0后面的名称要和我们前面添加的IO口定义相匹配。
trx-stby-gpio这个是定义standby口的定义
如果还有其他的控制IO口,参考上面的格式定义。
在mach-imx6q.c中增加下面的函数
static void mx6q_flexcan_switch_sd(void)
{
if (flexcan0_en ) {
gpio_set_value_cansleep(flexcan_stby_gpio, 1);
gpio_set_value_cansleep(flexcan_stby_gpio, 0);
printk(KERN_ALERT"-------can stby setup en-------\n");
} else {
gpio_set_value_cansleep(flexcan_stby_gpio, 1);
printk(KERN_ALERT"-------can stby setup off-------\n");
}
}
static void imx6q_flexcan0_switch_sd(int enable)
{
flexcan0_en = enable;
mx6q_flexcan_switch_sd();
}
static void imx6q_flexcan1_switch_sd(int enable)//can1在开发板上没有印出来,所以不使能,如果要用到can1,参考can0的设置就好了
{
flexcan1_en = 0;
printk(KERN_ALERT"-------can1 not supported-------\n");
}
//imx6q_flexcan_fixup_sd是读取DTS中IO口的设置,这里只有standby的定义,如果还有其他的控制脚,参考下面的代码自己加上。
static int __init imx6q_flexcan_fixup_sd(void)
{
struct device_node *np;
np = of_find_node_by_path("/soc/aips-bus@02000000/can@02090000");
if (!np)
return -ENODEV;
flexcan_stby_gpio = of_get_named_gpio(np, "trx-stby-gpio", 0);
if (gpio_is_valid(flexcan_stby_gpio) &&
!gpio_request_one(flexcan_stby_gpio, GPIOF_DIR_OUT, "flexcan-trx-stby")) {
flexcan_pdata[0].transceiver_switch = imx6q_flexcan0_switch_sd;
flexcan_pdata[1].transceiver_switch = imx6q_flexcan1_switch_sd;
}
return 0;
}
最后在static void __init imx6q_init_late(void)函数中增加
if (of_machine_is_compatible("fsl,imx6q-sabresd"))
{
imx6q_flexcan_fixup_sd();
}
编译后,重新烧录重新启动后再命令行中输入
ifconfig -a
就可以看到can0出来了。
下面是测试
在3.14.52中,测试程序变了,没有canecho了,我们可以用canfdtest来测试。
ip link set can0 up type can bitrate 20000
ifconfig can0 up
canfdtest -vv can0
canfdtest会把接收到的数据在调试串口打印出来,然后将接受的每一个字节的数值加1,然后发回去。