imx6q sebrasd can总线移植指南

在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,然后发回去。
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值