1. 程式人生 > >MYS-6ULX-IOT 開發板測評——支援 RTL8188 WiFi 模組

MYS-6ULX-IOT 開發板測評——支援 RTL8188 WiFi 模組

WiFi 模組

  MYS-6ULX-IOT 開發板與 MYS-6ULX-IND 的區別,除了一個是商業級微處理器,一個是工業級微處理器之外,另一個顯著的區別就是 MYS-6ULX-IOT 上還搭載了 USB WiFi 模組。

這裡寫圖片描述

  WiFi 內建晶片型號為 Realtek 公司的 RTL8188ETV,天線座子型號為泰科 1566230-1,預設配備一根天線,開發者也可以根據自己需要選擇合適的天線來使用 WiFi 功能。由於 i.MX6ull 的資源限制,USB WiFi 模組連線到的是 Hub 晶片擴充套件的 USB 埠,具體電路連線情況如下:

這裡寫圖片描述

構建系統

  前面我們通過 bitbake core-image-minimal

構建了一個 MYS-6ULX-IOT 最小版本的 Linux 發行版。但是這個版本並不包含 RTL8188 WiFi 模組的驅動,因此我們還需要做一些工作,以便能夠驅動該模組,實現無線網路通訊。
  進入 Yocto 根目錄,如果還沒有構建 minimal 的系統,那麼執行:

$ DISTRO=myir-imx-fb MACHINE=mys6ull14x14 source fsl-setup-release.sh -b build-myir

  如果已經構建過,則執行:

$ source setup-environment build-myir

  執行完成後自動切換到 build-myir 目錄,接下來我們看一下除了 minimal 映象,MYiR 還為我們提供了什麼:

$ tree -L 3 ../sources/meta-myir-imx6ulx/

  可以看到,在 recipes-core/images 目錄下有 core-image-base.bbappend 和 core-image-minimal.bbappend 兩個配方。其中 core-image-base.bbappend 的內容如下:

IMAGE_INSTALL += "imx-kobs \
    tslib-calibrate \
    tslib-conf \
    tslib-tests \
    bzip2 \
    gzip \
    canutils \
    dosfstools \
mtd-utils \ mtd-utils-ubifs \ ntpdate \ vlan \ tar \ net-tools \ ethtool \ evtest \ i2c-tools \ iperf3 \ iproute2 \ iputils \ udev-extraconf \ rpm \ iperf \ openssh \ openssl \ v4l-utils \ ${@base_contains("MACHINE", "mys6ull14x14", "rtl8188eu-driver", "", d)} \ alsa-utils \ myir-rc-local"

  我們發現其中包含了 rtl8188eu-driver 驅動,那麼我們就開始構建 base 系統吧:

$ bitbake core-image-base

  在構建過程中遇到了錯誤,這裡摘取一部分錯誤提示:

ERROR: rtl8188eu-driver-0.1-r0 do_install: oe_runmake failed
ERROR: rtl8188eu-driver-0.1-r0 do_install: Function failed: do_install (log file is located at /home/rudy/workspace_hd/IoT/MYS-6ULX-IOT/04-Source/fsl-release-yocto/build-myir/tmp/work/mys6ull14x14-poky-linux-gnueabi/rtl8188eu-driver/0.1-r0/temp/log.do_install.29532)

Log data follows:
|  DEBUG: Executing shell function do_install
|  NOTE: make -j 4 
   KERNEL_SRC=/home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work-shared/mys6ull14x14/kernel-source 
   DEPMOD=echo 
   INSTALL_MOD_PATH=/home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work/mys6ull14x14-poky-linux-gnueabi/rtl8188eu-driver/0.1-r0/image
   CC=arm-poky-linux-gnueabi-gcc -mno-thumb-interwork -marm -fuse-ld=bfd
   LD=arm-poky-linux-gnueabi-ld.bfd
   O=/home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work-shared/mys6ull14x14/kernel-build-artifacts
   modules_install
|  #install -p -m 644 8188eu.ko /lib/modules//kernel/drivers/net/wireless
|  make -C /home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work-shared/mys6ull14x14/kernel-source M= modules_install
|  make[1]: Entering directory '/home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work-shared/mys6ull14x14/kernel-source'
|  make[2]: Entering directory '/home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work-shared/mys6ull14x14/kernel-build-artifacts'
|  cp: cannot stat './modules.order': No such file or directory
|  /home/rudy/workspace_hd/IoT/04-Source/fsl-release-yocto/build-myir/tmp/work-shared/mys6ull14x14/kernel-source/Makefile:1123: recipe for target '_modinst_' failed
| 

  經檢查、分析,錯誤出現在構建 rtl8188eu-driver 驅動過程中 modules_install 失敗了,其中 M 的值居然是空。於是找到該驅動原始碼的 Makefile,路徑為:tmp/work/mys6ull14x14-poky-linux-gnueabi/rtl8188eu-driver/0.1-r0/git/Makefile。定位到 module_install,內容如下:

modules_install:
    #install -p -m 644 8188eu.ko $(MODDESTDIR)
    $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install

  雖然 M=$(SRC),但 SRC 卻沒有定義(可能是從環境變數或上層 Makefile 傳過來吧)。不管怎麼樣,在構建過程中確實出錯了。
  我們看一下 rtl8188eu-driver 軟體包的源路徑:

$ bitbake -e rtl8188eu-driver | grep ^SRC_URI
SRC_URI="git://github.com/MYiR-Dev/RTL8188eu-driver;protocol=https;branch=master"

  然後找到 GitHub 上,OMG!發現是這樣的:


modules_install:
    #install -p -m 644 8188eu.ko $(MODDESTDIR)
    $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules_install

  明明是 PWD 而不是 SRC 啊!
  檢查配方檔案:sources/meta-myir-imx6ulx/recipes-kernel/rtl8188eu-driver/rtl8188eu-driver_0.1.bb,看看 SRCREV 的值對不對,或者直接把本地 Makefile 改過來。
  OK,重新 bitbake core-image-base 一下,這次構建成功了!

WiFi 測試

  更新系統後,上電啟動 MYS-6ULX-IOT,登入 Linux Shell。檢查驅動:

root@mys6ull14x14:~# lsmod
Module                  Size  Used by
8188eu                758430  0

  執行 ifconfig -a,看到增加了 wlan0 網絡卡:

wlan0     Link encap:Ethernet  HWaddr a0:2c:36:e7:22:52  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

  看起來 WiFi 模組已經準備就緒了,接下來可以測試了。實際上 RTL8188 WiFi 模組支援 Client 和 AP 模式,本文只進行 Client 測試。
  首先,使用 wpa_passphrase 生成對應 WiFi 熱點 SSID 的密碼配置檔案,執行以下命令:

# wpa_passphrase "LittleFlowerPig" >> wifi.conf

  然後輸入對應的密碼。生成的 wifi.conf 檔案內容如下:

# reading passphrase from stdin
network={
        ssid="LittleFlowerPig"
        #psk="100%100%100%"
        psk=5d19fc4a6dc4beebe01c9be29cd613227d84609c871aff37c0c82460410c94c4
}

  接著使用 wpa_supplicant 命令,使 MYS-6ULX-IOT 的 WiFi 模組連線到 WiFi 熱點:

# wpa_supplicant -D wext -B -i wlan0 -c wifi.conf

  然後,使用 udhcpc 獲取 ip 地址,這樣就可以使用了

# udhcpc -b -i wlan0 -R

  連線成功,ping 一下我的網站吧:

# ping www.luckydarcy.top
PING www.luckydarcy.top (120.78.197.79) 56(84) bytes of data.
64 bytes from 120.78.197.79: icmp_seq=1 ttl=51 time=7.94 ms
64 bytes from 120.78.197.79: icmp_seq=2 ttl=51 time=15.0 ms
64 bytes from 120.78.197.79: icmp_seq=3 ttl=51 time=10.1 ms
64 bytes from 120.78.197.79: icmp_seq=4 ttl=51 time=10.5 ms

--- www.luckydarcy.top ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 16323ms
rtt min/avg/max/mdev = 7.942/10.936/15.082/2.592 ms

  為了實現開機自動連線,可以在 /etc/rc.local 中增加以下命令:

wpa_supplicant -D wext -B -i wlan0 -c /home/root/wifi.conf
udhcpc -b -i wlan0 -R

  這樣,我們在 MYS-6ULX-IOT 開發板上成功地驅動了 RTL8188 WiFi 模組,後面我們會在此基礎上增加應用層協議實現物聯網應用。