1. 外设接口使能

由于buildroot系统不支持设备树插件,因此除了主设备树默认配置的外设外,如果需要额外使能某些外设,需要修改主设备树,添加相应的节点,然后编译设备树重新烧录系统。

1.1. 主设备树节点介绍

各版本的设备树在内核源码路径如下:

  • eMMC/SD版本设备树: ebf_linux_kernel/arch/arm/boot/dts/imx6ull-mmc-npi-lite.dts

  • nand版本设备树: ebf_linux_kernel/arch/arm/boot/dts/imx6ull-nand-npi-lite.dts

由于设备树内容比较长,可以下载以下给各节点添加了注释的dts源码进行查看:

查看主设备树源码可知,主设备树仅配置以下内容:

  • 分配内存

  • 设置系统心跳灯

  • 添加74hc595扩展io

  • 设置cpu频率、状态

  • 配置两网口

  • 配置一些引脚复用

  • 添加电源按键

  • 配置debug串口uart1

  • 配置两个usb口

  • 配置sd卡

  • 配置emmc或者nand

1.2. 添加外设接口

大部分外设接口,如i2c、adc、pwm、can等均没有配置,那么如何开启呢?在Debian系统支持设备树插件,可以通过设备树插件方式开启,这种方式实际就是追加修改主设备树内容, 在buildroot系统不支持设备树插件,但可以参考设备树插件写法,把内容直接加到主设备树末尾,从而达到追加修改的效果。

野火提供了大量的设备树插件用于开启外设,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#进入内核源码设备树插件目录
cd ebf_linux_kernel/arch/arm/boot/dts/overlays/
#查看插件
ls *.dts

#信息输出如下
imx-fire-485r1-overlay.dts      imx-fire-ds18b20-overlay.dts       imx-fire-i2c4-overlay.dts              imx-fire-sound-overlay.dts
imx-fire-485r1-rts-overlay.dts  imx-fire-ecspi1-overlay.dts        imx-fire-i2c-gpio-overlay.dts          imx-fire-touch-capacitive-ft5726-overlay.dts
imx-fire-485r2-overlay.dts      imx-fire-ecspi2-overlay.dts        imx-fire-infra-overlay.dts             imx-fire-touch-capacitive-goodix-overlay.dts
imx-fire-485r2-rts-overlay.dts  imx-fire-ecspi3-overlay.dts        imx-fire-key-overlay.dts               imx-fire-touch-capacitive-gt1151-overlay.dts
imx-fire-74hc595-overlay.dts    imx-fire-ecspi3-slave-overlay.dts  imx-fire-lcd-overlay.dts               imx-fire-touch-resisitive-4wires-overlay.dts
imx-fire-adc1-overlay.dts       imx-fire-ecspi4-overlay.dts        imx-fire-led-overlay.dts               imx-fire-uart2-overlay.dts
imx-fire-bluetooth-overlay.dts  imx-fire-emmc-overlay.dts          imx-fire-mpu6050-overlay.dts           imx-fire-uart3-overlay.dts
imx-fire-btwifi-overlay.dts     imx-fire-gpmi-overlay.dts          imx-fire-otg1-overlay.dts              imx-fire-uart4-overlay.dts
imx-fire-cam-overlay.dts        imx-fire-hdmi-overlay.dts          imx-fire-pwm-led-overlay.dts           imx-fire-uart5-overlay.dts
imx-fire-can1-overlay.dts       imx-fire-i2c1-overlay.dts          imx-fire-pwm-overlay.dts               imx-fire-uart6-overlay.dts
imx-fire-can2-overlay.dts       imx-fire-i2c2-overlay.dts          imx-fire-resistive-screen-overlay.dts  imx-fire-uart7-overlay.dts
imx-fire-dht11-overlay.dts      imx-fire-i2c3-overlay.dts          imx-fire-sound-aic3106-overlay.dts     imx-fire-uart8-overlay.dts

1.2.1. 开启i2c接口

以开启i2c1接口为例,imx-fire-i2c1-overlay.dts设备树插件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/dts-v1/;
/plugin/;
#include "../imx6ul-pinfunc.h"
#include "../imx6ull-pinfunc.h"

/ {
    fragment@0 {
        target = <&i2c1>;
        __overlay__ {
            clock-frequency = <100000>;
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_i2c1>;
            status = "okay";
            #address-cells = <1>;
            #size-cells = <0>;
        };
    };

    fragment@1{
        target = <&iomuxc>;
        __overlay__ {
            pinctrl_i2c1: i2c1grp {
                fsl,pins = <
                    MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
                    MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
                >;
            };
        };
    };
};

以上追加配置了i2c1节点,然后在iomuxc节点添加了引脚配置,可以将以上内容转换为主设备树语法,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";
    #address-cells = <1>;
    #size-cells = <0>;
};

&iomuxc {
    pinctrl_i2c1: i2c1grp {
    fsl,pins = <
        MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
        MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
    >;
    };
};

将以上内容写到主设备树,然后重新编译设备树并烧录到板卡即可打开i2c1节点。

../../_images/interface_enable_0.jpg

重新烧录系统启动后,可以执行以下命令进行查看:

1
2
3
#查看i2c接口
ls /dev/i2c*
/dev/i2c-0

以上i2c-0就是i2c1接口,默认从0开始注册,也即i2c1->i2c-0,i2c3->i2c-2。如果没有接口生成,需要确认引脚复用是否与其他节点冲突。

1.2.2. 开启uart接口

以开启uart2接口为例,imx-fire-uart2-overlay.dts设备树插件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/dts-v1/;
/plugin/;
#include "../imx6ul-pinfunc.h"
#include "../imx6ull-pinfunc.h"
#include "dt-bindings/gpio/gpio.h"

/ {
    fragment@0 {
        target=<&uart2>;
        __overlay__ {
            pinctrl-names = "default";
            pinctrl-0 = <&pinctrl_uart2>;
            status = "okay";
        };
    };
    fragment@1 {
        target=<&iomuxc>;
        __overlay__ {
            pinctrl_uart2:uart2grp {
                fsl,pins = <
                    MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX   0x1b0b1
                    MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX   0x1b0b1
                >;
            };
        };
    };
};

以上追加配置了uart2节点,然后在iomuxc节点添加了引脚配置,可以将以上内容转换为主设备树语法,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
&uart2 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_uart2>;
    status = "okay";
};

&iomuxc {
    pinctrl_uart2:uart2grp {
    fsl,pins = <
        MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX       0x1b0b1
        MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX       0x1b0b1
    >;
    };
};

将以上内容写到主设备树,然后重新编译设备树并烧录到板卡即可打开uart2节点。

../../_images/interface_enable_1.jpg

重新烧录系统启动后,可以执行以下命令进行查看:

1
2
3
#查看uart接口
ls /dev/ttymxc*
/dev/ttymxc0  /dev/ttymxc1

以上ttymxc0就是uart1接口(debug接口),默认从0开始注册,也即uart1->ttymxc0,uart2->ttymxc1。如果没有接口生成,需要确认引脚复用是否与其他节点冲突。

1.2.3. 开启屏幕接口

野火imx6ull支持使用野火4.3、5、7寸RGB屏幕,要支持屏幕显示和触摸,需要开启以下插件:

4.3寸、5寸:

  • imx-fire-i2c1-overlay.dts

  • imx-fire-touch-capacitive-gt1151-overlay.dts

  • imx-fire-lcd-overlay.dts

7寸:

  • imx-fire-i2c1-overlay.dts

  • imx-fire-touch-capacitive-goodix-overlay.dts

  • imx-fire-lcd-overlay.dts

以7寸屏幕为例,将设备树插件源码转换为主设备树语法如下:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/ {
    /* 省略主设备树根节点原来部分内容 */

    backlight {
        compatible = "pwm-backlight";
        //pwms = <&pwm1 0 50000>;
        pwms = <&pwm1 0 20000>;
        brightness-levels = <0 1 2 3 4 5 6 7 8 9 10
                            11 12 13 14 15 16 17 18 19 20
                            21 22 23 24 25 26 27 28 29 30
                            31 32 33 34 35 36 37 38 39 40
                            41 42 43 44 45 46 47 48 49 50
                            51 52 53 54 55 56 57 58 59 60
                            61 62 63 64 65 66 67 68 69 70
                            71 72 73 74 75 76 77 78 79 80
                            81 82 83 84 85 86 87 88 89 90
                            91 92 93 94 95 96 97 98 99 100>;
        default-brightness-level = <90>;
        status = "okay";
    };

    /* 省略主设备树根节点原来部分内容 */
};

&lcdif {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_lcdif_dat &pinctrl_lcdif_ctrl>;
    display = <&display0>;
    status = "okay";

    display0: display {
        bits-per-pixel = <16>;
        bus-width = <24>;

        display-timings {
            native-mode = <&timing1>;

        timing1: timing1 {
                mode_name = "TFT50AB";
                clock-frequency = <27000000>;
                hactive = <800>;
                vactive = <480>;
                hfront-porch = <40>;
                hback-porch = <46>;
                hsync-len = <1>;
                vback-porch = <23>;
                vfront-porch = <13>;
                vsync-len = <3>;
                hsync-active = <0>;
                vsync-active = <0>;
                de-active = <1>;
                pixelclk-active = <0>;
            };
        };
    };
};

&pwm1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_pwm1>;
    status = "okay";
};

&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";
    #address-cells = <1>;
    #size-cells = <0>;

    gtxx_tsc@5d {
        compatible = "goodix,gt9xx";
        pinctrl-0 = <&pinctrl_tsc_reset>;
        pinctrl-1 = <&pinctrl_tsc_irq>;
        reg = <0x5d>;
        status = "okay";
        /*gpio*/
        reset-gpios = <&gpio3 4 GPIO_ACTIVE_LOW>;
        irq-gpios = <&gpio5 9 GPIO_ACTIVE_HIGH>;
        /*interrupt­*/
        interrupt-parent = <&gpio5>;
        interrupts = <9 IRQ_TYPE_EDGE_FALLING>;
        irq-flags = <2>;            /*1:rising 2: falling*/
    };
};

&iomuxc {
    pinctrl_lcdif_ctrl: lcdifctrlgrp {
        fsl,pins = <
            MX6UL_PAD_LCD_CLK__LCDIF_CLK        0x79
            MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79
            MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79
            MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79
        >;
    };
    pinctrl_lcdif_dat: lcdifdatgrp {
        fsl,pins = <
            MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79
            MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79
            MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79
            MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79
            MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79
            MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79
            MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79
            MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79
            MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79
            MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79
            MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79
            MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79
            MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79
            MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79
            MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79
            MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79
            MX6UL_PAD_LCD_DATA16__LCDIF_DATA16  0x79
            MX6UL_PAD_LCD_DATA17__LCDIF_DATA17  0x79
            MX6UL_PAD_LCD_DATA18__LCDIF_DATA18  0x79
            MX6UL_PAD_LCD_DATA19__LCDIF_DATA19  0x79
            MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79
            MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79
            MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79
            MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79
        >;
    };
    pinctrl_pwm1: pwm1grp {
        fsl,pins = <
            MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x000010B1
        >;
    };

    pinctrl_tsc_reset: tscresetgrp {
        fsl,pins = <
            /* used for tsc reset */
            MX6UL_PAD_LCD_RESET__GPIO3_IO04         0x05
        >;
    };

    pinctrl_i2c1: i2c1grp {
        fsl,pins = <
            MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0
            MX6UL_PAD_UART4_RX_DATA__I2C1_SDA 0x4001b8b0
        >;
    };
};

&iomuxc_snvs {
    pinctrl_tsc_irq: tsc_irq {
        fsl,pins = <
            MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09        0x4001b8b0
        >;
    };
};

将以上内容写到主设备树,然后重新编译设备树并烧录到板卡即可使能7寸屏幕。

  • 接入屏幕后,如果屏幕背光亮并且屏幕左上角显示小企鹅,即说明显示正常。

  • 可以通过以下命令检测触摸是否正常:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#查看启动信息
dmesg | grep Goodix

#查看触摸事件
ls /dev/input/event1

#检测屏幕,执行后点击屏幕
hexdump /dev/input/event1

#点击屏幕后信息输出如下
root@buildroot:~# hexdump /dev/input/event1
0000000 054b 0000 8f88 000b 0003 0039 0000 0000
0000010 054b 0000 8f88 000b 0003 0035 00d1 0000
0000020 054b 0000 8f88 000b 0003 0036 00d5 0000
0000030 054b 0000 8f88 000b 0003 0030 000c 0000
0000040 054b 0000 8f88 000b 0003 0032 000c 0000

如果生成event1事件,并且hexdump检测event1事件,点击屏幕有数据上报则说明触摸正常。

1.2.4. 开启wifi接口

野火imx6ull pro板卡板载ap6212/ap6236 wifi芯片,如果要使用wifi,在Debian系统中需要打开imx-fire-btwifi-overlay.dts和imx-fire-74hc595-overlay.dts插件。

其中imx-fire-btwifi-overlay.dts作wifi的主要配置,而开启imx-fire-74hc595-overlay.dts是因为wifi使用了74hc595的扩展io。

将两设备树插件源码转换为主设备树语法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/ {
    /* 省略主设备树根节点原来部分内容 */

    bcmdhd_wlan_0: bcmdhd_wlan@0 {
        compatible = "android,bcmdhd_wlan";
        wlreg_on-supply = <&wlreg_on>;
    };

    regulators {
        compatible = "simple-bus";
        #address-cells = <1>;
        #size-cells = <0>;


        reg_sd1_vmmc: regulator@1 {
            compatible = "regulator-fixed";
            regulator-name = "VSD_3V3";
            regulator-min-microvolt = <3300000>;
            regulator-max-microvolt = <3300000>;
            gpio = <&gpio1 9 GPIO_ACTIVE_HIGH>;
            off-on-delay = <20000>;
            enable-active-high;
        };

        reg_wifi_3v3: regulator-wifi-3v3 {
            compatible = "regulator-fixed";
            regulator-name = "WIFI_3V3";
            regulator-min-microvolt = <3300000>;
            regulator-max-microvolt = <3300000>;
            gpio = <&gpio1 1 GPIO_ACTIVE_HIGH>;
            enable-active-high;
        };

        wlreg_on: fixedregulator@100 {
            compatible = "regulator-fixed";
            regulator-min-microvolt = <5000000>;
            regulator-max-microvolt = <5000000>;
            regulator-name = "wlan-en-gpio";
            gpio = <&gpio_spi 4 0>;
            startup-delay-us = <20000>;
            enable-active-high;
        };

    /* 省略主设备树根节点原来部分内容 */
};

&spi4 {
    status = "okay";
};

    &iomuxc {
    pinctrl_wifi: wifigrp {
        fsl,pins = <
            MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x010B1
        >;
    };
};

&usdhc1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_usdhc1 &pinctrl_wifi>;

    pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
    pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
    /*cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;*/
    keep-power-in-suspend;
    enable-sdio-wakeup;
    vmmc-supply = <&reg_sd1_vmmc>;
    no-1-8-v;
    non-removable;
    cd-post;
    pm-ignore-notify;
    wifi-host;
    status = "okay";
};

将以上内容写到主设备树,然后重新编译设备树并烧录到板卡即可开启wifi设备。

../../_images/interface_enable_3.jpg
../../_images/interface_enable_4.jpg

启动板卡后可以执行 ifconfig -a 查看,如果存在wlan0网卡则配置成功。

但此时wifi还不能正常使用,由于wifi/蓝牙是需要固件的,因此除了设备树、网卡驱动,还需要在文件系统添加网卡固件。

固件路径配置位于内核配置文件npi_v7_lite_defconfig中,由以下配置项指定:

1
CONFIG_BCMDHD_FW_PATH="/lib/firmware/bcm/AP6xxx/"

所以需要把网卡固件拷贝到文件系统的/lib/firmware/bcm/AP6xxx/目录下。

将firmware.tar.gz传到板卡然后解压

1
2
3
4
5
6
tar xvf firmware.tar.gz
cd firmware

mkdir -p /lib/firmware

cp -rfdp ./* /lib/firmware/

添加完成后重启板卡,执行 ifconfig -a 查看存在wlan0,然后执行以下命令激活网卡。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#查看网卡
ifconfig -a

#激活网卡
ifconfig wlan0 up

#信息输出如下
[  632.158092] [dhd-wlan0] wl_android_wifi_on : in g_wifi_on=0
[  632.340334] mmc0: queuing unknown CIS tuple 0x80 (2 bytes)
[  632.366439] mmc0: queuing unknown CIS tuple 0x80 (3 bytes)
[  632.391481] mmc0: queuing unknown CIS tuple 0x80 (3 bytes)
[  632.432496] mmc0: queuing unknown CIS tuple 0x80 (7 bytes)
[  633.591448] [dhd] dhd_conf_read_config : Ignore config file /lib/firmware/bcm/AP6xxx/config.txt
[  633.600207] [dhd] dhd_conf_set_path_params : Final fw_path=/lib/firmware/bcm/AP6xxx/fw_bcm43438a0.bin
[  633.610587] [dhd] dhd_conf_set_path_params : Final nv_path=/lib/firmware/bcm/AP6xxx/nvram_ap6212.txt
[  633.620252] [dhd] dhd_conf_set_path_params : Final clm_path=/lib/firmware/bcm/AP6xxx/clm_bcm43438a0.blob
[  633.630210] [dhd] dhd_conf_set_path_params : Final conf_path=/lib/firmware/bcm/AP6xxx/config.txt
[  633.856233] [dhd] dhd_conf_set_txglom_params : txglom_mode=multi-desc
[  633.863783] [dhd] dhd_conf_set_txglom_params : txglomsize=36, deferred_tx_len=0
[  633.871113] [dhd] dhd_conf_set_txglom_params : txinrx_thres=-1, dhd_txminmax=1
[  633.879062] [dhd] dhd_conf_set_txglom_params : tx_max_offset=0, txctl_tmo_fix=300
[  633.886989] [dhd] dhd_conf_get_disable_proptx : fw_proptx=1, disable_proptx=-1
[  633.991969] [dhd] dhd_conf_set_country : set country CN, revision 0
[  634.006464] [dhd] dhd_conf_set_country : Country code: CN (CN/0)
[  634.020775] [dhd] CONFIG-ERROR) dhd_conf_set_intiovar : ampdu_mpdu setting failed -29
[  634.029765] [dhd-wlan0] wl_android_wifi_on : Success

从信息可以看到加载了网卡固件,最后激活成功。

要连接wifi还需要相应的工具,可以使用iw和wpa_supplicant工具,编译buildroot文件系统的时候添加以下配置项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
BR2_PACKAGE_IW=y

BR2_PACKAGE_WPA_SUPPLICANT=y
BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN=y
BR2_PACKAGE_WPA_SUPPLICANT_AP_SUPPORT=y
BR2_PACKAGE_WPA_SUPPLICANT_MESH_NETWORKING=y
BR2_PACKAGE_WPA_SUPPLICANT_EAP=y
BR2_PACKAGE_WPA_SUPPLICANT_HOTSPOT=y
BR2_PACKAGE_WPA_SUPPLICANT_WPS=y
BR2_PACKAGE_WPA_SUPPLICANT_CLI=y
BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y

添加iw和wpa_supplicant工具后可执行以下命令连接wifi:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#打开wifi
ip link set wlan0 up

#搜索附近的wifi
iw dev wlan0 scan | grep SSID

#创建/etc/wpa_supplicant/wpa_supplicant.conf文件配置wifi相关账号密码
mkdir -p /etc/wpa_supplicant/
vi /etc/wpa_supplicant/wpa_supplicant.conf

#wpa_supplicant.conf内容如下,修改为自己的wifi名称和密码
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
update_config=1

network={
    ssid="xxx" # Wi-Fi名字
    psk="xxx" # Wi-Fi密码
    key_mgmt=WPA-PSK
}

#保存内容后退出,并使用以下命令连接wifi
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf &

#申请动态ip
udhcpc -b -i wlan0
#如果成功获取ip则信息输出,类似如下
udhcpc: started, v1.33.0
udhcpc: sending discover
udhcpc: sending select for 10.169.169.5
udhcpc: lease of 10.169.169.5 obtained, lease time 7200
deleting routers
adding dns 119.29.29.29
adding dns 223.5.5.5

如果连接以及申请动态ip成功则wlan0会获取到ip和网关等信息。

1.2.5. 开启其他接口

仅以开启i2c和uart接口作详细说明,如果需要开启其他外设接口,可以参考 快速使用手册 各外设对应的章节。

每一章节如果需要通过开启设备树插件来打开外设,在文档中均会说明需要如何修改设备树插件配置,以spi章节为例: 使能SPI设备

../../_images/interface_enable_2.jpg

快速手册文档中说明如果要使能ecspi3外设需要开启imx-fire-ecspi3.dtbo,同时需要关闭imx-fire-i2c1.dtbo。

对应buildroot系统也即需要把imx-fire-ecspi3-overlay.dts内容加到主设备树, 并且不要把imx-fire-uart2-overlay.dts内容加到主设备树,避免uart2和ecspi3冲突。

其他外设接口均是如此,本教程不作赘述。

1.3. 避免外设冲突

如何避免外设冲突呢?简单来说就是同一个引脚同一时间只能使用一种复用功能。

引脚的复用功能定义在以下文件:

  • ebf_linux_kernel/arch/arm/boot/dts/imx6ul-pinfunc.h

  • ebf_linux_kernel/arch/arm/boot/dts/imx6ull-pinfunc.h

其中imx6ull-pinfunc.h引用了imx6ul-pinfunc.h,所以imx6ull大部分引脚使用的是imx6ul的配置。

以上一小节,uart2和ecspi3冲突进行说明:

截取imx-fire-uart2-overlay.dts和imx-fire-ecspi3-overlay.dts的引脚配置内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#imx-fire-uart2-overlay.dts中配置uart2引脚复用内容
fragment@1 {
    target=<&iomuxc>;
    __overlay__ {
        pinctrl_uart2:uart2grp {
            fsl,pins = <
                MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX       0x1b0b1
                MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX       0x1b0b1
            >;
        };
    };
};


#imx-fire-ecspi3-overlay.dts中配置ecspi3引脚复用内容
fragment@1 {
    target = <&iomuxc>;
    __overlay__ {
        pinctrl_ecspi3:ecspi3grp {
            fsl,pins = <
                MX6UL_PAD_UART2_TX_DATA__ECSPI3_SS0     0x1a090//0x10b0
                MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK                0x11090//0x10b0
                MX6UL_PAD_UART2_CTS_B__ECSPI3_MOSI                  0x11090//0x10b0
                MX6UL_PAD_UART2_RTS_B__ECSPI3_MISO                  0x11090//0x10b0
            >;
        };
    };
};

从上面内容可见,MX6UL_PAD_UART2_TX_DATA引脚在两插件分别配置为了UART2_DCE_TX、ECSPI3_SS0,MX6UL_PAD_UART2_RX_DATA引脚在两插件分别配置为了UART2_DCE_RX、ECSPI3_SCLK,因此冲突。

打开imx6ul-pinfunc.h文件,截取MX6UL_PAD_UART2_TX_DATA引脚和MX6UL_PAD_UART2_RX_DATA引脚内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#define MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX               0x0094 0x0320 0x0000 0 0
#define MX6UL_PAD_UART2_TX_DATA__UART2_DTE_RX               0x0094 0x0320 0x062c 0 0
#define MX6UL_PAD_UART2_TX_DATA__ENET1_TDATA02              0x0094 0x0320 0x0000 1 0
#define MX6UL_PAD_UART2_TX_DATA__I2C4_SCL           0x0094 0x0320 0x05bc 2 0
#define MX6UL_PAD_UART2_TX_DATA__CSI_DATA06         0x0094 0x0320 0x04dc 3 0
#define MX6UL_PAD_UART2_TX_DATA__GPT1_CAPTURE1              0x0094 0x0320 0x058c 4 1
#define MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20         0x0094 0x0320 0x0000 5 0
#define MX6UL_PAD_UART2_TX_DATA__ECSPI3_SS0         0x0094 0x0320 0x0560 8 0

#define MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX               0x0098 0x0324 0x062c 0 1
#define MX6UL_PAD_UART2_RX_DATA__UART2_DTE_TX               0x0098 0x0324 0x0000 0 0
#define MX6UL_PAD_UART2_RX_DATA__ENET1_TDATA03              0x0098 0x0324 0x0000 1 0
#define MX6UL_PAD_UART2_RX_DATA__I2C4_SDA           0x0098 0x0324 0x05c0 2 0
#define MX6UL_PAD_UART2_RX_DATA__CSI_DATA07         0x0098 0x0324 0x04e0 3 0
#define MX6UL_PAD_UART2_RX_DATA__GPT1_CAPTURE2              0x0098 0x0324 0x0590 4 0
#define MX6UL_PAD_UART2_RX_DATA__GPIO1_IO21         0x0098 0x0324 0x0000 5 0
#define MX6UL_PAD_UART2_RX_DATA__SJC_DONE           0x0098 0x0324 0x0000 7 0
#define MX6UL_PAD_UART2_RX_DATA__ECSPI3_SCLK                0x0098 0x0324 0x0554 8 0

从上面内容可见,MX6UL_PAD_UART2_TX_DATA引脚实际就是GPIO1_IO20引脚,有8种复用功能;MX6UL_PAD_UART2_RX_DATA引脚实际就是GPIO1_IO21引脚,有9种复用功能。

当需要配置某个引脚的外设功能或配置某个外设功能使用的引脚时可参考imx6ul-pinfunc.h以及imx6ull-pinfunc.h文件,确定实际引脚、复用功能、避免冲突。