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节点。

重新烧录系统启动后,可以执行以下命令进行查看:
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节点。

重新烧录系统启动后,可以执行以下命令进行查看:
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 = <®_sd1_vmmc>;
no-1-8-v;
non-removable;
cd-post;
pm-ignore-notify;
wifi-host;
status = "okay";
};
|
将以上内容写到主设备树,然后重新编译设备树并烧录到板卡即可开启wifi设备。


启动板卡后可以执行 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设备

快速手册文档中说明如果要使能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文件,确定实际引脚、复用功能、避免冲突。