Linux驱动的更改是一个很复杂的过程,而Linux内核中集成了好多常用的驱动。对于Linux内核的移植来说,目前我们最主要的工作是更改EMMC驱动及网路驱动,当然,也不是真正意义上的更改Linux内核中的驱动,由于,这两部份实际上在Linux内核中早已集成,并且因为不同的硬件平台使用的网路插口(复位引脚等)不同,所以,须要针对不同的硬件平台进行相应的更改,而这些更改(引脚等)是通过更改设备树文件来实现的。
添加设备树文件
Linux内核从3.8版本开始,采用设备树的概念描述板级设备,即,硬件平台上的设备信息,比如,CPU数目、内存基地址、SPI/IIC/UART总线插口等,设备树在Linux驱动开发中是一个很重要的知识点,之前在Linux内核启动过程中,遇见了网路插口错误的情况,而Linux网路又是在Linux内核移植调试、根文件系统调试以及Linux驱动调试中有重要的作用,因而,须要在Linux内核移植过程中,解决网路插口问题,也就须要更改相应的设备树文件。须要注意的是,对于Yocto在Linux内核编译过程的同时,也会编译设备树文件,在Linux内核移植过程中更改/添加设备树文件,优缺在于把握在编译Linux内核过程中,是怎样编译及使用设备树文件的,注重指出降低设备树文件,并将设备树文件添加进Linux内核编译过程中,对于设备树文件的详尽更改及编撰,更多的会在Linux驱动开发过程中涉及。
后面Linux内核编译完成后,在/Linux/fsl-release-yocto/build/tmp/work/imx6ull_bird_dk-poky-linux-gnueabi/linux-bird/5.4-r0/build/arch/arm/boot/dts路劲下生成了一些.dtb文件,如右图所示:
这种就是在Linux内核编译过程中生成的设备树文件,相应的,在/Linux/fsl-release-yocto/sources/meta-bird-imx6ull/conf/machine路劲下的imx6ull-bird-dk.conf文件中,定义了变量KERNEL_DEVICETREE,如右图所示:
可以看出,KERNEL_DEVICETREE定义的变量值刚好对应生成的设备树文件,而对于我们自己的开发板来说,大多数情况下都是须要参考官方的evk平台设计的,对于emmc版本的imx6ull硬件平台来说,imx6ull-14x14-evk-emmc.dtb是一个挺好的选择,imx6ull-14x14-evk-emmc.dtb是由/Linux/fsl-release-yocto/linux-imx-bird/arch/arm/boot/dts路劲下的imx6ull-14x14-evk-emmc.dts编译生成的。为此,imx6ull-14x14-evk-emmc.dts更改emmc版本的开发板对应的设备树文件即可。
降低设备树文件
/Linux/fsl-release-yocto/linux-imx-bird/arch/arm/boot/dts路劲下的imx6ull-14x14-evk-emmc.dts如右图所示:
在该文件的第9行,通过#include"imx6ull-14x14-evk.dts"词句包含了imx6ull-14x14-evk.dts以及更改了usdhc2节点(相对应硬件平台上的emmc硬件插口SD2),为此,为了简便,直接将imx6ull-14x14-evk.dts作为emmc版本设备树的参考文件,最后更改usdhc2节点即可。
在/Linux/fsl-release-yocto/linux-imx-bird/arch/arm/boot/dts路劲下,复制imx6ull-14x14-evk.dts文件,将其重命名为imx6ull-bird-emmc.dts:
但是,更改/Linux/fsl-release-yocto/sources/meta-bird-imx6ull/conf/machine路劲下imx6ull-bird-dk.conf中的KERNEL_DEVICETREE值,致使imx6ull-bird-emmc.dts参与Linux内核编译,生产imx6ull-bird-emmc.dtb文件:
重新编译Linux内核,在/Linux/fsl-release-yocto/build/tmp/work/imx6ull_bird_dk-poky-linux-gnueabi/linux-bird/5.4-r0/build/arch/arm/boot/dts路劲下生成了对应的imx6ull-bird-emmc.dtb文件。
设备树文件的更改
目前为止,我们只是复制了官方evk平台对于的imx6ull-14x14-evk.dts文件,将其重命名并生成了imx6ull-bird-emmc.dtb文件,其实质上还是和官方evk平台的设备树文件一致的,因而,我们须要依照我们自己所使用的硬件平台,对imx6ull-bird-emmc.dts文件进行更改,生成适宜我们自己硬件平台的imx6ull-bird-emmc.dtb设备树文件。在Linux内核的移植过程中,对imx6ull-bird-emmc.dts文件的更改主要包括两方面:emmc驱动的更改和网路插口的更改。
emmc驱动的更改
后面在提到官方evk平台的emmc版本所使用的imx6ull-14x14-evk-emmc.dts文件中,对usdhc2节点进行了更改,主要是将emmc插口采用了8线数据线,因而嵌入式linux移植,将imx6ull-14x14-evk-emmc.dts中的usdhc2节点配置复制至imx6ull-bird-emmc.dts中,更改如下:
2.网路插口的更改
教程中所使用的硬件平台上采用的是片内MAC加片外PHY的网路硬件方案,iMX6ULL片内自带了两个MAC外设,分别对应ETH1和ETH2,教程少将以ETH1为例,描述网路插口的更改。采用的PHY芯片为LNA87208720A,使用RMII插口。对于网路驱动来说,Linux内核集成了网路驱动,通常情况下,不仅硬件插口(PHY芯片复位引脚、PHY芯片地址)、使能LNA87208720A驱动之外,不须要做额外的更改即可驱动上去。为此,教程中使用的硬件平台只需更改PHY芯片复位引脚、PHY芯片地址即可,而这种更改都是通过更改imx6ull-bird-emmc.dts文件实现的。(关于网路驱动的更改,是一个比较复杂的过程,倘若涉及到网路驱动的更改,请参见其他相关教程。)
在imx6ull-bird-emmc.dts中,通过#include"imx6ul-14x14-evk.dtsi"的形式引用了imx6ul-14x14-evk.dtsi文件,在imx6ul-14x14-evk.dtsi文件中定义了官方EVK平台上的设备信息。同样的,在/Linux/fsl-release-yocto/linux-imx-bird/arch/arm/boot/dts路劲下,复制imx6ul-14x14-evk.dtsi文件,将其重命名为imx6ull-bird-emmc.dtsi,而且将imx6ull-bird-emmc.dts中的#include"imx6ul-14x14-evk.dtsi"更改为#include"imx6ull-bird-emmc.dtsi"
硬件平台中ETH1使用的PHY芯片复位引脚是MX6UL_PAD_SNVS_TAMPER9GPIO5_IO09引脚,将其添加进imx6ull-bird-emmc.dtsi文件中即可。首先,在imx6ull-bird-emmc.dtsi文件中搜索MX6UL_PAD_SNVS_TAMPER9GPIO5_IO09,发觉官方evk平台中早已将其作为lcd的复位引脚,在我们的硬件平台中,暂时不须要LCD驱动,将其屏蔽即可,如图:
之后在imx6ull-bird-emmc.dtsi文件中嵌入式linux移植,找到pinctrl_enet1节点,将MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO090x10B0加入其中,如右图所示:
在教程中,针对imx6ull-bird-emmc平台,我们只使用了单网口enet1,为此,在imx6ull-bird-emmc.dtsi还须要把enet2相关的内容去除,更改fec1节点的pinctrl-0属性且删掉fec2节点即可。在imx6ull-bird-emmc.dtsi文件中,找到名为“fec1”节点linux开源软件,更改其中的“pinctrl-0”属性值,更改之后如下所示,但是删掉fec2节点。如右图所示:
在ENET1网卡对应的pinctrl_enet1节点中添加MDIO和MDC引脚配置,但是屏蔽ENET2对应的pinctrl_enet2,如右图:
配置Linux内核,使能LAN8720驱动
输入命令“bitbakelinux-bird-cmenuconfig”,打开图形化配置界面linux操作系统,选择使能LAN87208720A的驱动,路径如下:(注意:使用图形化配置界面时,1、有可能会出现“Novalidterminalfound,unabletoopendevshell”的错误,只须要apt-getinstalltmux安装tmux即可。2、有可能出现“Unabletofindthencursespackage.”的错误,只须要根据提示安装libncurses-dev即可)
如右图所示:
图中选择将“DriversforSMSCPHYs”编译到Linux内核中,因而“”里面变为了“*”。LAN87208720A是SMSC公司出品的,因而勾选这个之后才会编译LAN8720驱动,配置好之后退出配置界面,之后重新编译一下Linux内核。
当通过menuconfig图形配置界面更改了linux内核以太网驱动后,保存生成的.config文件,将其重命名为defconfig,并复制至/Linux/fsl-release-yocto/sources/meta-bird-imx6ull/recipes-kernel/linux/files/defconfig,作为Linux内核的默认配置文件,这样,前面再编译的时侯就不须要再度配置以太网驱动了,这也是Linux内核默认配置文件反复迭代的方法。在更改了以太网驱动采用LAN8720驱动后,在生成的配置文件中搜索SMSC,可以看见使能了SMSC驱动,
同时,在Linux内核的启动过程中可以看见加载了SMSC提供的LAN8720驱动:
文档配套教学视频B站搜索“嵌入式孙工”
文章评论