1. Trang chủ
  2. » Công Nghệ Thông Tin

Viết driver chuột usb cho Linux

24 3 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 24
Dung lượng 786,68 KB

Nội dung

1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ VIỄN THÔNG BÁO CÁO BÀI TẬP LỚN Môn Hệ điều hành Đề tài Viết driver chuột usb cho Linux Giảng viên hướng dẫn TS Phạm Doãn Tĩnh Họ và tên MSSV Nguyễn Hữu P[.]

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ - VIỄN THƠNG BÁO CÁO BÀI TẬP LỚN Mơn: Hệ điều hành Đề tài: Viết driver chuột usb cho Linux Giảng viên hướng dẫn: TS Phạm Doãn Tĩnh Họ tên MSSV Nguyễn Hữu Phúc 20167332 Đào Tiến Thành 20163695 Võ Sinh Hiển 20161430 Hoàng Đức Mạnh 20162642 Nguyễn Văn Đường 20150983 Hà Nội, 6/202 LỜI MỞ ĐẦU Trong lĩnh vực lập trình hệ thống nhúng, cơng việc quan trọng với lập trình ghép nối, điều khiển module, thiết bị ngoại vi ghép nối với hệ trung tâm Để làm việc này, ngồi kỹ lập trình cịn cần phải thành thạo giao thức ghép nối phổ biến RS232, SPI, I2C Đặc biệt, chuẩn giao tiếp USB trở thành chuẩn kết nối phương thức truyền liệu thân thuộc với người dùng công nghệ nhờ vào thuận tiện, độ bền giá thành hợp lý nói chuẩn phổ biến Tìm hiểu chuẩn USB giúp cho có kiến thức để làm nhiều cơng việc như: • Thiết kế, chế tạo thiết bị hoạt động theo chuẩn USB • Viết driver cho thiết bị giao chuẩn USB • Lập trình ghép nối với thiết bị làm việc theo chuẩn USB Trong phạm vi tập lớn môn hệ điều hành, chúng em định chọn đề tài “Viết driver chuột theo chuẩn USB HID cho hệ điều hành Linux” với mong muốn biết cách xây dựng driver cho hệ điều hành, tìm hiểu phương thức giao tiếp hệ điều hành với thiết bị USB tìm hiểu hoạt động giao tiếp USB Chúng em xin cảm ơn thầy Phạm Doãn Tĩnh cung cấp cho chúng em kiến thức cần thiết, để chúng em hoàn thành tập lớn môn hệ điều hành Mặc dù driver device viết đơn sơ thời gian kiến thức có hạn nên chúng em hồn thành số tiêu chí định Từ lạ lần đầu sử dụng hệ điều hành Ubuntu đến kết thúc học phần chúng em có kiến thức để biến Linux công cụ hỗ trợ đắc lực trình học tập làm việc Chúng em xin cảm ơn! Nhóm 11 MỤC LỤC Khái quát giao thức USB 1.1 Các thành phần giao thức USB 1.2 Mơ hình giao thức USB 1.2.1 Chuẩn tín hiệu 1.2.2 Mơ hình mạng 10 1.2.3 Kịch hoạt động 11 USB driver 12 2.1 Tìm hiểu USB driver 12 2.2 Xây dựng driver cho chuột USB 15 Chạy chương trình kiểm tra kết 21 KẾT LUẬN 24 DANH MỤC HÌNH ẢNH Hình 1.1 Tổng quan lớp USB device Hình 1.2 Tổng quan lớp USB driver Hình 1.3 Cấu trúc liệu endpoint Hình 1.4 Cấu trúc liệu interface Hình 1.5 Mơ hình cáp USB Hình 1.6 Mơ hình host – devices USB 10 Hình 2.1 Thơng tin thiết bị 14 Hình 2.2 Thư viện linux dùng chương trình 15 Hình 2.3 Khởi tạo cấu trúc cho driver 15 Hình 2.4 Khai báo mã thiết bị 16 Hình 2.5 Cấu trúc hàm ngắt 16 Hình 2.6 Đăng kí driver với kernel 17 Hình 2.7 Hủy đăng ki driver với kernel 17 Hình 2.8 Cấu trúc hàm pen_probe 18 Hình 2.9 Cấu trúc hàm ngắt 19 Hình 2.10 Cấu trúc hàm file_operations 19 Hình 3.1 Thông tin thiết bị kernel 21 Hình 3.2 Kết đăng kí driver 22 Hình 3.3 Thơng tin thiết bị sau đổi driver 22 Hình 3.4 Kết chương trình test 23 Hình 3.5 Kết sau gỡ driver 23 Khái quát giao thức USB Universal serial bus (USB) kết nối máy tính chủ vài thiết bị ngoại vi Ban đầu tạo để thay loạt loại bus chậm khác-các kết nối song song nối tiếp, bàn phím-với kiểu bus mà tất thiết bị kết nối tới Một thiết bị giao tiếp chuẩn USB thực phức tạp Nhưng may mắn hệ điều hành Linux cung cấp cho ta thư viện hỗ trợ đầy đủ, điều giúp tiết kiệm nhiều thời gian, công sức chi phí xây dựng thiết bị Đa phần phức tạp USB hỗ trợ USB Core Linux Hình 1.1 Tổng quan lớp USB device Trình điều khiển USB nằm hệ thống kernel khác (khối, mạng, char, v.v.) điều khiển phần cứng USB Lõi USB cung cấp giao diện cho trình điều khiển USB sử dụng để truy cập điều khiển phần cứng USB mà lo lắng loại điều khiển phần cứng USB khác có hệ thống Hình 1.2 Tổng quan lớp USB driver Từ Hình 1.2 ta thấy để tìm hiểu viết usb device driver ta cần tìm hiểu enpoint, interface, cấu hình API cách tiến trình điều khiển lớp USB device Các thành phần giao thức USB Endpoint: Thành phần chuẩn giao tiếp USB USB Endpoint truyền liệu theo hướng nhất, từ host đến device (gọi OUT Endpoint) ngược lại (In Endpoint) Có loại endpoint: - Controll: Controll endpoint dùng để truy cập phần khác thiết bị USB Chúng thường dùng để cài đặt thiết bị, lấy thông tin thiết bị, gửi lệnh đến thiết bị, lấy báo cáo trạng thái thiết bị - Interupt: Interupt endpoint dùng để truyền liệu dung lượng nhỏ máy chủ truy vấn liệu từ thiết bị Loại endpoint hay sử dụng với thiết bị chuột hay bàn phím Chúng hay dùng để gửi liệu thiết bị với nhau, lượng liệu truyền thường không lớn Giao thức USB ln đảm bảo có băng thơng dự phòng cho loại endpoint - Bulk: Bulk endpoint dùng để truyền liệu có dung lượng lớn Loại endpoint có kích thước lớn nhiều so với interupt Chúng dùng cho loại thiết bị yêu cầu truyền dẫn liệu kích thước lớn mà khơng xảy mát liệu Chúng khơng có băng thông dự trữ giống interupt endpoint Nếu đủ băng thơng để truyền gói tin đi, liệu chia nhỏ Loại endpoint sử dụng cho thiết bị máy in, ổ nhớ flash… - Isochorous: Isochorous endpoint dùng để truyền liệu kích thước lớn, khơng u cầu đảm bảo liệu toàn vẹn Chúng dùng cho thiết bị chấp nhận mát truyền liệu, đổi lại đảm bảo trình liên tục, thiết bị truyền dẫn thời gian thực video audio… Cấu trúc liệu endpoint định nghĩa struct usb_host_endpoint Linux kernel Trong thơng tin thực endpoint chứa struct usb_endpoint_descriptor Hình 1.3 Cấu trúc liệu endpoint Các trường cần quan tâm struct usb_endpoint_descriptor : - bEndpointAddress: địa endpoint, có bit dùng mã hóa hướng endpoint IN hay OUT - bmAttributes: Dùng định nghĩa loại endpoint kiểu kiểu controll, bulk, interupt hay isochorous - wMaxPacketSize: Kích thước tối đa gói tin mà endpoint chuyển Nếu gói tin cần chuyển lớn giá trị bị chia thành gói có kích thước tương đương - bInterval: Nếu endpoint loại interupt biến xác định khoảng thời gian lần gửi request từ host đến device (đo mili giây) Interface: Tập hợp endpoint gọi interface Mỗi interface thể chức thiết bị, ví dụ ổ flash, hay bàn phím Một thiết bị có nhiều interface Một interface có nhiều thiết lập, với thiết lập ban đầu đánh số Thiết lập khác dùng điều khuyển endpoint theo cách khác nhau… Interface định nghĩa Linux kernel struct usb_interface Hình 1.4 Cấu trúc liệu interface Các thông số cần quan tâm: - struct usb_host_interface *altsetting: Một mảng chứa phần tử kiểu interface tương ứng với thiết lập khác Mỗi struct usb_host_interface chứa tập hợp endpoint định nghĩa usb_host_endpoint - unsigned num_altsetting: số thiết lập khác interface, trỏ đến trỏ *altsetting - struct usb_host_interface *cur_altsetting: trỏ trỏ đến thiết lập interface - int minor: Thiết bị hệ thống truy cập tên Tên thiết bị bao gồm phần major minor major dùng xác định driver cho thiết bị, minor dùng để xác định xác thiết bị xét Configuration: tập hợp interface Một thiết bị có nhiều configuration chuyển đổi qua lại chúng Chỉ có configuration phép sử dụng thời điểm Linux không mạnh việc hỗ trợ thiết bị sử dụng đồng thời nhiều configuration (tuy nhiên thiết bị hiếm) Tóm lại: - Một thiết bị có nhiều configuration - Một configuration có nhiều interface - Một interface có nhiều setting - Interface khơng có có nhiều endpoint Mơ hình giao thức USB Về mặt cấu trúc, hệ thống USB không đặt bus; xây dựng từ số liên kết điểm-điểm Các liên kết cáp bốn dây (nối đất, nguồn hai dây tín hiệu) kết nối thiết bị hub, giống Ethernet xoắn đôi Bộ điều khiển máy chủ USB chịu trách nhiệm yêu cầu thiết bị USB có liệu để gửi Do cấu trúc liên kết này, thiết bị USB khơng bắt đầu gửi liệu mà không yêu cầu trước điều khiển máy chủ Cấu hình cho phép loại hệ thống plug-and-play dễ dàng, theo thiết bị cấu hình tự động máy tính chủ 1.2.1 Chuẩn tín hiệu Hình 1.5 Mơ hình cáp USB Chuẩn USB sử dụng đường tín hiệu có đường cấp nguồn DC (VBUS-5V GND) đường cịn lại cặp tín hiệu vi sai (D+ D-) cho phép truyền liệu Cặp dây tín hiệu nối xoắn bên nên có khả chống nhiễu tốt 1.2.2 Mơ hình mạng Hình 1.6 Mơ hình host – devices USB Các thiết bị hoạt động theo chuẩn USB kết nối với theo đồ hình mạng hình phân cấp Trung tâm hình Hub Trong đồ vậy, thiết bị USB chia làm loại chính: - USB Host: thiết bị đóng vai trị điều khiển tồn mạng USB (có thể lên tới tối đa 126 thiết bị) Ví dụ máy tính, USB Host gắn mainboard Để giao tiếp điều khiển USB device, USB Host controller cần thiết kế tích hợp với USB RootHub (Hub mức cao nhất) Vai trò thiết bị USB Host: Trao đổi liệu với USB Device Điều khiển USB Bus: o Quản lý thiết bị cắm vào hay rút khỏi Bus USB qua trình điểm danh (Enumeration) o Phân xử, quản lý luồng liệu Bus, đảm bảo thiết bị có hội trao đổi liệu tùy thuộc vào cấu hình thiết bị 10 - USB Device: thiết bị đóng vai trị slave giao tiếp với USB Host Xin lưu ý điều quan trọng thiết bị hồn tồn đóng vai trị bị động, khơng tự ý gửi gói tin lên USB Host hay gửi gói tin USB Device với nhau, tất phải thơng qua q trình điều phối USB Host Các bạn hiểu chế rõ phần truyền thông chuẩn USB Chức thiết bị USB Device: Trao đổi liệu với USB Host Phát gói tin hay yêu cầu từ USB Host theo giao thức USB - USB Hub: đóng vai trị Hub mạng Ethernet Cấp nguồn cho thiết bị USB 1.2.3 Kịch hoạt động Quá trình hoạt động chuẩn USB chia làm hai giai đoạn chính: • Q trình điểm danh:là q trình USB Host phát thiết bị cắm vào rút khỏi đường USB Bus Mỗi thiết bị tham gia vào Bus USB, USB Host tiến hành đọc thông tin mô tả (Description) USB Device, từ thiết lập địa (NodeID) chế độ hoạt động tương ứng cho thiết bị USB Device Các địa đánh từ 1->126 nên lý thuyết, chuẩn USB cho phép kết nối 126 thiết bị vào đường Bus Khi thiết bị rút khỏi đường Bus, địa thu hồi • Q trình truyền liệu:Đứng góc độ mức hệ thống, Interface dịch vụ khác mà thiết bị cung cấp cịn Endpoint cổng cần thiết cho dịch vụ Tương ứng với khái niệm kiến trúc TCP/IP, ví dụ giao thức FTP giao thức sử dụng để truyền file sử dụng hai cổng 20,21 Trong giao thức HTTP lại sử dụng port 80, giao thức Telnet sử dụng port 23 Thực tế Endpoint Port chuẩn TCP/IP đóng vai trị đệm truyền/nhận liệu Nhờ việc sử dụng nhiều đệm mà q trình truyền thơng tiến hành song song cho tốc độ cao hơn, bên cạnh giúp cho việc phân tách dịch vụ khác Với chuẩn USB, thiết bị thiết kế với tối đa 16 Endpoint 11 USB driver Tìm hiểu USB driver Mã USB nhân Linux giao tiếp với tất thiết bị USB cách sử dụng cấu trúc gọi urb (USB request block) Khối yêu cầu mô tả với cấu trúc urb struct tìm thấy tệp bao gồm / linux / usb.h Một urb sử dụng để gửi nhận liệu đến từ endpoint USB cụ thể thiết bị USB cụ thể theo cách khơng đồng Trình điều khiển thiết bị USB phân bổ nhiều urbs cho endpoint sử dụng lại urb cho nhiều endpoint khác nhau, tùy thuộc vào nhu cầu trình điều khiển Mỗi endpoint thiết bị xử lý hàng urbs, nhiều urbs gửi đến điểm cuối trước hàng đợi trống Vòng đời điển hình urb sau: • Được tạo trình điều khiển thiết bị USB • Được gán cho điểm cuối cụ thể thiết bị USB cụ thể • Gửi đến lõi USB, trình điều khiển thiết bị USB • Gửi cho trình điều khiển điều khiển máy chủ USB cụ thể cho thiết bị định lõi USB • Được xử lý trình điều khiển điều khiển máy chủ USB thực chuyển USB sang thiết bị • Khi urb hồn thành, trình điều khiển máy chủ USB thơng báo cho trình điều khiển thiết bị USB Urbs bị hủy lúc trình điều khiển gửi urb lõi USB thiết bị bị tháo khỏi hệ thống, urbs tạo động chứa số tham chiếu bên cho phép chúng tự động giải phóng người dùng cuối urb giải phóng • Các trường cấu trúc urb cấu trúc quan trọng trình điều khiển thiết bị USB là: struct usb_device *dev 12 • Con trỏ tới cấu trúc usb_device mà urb gửi tới Biến phải trình điều khiển USB khởi tạo trước urb gửi đến lõi USB unsigned int pipe Thông tin endpoint cho cấu trúc usb_device cụ thể mà urb gửi đến Biến phải trình điều khiển USB khởi tạo trước urb gửi đến lõi USB • Tạo hủy urbs: Cấu trúc urb tạo việc gọi hàm struct urb: *usb_alloc_urb(int iso_packets, int mem_flags); Tham số đầu tiên, iso_packets, số lượng gói đồng thời mà urb chứa Nếu không muốn tạo urb đồng thời, biến phải đặt thành Tham số thứ hai, mem_flags, loại cờ truyền cho lệnh gọi hàm kmalloc để cấp phát nhớ từ kernel Nếu hàm thành công việc phân bổ đủ không gian cho urb, trỏ tới urb trả cho người gọi Nếu giá trị trả NULL, số lỗi xảy lõi USB trình điều khiển cần phải dọn cách • Để hủy urbs gọi hàm: void usb_free_urb(struct urb *urb); Tham số truyền vào hàm địa urb cần hủy • Thốt urb Để dừng urb gửi đến lõi USB, sử dụng hàm usb_kill_urb usb_unlink_urb int usb_kill_urb(struct urb *urb); int usb_unlink_urb(struct urb *urb); Khi hàm usb_kill_urb, vòng đời urb bị dừng lại Chức thường sử dụng thiết bị bị ngắt kết nối với hệ thống Hàm usb_unlink_urb sử dụng để báo cho lõi USB dừng urb Hàm khơng chờ cho urb hồn toàn dừng lại trước trả tới hàm gọi 13 • Cấu trúc cấu trúc usb_device_id cung cấp danh sách loại thiết bị USB khác mà trình điều khiển hỗ trợ Danh sách sử dụng lõi USB để định trình điều khiển cung cấp cho thiết bị Một số trường usb_device_id +_u16 idVendor ID nhà cung cấp USB cho thiết bị Số định diễn đàn USB cho thành viên khơng thể tạo khác + _u16 idProduct Hình 2.1 Thông tin thiết bị ID sản phẩm USB cho thiết bị Tất nhà cung cấp có ID nhà cung cấp gán cho họ quản lý ID sản phẩm họ theo cách họ chọn Sử dụng lệnh command “$ sudo cat /sys/kernel/debug/usb/devices” để quan sát thông tin chi tiết thiết bị Lưu ý thiết bị cấu hình driver mặc định “usbhid” ta cần gỡ trước cài driver 14 Xây dựng driver cho chuột USB Trước hết cần khai báo thư viện sử dụng chương trình Hình 2.2 Thư viện linux dùng chương trình Cấu trúc mà tất trình điều khiển USB phải tạo cấu trúc usb_driver: Để tạo cấu trúc cấu trúc usb_driver, có năm trường cần khởi tạo: Hình 2.3 Khởi tạo cấu trúc cho driver Cấu trúc phải trình điều khiển USB điền vào bao gồm số hàm gọi lại biến mơ tả trình điều khiển USB với mã lõi USB: const char *name Con trỏ đến tên trình điều khiển Nó phải số tất trình điều khiển USB kernel thường đặt tên với tên mơ-đun trình điều khiển Nó hiển thị sysfs / sys / bus / usb / driver / trình điều khiển nằm kernel const struct usb_device_id *id_table 15 Con trỏ tới bảng struct usb_device_id chứa danh sách tất loại thiết bị USB khác mà trình điều khiển chấp nhận Nếu biến không đặt, hàm probe trình điều khiển USB khơng gọi Hình 2.4 Khai báo mã thiết bị void (*disconnect) (struct usb_interface *intf) Con trỏ đến hàm ngắt kết nối trình điều khiển USB Chức gọi lõi USB cấu trúc usb_interface bị xóa khỏi hệ thống trình điều khiển dỡ khỏi lõi USB Hình 2.5 Cấu trúc hàm ngắt Để đăng ký cấu trúc usb_driver gọi đến usb_register_driver thực trỏ tới cấu trúcusb_driver Điều thường thực mã khởi tạo mơ-đun cho trình điều khiển USB: 16 Hình 2.6 Đăng kí driver với kernel Khi trình điều khiển USB hủy , cấu trúc usb_driver cần phải hủy đăng ký khỏi kernel Điều thực với gọi đến usb_deregister_driver Khi gọi xảy ra, giao diện USB bị ràng buộc với trình điều khiển bị ngắt kết nối hàm ngắt kết nối gọi cho chúng Hình 2.7 Hủy đăng ki driver với kernel int (*probe) (struct usb_interface *intf, const struct usb_device_id *id) Con trỏ đến chức probe trình điều khiển USB Hàm gọi lõi USB nghĩ có cấu trúc usb_interface mà trình điều khiển xử lý Một trỏ tới struct usb_device_id mà lõi USB sử dụng để đưa định truyền cho hàm Nếu trình điều khiển USB xác nhận cấu trúc usb_interface truyền cho nó, khởi tạo thiết bị cách trả Nếu trình điều khiển khơng muốn u cầu thiết bị xảy lỗi, trả giá trị lỗi âm 17 Hình 2.8 Cấu trúc hàm pen_probe void (usb_mouse_irq) (struct urb *urb) 18 Hàm ngắt nhận tín hiệu chuột quét tới thiết bị vận chuyển liệu lên tầng usb driver Hình 2.9 Cấu trúc hàm ngắt Trên cấu trúc chương trình usb device driver với hàm số Ngoài ta cần cấu trúc file_operations để điều khiển thiết bị Hình 2.10 Cấu trúc hàm file_operations Cũng hàm static int my_open(struct inode *i, struct file *f), static int my_close(struct inode *i, struct file *f), static ssize_t my_read(struct file *f, char user 19 *buf, size_t len, loff_t *off), static ssize_t my_write(struct file *f, const char user *buf,size_t len, loff_t *off) Sau xây dựng chương trình device driver ta viết chương trình ứng dựng để test khản hoạt động chương trình 20 Chạy chương trình kiểm tra kết Đầu tiên cần gỡ chương gỡ bỏ chương trình mặc định device driver lệnh “$ sudo mknod /dev/myDev c 91 1” “$ sudo rmmod usbhid” Lúc ta sử dụng chuột driver gỡ “$ sudo insmod usb1.ko” Sau chạy lệnh ta thu kết sau: Hình 3.1 Thông tin thiết bị kernel Để xem kết ta sử dụng lệnh “$ dmesg” sau insert kernel vào thiết bị Ta sử dụng chuột bình thường Sau ta sử dụng lệnh “$ sudo cat /proc/devices” để kiểm tra driver đăng kí insmod thiết bị 21 Hình 3.2 Kết đăng kí driver Chúng ta xem kết driver thay “usbhid” thiết bị lệnh “$ sudo cat /sys/kernel/debug/usb/devices” Hình 3.3 Thông tin thiết bị sau đổi driver 22 Để thuận tiến cho việc kiểm tra ta sử dụng chương trình ứng dụng để gọi vào usb driver vừa code Hình 3.4 Kết chương trình test Nếu khơng muốn sử dụng driver ta sử dụng lệnh “$ sudo rmmod usb1” để gỡ driver khỏi thiết bị Sử dụng lệnh “$ dmesg” để kiểm tra kết Hình 3.5 Kết sau gỡ driver Tất nhiên lúc sử dụng chuột cài driver khơi phục lại driver “usbhid” mặc định Để khơi phục driver mặc định ta sử dụng lệnh “sudo modprobe usbhid” Lúc ta sử dụng chuột chế độ mặc định 23 KẾT LUẬN Chương trình với mục địch tìm hiểu kernel , device driver, usb driver Linux mà chúng em nhập môn tập tành làm quen với Ubuntu, cố gắng học hỏi khản có hạn chúng em chủ yếu buid lại xây dựng chương tình device driver đơn giản bước đầu hoạt động Tuy chương trình chưa hồn thiện chúng em hồn thiện học hỏi nhiều linux kernel Trên báo cáo tập lớn thu hoạch chúng em thực hành viết usb mouse device driver Chúng em xin cảm ơn thầy kiến thức mà thức mà chúng em học 24

Ngày đăng: 05/10/2023, 23:13