Hãy kết bạn RaspberryPi với TP-Link TL-WN727N

Này Habr!

Có lần tôi quyết định kết nối quả mâm xôi của mình với Internet qua mạng.

Nói sớm hơn làm, vì mục đích này, tôi đã mua một chiếc còi usb wi-fi của công ty nổi tiếng TP-Link từ cửa hàng gần nhất. Tôi sẽ nói ngay rằng đây không phải là một loại mô-đun nano usb nào đó mà là một thiết bị khá lớn, có kích thước bằng một ổ đĩa flash thông thường (hoặc nếu bạn thích, có kích thước bằng ngón trỏ của một người đàn ông trưởng thành). Trước khi mua, tôi đã nghiên cứu một chút về danh sách các nhà sản xuất còi được hỗ trợ cho RPI và TP-Link có trong danh sách (tuy nhiên, sau này hóa ra, tôi đã không tính đến những điều nhỏ nhặt, bởi vì ma quỷ, như chúng ta đã biết). , có trong chi tiết). Vì vậy, câu chuyện lạnh lùng về những sai lầm của tôi bắt đầu; chúng tôi xin giới thiệu với các bạn một câu chuyện trinh thám gồm 3 phần. Đối với những người quan tâm, xin vui lòng tham khảo cat.

Bài báo Kết nối bộ điều hợp WiFi WN727N với Ubuntu/Mint Nó giúp tôi một phần, nhưng điều đầu tiên phải làm trước tiên.

Điều kiện của vấn đề

Được:

  1. máy tính bảng đơn Raspberry Pi 2 B v1.1 – 1 cái
  2. còi wifi usb WN727N - 1 cái
  3. một đôi bàn tay không cong vẹo - 2 cái
  4. Raspbian mới nhất được cài đặt làm HĐH (dựa trên Debian 10 Buster)
  5. phiên bản hạt nhân 4.19.73-v7+

Tìm: kết nối Internet (Wi-Fi được phân phối từ bộ định tuyến tại nhà của bạn)

Sau khi giải nén bộ chuyển đổi, tôi đọc hướng dẫn bên trong:

Khả năng tương thích hệ thống: Windows 10/8/7/XP (thậm chí cả bầu trời, thậm chí XP) và MacOS 10.9-10.13

Hmm, như thường lệ, không nói một lời nào về Linux. Đó là 2k19 và các trình điều khiển vẫn cần được lắp ráp thủ công ...

Chúng tôi có 2 trình biên dịch, 75 nghìn thư viện, XNUMX đốm màu nhị phân, một nửa mảng phụ nữ khỏa thân có logo và cả một biển tiêu đề của tất cả các ngôn ngữ và đánh dấu. Không phải đây là một bộ cần thiết cho công việc. Nhưng một khi bạn bắt đầu lắp ráp một hệ thống cho riêng mình thì việc dừng lại sẽ trở nên khó khăn. Điều duy nhất khiến tôi lo lắng là trình điều khiển Wi-Fi. Không có gì bất lực, vô trách nhiệm và tham nhũng hơn việc xây dựng trình điều khiển từ nguồn. Nhưng tôi biết rằng sớm hay muộn chúng tôi cũng sẽ chuyển sang thứ rác rưởi này.

Nói chung, như bạn đã biết, loay hoay với usb wi-fi trên Linux là một điều khó khăn. đau đớn và có phần vô vị (như món sushi của Nga).

Trong hộp còn có một đĩa CD chứa driver. Không có nhiều hy vọng, tôi nhìn vào những gì trên đó - họ chắc chắn chưa quan tâm đến nó. Tìm kiếm trên Internet đã đưa tôi đến trang web của nhà sản xuất, nhưng ở đó có trình điều khiển Linux chỉ để sửa đổi thiết bị v4, và trong vòng tay tôi là v5.21. Và bên cạnh đó, đối với các phiên bản kernel 2.6-3.16 rất cũ. Chán nản vì thất bại ngay từ đầu, tôi đã nghĩ rằng lẽ ra mình nên dùng TL-WN727N (nó đắt hơn một chút và có thể xử lý tốc độ 300Mbps so với 150 của tôi, nhưng hóa ra, điều này không thành vấn đề gì cả đối với quả mâm xôi, điều này sẽ được viết sau). Nhưng điều quan trọng nhất là trình điều khiển cho nó đã tồn tại và được cài đặt đơn giản dưới dạng một gói firmware-ralink. Bạn thường có thể xem bản sửa đổi của thiết bị trên thân thiết bị trên nhãn dán bên cạnh số sê-ri.

Tìm kiếm thêm trên Google và truy cập các diễn đàn khác nhau không mang lại nhiều điều tốt đẹp. Rõ ràng chưa có ai trước tôi đã thử kết nối một bộ chuyển đổi như vậy với Linux. Ừm, tôi may mắn như người chết đuối.

Mặc dù không, tôi nói dối, việc truy cập các diễn đàn (chủ yếu là tiếng Anh) cũng có kết quả, trong một số chủ đề có đề cập đến một ông lwfinger nào đó, người nổi tiếng với việc viết một số trình điều khiển cho bộ điều hợp Wi-Fi . Kho git của anh ấy nằm ở cuối bài viết trong các liên kết. Và bài học thứ hai tôi học được là bạn cần xác định thiết bị của mình để hiểu trình điều khiển nào có thể phù hợp với nó.

Phần 1: Bản sắc Bourne

Khi cắm máy vào cổng tất nhiên không có đèn LED nào sáng lên. Và nói chung, không rõ liệu thứ gì đó có hoạt động hay không.

Trước hết, để tìm hiểu xem kernel có nhìn thấy thiết bị của chúng tôi hay không, tôi tìm trong dmesg:

[  965.606998] usb 1-1.3: new high-speed USB device number 9 using dwc_otg
[  965.738195] usb 1-1.3: New USB device found, idVendor=2357, idProduct=0111, bcdDevice= 0.00
[  965.738219] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  965.738231] usb 1-1.3: Product: 802.11n NIC
[  965.738243] usb 1-1.3: Manufacturer: Realtek
[  965.738255] usb 1-1.3: SerialNumber: 00E04C0001

Hóa ra nó nhìn thấy, và thậm chí còn rõ ràng rằng có chip Realtek và VID/PID của chính thiết bị trên bus usb.

Chúng ta hãy đi xa hơn và nhìn lsusb, và ở đây một thất bại khác đang chờ chúng ta

Bus 001 Device 008: ID 2357:0111 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Hệ thống không biết đó là loại thiết bị gì và hiển thị một khoảng trống thay vì tên (mặc dù nhà cung cấp=2357 chắc chắn là TP-Link).

Ở giai đoạn này, người đọc tò mò có lẽ đã nhận thấy điều gì đó thú vị, nhưng chúng tôi sẽ để nó cho đến lúc này.

Việc nghiên cứu vấn đề về tên trống đã dẫn tôi đến một trang web có số nhận dạng, nơi nhập thông tin về VID/PID đã biết. 2357:0111 của chúng tôi không có ở đó. Hóa ra sau này, tiện ích lsusb sử dụng tập tin /usr/share/misc/usb.ids, đây chính là danh sách ID từ trang web này. Để làm đẹp màn hình, tôi chỉ cần thêm các dòng cho nhà cung cấp TP-Link vào hệ thống của mình.

2357  TP-Link
        0111  TL-WN727N v5.21

Chà, chúng tôi đã sửa lỗi hiển thị trong danh sách thiết bị, nhưng nó không giúp chúng tôi tiến gần hơn một bước đến việc chọn trình điều khiển. Để chọn driver, bạn cần biết còi của bạn được làm bằng chip gì. Những nỗ lực không thành công tiếp theo để tìm hiểu điều này trên Internet đã không dẫn đến điều gì tốt đẹp. Được trang bị một chiếc tuốc nơ vít có rãnh mỏng, tôi cẩn thận cạy nắp bộ chuyển đổi và đứa con tinh thần độc ác của bác Liao xuất hiện với tất cả sự trần trụi nguyên sơ của nó. Dưới kính lúp, bạn có thể thấy tên của con chip - RTL8188EUS. Điều này đã tốt rồi. Trên một số diễn đàn, tôi thấy các bài đăng nói rằng trình điều khiển của quý ông lwfinger đó rất phù hợp với con chip này (mặc dù anh ta chỉ viết về RTL8188EU).

Phần 2: Quyền lực tối cao của Bourne

Tôi tải xuống các nguồn trình điều khiển từ Git.

Đã đến lúc cài đặt lại Windows và làm những việc mà người dùng Linux thường làm - lắp ráp thứ gì đó từ một số loại. Hóa ra, việc lắp ráp các trình điều khiển khác rất ít so với việc biên dịch các chương trình:

make
sudo make install

nhưng để biên dịch các mô-đun hạt nhân, chúng ta cần các tệp tiêu đề hạt nhân cho phiên bản cụ thể của mình.

Có một gói trong kho lưu trữ tiêu đề hạt nhân Raspberrypi, nhưng nó chứa phiên bản kernel của các tập tin 4.19.66-v7l+, và điều đó không phù hợp với chúng tôi. Nhưng hóa ra, để có được các tiêu đề của phiên bản được yêu cầu, có một công cụ tiện lợi nguồn rpi (liên kết ở cuối trên Github), qua đó bạn có thể tải xuống các tiêu đề cần thiết. Chúng tôi sao chép kho lưu trữ, làm cho tập lệnh có thể thực thi được và chạy nó. Lần khởi chạy đầu tiên bị lỗi - không có tiện ích bc. May mắn thay, nó có trong kho và chúng ta chỉ cần cài đặt nó.

sudo apt-get install bc

Sau đó, việc khởi động lại và tải xuống các tiêu đề (và sau đó thiết lập thứ gì đó, bây giờ tôi không nhớ) sẽ mất một chút thời gian và bạn có thể ngồi lại trên ghế của mình, Windows đã trở nên tốt hơn trong mọi biểu hiện của nó.

Sau khi tất cả các tiêu đề đã được tải xuống, hãy kiểm tra xem thư mục có xuất hiện không /lib/mô-đun/4.19.73-v7+ và trong đó, liên kết tượng trưng trỏ đến nơi chứa các tệp đã tải xuống (đối với tôi đó là/home/pi/linux):

pi@raspberrypi:/home/pi/rtl8188eu# ls -l /lib/modules/4.19.73-v7+/
lrwxrwxrwx  1 root root     14 Sep 24 22:44 build -> /home/pi/linux

Giai đoạn chuẩn bị đã hoàn thành, bạn có thể bắt đầu lắp ráp. Việc lắp ráp lại các mô-đun sẽ mất một chút thời gian, Raspberry không phải là một con quái vật nhanh (nó có Cortex ARM v32 900 bit 7 MHz).
Vì vậy, mọi thứ được biên soạn. Chúng tôi cài đặt trình điều khiển ở bước thứ 2 (thực hiện cài đặt), đồng thời sao chép thêm các tệp chương trình cơ sở cần thiết để trình điều khiển hoạt động:

install:
        install -p -m 644 8188eu.ko  $(MODDESTDIR)
        @if [ -a /lib/modules/$(KVER)/kernel/drivers/staging/rtl8188eu/r8188eu.ko ] ; then modprobe -r r8188eu; fi;
        @echo "blacklist r8188eu" > /etc/modprobe.d/50-8188eu.conf
        cp rtl8188eufw.bin /lib/firmware/.
        /sbin/depmod -a ${KVER}
        mkdir -p /lib/firmware/rtlwifi
        cp rtl8188eufw.bin /lib/firmware/rtlwifi/.

Phần 3. Tối hậu thư của Bourne

Tôi cắm còi vào cổng và... không có gì xảy ra. Có phải tất cả đều không có gì?

Tôi bắt đầu nghiên cứu các tệp bên trong dự án và trong một trong số đó, tôi phát hiện ra vấn đề là gì: trình điều khiển chỉ định danh sách đầy đủ các mã định danh VID/PID mà nó có thể phân phát. Và để thiết bị của chúng tôi hoạt động với trình điều khiển này, tôi chỉ cần thêm id của mình vào tệp rtl8188eu/os_dep/usb_intf.c

static struct usb_device_id rtw_usb_id_tbl[] = {
        /*=== Realtek demoboard ===*/
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8179)}, /* 8188EUS */
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0179)}, /* 8188ETV */
        /*=== Customer ID ===*/
        /****** 8188EUS ********/
        {USB_DEVICE(0x07B8, 0x8179)}, /* Abocom - Abocom */
        {USB_DEVICE(0x0DF6, 0x0076)}, /* Sitecom N150 v2 */
        {USB_DEVICE(0x2001, 0x330F)}, /* DLink DWA-125 REV D1 */
        {USB_DEVICE(0x2001, 0x3310)}, /* Dlink DWA-123 REV D1 */
        {USB_DEVICE(0x2001, 0x3311)}, /* DLink GO-USB-N150 REV B1 */
        {USB_DEVICE(0x2001, 0x331B)}, /* D-Link DWA-121 rev B1 */
        {USB_DEVICE(0x056E, 0x4008)}, /* Elecom WDC-150SU2M */
        {USB_DEVICE(0x2357, 0x010c)}, /* TP-Link TL-WN722N v2 */
        {USB_DEVICE(0x2357, 0x0111)}, /* TP-Link TL-WN727N v5.21 */
        {}      /* Terminating entry */
};

Tôi đã biên dịch lại trình điều khiển và cài đặt lại nó trên hệ thống.

Và lần này mọi thứ bắt đầu. Đèn trên bộ chuyển đổi sáng lên và một thiết bị mới xuất hiện trong danh sách các giao diện mạng.

Xem giao diện không dây hiển thị như sau:

pi@raspberrypi:/home/pi/rtl8188eu# iwconfig
eth0      no wireless extensions.

lo        no wireless extensions.

wlan0     unassociated  ESSID:""  Nickname:"<WIFI@REALTEK>"
          Mode:Auto  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=0/100  Signal level=0 dBm  Noise level=0 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Bonus cho ai đọc đến cuối

Hãy nhớ tôi đã nói rằng tốc độ tối đa được nêu trên bộ chuyển đổi của bạn không quan trọng?
Vì vậy, trên Malinka (trước khi phát hành model 4), tất cả các thiết bị (bao gồm cả bộ chuyển đổi ethernet) đều nằm trên cùng một bus usb. Tuyệt vời phải không? Và do đó băng thông của bus usb được chia cho tất cả các thiết bị trên đó. Khi đo tốc độ cả qua ethernet và qua usb wi-fi (được kết nối với 1 bộ định tuyến) cả bằng đường hàng không và đường dây, tốc độ là khoảng 20Mbit/s.

PS Nói chung, hướng dẫn biên dịch trình điều khiển cho bộ điều hợp cụ thể này không chỉ hợp lệ cho RPI. Sau đó tôi lặp lại nó trên máy tính để bàn của mình bằng Linux Mint - mọi thứ cũng hoạt động ở đó. Bạn chỉ cần tải xuống các tệp tiêu đề cần thiết cho phiên bản kernel của mình theo cách tương tự.

CẬP NHẬT. Những người am hiểu đề xuất: để không phụ thuộc vào phiên bản kernel, bạn cần thu thập và cài đặt trình điều khiển bằng dkms. Readme cho trình điều khiển cũng chứa tùy chọn này.

pi@raspberrypi:/home/pi# sudo dkms add ./rtl8188eu
pi@raspberrypi:/home/pi# sudo dkms build 8188eu/1.0
pi@raspberrypi:/home/pi# sudo dkms install 8188eu/1.0

CẬP NHẬT2. Đề xuất cho id thiết bị đã được chấp nhận vào nhánh chính của kho lưu trữ lwfinger/rtl8188eu.

tài liệu tham khảo
- Bộ điều hợp Wi-Fi USB RPi
- Gitbub lwfinger/rtl8188eu
- usb.ids
- nguồn rpi

Nguồn: www.habr.com