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 đề tài VIẾT DRIVER CHO USB TRÊN UBUNTU

48 15 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

Định dạng
Số trang 48
Dung lượng 1,17 MB

Cấu trúc

  • 1.1 Giới thiệu về USB (7)
    • 1.1.1 Định nghĩa USB (7)
    • 1.1.2 Cấu tạo USB (9)
  • 1.2 Chuẩn tín hiệu (9)
  • 1.3 Mô hình mạng (10)
  • 1.4 Quá trình hoạt động của chuẩn USB (12)
  • 1.5 Chế độ truyền (13)
  • 1.6 Mô tả thiết bị (14)
    • 1.6.1 Standard USB descriptors (Mô tả chuẩn USB) (14)
    • 1.6.2 Human Interface Devices (HID) (16)
  • CHƯƠNG 2. VIẾT DRIVER CHO UBUNTU 11 (17)
    • 2.1 Quá trình nhận dạng USB trên Linux (17)
    • 2.2 Xây dựng driver cho USB chuột (18)
      • 2.2.1 Khung của một USB driver bất kỳ (18)
      • 2.2.2 Lấy thông tin thiết bị USB giao tiếp (USB device) (20)
      • 2.2.3 Khai báo thư viện (20)
      • 2.2.4 Khởi tạo (21)
      • 2.2.5 Interupt (22)
      • 2.2.6 Thăm dò thiết bị Probe (23)
      • 2.2.7 Open syscall (28)
      • 2.2.8 Close syscall (28)
      • 2.2.9 Disconnect (29)

Nội dung

Giới thiệu về USB

Định nghĩa USB

USB là thiết bị lưu trữ di động và là cầu nối giữa máy tính với các thiết bị ngoại vi Được phát triển để tối ưu hóa giao diện giữa máy tính cá nhân và thiết bị ngoại vi, USB giúp đơn giản hóa quá trình 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 phổ biến trong máy tính, cho phép kết nối giữa các linh kiện máy tính và 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 tiêu chuẩn của thế kỷ XXI, với phiên bản 3.1 hiện đang có mặt trên thị trường.

USB có khả năng kết nối với 127 thiết bị ngoại vi mà không ảnh hưởng đến băng thông Để hoạt động hiệu quả, USB cần sự hỗ trợ từ phần cứng máy chủ, hệ điều hành và thiết bị ngoại vi 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 thêm nhiều kết nối thông qua Hub.

Giao diện USB tự động cấu hình, loại bỏ nhu cầu điều chỉnh cài đặt thiết bị về tốc độ, định dạng dữ liệu, cũng như cấu hình ngắt, địa chỉ đầu vào/ra và kênh truy cập bộ nhớ trực tiếp cho người dùng.

Đầu nối USB được tiêu chuẩn hóa tại máy chủ, cho phép mọi thiết bị ngoại vi dễ dàng kết nối với hầu hết các ổ cắm có sẵn.

USB tối ưu hóa 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.

• 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 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 tính dễ thực hiện của 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 để đảm bảo độ trễ thấp cho các chức năng quan trọng về thời gian, 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 tính 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ó thể được tối ưu hóa để đạt được độ trễ tối ưu cho các chức năng yêu cầu thời gian chính xác, hoặc được cấu hình để thực hiện chuyển dữ liệu hàng loạt trong nền, giảm thiểu tác động đế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ế vì tiêu chuẩn này chỉ áp dụng cho các thiết bị ngoại vi trên cùng một mặt bàn, không phải 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ể kết nối một cổng USB với cổng truy cập để sử dụng các thiết bị ở xa.

USB sử dụng cấu trúc 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à không thể giao tiếp trực tiếp qua cổng USB với nhau.

Máy chủ lưu trữ không thể phát tín hiệu đồng thời đến tất cả các thiết bị ngoại vi, vì mỗi thiết bị cần có đị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 trong việc sử dụng các thiết bị ngoại vi.

• 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à một tính năng quan trọng 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 Thiết kế này bảo vệ thông tin của người dùng, đảm bảo rằng dữ liệu được lưu trữ an toàn và không bị thay đổi một cách không mong muốn.

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 việc tháo thiết bị khi đang trong quá trình làm việc, đảm bảo an toàn và hiệu suất sử dụng.

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-) để truyền dữ liệu Cặp dây tín hiệu vi sai này được thiết kế xoắn bên trong, giúp cải thiện khả năng chống nhiễu hiệu quả.

Cổng USB trên máy tính cung cấp nguồn nuô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 từ cổng này mà không cần nguồn bổ sung.

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 cho mỗi hình sao Trong cấu trúc 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ị quản lý 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 tích hợp trên mainboard Để giao tiếp và điều khiển các thiết bị USB, USB Host controller cần được thiết kế kết hợp với USB RootHub, đóng vai trò là Hub cấp cao nhất.

– 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ý luồng dữ liệu trên Bus là nhiệm vụ quan trọng nhằm đảm bảo rằng tất cả các thiết bị đều có cơ hội trao đổi dữ liệu, tùy theo cấu hình của từng thiết bị Việc phân xử dữ liệu giúp tối ưu hóa quá trình giao tiếp giữa các thiết bị, nâng cao hiệu suất hoạt động của hệ thống.

Ngày nay, bộ điều khiển máy chủ USB đã trở thành một phần tích hợp trên hầu hết các chipset bo mạch chủ hiện đại Đối với các bo mạch cũ không có bộ điều khiển này, người dùng có thể nâng cấp bằng cách sử dụng thẻ PCI Tất cả các bộ điều khiển USB đều tương thích với tiêu chuẩn Open Host Controller Interface (OHCI) của Compaq, Microsoft và National Semiconductor, hoặc Universal Host Controller Interface (UHCI) của Intel Mặc dù cả hai loại đều có khả năng tương đương, nhưng 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ể làm quá tải 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 Tất cả giao tiếp giữa USB Device và USB Host phải được điều phối qua USB Host Chức năng chính của USB Device là đảm bảo sự kết nối và truyền tải dữ liệu một cách hiệu quả trong hệ thống USB.

– 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 phục vụ cho các mục đích khác nhau Thiết bị USB có thể tự cấp nguồn hoặc chạy bằng nguồn bus, với khả năng cung cấp điện lên tới 500mA cho các thiết bị 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, do đó cần thiết phải có nguồn cung cấp 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 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ó thể khác nhau tùy thuộc vào từng loại thiết bị Các thiết bị tốc độ thấp như chuột và bàn phím thường giao tiếp với 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ể đạt tới 90% tốc độ 12 Mbit/s, tương đương khoảng 10 Mbit/s sau khi tính đến chi phí giao thức.

USB Hub là thiết bị mở rộng số lượng cổng USB, tương tự như các Hub trong mạng Ethernet, giúp cấp nguồn cho các thiết bị USB Trên máy tính, có một số cổng USB ở bảng điều khiển phía sau, cho phép gắn các thiết bị hoặc hub Số lượng thiết bị tối đa có thể kết nối bị giới hạn bởi số lượng hub trên từng bus Hub hoạt động bằng cách tự cấp nguồn hoặc sử dụng nguồn bus tốc độ cao.

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 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à quá trình mà USB Host phát hiện và quản lý các thiết bị được kết nối và 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ị đó, từ đó thiết lập địa chỉ (NodeID) và chế độ hoạt động tương ứng Chuẩn USB cho phép kết nối tối đa 126 thiết bị, với các địa chỉ được đánh từ 1 đến 126 Khi một thiết bị rút khỏi Bus, địa chỉ của nó sẽ được thu hồi để sử dụng cho thiết bị khác.

Quá trình truyền dữ liệu trong chuẩn USB liên quan đến hai khái niệm quan trọng: Interface và Endpoint Chỉ thiết bị USB mới có Endpoint, trong khi USB Host không có Một thiết bị USB có thể có nhiều Interface, và mỗi Interface có thể sử dụng nhiều Endpoint Ví dụ, thẻ nhớ USB chỉ sử dụng 1 Interface theo chuẩn USB Mass Storage với 3 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.

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 mỗi 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 quá trình truyền thông diễn ra song song với tốc độ cao hơn và phân tách các dịch vụ khác nhau Đối với chuẩn USB, thiết bị có thể có tối đa 16 Endpoint, được phân loại theo hướng truyền dữ liệu từ phía USB Host.

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

Các Endpoint OUT là điểm truyền dữ liệu từ USB Host đến USB Device Để truyền dữ liệu theo chuẩn USB, USB Device cần kết nối với USB Host thông qua các Pipe Mỗi Pipe 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 từng mục đích sử 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 truyền dữ liệu được sử dụng cho các thiết bị cần gửi một lượng dữ liệu nhỏ theo chu kỳ, chẳng hạn như chuột và bàn phím Trong quá trình này, USB Host sẽ gửi yêu cầu đến USB Device mỗi 10 giây, và USB Device sẽ phản hồi bằng cách gửi dữ liệu trở lại cho USB Host thông qua Endpoint ngắt.

Truyền theo khối (Bulk transfer) là phương pháp truyền dữ liệu lý tưởng cho các thiết bị cần xử lý lượng dữ liệu lớn với độ chính xác cao, không yêu cầu thời gian thực 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.

Truyền đẳng thời (Isochronos transfer) là phương pháp truyền dữ liệu lý tưởng cho các thiết bị yêu cầu băng thông lớn và tốc độ cao, chẳng hạn như máy nghe nhạc và thiết bị xem phim kết nối qua chuẩn USB Phương pháp này đảm bảo ràng buộc về thời gian thực nhưng có thể chấp nhận một mức độ chính xác nhất định 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 được sử dụng cho việc truyền dữ liệu không đồng bộ khi cần thiết 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 liên tục, từ đó đảm bảo băng thông được dành riêng cho lõi USB.

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 đều cung cấp một bộ mô tả thiết bị duy nhất, bao gồm thông tin và cấu hình quan trọng Các trường như 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 biết thiết bị được thiết kế theo tiêu chuẩn 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 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, và có thể bao gồm các mô tả tùy chỉnh từ nhà sản xuất 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

USB interface descriptor là một mô tả chi tiết về giao diện trong cấu hình USB, cung cấp thông tin về cài đặt thay thế của giao diện 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 lại có thể có 0 hoặc nhiều endpoint, đại diện cho 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 để máy chủ lưu trữ xác định yêu cầu băng thông cho 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 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, thường đượ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 chủ yếu 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 Các thiết bị tiêu biểu trong lớp HID bao gồm bàn phím, chuột và tay cầm game.

• 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 sử dụng 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 hệ thống.

Chip USB host controller có nhiệm vụ phát hiện thiết bị USB cắm vào, hoạt động như thiết bị chủ động trên bus của giao thức USB Nó 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, do USBcore driver điều khiể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ể cho chức năng của chúng Sau khi hoàn tất quá trình nhận diện ở tầng nhân, nhiệm vụ tiếp theo thuộc về các driver, giao diện hoặc ứng dụng, 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 lên Drive trên Ubuntu, việc tìm hiểu thông tin chi tiết về thiết bị USB là rất cần thiết Trong bài viết này, chúng tôi sử dụng chuột không dây làm thiết bị USB Các thông tin quan trọng về thiết bị USB bao gồm cấu hình thiết bị, các giao diện và kiểu truyền.

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){

} 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)

USB device firmware information 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 in each interface.

Để liệt kê danh sách 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 trên Ubuntu, bạn có thể sử dụng lệnh `lsusb` Để 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, bạn sẽ thấy rõ 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, an input device that communicates via URB: `struct usb_mouse` includes essential attributes such as a character array for the mouse name, a physical descriptor, pointers to the USB device and input device, an interrupt request buffer, and a data buffer for handling interrupts Additionally, it contains a DMA address for efficient data transfer.

• 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

Con trỏ kiểu URB (USB Request Block) là một thành phần quan trọng trong mã USB, cho phép giao tiếp với các thiết bị USB URB được sử dụng để gửi và nhận dữ liệu từ các endpoint của thiết bị theo phương thức không đồng bộ, giúp tối ưu hóa hiệu suất truyền tải dữ liệu Chu kỳ hoạt động của một URB diễn ra liên tục, đảm bảo quá trình giao tiếp diễn ra mượt mà và hiệu quả.

– Đượ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 operate with the parameters of `usb_fill_int_urb`, facilitating the setup of a callback function for URB (USB Request Block) It utilizes a pointer to the URB, which is essential in USB drivers for storing relevant data.

In the context of USB mouse handling, the code snippet demonstrates the process of managing USB Request Blocks (URBs) by checking the status of the URB If the status indicates success (0), the operation continues; however, if the status reflects conditions such as -ECONNRESET, -ENOENT, or -ESHUTDOWN, the function will exit without further action This structured approach ensures efficient error handling during USB communication.

/* -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.

Biến status trong struct urb có vai trò quan trọng trong việc theo dõi trạng thái của urb Khi urb được xử lý hoặc hoàn tất, giá trị của status sẽ được cập nhật để phản ánh trạng thái hiện tại Giá trị này sau đó sẽ được sử dụng trong hàm xử lý ngắt, nơi một cấu trúc điều kiện sẽ kiểm tra giá trị của biến status để thực hiện các hành động phù hợp.

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

Khi trạng thái của TH2 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 function `usb_submit_urb(struct urb *urb, int mem_flags)` is used to change the status of the URB (USB Request Block) to "submitted." This process involves sending the URB to the USB device, as indicated by the parameters such as the bus name and device path, along with the current status.

Cờ mem_flags được sử dụng để thiết lập phương thức phân bố bộ nhớ đệm cho USB core, đảm bảo rằng không có truy cập vào bất kỳ trường hợp nào của struct urb cho đến khi urb hoàn tất Điều này giúp tránh xung đột khi usb_submit_urb có thể được gọi bất cứ lúc nào, đặc biệt là trong hàm xử lý ngắt, nơi 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 code snippet initializes a USB device structure by converting an interface to a USB device using the function `interface_to_usbdev(intf)` It also defines a variable for the USB host interface, which is essential for describing the interface and setting up the structure Additionally, it includes a declaration for the USB endpoint descriptor, which plays a crucial role in managing data transfers between the host and the USB device.

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

Dev là con trỏ kiểu thiết bị USB, và một USB driver thường cần chuyển đổi định dạng dữ liệu khi truyền từ struct usb_interface sang struct usb_device Việc này giúp USB core dễ dàng gọi hàm Để thực hiện chuyển đổi này, ta sử dụng hàm interface_to_usbdev khi truyền dữ liệu từ intf sang dev.

• *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 như vậy, vì chuột chỉ có một endpoint duy nhất Cụ thể, endpoint được xác định bằng cách sử dụng interface->endpoint[0].desc, và nếu endpoint không phải là kiểu int in, hệ thống 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 đến fail1nế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

• fail1giải phóng bộ nhớ dành cho thiết bị đầu vào cũng như chuột, và trả về lỗi error.

Khối lệnh tiếp theo mouse->irq = usb_alloc_urb(0, GFP_KERNEL); if (!mouse->irq) goto fail2; fail2: usb_free_coherent(dev, 8, mouse->data, mouse->data_dma);

• Bắt đầu tạo một urb mới cho chuột sử dụng

Ngày đăng: 24/04/2022, 21:45

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 đề tài 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 1.2 Chuẩn tín hiệu - BÀI tập lớn CUỐI kỳ hệ điều HÀNH đề tài VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.2 Cấu tạo 1.2 Chuẩn tín hiệu (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 đề tài 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 1.3 Mô hình mạng - BÀI tập lớn CUỐI kỳ hệ điều HÀNH đề tài VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.3 Chuẩn tín hiệu USB 1.3 Mô hình mạng (Trang 10)
Hình 1.5 Mô tả thiết bị USB - BÀI tập lớn CUỐI kỳ hệ điều HÀNH đề tài VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 1.5 Mô tả thiết bị USB (Trang 14)
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 đề tài 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.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 đề tài 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)
• USB configuration descriptor: Cấu hình USB chứa một loạt giao diện. Mỗi giao diện bao gồm một hoặc nhiều cài đặt thay thế và mỗi cài đặt thay thế được tạo thành từ một tập hợp các endpoint - BÀI tập lớn CUỐI kỳ hệ điều HÀNH đề tài VIẾT DRIVER CHO USB TRÊN UBUNTU
configuration descriptor: Cấu hình USB chứa một loạt giao diện. Mỗi giao diện bao gồm một hoặc nhiều cài đặt thay thế và mỗi cài đặt thay thế được tạo thành từ một tập hợp các endpoint (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 đề tài 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 đề tài 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 đề tài 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 đề tài 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 đề tài 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 đề tài VIẾT DRIVER CHO USB TRÊN UBUNTU
Hình 3.4 Kết quả chạy driver (Trang 33)

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w