Tìm hiểu cơ chế viết Driver cho thiết bị chuẩn USB trên Linux. Ứng dụng viết Driver cho máy điện tim 3 đạo trình

63 593 0
Tìm hiểu cơ chế viết Driver cho thiết bị chuẩn USB trên Linux. Ứng dụng viết Driver cho máy điện tim 3 đạo trình

Đ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

TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP Ngày chuẩn truyền thông USB lựa chọn hàng đầu cho giải pháp kết nối tới máy tính nhà phát triển Tuy nhiên việc viết Driver lại không đơn giản với kỹ sư công nghệ thông tin, việc đòi hỏi phải có nhìn bao quát hệ thống: từ mức firmware thiết bị tới kiến trúc hệ điều hành máy tính Trong đề tài em tìm hiểu kiến thức liên quan làm tài liệu nội dung tìm hiểu được, nhằm đưa quy trình mà theo kỹ sư công nghệ thông tin áp dụng để viết thành công USB Device Driver Các nội dung trình bày từ mức tổng quan hệ thống Linux, chuẩn truyền thông USB tới mức chi tiết hàm cần cài đặt viết USB Device Driver Đồ án bao gồm việc ứng dụng viết Driver cho máy điện tim đạo trình chương trình hiển thị sóng điện tim tảng Qt, sau chuyển toàn chương trình xuống chạy kiểm thử tảng Linux nhúng (KIT FriendlyARM) Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính ABSTRACT OF THESIS Nowaday, USB Connection is always the first choice of many hardware developers when connecting their devices to computers However, writing successfully a driver is not simple to an IT engineer because this need the engineer to have knowledge of system architecture, hardware design and firmware of devices In scope of this project, I have researched relative contents and then documentized all those contents My destination is giving a process so an engineer can follow that to write successfully his USB device driver The contents in this project are represented from general about Linux architecture, USB protocol standard to detail of defined functions in a USB device driver This project also included writing the driver of 3-lead electrocardiogram machine and a Qt base program to show electrocardiogram signal The last, I ported the driver and the Qt base program to an Embeded Linux KIT (FriendlyARM) to testing Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính MỤC LỤC TÓM TẮT NỘI DUNG ĐỒ ÁN TỐT NGHIỆP ABSTRACT OF THESIS MỤC LỤC DANH MỤC HÌNH ẢNH DANH MỤC CÁC THUẬT NGỮ, TỪ VIẾT TẮT MỞ ĐẦU PHẦN CÁC KIẾN THỨC TỔNG QUAN CHƯƠNG KIẾN TRÚC HỆ ĐIỀU HÀNH LINUX GIỚI THIỆU VỀ LẬP TRÌNH MÔ-ĐUN NHÂN TRÊN LINUX 1.1 Tổng quan kiến trúc hệ điều hành Linux 1.2 Hệ thống tệp tin hệ điều hành Linux 10 1.3 Cơ chế quản lý thiết bị hệ điều hành Linux 11 1.3.1 Khái niệm Device Driver 11 1.3.2 Định danh thiết bị hệ điều hành Linux 12 1.3.3 Device File Đường dẫn /dev hệ thống tệp tin 13 1.3.4 Cơ chế tạo tệp tin thiết bị tự động sử dụng udev 16 1.4 Giới thiệu lập trình mô-đun nhân Linux 18 1.4.1 Khái niệm mô-đun nhân Linux 18 1.4.2 Chương trình HelloWorld 20 CHƯƠNG HỆ THỐNG USB TRÊN LINUX 24 2.1 Tổng quan giao thức usb 24 2.1.1 Kiến trúc bus 24 2.1.2 Các lớp thiết bị usb 24 2.1.3 Các khái niệm Endpoint, Interface, Configuration 27 2.2 Hệ thống USB hệ điều hành Linux 29 2.2.1 Mô hình phân lớp hệ thống USB Linux 29 2.2.2 Cách thức giao tiếp hệ thống USB 30 PHẦN THỰC HIỆN VIẾT USB DEVICE DRIVER TRÊN LINUX 36 CHƯƠNG TRÌNH TỰ VIẾT USB DEVICE DRIVER TRÊN LINUX 36 3.1 Tìm hiểu phần cứng 36 3.2 Khai báo cấu trúc liệu liên quan tới thiết bị 36 3.3 Khai báo danh sách thiết bị điều khiển Driver 37 3.4 Đăng kí hủy đăng kí USB Device Driver 37 3.5 Hàm thăm dò 39 3.5.1 Truy nhập thông tin Endpoint 39 3.5.2 Lưu lại thông tin truy nhập cấp phát 40 3.5.3 Đăng kí lớp thiết bị 41 3.6 Hàm ngắt kết nối thiết bị 42 Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 3.7 Các hàm mở / đọc / ghi thiết bị 43 3.7.1 Hành động mở tệp tin 43 3.7.2 Hành động đọc / ghi 44 CHƯƠNG VIẾT DRIVER CHO MÁY ĐIỆN TIM ĐẠO TRÌNH 45 4.1 Viết Driver cho máy điện tim đạo trình 45 4.1.1 Tìm hiểu phần cứng 45 4.1.2 Khai báo cấu trúc liệu biến toàn cục cần thiết 45 4.1.3 Khai báo danh sách thiết bị hỗ trợ Driver 46 4.1.4 Đăng kí gỡ bỏ driver khỏi hệ thống 48 4.1.5 Thăm dò thiết bị 48 4.1.6 Cài đặt hành động mở, đọc, ghi thiết bị 50 4.2 Chương trình hiển thị tín hiệu điện tim tảng Qt 54 4.2.1 Xây dựng giao diện 54 4.2.2 Sử dụng Driver viết để giao tiếp với máy điện tim 55 4.3 Chạy kiểm thử KIT FriendlyARM 57 4.3.1 Biên dịch lại Driver 57 4.3.2 Chuyển Driver chương trình hiển thị tín hiệu xuống KIT 58 4.4 Kết chương trình 58 KẾT LUẬN 62 TÀI LIỆU THAM KHẢO 63 Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính DANH MỤC HÌNH ẢNH Hình Mô hình kiến trúc hệ thống Linux Hình Hệ thống tệp tin Linux 10 Hình Số hiệu loại thiết bị số hiệu thiết bị riêng lẻ 12 Hình Các số hiệu loại thiết bị nhân Linux gán cố định 13 Hình Các thiết bị tìm thấy đường dẫn /dev 14 Hình Tạo tệp tin thiết bị 15 Hình Các mô-đun tải vào nhân 19 Hình Kết biên dịch hello-1.c 21 Hình Kiểm tra thông tin mô-đun hello-1.ko 22 Hình 10 Kiểm tra mô-đun hello-1.ko tải lên 22 Hình 11 Nhật ký hệ thống thêm gỡ bỏ mô-đun hello-1.ko 23 Hình 12 Mô hình bus USB 24 Hình 13 Mối quan hệ Endpoint, Interface, Configuration 28 Hình 14 Mô hình phân lớp hệ thống USB Linux 29 Hình 15 Chu trình URB 30 Hình 16 Lưu đồ hàm thăm dò hàm ngắt kết nối thiết bị 43 Hình 17 Kết chạy lệnh lsusb 45 Hình 18 Lệnh lsusb hiển thị thông tin phần cứng 47 Hình 19 Kết nối mạch với máy tính 58 Hình 20 Tệp tin thiết bị liên kết với Driver máy điện tim 59 Hình 21 Kiểm tra mô-đun tải vào nhân hệ điều hành 59 Hình 22 Chương trình Qt hiển thị tín hiệu điện tim 60 Hình 23 Kết chạy Kit FriendlyARM 61 Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính DANH MỤC CÁC THUẬT NGỮ, TỪ VIẾT TẮT Thuật ngữ / Từ viết tắt USB USB Host USB Device USB Core URB Driver / Device Driver Device Number Major Number Minor Number Configuration Interface Endpoint Bulk Endpoint Từ nguyên gốc Universal Serial Bus USB Request Block Interrupt Endpoint Isochronous Endpoint Control Endpoint HID Mass Storage Device Audio Device Embedded Linux Kernel User/Kernel Mode User/Kernel Space Linux Kernel Module Firmware Human Interface Device Dịch nghĩa Bus nối tiếp đa Máy chủ USB Thiết bị USB Lõi hệ thống USB Khối yêu cầu USB Trình điều khiển thiết bị Số hiệu xác định thiết bị Số hiệu loại thiết bị Số hiệu thiết bị riêng lẻ Cấu hình Giao diện Điểm cuối Điểm cuối kiểu truyền theo khối Điểm cuối kiểu truyền theo ngắt Điểm cuối kiểu truyền đẳng thời Điểm cuối kiểu truyền điều khiển Thiết bị giao tiếp người dùng Thiết bị lưu trữ Thiết bị âm Linux nhúng Nhân hệ điều hành Chế độ người dùng / nhân Không gian người dùng / nhân Mô-đun nhân Linux Vi chương trình Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính MỞ ĐẦU Ngày thiết bị ngoại vi, chuẩn truyền thông USB trở nên phổ biến Sự đa ưu điểm tốc độ, khoảng cách, khả chịu lỗi giúp cho kết nối USB nhiều nhà phát triển phần cứng lựa chọn cho thiết bị Ta bắt gặp kết nối USB hầu hết loại điện thoại di động thông thường, điện thoại thông minh, máy tính bảng, chuột, bàn phím, loa… Các ứng dụng người dùng muốn giao tiếp với thiết bị phải thông qua Driver Các Driver có tác dụng làm ẩn phức tạp đa dạng kiến trúc phần cứng với ứng dụng người dùng Trên hệ điều hành Linux, Driver cho số lớp thiết bị USB phổ biến HID, Mass Storage, Audio… xây dựng sẵn nhân hệ điều hành Tuy nhiên phát triển thiết bị chưa hệ điều hành hỗ trợ nhà phát triển phải tự xây dựng Driver cho thiết bị Công việc khó khăn với đa số lập trình viên vừa phải hiểu nguyên lý phần cứng, vừa phải biết lập trình hệ thống Linux Được gợi ý giúp đỡ thầy hướng dẫn em thực đề tài: “Tìm hiểu chế viết Driver cho thiết bị chuẩn USB Linux Ứng dụng viết Driver cho máy điện tim đạo trình” Thông qua đồ án em xin gửi lời cảm ơn tới thầy cô trường Đại học Bách Khoa Hà Nội, thầy cô Viện công nghệ thông tin truyền thông, thầy cô môn Kỹ thuật máy tính truyền đạt cho em kiến thức quý báu suốt năm qua Đặc biệt, em xin bày tỏ biết ơn sâu sắc tới thầy Phạm Văn Thuận, người tận tình hướng dẫn theo sát em trình em thực đề tài Cuối em xin gửi lời cảm ơn tới bạn lớp Kỹ thuật máy tính K52 có góp ý chân thành cho đề tài Bố cục báo cáo tốt nghiệp sau: Mở đầu Trong phần em giới thiệu chung đề tài, lý chọn đề tài, bố cục báo cáo lời cảm ơn Phần Các kiến thức tổng quan Chương Kiến trúc hệ điều hành Linux Giới thiệu lập trình mô-đun nhân Linux Chương giới thiệu kiến trúc hệ điều hành Linux, nhấn mạnh chức quản lý thiết bị Driver hệ thống Linux Chương Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính giới thiệu lập trình mô-đun không gian nhân hệ điều hành, bước cần nắm để viết USB Device Driver Chương Hệ thống USB Linux Chương cung cấp số kiến thức chuẩn truyền thông USB mô hình điều khiển thiết bị USB hệ thống Linux Phần Thực viết USB Device Driver Linux Chương Trình tự viết USB Device Driver Linux Trong chương em giới thiệu cách chi tiết bước để cài đặt USB Device Driver Chương Viết Driver cho máy điện tim đạo trình Phần em tập trung vào việc cài đặt cụ thể Driver cho máy điện tim đạo trình chương trình hiển thị tín hiệu điện tim tảng Qt Sau em thực chuyển toàn chương trình xuống KIT FriendlyARM chạy kiểm thử Kết luận Phần đánh giá kết đạt được, điểm chưa đạt hướng phát triển nhằm hoàn thiện chương trình Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính PHẦN CÁC KIẾN THỨC TỔNG QUAN CHƯƠNG KIẾN TRÚC HỆ ĐIỀU HÀNH LINUX GIỚI THIỆU VỀ LẬP TRÌNH MÔ-ĐUN NHÂN TRÊN LINUX 1.1 Tổng quan kiến trúc hệ điều hành Linux Linux thực thi hai chế độ: chế độ người dùng (user mode) chế độ nhân (kernel mode), tương ứng với hai chế độ hai không gian nhớ nhớ chính: không gian người dùng (user space) không gian nhân (kernel space) Không gian người dùng vùng không gian nhớ mà tiến trình người dùng thực thi Không gian bảo vệ  Hệ thống ngăn chặn việc tiến trình giao tiếp với tiến trình khác  Chỉ tiến trình nhân truy nhập tới tiến trình người dùng Không gian nhân vùng không gian nhớ nơi mà tiến trình nhân thực thi Người dùng truy nhập tới vùng nhớ thông qua lời gọi hệ thống Trong không gian nhân, hệ điều hành có chức sau:      Quản lý nhớ (Memory Management) Quản lý tiến trình (Process Management) Quản lý thiết bị (Device Management) Quản lý hệ thống tệp tin (File System Management) Quản lý giao tiếp mạng (Network Interface Management) Mô hình kiến trúc hệ điều hành Linux sau: Hình Mô hình kiến trúc hệ thống Linux Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính Chế độ nhân hỗ trợ kiến trúc CPU (bởi lệnh máy đặc biệt) ngăn người dùng truy nhập vào phần cứng cách trực tiếp Trong chế độ người dùng chương trình hệ thống, trình ứng dụng sử dụng lại dịch vụ hệ điều hành Việc sử dụng lại dịch vụ thực thông qua lời gọi hệ thống (system calls) Khi lời gọi hệ thống thực thi, tham số tới lời gọi truyền từ không gian người dùng tới không gian nhân Các lời gọi hệ thống chuyển chế độ chạy máy từ chế độ người dùng sang chế độ nhân, điều khiển chuyển cho hệ điều hành Sau thực xong lời gọi hệ thống, điều khiển trả lại cho chương trình người dùng 1.2 Hệ thống tệp tin hệ điều hành Linux Hệ thống tệp tin (File System) Linux đặc tả sau:       Cấu trúc cấp bậc (cây thư mục) Cách xử lý quán tệp (chuỗi byte – byte stream) Khả tạo hủy tệp (tạo mới, xóa) Tính tăng trưởng động tệp (thêm bớt, cắt dán) Khả bảo vệ liệu tệp (bởi kiểu thuộc tính quyền truy xuất) Xử lý thiết bị ngoại vi xử lý tệp Cây thư mục hệ thống tệp tin Linux sau: Hình Hệ thống tệp tin Linux Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 10 .release flush = = ecg3_release, ecg3_flush, }; Bây giờ, hàm thăm dò ta tìm Endpoint Bulk IN Endpoint Bulk OUT Interface mà USB Core cung cấp cho hàm thăm dò Khai báo biến cần thiết: static int ecg3_probe(struct usb_interface *interface, const struct usb_device_id *id) { struct usb_ecg3 *dev; struct usb_host_interface *iface_desc; struct usb_endpoint_descriptor *endpoint; size_t buffer_size; int i; int retval = -ENOMEM; printk(KERN_INFO "Start probe"); // // printk(KERN_INFO "End probe"); } Sử dụng vòng lặp để duyệt tìm Endpoint, lưu giữ địa chỉ, cấp phát nhớ cho vùng đệm Endpoint iface_desc = interface->cur_altsetting; for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { endpoint = &iface_desc->endpoint[i].desc; //kiểm tra Endpoint // } Tìm thấy Endpoint Bulk In Endpoint Bulk Out //bulk_in if (!dev->bulk_in_endpointAddr && usb_endpoint_is_bulk_in(endpoint)) { //tìm thấy Endpoint Bulk IN buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); dev->bulk_in_size = buffer_size; dev->bulk_in_endpointAddr = endpoint->bEndpointAddress; dev->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL); if (!dev->bulk_in_buffer) { err("Could not allocate bulk_in_buffer"); goto error; } } Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 49 //bulk_out if (!dev->bulk_out_endpointAddr && usb_endpoint_is_bulk_out(endpoint)) { //tìm thấy Bulk OUT dev->bulk_out_endpointAddr = endpoint->bEndpointAddress; } Lưu trữ lại thông tin tìm thấy cấp phát, đăng kí lớp thiết Driver: usb_set_intfdata(interface, dev); retval = usb_register_dev(interface, &ecg3_class); if (retval) { err("Not able to get a minor for this device."); usb_set_intfdata(interface, NULL); goto error; } 4.1.6 Cài đặt hành động mở, đọc, ghi thiết bị A Hành động mở tệp tin: static int ecg3_open(struct inode *inode, struct file *file) { struct usb_ecg3 *dev; struct usb_interface *interface; int subminor; int retval = 0; subminor = iminor(inode); printk(KERN_INFO "start open"); interface = usb_find_interface(&ecg3_driver, subminor); if (!interface) { err("%s - error, can't find device for minor %d", func , subminor); retval = -ENODEV; goto exit; } dev = usb_get_intfdata(interface); if (!dev) { retval = -ENODEV; goto exit; } printk(KERN_INFO "end open"); return retval; } Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 50 B Hành động đọc: Ta sử dụng hàm truyền nhận liệu mà không cần URB để thực đọc liệu từ thiết bị: static ssize_t ecg3_read(struct file *file, char user *buffer, size_t count, loff_t *ppos) { struct usb_ecg3 *dev; int retval = 0; int actual_size; memset(&data, 0x00, sizeof(struct ecg3_data)); printk(KERN_INFO "start read\n"); dev = (struct usb_ecg3 *)file->private_data; // bulk_in printk(KERN_INFO "start bulk in"); retval = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), dev->bulk_in_1_buffer, min(dev->bulk_in_size, (size_t)12), &actual_size, HZ*10); if (!retval) { memcpy(& data.ecg3_data, dev->bulk_in_buffer, actual_size); printk(KERN_INFO "bulk_in ok\n"); } else printk(KERN_INFO "bulk_in error\n"); if (!copy_to_user(buffer, &data, sizeof(struct ecg3_data))) printk(KERN_INFO "read ok\n"); printk(KERN_INFO "end read\n"); return retval; } C Hành động ghi: Sao chép liệu từ không gian người dùng, tạo URB xác nhận URB xuống USB Core static ssize_t ecg3_write(struct file *file, const char *user_buffer, size_t count, loff_t *ppos) { struct usb_ecg3 *dev; int retval = 0; struct urb *urb = NULL; char *buf = NULL; size_t writesize = min(count, (size_t)MAX_TRANSFER); Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 51 printk(KERN_INFO "start write"); dev = (struct usb_ecg3 *)file->private_data; if (count == 0) goto exit; //cấp phát URB để gửi liệu urb = usb_alloc_urb(0, GFP_KERNEL); if (!urb) { retval = -ENOMEM; goto error; } buf = usb_buffer_alloc(dev->udev, writesize, GFP_KERNEL, &urb->transfer_dma); if (!buf) { retval = -ENOMEM; goto error; } if (copy_from_user(buf, user_buffer, writesize)) { retval = -EFAULT; goto error; } //khởi tạo URB //hàm hoàn thành ecg3_write_bulk_callback usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), buf, writesize, ecg3_write_bulk_callback, dev); urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; usb_anchor_urb(urb, &dev->submitted); //xác nhận URB retval = usb_submit_urb(urb, GFP_KERNEL); if (retval) { err("%s - failed submitting write urb, error %d", func , retval); goto error; } usb_free_urb(urb); printk(KERN_INFO "end write"); return writesize; error: if (urb) { usb_buffer_free(dev->udev, writesize, buf, urb->transfer_dma); usb_free_urb(urb); } exit: return retval; } Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 52 D Hàm hoàn thành URB sử dụng hành động ghi: static void ecg3_write_bulk_callback(struct urb *urb) { struct usb_ecg3 *dev; dev = urb->context; printk(KERN_INFO "Start write_callback"); if (urb->status) { if (!(urb->status == -ENOENT || urb->status == -ECONNRESET || urb->status == -ESHUTDOWN)) printk(KERN_INFO "write_callback: err: %s – nonzero write bulk status received: %d", func , urb->status); } //giải phóng nhớ cấp phát usb_buffer_free(urb->dev, urb->transfer_buffer_length, urb->transfer_buffer, urb->transfer_dma); printk(KERN_INFO "End write_callback"); } 4.1.7 Biên dịch, tải Driver vào nhân hệ điều hành Để biên dịch mô-đun Driver viết ta sử dụng Makefile Nội dung Makefile sau: obj-m += ecg3-driver.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean Sử dụng lệnh make để biên dịch, kết sinh mô-đun ecg3-driver.ko Đây mô-đun Driver viết Để tải mô-đun vào hệ điều hành, ta sử dụng lệnh sau: insmod ecg3-driver.ko modprobe ecg3-driver Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 53 4.2 Chương trình hiển thị tín hiệu điện tim tảng Qt 4.2.1 Xây dựng giao diện A Giấy vẽ Đầu tiên, ta xây dựng lớp có tác dụng “giấy vẽ”, ta vẽ tín hiệu điện tim lên đối tượng Khai báo lớp sau: class RenderArea : public QWidget { Q_OBJECT public: QList listPoint; public: void UpdatePointList(QList); protected: void paintEvent(QPaintEvent *event); }; Các thành viên lớp RenderArea :  Một danh sách điểm biểu diễn tín hiệu điện tim hiển thị: QList listPoint Danh sách tổ chức hàng đợi, tối đa chứa 400 điểm Các phương thức cần thiết cho lớp giấy vẽ là:  void UpdatePointList(QList): Cập nhật lại danh sách điểm tín hiệu điện tim, danh sách truyền vào từ lớp cửa sổ chương trình  void paintEvent(QPaintEvent *event): Vẽ tín hiệu điện tim B Cửa sổ chương trình Khai báo lớp cửa sổ chương trình: class Dialog : public QDialog { Q_OBJECT public: Dialog(); void timerEvent(QTimerEvent*); void UpdatePointList(); private: QList listPoint1, listPoint2, listPoint3; RenderArea* renderArea1, *renderArea2, *renderArea3; Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 54 private: DataDelegate* dataHandler; }; Các thành viên lớp này: đối tượng “giấy vẽ” tạo để hiển thị tín hiệu đạo trình điện tim: RenderArea* renderArea1, *renderArea2, *renderArea3  danh sách chứa điểm biểu diễn tín hiệu điện tim giấy vẽ này:  QList listPoint1, listPoint2, listPoint3 Các phương thức lớp bao gồm:  void UpdatePointList(): Cập nhật danh sách điểm: listPoint1, listPoint2, listPoint3 Để thực việc ta cần khai báo thêm lớp DataDelegate, lớp thực thao tác giao tiếp với Driver máy điện tim  void timerEvent(QTimerEvent*): Tần số lấy mẫu tín hiệu điện tim 25 mẫu / giây, khởi chạy chương trình ta tạo Timer để định thời Hàm gọi có kiện Timer Trong hàm ta gọi tới hàm UpdatePointList để thực lấy liệu từ máy điện tim, sau gọi tới hành động vẽ tín hiệu điện tim đối tượng giấy vẽ 4.2.2 Sử dụng Driver viết để giao tiếp với máy điện tim Ta khai báo cấu trúc liệu điện tim sau: struct ecg3_data { float data_1; float data_2; float data_3; }; Để thực lấy liệu điện tim cung cấp cho lớp giao diện chương trình, ta khai báo thêm lớp DataDelegate Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 55 class DataDelegate { public: DataDelegate(); DataDelegate(char* file); struct ecg3_data GetData(); public: int fdes; char filename[30]; }; Các thành viên lớp là:  int fdes: file descriptor tệp tin thiết bị  char filename[30]: đường dẫn tới tệp tin thiết bị Các phương thức lớp này:  struct ecg3_data GetData(): Thực việc giao tiếp với thiết bị thông qua Driver xây dựng Trong phương thức này, ta thực ghi lệnh yêu cầu liệu xuống thiết bị, sau thực đọc liệu thiết bị gửi lên Cài đặt chi tiết phương thức sau: struct ecg3_data DataDelegate::GetData() { struct ecg3_data result; char c = 'a'; int fd; int rt; fd = open((const char*)filename, O_RDWR); if(fd[...]... trữ trên thiết bị Ví dụ: ổ đĩa cứng… 1 .3. 2 Định danh thiết bị trên hệ điều hành Linux Khi thiết bị được kết nối vào hệ thống, nếu có Driver được chỉ định điều khiển thiết bị thì Linux sẽ định danh cho thiết bị đó Linux định danh các thiết bị bằng các số hiệu thiết bị (Device Numbers), gồm: số hiệu loại thiết bị (Major Number) và số hiệu thiết bị riêng lẻ (Minor Number) Major Number xác định xem Driver. .. thuật máy tính 14 C Tạo ra một tệp tin thiết bị mới Để tạo ra một tệp tin thiết bị mới trong /dev ta sử dụng lệnh mknod Việc tạo ra một tệp tin thiết bị mới không có nghĩa là các trình điều khiển thiết bị tương ứng hay các thiết bị phần cứng có thể sử dụng được ngay Mỗi tệp tin thiết bị chỉ đóng vai trò như một cổng thông tin để giao tiếp với các trình điều khiển thiết bị tương ứng Chỉ các tiến trình. .. của thiết bị Tiếp tục, gõ lệnh lsusb –vd : để hiển thị các thông tin về cấu hình USB của thiết bị Ví dụ chi tiết sẽ được trình bày khi bắt tay vào việc viết Driver cho máy điện tim 3. 2 Khai báo cấu trúc dữ liệu liên quan tới thiết bị Trong quá trình thăm dò thiết bị, có rất nhiều thông tin về thiết bị ta truy nhập được và cần phải lưu lại để sử dụng về sau Các thông tin cần thiết. .. thiết bị (‘c’ cho thiết bị kiểu kí tự, ‘b’ cho thiết bị kiểu khối), tham số thứ ba và thứ tư chính là số hiệu loại thiết bị và số hiệu thiết bị riêng lẻ của thiết bị Ví dụ: Bật terminal, đăng nhập với quyền root, sau đó sử dụng lệnh mknod đã nói trên để tạo ra một tệp tin thiết bị có tên là mydevice, Major Number là 6, Minor Number là 0 Hình 6 Tạo tệp tin thiết bị mới D Thao tác với tệp tin thiết bị. .. số thiết bị giao diện thẻ thông minh (CCID) sử dụng giao diện USB để giao tiếp với máy tính  Lớp các thiết bị truyền thông: Lớp các thiết bị truyền thông bao gồm hai loại thiết bị chính là: thiết bị thoại và các thiết bị mạng tốc độ trung bình Thiết bị thoại bao gồm điện thoại tương tự, modem tương tự, Các bộ thích nghi đầu cuối ISDN và điện thoại số Các thiết bị mạng bao gồm modem ADSL, modem điện. .. kiểu kí tự hay thiết bị kiểu khối, ‘c’ cho thiết bị kiểu kí tự và ‘b’ cho thiết bị kiểu khối  Sau đó là các kí tự cho biết quyền đối với tệp tin thiết bị này  Theo sau người sở hữu và nhóm người sở hữu là hai số, chính là số hiệu loại thiết bị và số hiệu thiết bị riêng lẻ  Theo sau là thời gian tạo tệp tin thiết bị  Cuối cùng là tên của tệp tin thiết bị Hình 5 Các thiết bị được tìm thấy tại đường... tính 15 1 .3. 4 Cơ chế tạo ra tệp tin thiết bị tự động sử dụng udev A Giới thiệu về udev Trong hệ thống Linux, đường dẫn /dev chứa các tệp tin thiết bị Mỗi tệp tin thiết bị liên kết với một thiết bị của hệ thống, thiết bị này có thể tồn tại hoặc không tồn tại trong hệ thống Các tiến trình trong không gian người dùng có thể sử dụng các tệp tin thiết bị này để giao tiếp với các thiết bị phần cứng Đường... điều khiển  Sinh viên thực hiện: Mai Đình Đương – SHSV: 20070820 – Khóa K52 – Lớp: Kỹ thuật máy tính 35 PHẦN 2 THỰC HIỆN VIẾT USB DEVICE DRIVER TRÊN LINUX CHƯƠNG 3 TRÌNH TỰ VIẾT USB DEVICE DRIVER TRÊN LINUX 3. 1 Tìm hiểu phần cứng Đầu tiên chúng ta cần có các thông tin về Firmware trên thiết bị Thông tin cần thiết bao gồm: idVendor, idProduct, số lượng Configuration, số lượng Interface trong từng Configuration,... sử dụng USB) Nếu một thiết bị đầu cuối mà không phù hợp để gán vào một lớp được định nghĩa thì người thiết kế sẽ phải viết Driver cho thiết bị để cung cấp cho máy chủ các thông tin giúp nó giao tiếp được với thiết bị đó 2.1 .3 Các khái niệm Endpoint, Interface, Configuration Dạng cơ bản nhất trong giao tiếp USB là thông qua các Điểm cuối (Endpoint) Các Endpoint thực chất là các vùng nhớ trên thiết bị, ... với các thiết bị phần cứng thông qua các thành phần phần mềm được mô-đun hóa (modularized) gọi là trình điều khiển thiết bị (Device Driver) Một Device Driver sẽ ẩn đi các giao thức giao tiếp phần cứng cụ thể đối với hệ điều hành Các Driver cho phép hệ điều hành giao tiếp với thiết bị thông qua một giao diện đã được chuẩn hóa Trên Linux, các thiết bị được phân thành hai dạng chính:  Thiết bị kiểu kí

Ngày đăng: 31/05/2016, 21:22

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan