i.MX6q flexcan移植篇

移植过程:

1、移植的工具和原材料:buildroot工具  i.MX6q设备树


第一步:buildroot工具产生内核和交叉编译工具链

①首先我使用的buildroot工具是buildroot-2017.02版本的,下载地址为https://buildroot.org/downloads/manual/manual.html#_buildroot_quick_start ,下载之后解压。其源码目录下的configs目录下有我使用板子的配置文件imx6qsabresd_defconfig,我将该配置文件拷贝到buildroot的顶层目录。

cp  ./configs/freescale_imx6qsabresd_defconfig     ./.config

②为buildroot编译安装必要工具

apt-get install build-essential kernel-package libncurses5-dev

apt-get install git

③对.config配置文件在buildroot中的一些默认配置进行修改

make  menuconfig

a、Target options------>选项中

Target  ABI   使用我们拷贝的.config配置文件默认的是EABIhf的,如果我们的开发板中已经有内核了,我们只希望在其基础上进行修改,那么就需要查看一下交叉编译工具链是EABIhf的还是EABI的,如果没找到相关信息也可以先不管,先这么配置,后续buildroot编译完成之后,用该buildroot生成的交叉编译工具链编译一个测试程序,下载到开发板上能跑则配置正确,否则就是错的,就需要从新配置成EABI。(这两个的主要区别好像是库不同,如果使用的静态库编译程序,这两个没有差别,如果是用动态库编译程序,EABIhf编译生成的则无法在EABI的环境下使用。执行会报错no such file,我们老大解释的是固件版本不匹配)。这里我按照的是默认的配置EABIhf进行配置的。如果是一个啥也没有的板子或者可以重新烧录的板子则不用在乎这些。

b、Toolchain

    C  library   C库的选择,选择glibc

作为新手可以先这么配置,然后save之后推出配置,在buildroot顶层目录执行make

(说明:buildroot工具大致的作用就是自动下载配置好开发板的UBOOT源码、内核源码编译成符合配置开发板的相关镜像,制作根文件系统等。由于我也是第一次使用,所以不是太清楚其内部的东西,大家可以自行去了解,后面评论区我看能不能发一两个我参照过的比较好的博客链接,与大家分享)

待编译完成之后,在buildroot顶层目录/output目录下就生成了我们所需要的所有东西。

output 目录简介:

    build     编译Uboot、内核、交叉编译工具、根文件系统等的一些原始材料(这个一般都是通过在make过程中网络自动下载的)。个人认为重要的有Uboot源码(make的时候已经编译过了)、内核源码(make的时候已经编译过了),后期我自己对flexcan移植改动内核源码的时候就是基于这里的内核源码来改的。

    host:这个目录中有编译好了的交叉编译工具链,在/output/host/usr/bin目录中,我们后期改动内核代码重新编译设备树的时候就需要这里的交叉编译工具链。

    images:这里面存放了编译好的各种镜像,可以直接烧录到开发板上。

其它还有写目录就不一一介绍了,可自行上网查阅。

好了下面正式来移植flexcan:

FLEXCAN移植:

首先我所使用的开发板imx6q在硬件上和NXP官方给出的硬件原理图对比,做了很大的剪裁,但是CAN模块并没有改动过,原本是不需要进行移植的,但是将buildroot编译好的镜像放烧录到开发板中之后发现/sys/class/net目录下并没有生成相关的设备文件(这里要说明的是can总线在linux的某个版本之后归类到了网络版本,至于具体哪个版本我也忘了,但是3.0.15版本及其之后的内核中都是这么归类的,不了解这个很容易误认为是字符设备,到/dev下面去找设备文件)。

其次,内核中的flexcan驱动是有NXP官方维护的(因为buildroot下载的4.1.15版本的内核就是在NXP官网下载的,这个可以从配置文件中看到)。所以驱动本身是好的,是不用修改的,但是没有相关硬件描述文件。这是因为在内核源码的设备树文件中并没有对该硬件进行描述,模块是disable的。

所以需要修改设备树。

在看了很多博客后发现很多描述的要么不是很清晰,要么就是按照其配置能生成设备描述文件,但是硬件不能正常发送数据。最后在NXP社区中找到了个人认为比较可靠,切配置后硬件正常工作的一个设备树修改方式。

1、设备树文件

    根据我的板子型号,以及设备树中描述的东西,我选的设备树文件是imx6q-sabresd.dts(如果是其它的板子的话,可能需要自己对照自己的板子看看了。)

该设备树所包含的“头文件”有:

imx6q.dtsi  和imx6qdl-sabresd.dtsi    然后imx6q.dtsi中又包含了imx6qdl.dtsi

其中imx6qdl.dtsi中有对flexcan的相关描述,根据其描述发现描述的寄存器地址和imx6q的数据手册中描述的是一样的,所以确定该设备树可用于我手中的开发板。(确定设备树适用自己手中开发板方法

然后我根据社区的描述进行对这几个文件进行如下修改:

①在imx6q.dtsi中的iomuxc中添加:(如果我们的内核版本相同的话:文件在内核源码的/arch/arm/boot/dts目录下,增加内容的地方在文件的196行)

can1{
      pinctrl_flexcan1_1:can1grp{
  fsl,pins = <
  MX6QDL_PAD_GPIO_7__FLEXCAN1_TX   0x1b0b0
MX6QDL_PAD_GPIO_8__FLEXCAN1_RX   0x1b0b0
MX6QDL_PAD_GPIO_19__GPIO4_IO05   0x1b0b0
  >;
 };

    };

②在imx6qdl-sabresd.dtsi文件的regulators中添加:(文件所在目录同上,在文件的第134行)

reg_can_xcvr:regulator@6{                          //这里的数字随regulator的内容改动,我是看前面的规律写的

                    compatible = "regulator-fixed";

                    reg = <6>;                             //和上面的@6相同

                    regulator-name = "CAN XCVR";

                    regulator_min_microvolt = <33000000>;

                    regulator_max_microvolt = <33000000>;

                    pinctrl-names = "default";

                    gpio = <&gpio4 5 GPIO_ACTIVE_HIGH>;

                    enable-active-low;

};

③在imx6q-sabresd.dts文件最末尾添加:

&can1{
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1_1>;
xceiver-supply = <®_can_xcvr>;
status = "okay";

};


需要注意的是如果内核版本不同,那么需要仔细看一下内核文件,有的内核可能把这里的can1的描述写成的是flexcan1,这个就需要自己多看多找规律分析了,或者把设备树好好学懂也成,我也刚接触这个不能很清楚的去解释这些东西,所以就不细说了。


④修改好设备树之后到内核源码的顶层目录执行

make  dtbs  ARCH=arm   

即可进行设备树的编译(注意要提前指定好交叉编译工具链为buildroot下面的,我的做法是vi  ~/.bashrc  该文件的末尾添加环境变量配置,然后把buildroot中编译过的内核拷贝出来再修改设备树执行,避免污染源码)


成品固件更新方式:

    当我的设备树编译好之后,又出现了一个新的问题,那就是我的板子中在根文件系统中有很多别人的重要的东西,而且内核也是同事弄好的,为了避免自己二次劳动和破坏人家的东西,我需要把新的设备树替换掉板子中的设备树。经过大量的搜索之后发现,可以采用成品固件更新的一种方式。因为我们的内核镜像和设备树都是放在emmc中的,而在内核的/dev下面又有对该存储介质的描述文件,所以我们可以通过该设备文件来操作emmc,把原来的设备树替换成我们的。具体操作方式如下:

mount  /dev/mmblk3p2      ./mmc

进入到mmc中发现里面多了内核镜像文件和设备树文件,这个时候我们只需要保存其原来的设备树文件,然后把我们自己的mv进去就可以了。开机重启就发现已经有CAN模块的相关描述了。


硬件功能测试:   

 现在设备文件都已经有了,那么就可以进行硬件测试了,但是发现原来内核中的ip工具并不能对can进行设置,究其原因是因为/sbin下的ip工具太老了,需要进行替换。这个相对来说比较简单,网上下一个iproute2工具编译,拷贝生成的ip工具到/sbin下替换掉原来的就可以了。需要注意的是网上下载的很多源码可能不能正常编译过,这可能是源码本身的问题,我尝试编译了几个,发现

 http://www.linuxgrill.com/anonymous/iproute2/NEW-OSDL/ 连接下的iproute2-2.6.39版本的是可以一次性编译通过的。

编译过程:

①修改Makefile中的CC = arm-linux-gcc  (自己buildroot生成的交叉编译工具链,如果没有进行交叉编译工具链的全局配置,需要加上绝对路径)。

②因为我们只需要ip工具,所以SUBDIRS = lib  ip  (源码中默认的还会生成其它工具)。

③make

最后编译成功后在进入到源码目录下的ip目录可以发现有一个生成的ip(这就是个可执行的二进制文件ip工具),将该文件拷贝到开发板的/sbin目录下替换原来的ip即可。

你可能感兴趣的:(CAN总线)