Patch AppleUSBXHCI để dùng với mọi USB 3.0 Controller – Phần 1

 Phần 1 – Mục đích và các bước chuẩn bị

PatchAppleUSBXHCI Bài viết có sự tham khảo từ các nguồn sau: 

http://www.insanelymac.com/forum/topic/285157-patched-appleusbxhci-from-os-1082/ http://www.insanelymac.com/forum/files/file/150-patched-appleusbxhci/

1. Mục đích của patch AppleUSBXHCI

AppleUSBXHCI là một plug-in của kext IOUSBFamily nhằm nhận biết và điều khiển USB 3.0 Controller. Nó được Apple phát triển khi Intel bắt đầu hỗ trợ USB 3.0 từ thế hệ chipset thứ 7 trở đi, và chỉ làm việc với USB 3.0 Controller của Intel. Rất may là thành viên Zenith432 trên diễn đàn InsanelyMac đã phát triển kext GenericUSBXHCI dựa trên mã nguồn của AppleUSBXHCI để có thể hoạt động với mọi USB 3.0 Controller. Nhưng nếu bạn muốn một giải pháp native hơn thì vẫn có cách, đó là patch AppleUSBXHCI.

2. So sánh giữa patch AppleUSBXHCI và dùng kext GenericUSBXHCI

a. Ưu điểm:

  • Sử dụng native kext của Apple thay cho kext ngoài, do đó khả năng lỗi ít hơn và luôn được cập nhật.
  • Khi dùng GenericUSBXHCI với các controller cũ (chẳng hạn như Renesas uPD720200A), sẽ mất vài giây để các cổng USB 3.0 resume sau khi wake từ trạng thái sleep. Với AppleUSBXHCI thì không có tình trạng này, do đó sẽ có lợi khi dùng các thiết bị chuột, bàn phím trên cổng USB 3.0.

b. Điểm giống nhau:

  • Tốc độ truyền tải dữ liệu là như nhau, do source của GenericUSBXHCI là dựa trên AppleUSBXHCI.
  • Với các controller cũ không hỗ trợ PME (PCI Power Management), GenericUSBXHCI cũng như AppleUSBXHCI đều sẽ tắt hẳn controller khi sleep và bật lại khi wake, cho nên các thiết bị cắm vào cổng USB 3.0 sẽ bị disconnect khi sleep.

c. Nhược điểm:

  • Một số thiết bị USB 3.0 như flash drive có thể sẽ không hoạt động sau khi wake, mặc dù vẫn nhận được bởi AppleUSBXHCI; khi đó bạn sẽ phải rút ra cắm lại thiết bị. GenericUSBXHCI không gặp tình trạng này có thể là do thời gian delay để resume các cổng USB 3.0.
  • Khi AppleUSBXHCI được cập nhật lên phiên bản mới thì bạn có thể sẽ phải cập nhật lại patch, do binary của kext bị thay đổi.

Nếu bạn muốn một giải pháp đơn giản, không phải lo lắng đến chuyện cập nhật patch thì GenericUSBXHCI là lựa chọn phù hợp. Còn nếu bạn ưa khám phá và thích một giải pháp native hơn thì mời bạn đọc tiếp bài viết này.

3. Các bước chuẩn bị

Lưu ý: Bài viết này sẽ chỉ rõ nguyên lý của patch AppleUSBXHCI, để bạn sau này có thể cập nhật patch cho các phiên bản AppleUSBXHCI mới hơn. Nếu bạn sử dụng Clover Bootloader và chỉ quan tâm đến việc patch, không muốn tìm hiểu nguyên lý, thì bạn có thể đọc phần 3, bỏ qua phần 1 và 2 của bài viết.

Những công cụ bạn cần có bao gồm:

  • Otool dùng để giải mã (disassemble) binary của AppleUSBXHCI. Để có otool, bạn cần tải bộ công cụ XCode từ App Store (miễn phí).
  • Một Hex Editor. Ở đây mình dùng 0xED vì nó miễn phí, bạn có thể tải 0xED phiên bản mới nhất tại đây.

a. Sau khi tải các công cụ trên rồi, các bạn truy cập vào đường dẫn sau:

/System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/

Copy file AppleUSBXHCI.kext ra một thư mục nào đó (chẳng hạn như Desktop) để chỉnh sửa.

b. Các bạn bấm chuột phải vào file AppleUSBXHCI.kext đã copy, chọn Show Package Contents. Truy cập vào /Contents/MacOS để thấy file AppleUSBXHCI, đây chính là file chương trình (binary) của AppleUSBXHCI.

c. Mở 0xED lên, kéo file AppleUSBXHCI vào biểu tượng 0xED trên Dock để mở file. Các bạn có thể điều chỉnh kích cỡ cửa sổ 0xED sao cho mỗi cột đều hiển thị đủ 4 byte.

PatchAppleUSBXHCI2

d. Để disassemble file AppleUSBXHCI, ta mở Terminal và chạy câu lệnh sau:

otool -tv /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBXHCI.kext/Contents/MacOS/AppleUSBXHCI > ~/Desktop/AppleUSBXHCI.dsm.txt

Sau khi otool chạy xong, file AppleUSBXHCI.dsm.txt chứa mã assembly sẽ được tạo ra trên Desktop. Các bạn mở file này bằng TextEdit.

PatchAppleUSBXHCI3

Phần tiếp theo: Các patch cần áp dụng đối với AppleUSBXHCI

Bình luận về bài viết này