1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH VIẾT DRIVER CHO USB TRÊN UBUNTU

48 31 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Viết Driver Cho USB Trên Ubuntu
Tác giả Phùng Thị Kim Ngân, Phạm Thị Thanh Huyền, Trịnh Thanh Phong
Người hướng dẫn TS. Nguyễn Thanh Bình
Trường học Trường Đại Học Bách Khoa Hà Nội
Thể loại bài tập lớn
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 48
Dung lượng 870,54 KB

Cấu trúc

  • DANH MỤC HÌNH VẼ

  • CHƯƠNG 1. TỔNG QUAN VỀ USB

    • Giới thiệu về USB

      • Định nghĩa USB

      • Cấu tạo USB

    • Chuẩn tín hiệu

    • Mô hình mạng

    • Quá trình hoạt động của chuẩn USB

    • Chế độ truyền

    • Mô tả thiết bị

      • Standard USB descriptors (Mô tả chuẩn USB)

      • Human Interface Devices (HID)

        • CHƯƠNG 2. VIẾT DRIVER CHO UBUNTU

          • Quá trình nhận dạng USB trên Linux

          • Xây dựng driver cho USB chuột

            • Khung của một USB driver bất kỳ

            • Lấy thông tin thiết bị USB giao tiếp (USB device)

            • Khai báo thư viện

            • Khởi tạo

            • Interupt

            • Thăm dò thiết bị Probe

            • Open syscall

            • Close syscall

            • Disconnect

        • CHƯƠNG 3. KẾT QUẢ

          • Gỡ bỏ driver cũ

          • Viết driver và biên dịch

          • Kết quả

  • PHỤ LỤC

Nội dung

Giới thiệu về USB

Định nghĩa USB

USB là thiết bị lưu trữ di động và cũng là cầu nối giữa nhiều thiết bị ngoại vi với máy tính Được phát triển nhằm đơn giản hóa và nâng cao giao diện giữa máy tính cá nhân và các thiết bị ngoại vi, USB đã trở thành một công cụ thiết yếu trong việc kết nối và truyền tải dữ liệu.

USB (Universal Serial Bus) là chuẩn kết nối có dây trong máy tính, được sử dụng để kết nối các điểm kỹ thuật với thiết bị ngoại vi Được đề xuất vào cuối năm 1994 bởi Intel, Compaq, IBM, Microsoft và nhiều công ty khác, USB đã trở thành giao diện mở rộng máy tính tiêu chuẩn của thế kỷ XXI, với phiên bản 3.1 hiện đã có mặt trên thị trường.

USB có khả năng kết nối lên đến 127 thiết bị ngoại vi mà không làm giảm băng thông, nhưng cần có sự hỗ trợ từ phần cứng máy chủ, hệ điều hành và thiết bị ngoại vi để hoạt động hiệu quả Ngoài ra, giao diện USB cho phép kết nối hai máy tính thông qua cáp chuyên dụng và mở rộng khả năng kết nối với các thiết bị khác thông qua Hub.

Giao diện USB tự động cấu hình giúp người dùng tiết kiệm thời gian và công sức bằng cách loại bỏ nhu cầu điều chỉnh cài đặt như tốc độ, định dạng dữ liệu, cấu hình ngắt, địa chỉ đầu vào/ra và kênh truy cập bộ nhớ trực tiếp.

Đầu nối USB được tiêu chuẩn hóa tại máy chủ, cho phép hầu hết các thiết bị ngoại vi tương thích với nhiều ổ cắm khác nhau.

USB tận dụng sức mạnh xử lý bổ sung cho phép các thiết bị ngoại vi tự quản lý mà không cần cài đặt giao diện người dùng điều chỉnh Điều này giúp tối ưu hóa hiệu suất và tính năng của các thiết bị USB.

• Giao diện USB xác định các giao thức để khôi phục từ các lỗi phổ biến, cải thiện độ tin cậy so với các giao diện trước đó.

Tiêu chuẩn USB mang lại nhiều lợi ích cho các nhà sản xuất phần cứng và nhà phát triển phần mềm, đặc biệt nhờ vào khả năng dễ dàng thực hiện.

• Tiêu chuẩn USB loại bỏ yêu cầu phát triển các giao diện độc quyền cho các thiết bị ngoại vi mới.

Giao diện USB có thể được tối ưu hóa để đạt được độ trễ thấp cho các chức năng thời gian quan trọng, hoặc được cấu hình để thực hiện chuyển dữ liệu hàng loạt trong nền mà không làm ảnh hưởng nhiều đến tài nguyên hệ thống.

Tiêu chuẩn USB mang lại nhiều lợi ích cho các nhà sản xuất phần cứng và nhà phát triển phần mềm, đặc biệt là nhờ vào sự dễ dàng trong việc triển khai.

• Tiêu chuẩn USB loại bỏ yêu cầu phát triển các giao diện độc quyền cho các thiết bị ngoại vi mới.

Giao diện USB có khả năng được tối ưu hóa để đảm bảo độ trễ tối ưu cho các chức năng quan trọng liên quan đến thời gian, hoặc có thể được cấu hình để thực hiện việc chuyển dữ liệu hàng loạt trong nền mà không làm ảnh hưởng đáng kể đến tài nguyên hệ thống.

Như với tất cả các tiêu chuẩn, USB có nhiều hạn chế đối với thiết kế của nó:

Cáp USB có chiều dài hạn chế, được thiết kế chủ yếu cho các thiết bị ngoại vi hoạt động trên cùng một mặt bàn, không phù hợp cho việc kết nối giữa các phòng hoặc tòa nhà Tuy nhiên, người dùng có thể sử dụng một cổng USB để kết nối với cổng truy cập, cho phép truy cập các thiết bị ở khoảng cách xa hơn.

USB sử dụng cấu trúc liên kết mạng cây nghiêm ngặt và giao thức chủ/tớ để định địa chỉ các thiết bị ngoại vi Các thiết bị này chỉ có thể tương tác thông qua máy chủ lưu trữ, và hai máy chủ không thể giao tiếp trực tiếp qua cổng USB của chúng.

Máy chủ lưu trữ không thể phát tín hiệu đến tất cả các thiết bị ngoại vi cùng lúc, vì mỗi thiết bị cần được định địa chỉ riêng Một số thiết bị ngoại vi có tốc độ rất cao yêu cầu tốc độ ổn định, điều này không được đảm bảo trong tiêu chuẩn USB.

Cấu tạo USB

Thông thường gồm các bộ phận sau:

• Bản mạch in nhỏ: chứa các linh kiện điện tử cùng một (hoặc nhiều) chip nhớ flash hàn trực tiếp lên mạch in.

Đầu cắm USB chuẩn A cho phép kết nối trực tiếp với các khe cắm USB trên máy tính, mang lại sự tiện lợi và dễ dàng trong việc sử dụng.

• Vỏ bảo vệ: Toàn bộ bản mạch in, chip nhớ flash nằm trong một vỏ bảo vệ kim loại hoặc nhựa giúp nó đủ chắc chắn.

Lẫy gạt chống ghi là tính năng có trên một số ổ USB flash, giúp ngăn chặn hệ điều hành ghi hoặc sửa đổi dữ liệu.

Người sử dụng nên thường xuyên quan sát đèn báo hoạt động trên USB để hiểu rõ quy luật hoạt động của nó Điều này giúp tránh tình trạng tháo thiết bị khi đang hoạt động, đảm bảo an toàn và hiệu suất sử dụng tối ưu.

Chuẩn tín hiệu

Chuẩn USB sử dụng bốn đường tín hiệu, bao gồm hai đường cấp nguồn DC (VBUS - 5V và GND) và hai đường tín hiệu vi sai (D+ và D-), cho phép truyền dữ liệu hiệu quả Cặp dây tín hiệu này được thiết kế xoắn bên trong, giúp tăng cường khả năng chống nhiễu.

Cổng USB trên máy tính cung cấp nguồn nuôi ra ngoài với dòng tối đa 500mA, cho phép các thiết bị tiêu thụ ít điện năng như chuột và thẻ nhớ USB có thể lấy nguồn trực tiếp mà không cần nguồn phụ.

Hình 1.3 Chuẩn tín hiệu USB

Mô hình mạng

Hình 1.4 Mô hình mạng các thiết bị theo chuẩn USB

Các thiết bị USB kết nối theo cấu trúc mạng hình sao phân cấp, với các Hub làm trung tâm Trong hệ thống này, các thiết bị USB được phân loại thành ba loại chính.

USB Host là thiết bị điều khiển toàn bộ mạng USB, có khả năng kết nối tối đa 126 thiết bị Trên máy tính, USB Host thường được gắn trên mainboard và cần tích hợp với USB RootHub để giao tiếp và điều khiển các thiết bị USB Vai trò chính của USB Host là quản lý và điều phối hoạt động của các thiết bị trong mạng USB.

– Trao đổi dữ liệu với các USB Device.

– Quản lý các thiết bị cắm vào hay rút ra khỏi Bus USB qua quá trình điểm danh(Enumeration).

Quản lý và phân xử luồng dữ liệu trên Bus là rất quan trọng, giúp đảm bảo rằng tất cả các thiết bị đều có cơ hội trao đổi dữ liệu một cách hiệu quả, dựa trên cấu hình riêng của từng thiết bị.

Ngày nay, bộ điều khiển máy chủ USB đã được tích hợp trên hầu hết các chipset bo mạch chủ, trong khi các bo mạch cũ có thể nâng cấp bằng PCI cards Tất cả các bộ điều khiển này đều tương thích với tiêu chuẩn Open Host Controller Interface (OHCI) và Universal Host Controller Interface (UHCI) Cả hai loại bộ điều khiển đều có khả năng tương đương và thiết bị USB không cần phải lo lắng về chúng Tuy nhiên, phần cứng của UHCI đơn giản hơn, dẫn đến việc cần driver phức tạp hơn, có thể gây quá tải cho CPU.

USB Device là các thiết bị hoạt động như các slave giao tiếp với USB Host, hoàn toàn thụ động và không tự ý gửi gói tin đến USB Host hoặc giữa các USB Device Tất cả giao tiếp đều phải thông qua sự điều phối của USB Host Chức năng chính của USB Device là hỗ trợ quá trình truyền nhận dữ liệu theo cách này.

– Trao đổi dữ liệu với USB Host

– Phát hiện gói tin hay yêu cầu từ USB Host theo giao thức USB

Có nhiều loại thiết bị USB được thiết kế cho các mục đích khác nhau, bao gồm thiết bị tự cấp nguồn, thiết bị chạy bằng nguồn bus hoặc cả hai USB có khả năng cung cấp điện lên tới 500mA cho các thiết bị, nhưng nếu chỉ sử dụng thiết bị chạy bằng nguồn bus, có thể xảy ra tình trạng tiêu hao năng lượng vượt mức cho phép, dẫn đến việc cần thiết bị cấp nguồn riêng Những thiết bị hỗ trợ cả hai loại nguồn có khả năng chuyển sang chế độ tự cấp nguồn khi được kết nối với nguồn điện bên ngoài.

Tốc độ giao tiếp của các thiết bị USB có sự khác biệt đáng kể, phụ thuộc vào từng loại thiết bị cụ thể Các thiết bị tốc độ thấp như chuột và bàn phím chỉ đạt tốc độ 1,5 Mbit/s, trong khi các thiết bị tốc độ cao như hệ thống âm thanh và video có thể sử dụng tới 90% tốc độ tối đa 12 Mbit/s, tương đương khoảng 10 Mbit/s sau khi trừ chi phí giao thức.

USB Hub đóng vai trò tương tự như các Hub trong mạng Ethernet, cung cấp nguồn cho các thiết bị USB Trên bảng điều khiển phía sau máy tính thường có một số cổng USB, cho phép kết nối các thiết bị hoặc một hub Hub là thiết bị giúp mở rộng số lượng cổng USB để kết nối nhiều thiết bị khác nhau Tuy nhiên, số lượng thiết bị tối đa có thể kết nối sẽ giảm theo số lượng hub được sử dụng trên mỗi bus Hub tự cấp nguồn hoặc chạy bằng nguồn bus tốc độ cao, mang lại sự tiện lợi trong việc quản lý các thiết bị USB.

Các cổng vật lý của bộ điều khiển máy chủ thường được quản lý bởi một virtual root hub, được mô phỏng bởi driver của trình điều khiển thiết bị Điều này giúp thống nhất cấu trúc liên kết bus, cho phép mọi cổng được xử lý đồng nhất bởi driver của hệ thống con USB.

Quá trình hoạt động của chuẩn USB

Quá trình hoạt động của chuẩn USB có thể được chia làm hai giai đoạn chính:

Quá trình điểm danh trong hệ thống USB là bước mà USB Host phát hiện các thiết bị được kết nối hoặc ngắt kết nối khỏi đường USB Bus Khi một thiết bị mới tham gia, USB Host sẽ đọc thông tin mô tả của thiết bị đó để thiết lập địa chỉ (NodeID) và chế độ hoạt động phù hợp Theo tiêu chuẩn USB, có thể kết nối tối đa 126 thiết bị với địa chỉ được đánh từ 1 đến 126 Khi thiết bị được rút ra, địa chỉ sẽ được thu hồi để sử dụng cho các thiết bị khác.

Quá trình truyền dữ liệu qua chuẩn USB liên quan đến hai khái niệm quan trọng: Interface và Endpoint Một thiết bị USB có thể có nhiều Interface, trong khi một Interface có thể sử dụng nhiều Endpoint Ví dụ, thẻ nhớ USB chỉ sử dụng một Interface theo chuẩn USB Mass Storage với ba Endpoint, trong khi bộ USB 3G sử dụng nhiều Interface khác nhau như CD Room, Mass Storage và Communication, mỗi Interface lại có nhiều Endpoint riêng biệt.

Trong hệ thống, các Interface đại diện cho các dịch vụ mà thiết bị cung cấp, trong khi các Endpoint là các cổng cần thiết cho từng dịch vụ Theo kiến trúc TCP/IP, giao thức FTP sử dụng hai cổng 20 và 21, trong khi HTTP sử dụng port 80 và Telnet sử dụng port 23 Các Endpoint và Port trong TCP/IP hoạt động như bộ đệm truyền/nhận dữ liệu, cho phép truyền thông song song và nâng cao tốc độ Chuẩn USB cho phép thiết kế tối đa 16 Endpoint, được phân loại theo hướng truyền dữ liệu từ USB Host.

• Các Endpoint truyền dữ liệu từ USB Device tới USB Host là Endpoint IN

Các Endpoint truyền dữ liệu từ USB Host đến USB Device được gọi là Endpoint OUT Để đảm bảo việc truyền dữ liệu theo chuẩn USB, các thiết bị USB Device cần được kết nối với USB Host thông qua các Pipe (đường ống) Mỗi Pipe sẽ kết nối một Endpoint của USB Device với USB Host.

Chế độ truyền

Chuẩn USB hỗ trợ 4 chế độ truyền khác nhau, cho phép người thiết kế lựa chọn phù hợp với cơ chế truyền và tốc độ mong muốn cho các mục đích sử dụng đa dạng.

• Truyền điều khiển (Control transfer):là chế độ truyền được tất cả các thiết bị

USB hỗ trợ để truyền các thông tin điều khiển với tốc độ tương đối chậm.

Truyền ngắt (Interrupt transfer) là phương thức được sử dụng cho các thiết bị cần truyền một lượng dữ liệu nhỏ một cách định kỳ, như chuột và bàn phím Cứ sau 10 giây, USB Host sẽ gửi yêu cầu xuống và USB Device sẽ phản hồi dữ liệu về cho USB Host thông qua Endpoint kiểu Interrupt in.

Truyền theo khối (Bulk transfer) là phương pháp lý tưởng cho các thiết bị cần chuyển tải một lượng lớn dữ liệu với độ chính xác cao, không yêu cầu thời gian thực quá nghiêm ngặt, như thẻ nhớ USB và máy in Phương thức này tương tự như giao thức TCP trong mạng Ethernet, đảm bảo tính ổn định và đáng tin cậy trong quá trình truyền tải dữ liệu.

Truyền đẳng thời (Isochronos transfer) là phương pháp truyền dữ liệu được sử dụng cho các thiết bị cần chuyển tải lượng lớn thông tin với tốc độ nhanh, đồng thời đảm bảo yêu cầu về thời gian thực Tuy nhiên, phương pháp này chấp nhận giảm độ chính xác ở một mức độ nhất định, thường thấy trong các thiết bị nghe nhạc và xem phim qua kết nối USB Giao thức này tương tự như giao thức UDP trong mạng Ethernet.

Chế độ truyền điều khiển và chế độ truyền theo khối là hai phương thức được sử dụng để truyền dữ liệu không đồng bộ khi driver quyết định Trong khi đó, chế độ truyền ngắt và chế độ truyền đẳng thời hoạt động theo chu kỳ, cho phép truyền dữ liệu vào những thời điểm cố định, đảm bảo băng thông được tối ưu hóa cho USB core.

Mô tả thiết bị

Standard USB descriptors (Mô tả chuẩn USB)

Hình 1.6 Bộ mô tả USB được ánh xạ tới device layout

Mỗi thiết bị USB cung cấp một mô tả thiết bị duy nhất, chứa thông tin và cấu hình liên quan Các trường idVendor và idProduct xác định số nhận dạng của nhà cung cấp và sản phẩm, trong khi trường bcdUSB chỉ ra phiên bản thông số kỹ thuật USB mà thiết bị tuân theo, ví dụ như 0x0200 cho USB 2.0.

Cấu hình USB bao gồm nhiều giao diện, mỗi giao diện có thể chứa một hoặc nhiều cài đặt thay thế, và mỗi cài đặt thay thế được cấu thành từ các endpoint Mỗi descriptor cấu hình mô tả toàn bộ cấu hình, bao gồm các giao diện, cài đặt thay thế và endpoint Ngoài ra, nó còn có thể chứa các mô tả tùy chỉnh từ nhà sản xuất thiết bị Phần đầu của descriptor cấu hình là 9 bytes cố định, trong khi phần còn lại thay đổi tùy thuộc vào số lượng giao diện, cài đặt thay thế và các endpoint mà thiết bị hỗ trợ.

Hình 1.7 Ví dụ về Configuration Descriptor cho thiết bị USB webcam

Mô tả giao diện USB là một phần quan trọng trong cấu hình, cung cấp thông tin về cài đặt thay thế cho giao diện USB Mỗi cấu hình có thể chứa một hoặc nhiều giao diện, và mỗi giao diện có thể bao gồm 0 hoặc nhiều endpoint, tạo thành một tập hợp các endpoint trong cấu hình.

Hình 1.8 Ví dụ về Interface Descriptor cho cài đặt thay thế 0 của Interface 0 cho thiết bị webcam

USB endpoint descriptor chứa thông tin cần thiết cho máy chủ lưu trữ để xác định yêu cầu băng thông của từng endpoint Mỗi endpoint đại diện cho một nguồn dữ liệu logic hoặc bộ góp của thiết bị USB Endpoint 0 được sử dụng cho tất cả các lần truyền điều khiển tiêu chuẩn và không có mô tả cho endpoint này.

Hình 1.9 Ví dụ về Endpoint Descriptor cho thiết bị webcam

String Descriptor là một tùy chọn cung cấp thông tin bổ sung ở định dạng Unicode dễ đọc, có thể được sử dụng để hiển thị tên nhà cung cấp thiết bị hoặc số seri.

Human Interface Devices (HID)

Lớp HID bao gồm các thiết bị mà con người sử dụng để điều khiển hoạt động của hệ thống máy tính, với các ví dụ điển hình như bàn phím, chuột và các thiết bị ngoại vi khác.

• Bàn phím và thiết bị trỏ, thiết bị chuột, cần điều khiển,

• Bảng điều khiển phía trước: núm, công tắc, nút, thanh trượt,

Các điều khiển có thể được tìm thấy trên nhiều thiết bị khác nhau, bao gồm điện thoại, điều khiển từ xa, và các thiết bị mô phỏng như găng tay, vô lăng, và bàn đạp bánh lái.

VIẾT DRIVER CHO UBUNTU 11

Quá trình nhận dạng USB trên Linux

Khi một thiết bị USB hợp lệ được kết nối với hệ thống Linux, nó sẽ được nhận diện bởi phần cứng ở tầng nhân, bất kể có driver hay không Điều này khả thi nhờ vào thiết kế của giao thức USB, đã được hỗ trợ trong đặc tả của nó.

Chip USB host controller đóng vai trò quan trọng trong việc phát hiện thiết bị USB khi được cắm vào Thiết bị này thu thập và diễn giải thông tin từ tầng vật lý (low-level) đến các thông tin đặc tả giao thức USB ở tầng cao hơn (high-level).

Hình 2.1 Quá trình nhận dạng thiết bị USB trên Linux

Thông tin về thiết bị theo quy định của giao thức USB được tích hợp vào tầng USB core tổng quát trong tầng nhân, điều này cho phép hệ thống nhận diện các thiết bị USB ngay cả khi chưa có driver cụ thể Sau khi quá trình nhận diện ở tầng nhân hoàn tất, nhiệm vụ tiếp theo thuộc về các drivers, interfaces hoặc applications, tùy thuộc vào các phiên bản Linux khác nhau, để tiếp tục nhận dạng thiết bị ở tầng người dùng.

Xây dựng driver cho USB chuột

Để ghi dữ liệu trên Ubuntu bằng thiết bị USB, cần nắm rõ thông tin chi tiết về thiết bị, trong trường hợp này là chuột không dây Các thông tin cần thiết bao gồm cấu hình thiết bị, các giao diện và kiểu truyền của USB.

2.2.1 Khung của một USB driver bất kỳ struct usb_{

}; static struct usb_device_id_table[]=

{USB_DEVICE(ML_VENDOR_ID, ML_PRODUCT_ID)},

}; static int _open(struct inode* inode, struct file* file){

} static int _release(struct inode* inode, struct file* file){

} static ssize_t_write(struct file* file, const char_user* user_buf, size_tcount, loff_t*ppos){

} static struct file_operations_fops=

}; static int_probe(struct usb_interface* interface, const struct usb_device_id* id){

/* This function is called when the device is connected to the computer */

} static void_disconnect(struct usb_interface* interface){

/* This function is called when the device is removed from the computer */

} static struct usb_driverml_driver =

}; static int_initusb__init(void){

13 static void_exitusb__exit(void){

} module_init(usb__init); module_exit(usb__exit);

2.2.2 Lấy thông tin thiết bị USB giao tiếp (USB device)

The firmware information of USB devices includes essential details such as idVendor, idProduct, the number of configurations, the number of interfaces within each configuration, and the quantity and types of endpoints within each interface.

Trong Ubuntu, lệnh lsusb cho phép người dùng liệt kê thông tin cơ bản của tất cả các thiết bị USB được hệ thống nhận diện Để xem thông tin chi tiết về một thiết bị cụ thể, cần sử dụng lệnh lsusb –vd (:) Trong phần Device Descriptor, người dùng có thể dễ dàng nhận diện idVendor và idProduct của thiết bị.

#include // Needed for KERN_INFO

#include // Needed by all modules

#include // Needed for the macros

#include // Needed for device input

#include // USB HID quirk support for Linux it defines all USB_VENDOR_ID parameters

The following structure describes a USB mouse, which is an input device that communicates via URB: `struct usb_mouse` includes fields such as `char name[128]` for the mouse name, `char phys[64]` for physical address, pointers to `struct usb_device *usbdev` and `struct input_dev *dev`, as well as `struct urb *irq` for the interrupt handler Additionally, it contains a signed character pointer `signed char *data` for the interrupt buffer and a DMA address defined by `dma_addr_t data_dma`.

• phys: chuỗi định danh thiết bị

• *usbdev: con trỏ dùng để trỏ tới thiết bị đã gửi urb đi

• *dev: con trỏ dùng mô tả 1 thiết bị đầu vào

Trình điều khiển USB sử dụng con trỏ kiểu urb, hay còn gọi là USB request block, để giao tiếp với các thiết bị USB Urb đóng vai trò quan trọng trong việc gửi và nhận dữ liệu từ endpoint của thiết bị theo phương thức không đồng bộ Chu kỳ hoạt động của một urb diễn ra theo quy trình cụ thể.

– Được tạo bởi usb device driver

– Được gắn vào một endpoint của driver

– Được gửi tới USB core bởi driver

– Được gửi tới host controller driver bởi core

– Được xử lý bởi host controller driver rồi thực hiện truyền dữ liệu về device

– Khi hoàn tất thủ tục request, host controller driver sẽ gửi thông báo đến device.

• data_dma: biến dữ liệu theo cơ chế DMA (Direct Memory Access)

Hàm sau đây được gọi để xử lý ngắt:

The function `usb_mouse_irq` is designed to handle USB mouse interrupts by utilizing the parameters of `usb_fill_int_urb` to establish a callback function It accepts a pointer to a `urb` structure, which is essential in USB driver contexts for storing relevant data.

The USB mouse driver processes the input data by referencing the mouse structure and its associated device It checks the status of the USB request block (urb); if the status indicates success (0), the operation continues However, if the status reflects an error such as -ECONNRESET, -ENOENT, or -ESHUTDOWN, the function terminates to prevent further actions.

/* -EPIPE: should clear the halt */ default: /* error */ goto resubmit;

• *mouse:: con trỏ mô tả thiết bị kiểu mouse như đã định nghĩa ở khởi tạo.

• *data: con trỏ dữ liệu.

• *dev: con trỏ kiểu input device.

Status trong struct urb là một biến kiểu nguyên, được cập nhật khi urb được xử lý hoặc hoàn tất, phản ánh trạng thái hiện tại của urb.

16 status sau đó sẽ được truyền vào hàm xử lý ngắt 1 cấu trúc điều kiện sẽ kiểm tra giá trị biến này.

– TH1 : Nếu status = 0, tức là quá trình truyền urb thành công.

Khi trạng thái là ESHUTDOWN, điều này cho thấy đã xảy ra lỗi với driver của bộ điều khiển USB host, dẫn đến việc nó bị vô hiệu hóa Lỗi này cũng có thể xảy ra nếu một URB được gửi đi sau khi thiết bị đã ngắt kết nối hoặc khi cấu hình bị thay đổi trong quá trình gửi URB.

– TH3 : Nếu status = ECONNRESET, thì urb bị ngắt kết nối bởi hàm urb_unlink_urb, biến transfer_flags trong urb được set giá trị bằng URB_ASYNC_UNLINK.

– TH4: Nếu status = ENOENT, thì urb bị dừng lại bởi hàm usb_kill_urb.

• Nếu status rơi vào 3 trường hợp lỗi thì chương trình sẽ thoát khỏi hàm ngắt.

• Nếu status rơi vào trường hợp đầu tiên, chương trình sẽ thoát khỏi cấu trúc switch

• Nếu status không rơi vào trường hợp nào, nó sẽ nhảy đến nhãn resubmit: resubmit: status = usb_submit_urb (urb, GFP_ATOMIC); if (status) dev_err(&mouse->usbdev->dev,

The USB request block (URB) is transitioned to a submitted state by invoking the function `usb_submit_urb(struct urb *urb, int mem_flags)`, which takes parameters such as the USB device's bus name and device path, along with the status code.

Cờ mem_flags được sử dụng để thiết lập phương thức phân bố bộ nhớ đệm cho USB core Khi urb được gửi, việc truy cập vào bất kỳ trường hợp nào của struct urb là không được phép cho đến khi urb hoàn tất Trong khi đó, usb_submit_urb có thể được gọi bất kỳ lúc nào, vì vậy cờ mem_flags giúp tránh xung đột Đặc biệt, nếu usb_submit_urb được gọi trong hàm xử lý ngắt, mem_flags sẽ được gán bằng GFP_ATOMIC.

Phần code bên dưới khối code sẽ in ra thông báo lỗi nếu urb bị lỗi.

2.2.6 Thăm dò thiết bị Probe

Hàm sau đây dùng để phát hiện nếu chuột được kết nối, và thực hiện gửi urb:

//This method is for detection of driver functions. static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)

The structure `usb_device *dev` is obtained by converting the interface to a USB device using `interface_to_usbdev(intf)` Additionally, `struct usb_host_interface *interface` is defined to describe the interface, which is crucial for setting up the structure The `usb_endpoint_descriptor` is also referenced in this context.

*endpoint;//usb_endpoint_descriptor is the endpoint descriptor structure. struct usb_mouse *mouse; struct input_dev *input_dev; int pipe, maxp; int error = -ENOMEM;

Trong phát triển driver USB, con trỏ kiểu thiết bị USB đóng vai trò quan trọng Một driver USB thường cần chuyển đổi định dạng dữ liệu khi truyền từ struct usb_interface sang struct usb_device, nhằm hỗ trợ cho USB core trong quá trình gọi hàm Để thực hiện việc này, hàm interface_to_usbdev được sử dụng để truyền dữ liệu từ interface sang device.

• *interface: con trỏ kiểu con trỏ trung gian dùng để load thông số của *altsetting và*cur_altsetting

• *endpoint: con trỏ chứa thông tin các endpoint

• *mouse: con trỏ kiểu thiết bị chuột

• *input_dev: con trỏ kiểu thiết bị đầu vào

• maxp: kích thước tối đa gói tin

• error = -ENOMEM:lỗi tràn bộ nhớ interface = intf->cur_altsetting; if (interface->desc.bNumEndpoints != 1) return -ENODEV;

• Con trỏinterfacelúc này sẽ trỏ đến setting hiện tại của nó

• bNumEndpointslà một biến của struct usb_interface_descriptorthuộc struct usb_host_interface, có giá trị bằng số endpoint của interface đang xét

Nếu không có endpoint hoặc có nhiều hơn một endpoint, hệ thống sẽ trả về lỗi -ENODEV, cho thấy không tồn tại thiết bị nào phù hợp, vì chuột chỉ có một endpoint duy nhất Để kiểm tra, sử dụng đoạn mã endpoint = &interface->endpoint[0].desc; và nếu không phải là endpoint đầu vào dạng int, sẽ trả về lỗi -ENODEV.

The function usb_endpoint_is_int_in(endpoint) checks whether the specified endpoint is an interrupt IN endpoint It returns True if the condition is met and False otherwise If the result is not True, an ENODEV error will be returned.

Khối lệnh tiếp theo pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);

• Lệnh đầu tiên sẽ tạo một đường ống để nhận lệnh.

• Lệnh thứ 2 thiết lập kích thước gói tin tối đa cho endpoint

• Lệnh thứ 3 phân bố bộ nhớ thiết bị, kích thước bộ nhớ bằng kích thước urb của chuột Vùng nhớ được cập được làm rỗng.

Khối lệnh tiếp theo input_dev = input_allocate_device(); // (1) if (!mouse || !input_dev) goto fail1; mouse->data = usb_alloc_coherent(dev, 8, GFP_ATOMIC,

&mouse->data_dma); // (2) if (!mouse->data) goto fail1; fail1: input_free_device(input_dev); kfree(mouse); return error;

• Lệnh (1) thực hiện phân bố bộ nhớ cho thiết bị đầu vào

• Lệnh (2) thực hiện phân bố bộ nhớ đệm theo cơ chế DMA cho chuột

• Chương trình sẽ nhảy đếnfail1 nếu không thể chấp phát bộ nhớ hoặc bộ đệm cho chuột hoặc thiết bị đầu vào

Ngày đăng: 05/02/2022, 12:26

HÌNH ẢNH LIÊN QUAN

Hình 1.1 Thiết bị USB - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.1 Thiết bị USB (Trang 8)
Hình 1.2 Cấu tạo - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.2 Cấu tạo (Trang 9)
Hình 1.4 Mô hình mạng các thiết bị theo chuẩn USB - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.4 Mô hình mạng các thiết bị theo chuẩn USB (Trang 10)
Hình 1.3 Chuẩn tín hiệu USB - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.3 Chuẩn tín hiệu USB (Trang 10)
Hình 1.6 Bộ mô tả USB được ánh xạ tới device layout - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.6 Bộ mô tả USB được ánh xạ tới device layout (Trang 14)
Hình 1.5 Mô tả thiết bị USB - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.5 Mô tả thiết bị USB (Trang 14)
Hình 1.8 Ví dụ về Interface Descriptor cho cài đặt thay thế 0 của Interface 0 cho thiết bị webcam - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.8 Ví dụ về Interface Descriptor cho cài đặt thay thế 0 của Interface 0 cho thiết bị webcam (Trang 15)
Hình 1.7 Ví dụ về Configuration Descriptor cho thiết bị USB webcam - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.7 Ví dụ về Configuration Descriptor cho thiết bị USB webcam (Trang 15)
Hình 1.9 Ví dụ về Endpoint Descriptor cho thiết bị webcam - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.9 Ví dụ về Endpoint Descriptor cho thiết bị webcam (Trang 16)
Hình 2.1 Quá trình nhận dạng thiết bị USB trên Linux - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 2.1 Quá trình nhận dạng thiết bị USB trên Linux (Trang 18)
Hình 2.2 Các thông tin về thiết bị USB - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 2.2 Các thông tin về thiết bị USB (Trang 20)
Hình 3.1 File Makefile - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 3.1 File Makefile (Trang 32)
Hình 3.2 Biên dịch module - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 3.2 Biên dịch module (Trang 32)
Hình 3.4 Kết quả chạy driver - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 3.4 Kết quả chạy driver (Trang 33)
Hình 3.3 Gỡ bỏ Driver usbhid có sẵn - BÀI TẬP LỚN CUỐI KỲ HỆ ĐIỀU HÀNH  VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 3.3 Gỡ bỏ Driver usbhid có sẵn (Trang 33)

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w