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,然后發回去。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com