imx6ull移植linux5.4内核

因为使用的WiFi模块是mt7612u,正点原子核心板目前提供的4.1内核没有此模块驱动,便移植更新的5.4内核

1 下载内核源码
NXP官方linux仓库地址为:​ ​https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx​​。

2 设置临时环境变量
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-

3 清理构建
make distclean

4 加载默认配置
make imx_v7_defconfig

5 先编译一遍
make -j8

针对正点原子核心板,开始移植

6 修改网络驱动
修改设备树文件​​arch/arm/boot/dts/imx6ul-14x14-evk.dtsi​

屏蔽 GPIO5_IO07 GPIO5_IO08 复用功能
    pinctrl_spi4: spi4grp {
        fsl,pins = <
            MX6UL_PAD_BOOT_MODE0__GPIO5_IO10    0x70a1
            MX6UL_PAD_BOOT_MODE1__GPIO5_IO11    0x70a1
        /*    MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07    0x70a1 */
        /*    MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08    0x80000000 */
        >;
    };

屏蔽 spi4中 这两个引脚功能
    spi4 {
        compatible = "spi-gpio";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_spi4>;
        status = "okay";
    /*    pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; */
        gpio-sck = <&gpio5 11 0>;
        gpio-mosi = <&gpio5 10 0>;
    /*    cs-gpios = <&gpio5 7 0>; */
        num-chipselects = <1>;
        #address-cells = <1>;
        #size-cells = <0>;
        
将复位引脚加入到 pinctrl_enet1 和 pinctrl_enet2 节点
    pinctrl_enet1: enet1grp {
        fsl,pins = <
            MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN    0x1b0b0
            MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER    0x1b0b0
            MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00    0x1b0b0
            MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01    0x1b0b0
            MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN    0x1b0b0
            MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00    0x1b0b0
            MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01    0x1b0b0
            MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1    0x4001b009
            MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x10B0
        >;
    };

    pinctrl_enet2: enet2grp {
        fsl,pins = <
            MX6UL_PAD_GPIO1_IO07__ENET2_MDC        0x1b0b0
            MX6UL_PAD_GPIO1_IO06__ENET2_MDIO    0x1b0b0
            MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN    0x1b0b0
            MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER    0x1b0b0
            MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00    0x1b0b0
            MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01    0x1b0b0
            MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN    0x1b0b0
            MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00    0x1b0b0
            MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01    0x1b0b0
            MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2    0x4001b009
            MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x10B0
        >;
    };

在fec1和fec2节点,添加网络驱动复位引脚
&fec1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet1>;
    phy-mode = "rmii";
    phy-handle = <ðphy0>;
    phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <200>;
    status = "okay";
};

&fec2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_enet2>;
    phy-mode = "rmii";
    phy-handle = <ðphy1>;
    phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
    phy-reset-duration = <200>;
    status = "okay";

修改mdio节点中的mac芯片地址
    mdio {
        #address-cells = <1>;
        #size-cells = <0>;

        ethphy0: ethernet-phy@0 {
            reg = <0>;
            micrel,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET_REF>;
            clock-names = "rmii-ref";
        };

        ethphy1: ethernet-phy@1 {
            reg = <1>;
            micrel,led-mode = <1>;
            clocks = <&clks IMX6UL_CLK_ENET2_REF>;
            clock-names = "rmii-ref";
        };
    };
    
修改​​drivers/net/ethernet/freescale/fec_main.c​​文件,找到函数fec_probe,在函数开头添加如下代码:
void __iomem *IMX6U_ENET1_TX_CLK;
void __iomem *IMX6U_ENET2_TX_CLK;

IMX6U_ENET1_TX_CLK = ioremap(0X020E00DC, 4);
writel(0X14, IMX6U_ENET1_TX_CLK);

IMX6U_ENET2_TX_CLK = ioremap(0X020E00FC, 4);
writel(0X14, IMX6U_ENET2_TX_CLK);

网上说要 修改​​drivers/net/phy/smsc.c​​文件里面的复位功能,但我没有修改也正常

配置Linux内核,使能LAN8720驱动,SMSC PHYs 在5.4内核中默认是打开的

7 根据正点原子出厂系统外设复用参考文档v1.3.1,释放CAMERA,AUDIO,LCD,等复用功能,释放更多管脚用于其他功能

修改memuconfig 去掉camera功能
Device Drivers --->
<*> Multimedia support --->
[*] V4L platform devices --->
MXC Camera/V4L2 PRP Features support --->
< > OmniVision ov5640 camera support
< > OmniVision ov5642 camera support
< > OmniVision ov5640 camera support using mipi

修改设备树,屏蔽csi
/* &csi {
    status = "disabled";

    port {
        csi1_ep: endpoint {
            remote-endpoint = <&ov5640_ep>;
        };
    };
}; */
屏蔽csi对应的pinctrl_csi1
/*    pinctrl_csi1: csi1grp {
        fsl,pins = <
            MX6UL_PAD_CSI_MCLK__CSI_MCLK        0x1b088
            MX6UL_PAD_CSI_PIXCLK__CSI_PIXCLK    0x1b088
            MX6UL_PAD_CSI_VSYNC__CSI_VSYNC        0x1b088
            MX6UL_PAD_CSI_HSYNC__CSI_HSYNC        0x1b088
            MX6UL_PAD_CSI_DATA00__CSI_DATA02    0x1b088
            MX6UL_PAD_CSI_DATA01__CSI_DATA03    0x1b088
            MX6UL_PAD_CSI_DATA02__CSI_DATA04    0x1b088
            MX6UL_PAD_CSI_DATA03__CSI_DATA05    0x1b088
            MX6UL_PAD_CSI_DATA04__CSI_DATA06    0x1b088
            MX6UL_PAD_CSI_DATA05__CSI_DATA07    0x1b088
            MX6UL_PAD_CSI_DATA06__CSI_DATA08    0x1b088
            MX6UL_PAD_CSI_DATA07__CSI_DATA09    0x1b088
        >;
    }; */

屏蔽 ov5640    
    /* ov5640: ov5640@3c {
        compatible = "ovti,ov5640";
        reg = <0x3c>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_csi1>;
        clocks = <&clks IMX6UL_CLK_CSI>;
        clock-names = "csi_mclk";
        pwn-gpios = <&gpio_spi 6 1>;
        rst-gpios = <&gpio_spi 5 0>;
        csi_id = <0>;
        mclk = <24000000>;
        mclk_source = <0>;
        status = "disabled";
        port {
            ov5640_ep: endpoint {
                remote-endpoint = <&csi1_ep>;
            };
        };
    }; */

屏蔽wdog1

/* &wdog1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_wdog>;
    fsl,ext-reset-output;
}; */

8 裁剪AUDIO

修改menuconfig
Device Drivers --->
<*> Sound card support --->
<*> Advanced Linux Sound Architecture --->
<*> ALSA for SoC audio support --->
SoC Audio for Freescale CPUs --->
< > Asynchronous Sample Rate Converter (ASRC) module support
< > Synchronous Audio Interface (SAI) module support
< > Synchronous Serial Interface module (SSI) support
< > Sony/Philips Digital Interface (S/PDIF) module support
< > Enhanced Serial Audio Interface (ESAI) module support
< > Digital Audio Mux module support
< > SoC Audio for Freescale i.MX CPUs

修改设备树屏蔽sound
屏蔽 sound-wm8960 
屏蔽 pinctrl_sai2
屏蔽 &sai2

9 裁剪lcd
屏蔽 pinctrl_lcdif_dat
屏蔽 pinctrl_lcdif_ctrl
屏蔽 pinctrl_pwm1
屏蔽 pinctrl_wdog
屏蔽 &lcdif
屏蔽 &pwm1
屏蔽 &wdog1

10 uart2 复用
屏蔽 UART2_DCE_RTS 与 UART2_DCE_CTS
    pinctrl_uart2: uart2grp {
        fsl,pins = <
            MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX    0x1b0b1
            MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX    0x1b0b1 
        /*    MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS    0x1b0b1
            MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS    0x1b0b1 */
        >;
    };

    pinctrl_uart2dte: uart2dtegrp {
        fsl,pins = <
        /*    MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX    0x1b0b1
            MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX    0x1b0b1
            MX6UL_PAD_UART3_RX_DATA__UART2_DTE_CTS    0x1b0b1
            MX6UL_PAD_UART3_TX_DATA__UART2_DTE_RTS    0x1b0b1 */
        >;
    };
    
修改 &uart2 屏蔽 uart-has-rtscts;
&uart2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart2>;
    /* uart-has-rtscts; */
    /* for DTE mode, add below change */
    /* fsl,dte-mode; */
    /* pinctrl-0 = <&pinctrl_uart2dte>; */
    status = "okay";
};

11 uart3 复用
屏蔽UART2_DCE_RTS与UART2_DCE_CTS
    pinctrl_uart2: uart2grp {
        fsl,pins = <
            MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX    0x1b0b1
            MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX    0x1b0b1 
        /*    MX6UL_PAD_UART3_RX_DATA__UART2_DCE_RTS    0x1b0b1
            MX6UL_PAD_UART3_TX_DATA__UART2_DCE_CTS    0x1b0b1 */
        >;
    };
    
    pinctrl_uart2dte: uart2dtegrp {
        fsl,pins = <
        /*    MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX    0x1b0b1
            MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX    0x1b0b1
            MX6UL_PAD_UART3_RX_DATA__UART2_DTE_CTS    0x1b0b1
            MX6UL_PAD_UART3_TX_DATA__UART2_DTE_RTS    0x1b0b1 */
        >;
    };
    
12 定义led管脚
屏蔽 GPIO1_IO03 此管脚当作wifi模块的复位管脚了
    pinctrl_tsc: tscgrp {
        fsl,pins = <
            MX6UL_PAD_GPIO1_IO01__GPIO1_IO01        0xb0
            MX6UL_PAD_GPIO1_IO02__GPIO1_IO02        0xb0
        /*    MX6UL_PAD_GPIO1_IO03__GPIO1_IO03        0xb0 */
            MX6UL_PAD_GPIO1_IO04__GPIO1_IO04        0xb0
        >;
    };
    
在根节点下创建leds节点
    leds {
    compatible = "gpio-leds";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_gpio_leds>;

        led1{
            label = "sys-led";
            gpios = <&gpio3 5 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "heartbeat";
            default-state = "on";
        };
        led2{
            label = "tunnel-led1";
            gpios = <&gpio3 9 GPIO_ACTIVE_HIGH>;
            default-state = "off";
        };
        led3{
            label = "tunnel-led2";
            gpios = <&gpio3 8 GPIO_ACTIVE_HIGH>;
            default-state = "off";
        };
        led4{
            label = "tunnel-led3";
            gpios = <&gpio3 7 GPIO_ACTIVE_HIGH>;
            default-state = "off";
        };
        led5{
            label = "wifi_reset";
            gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
            default-state = "off";
        };
    };

你可能感兴趣的:(物联网)