MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

71 13 0
MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Đ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

VIỆN ĐIỆN TỬ - VIỄN THÔNG MÔN: HỆ ĐIỀU HÀNH Đề tài: Lập trình Driver cho USB Giảng viên hướng dẫn: TS.NGUYỄN THANH BÌNH Nhóm: Họ tên sinh viên MSSV Nguyễn Hữu Hiếu 20182517 Nguyễn Cao Lương 20182671 Trần Quang Vinh 20182891 Nguyễn Bá Quý 20182747 Trần Văn Cương 20182394 Hà Nội-Tháng 10 Năm 2021 LỜI MỞ ĐẦU Hiện nay, với phát triển ngày nhanh hệ thống nhúng để đáp ứng lại thị trường, dễ dàng thấy hệ điều hành Linux xuất hầu hết thiết bị có cấu trúc phức tạp khả đáp ứng cao Việc tích hợp hệ điều hành lên hệ thống nhúng giúp đơn giản hóa q trình thiết kế sản phẩm, rút ngắn thời gian chi phí xây dựng hệ thống ứng dụng kế thừa ưu việt hệ điều hành nói chung Linux riêng Đó nhỏ gọn, ổn định, thực thi nhanh, đơn giản hóa khả can thiệp phần cứng Hơn nữa, với cộng đồng sử dụng Linux rộng lớn khắp giới phần mềm mã nguồn mở đa dạng làm cho việc phát triển hệ thống Linux nhúng chiến lược công ty lựa chọn hàng đầu Mặt khác, chuẩn giao tiếp USB (Universal Series Bus) trở thành chuẩn giao tiếp phổ biến Hiện tại, 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 vững giá thành hợp lý 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 Chúng em định chọn đề tài “Viết driver viết USB” cho hệ điều hành làm tập lớn cho môn học Hệ điều hành Mặc dù cố gắng có khả báo cáo chúng em cịn thiếu sót, chúng em mong nhận đóng góp ý kiến đánh giá thầy cô người quan tâm đến đề tài chúng em, để báo cáo hoàn thiện Cuối cùng, chúng em xin chân thành cảm ơn thầy TS Nguyễn Thanh Bình định hướng đề tài giúp đỡ chúng em hoàn thành báo cáo MỤC LỤC MỤC LỤC II HÌNH ẢNH VÀ BẢNG BIỂU IV CHƯƠNG TỔNG QUAN DEVICE DRIVER 1.1 CƠ BẢN VỀ DRIVER TRÊN LINUX 1.1.1 Định nghĩa Driver 1.1.2 Vai trò nhiệm vụ Driver 1.1.3 Mơ hình phân lớp theo chiều dọc: 1.2 VIẾT DRIVER ĐẦU TIÊN TRÊN LINUX 1.2.1 Nạp động driver vào hệ thống 1.2.2 Viết driver 1.2.3 Biên dịch Driver đầu tiên: 1.3 LẬP TRÌNH C Ở TẦNG NHÂN 11 1.3.1 Ghi log thông điệp tầng nhân: 11 1.3.2 Một số mở rộng GCC tầng nhân: .12 1.3.3 Sử dụng giá trị trả cho hàm tầng nhân: 13 1.3.4 Kernel C pure C: 14 1.4 LINUX CHARACTER DRIVERS 15 1.4.1 Device file (device node): .15 1.4.2 Device number: 17 1.4.3 Cấu trúc character driver: .17 1.4.4 Cấp phát tĩnh Device Number: 19 1.4.5 Cấp phát động Device number: 22 1.4.6 Tạo device file 23 1.4.7 Cấp phát nhớ khởi tạo thiết bị: 26 1.4.8 Đăng kí entry point open release: 27 1.4.9 Đăng ký entry point read write .31 CHƯƠNG USB DEVICE DRIVER 36 2.1 CƠ BẢN VỀ USB 36 2.1.1 Định nghĩa USB 36 2.1.2 Chuẩn tín hiệu .36 2.1.3 Mơ hình mạng: 36 2.1.4 Kịch hoạt động USB .38 2.1.5 Chế độ truyền USB 40 2.1.6 Quá trình nhận dạng thiết bị usb Linux .40 2.1.7 Giải mã thông tin thiết bị USB 43 TÀI LIỆU THAM KHẢO 46 PHỤ LỤC 47 HÌNH ẢNH VÀ BẢNG BIỂU Hình 1.1 Tương tác thiết bị driver .2 Hình 1.2 Các thành phần driver thên Linux .3 Hình 1.3 Kiến trúc tổng quan nhân Linux Hình 1.4 Xem module có sẵn Linux Hình 1.5 Xem module nạp Hình 1.6 Kết biên dịch file mymodule.ko Hình 1.7 Kiểm tra module nạp vào lệnh ls Hình 1.8 Nạp module 10 Hình 1.9 Gỡ module khỏi kernel 10 Hình 1.10 Xem thông điệp ghi log từ kernel 12 Hình 1.11 Cài đặt kernel source 14 Hình 1.12 Kết nối tiến trình character device Linux .16 Hình 1.13 Một số device file 17 Hình 1.14 Danh sách thiết bị hoạt động hệ thống 21 Hình 15 Cấp phát tĩnh device number 22 Hình 16 Thơng tin /proc/devices sau lắp vchar_driver.ko vào kernel 23 Hình 1.17 Tạo device file cơng cụ mknod 24 Hình 1.18 Tạo device file tự động 26 Hình 1.19 Các bước triển khai entry point read char driver 32 Hình 1.20 Biên dịch lắp vchar_driver vào kernel 34 Hình 1.21 Thực hàm entry point device file Hình 2.1 Các đường tín hiệu chuẩn USB .36 Hình 2.2 Đồ hình mạng thiết bị hoạt động theo chuẩn USB 37 Hình 2.3 Thơng tin cấu hình thiết bị USB hoạt động với Interface 39 Hình 2.4 Hệ thống USB Linux 41 Hình 2.5 Xem thơng tin thiết bị USB sử dụng lệnh lsusb .42 Hình 2.6 Thơng tin đặc tả thiết bị USB /proc/bus/usb/devices 43 Hình 2.7 Mơ hình biểu diễn tổng quan thiết bị USB 44 Y Bảng 1.1 Một số hàm marco làm việc với device number .20 CHƯƠNG TỔNG QUAN DEVICE DRIVER 1.1 Cơ driver Linux 1.1.1 Định nghĩa Driver Driver gì? Driver phần mềm, gồm lệnh, hướng dẫn CPU cách tương tác với thiết bị Các thiết bị chuột, bàn phím, ổ cứng, card mạng, loa, hình,… Ví dụ đơn giản: Máy tính bạn có card Wifi khơng cài driver máy tính khơng thể dùng Wifi 1.1.2 Vai trị nhiệm vụ Driver a) Vai trò driver Thông dịch qua lại hệ điều hành phần cứng máy tính, khơng có driver driver khơng với thiết bị hệ điều hành khơng thể nhận thiết bị, dẫn đến máy tính khơng sử dụng Driver trình điều khiển có vai trò điều khiển, quản lý, giám sát thực thể quyền Bus driver làm việc với đường bus, device driver làm việc với thiết bị (chuột, bàn phím, hình, đĩa cứng, camera, …) Có thể lấy ví dụ tương tự vai trị phi cơng hệ thống bay tự động giám sát phi công, thành phần phần cứng điều khiển driver điều khiển phần cứng khác mà driver quản lý Trường hợp này, phần cứng có vai trị điều khiển gọi device controller Bản thân controller cần driver Ví dụ: hard disk controller, display controller, audio controller, … quản lý thiết bị kết nối với chúng, mà nói cách kỹ thuật IDE controller, PCI controller, USB controller, SPI controller, I2C controller, … Các khái niệm minh họa tổng quan hình sau: Hình 1.1 Tương tác thiết bị driver Các device controller thông thường kết nối với CPU thông qua đường bus (PCI, IDE, USB, SPI, …) Trong vi điều khiển, CPU device controller thường thiết kế chip Điều cho phép giảm kích thước giá thành, phù hợp với phát triển hệ thống nhúng Mà mặt nguyên tắc, khác biệt tương đối lớn driver hệ thống máy tính cá nhân b) Hai nhiệm vụ driver: Các bus driver cung cấp giao diện đặc tả cho giao thức phần cứng tương ứng Nó nằm tầng mơ hình phân lớp phần mềm hệ điều hành Nằm device driver thực để vận hành thiết bị, mang đặc trưng thiết bị xác định Ngồi ra, mục đích quan trọng driver thiết bị cung cấp giao diện trừu tường hóa cho người sử dụng, tức cung cấp giao diện lên tầng hệ điều hành Một cách tổng quan, driver bao gồm phần quan trọng:  Giao tiếp với thiết bị (Device-specific)  Giao tiếp với hệ điều hành (OS-specific) Hình 1.2 Các thành phần driver thên Linux Thành phần giao tiếp với thiết bị (device-specific) driver giống tất hệ điều hành Nó hiểu giải mã thơng tin thiết bị (chi tiết kỹ thuật, kiểu thao tác, hiệu năng, cách lập trình giao tiếp với thiết bị, …) Thành phần giao tiếp với hệ điều hành (OS-specific) gắn kết chặt chẽ với chế hệ điều hành, khác driver Linux driver Windows, MacOS, … 1.1.3 Mơ hình phân lớp theo chiều dọc: Trên Linux, device driver cung cấp giao diện “system call” (giao diện gọi hàm hệ thống) đến tầng ứng dụng cho người dùng; coi ranh giới tầng nhân (kernel space) tầng người dùng (user space) Linux   Mơ hình phân tầng hình vẽ Hình 1.3 Kiến trúc tổng quan nhân Linux Tùy thuộc vào đặc trưng driver với hệ điều hành, driver Linux chia làm loại (phân cấp theo chiều dọc):    Driver hướng gói liệu (Packet-orented or the network vertical) Driver hướng khối liệu (Block-oriented or the storage vertical) Driver hướng byte/kí tự (Byte-oriented or the character vertical) Packet-oriented hay network driver gồm phần:  Network protocol stack  Network interface card (NIC) device drivers đơn giản network device driver (có thể Ethernet,Wi-fi, mạng giao tiếp khác, ….) Block-oriented hay storage driver gồm phần:  File-system drivers để giải mã định dạng khác phân vùng lưu trữ khác (FAT, ext, …)  Block device drivers cho giao thức phần cứng ứng với thiết bị lưu trữ khác (IDE, SCSI, MTD, …) Các Byte-oriented hay character driver lại tiếp tục phân chia thành lớp (sub-classified) tty driver, input driver, console driver, frame-buffer drivers, sound driver, … (tương ứng với giao tiếp RS232, PS/2, VGA, I2C, SPI, …) Tạo device file cách tự động: #include // dinh nghia cac marco nhu module_init va module_exit #include // dinh nghia cac ham cap phat/giai phong device number #include // #define DRIVER_AUTHOR "CaoLuong" #define DRIVER_DESC "vi du ve cap phat tinh" #define DRIVER_VERSION "0.2" /* tao cau truc de luu gia tri device number */ struct _vchar_drv { dev_t dev_num; struct class *dev_class; struct device *dev; } vchar_drv; /*============= OS specific - START ============*/ /********Ham khoi tao driver********/ static int init vchar_driver_init(void) { int ret = 0; /* cap phat device number*/ vchar_drv.dev_num = 0; ret=alloc_chrdev_region(&vchar_drv.dev_num,0,1,"vchar_device"); // hàm alloc_chrdev_region yeu cau tim kiem mot device number // phu hop if(ret < 0) { printk("failed to register device number statically\n"); goto failed_register_devnum; } printk("allocated device number (%d, %d)\n",MAJOR(vchar_drv.dev_num), MINOR(vchar_drv.dev_num)); /* tao device file */ vchar_drv.dev_class = class_create(THIS_MODULE,”class_vchar_dev”); if(vchar_drv.dev_class == NULL) { printk(“failed to create a device class\n”); goto failed_create_class; } vchar_drv.dev = device_create(vchar_drv.dev_class,NULL, vchar_drv.dev_num, NULL, “vchar_dev”); if(IS_ERR(vchar_drv.dev)){ printk(“failed to create a device”); goto failed_create_device; } /* /* */ printk("Initialize vchar driver successfully\n"); return 0; failed_register_devnum: return ret; } /*********Ham ket thuc driver*********/ static void exit vchar_driver_exit(void) { /* Huy dang ky xu li ngat */ /* */ /*giai phong device number */ unregister_chrdev_region(vchar_drv.dev_num,1); printk("Exit vchar driver\n"); } module_init(vchar_driver_init); module_exit(vchar_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_VERSION(DRIVER_VERSION); MODULE_SUPPORTED_DEVICE("testdevice"); vchar_driver.h /* *ten file: vchar_driver.h *tac gia: CaoLuong *ngay tao: 23/11/2021 *mo ta: chua cac dinh nghia mo ta thiet bi gia lap vchar_dev * vchar_dev la mot thiet bi gia lap nawm tren RAM */ #define REG_SIZE //kich thuoc cua ghi la byte (8 bits) #define NUM_CTRL_REGS // so ghi dieu khien cua thiet bi #define NUM_STS_REGS // so ghi trang thai cua thiet bi #define NUM_DATA_REGS 256 // so ghi du lieu cua thiet bi #define NUM_DEV_REGS (NUM_CTRL_REGS + NUM_STS_REGS + NUM_DATA_REGS) // tong so ghi cua thiet bi /*========Mo ta cac ghi trang thai: START ========*/ /* *cap ghi [READ_COUNT_H_REG:READ_COUNT_L_REG]: * - gia tri luc khoi tao: 0x0000 * - moi lan doc cong tu cac ghi du lieu, tang them don vi */ #define READ_COUNT_H_REG #define READ_COUNT_L_REG /* *cap ghi [WRITE_COUNT_H_REG:WRITE_COUNT_L_REG]: * - gia tri luc khoi tao: 0x0000 * - moi lan doc cong tu cac ghi du lieu, tang them don vi */ #define WRITE_COUNT_H_REG #define WRITE_COUNT_L_REG /* *thanh ghi DEVICE_STATUS_REG: * - gia tri luc khoi tao: 0x03 * - y nghia cua cac bit: * bit 0: * doc 0: cho biet cac ghi du lieu dang khong san sang de * * * ghi * : cho biet cac ghi du lieu san sang de doc bit 1: 0: cho biet cac ghi du lieu dang khong san sang de : cho biet cac ghi du lieu san sang de ghi * bit 2: * la 0: cac ghi du lieu bi xoa, bit duoc thiet lap * la 1: toan bo cac ghi du lieu da bi ghi, bit se * bit 3~7: chua dung toi */ #define DEVICE_STATUS_REG #define STS_READ_ACCESS_BIT (1control_regs); } /*======== device specific - END ==========*/ /*========= OS specific - START ===========*/ /**** Cac ham entry points - START *****/ // kiem tra thiet bi san sang chua, - Open entry point static int vchar_driver_open(struct inode *inode, struct file *flip) { vchar_drv.open_cnt++; printk("Handle opened event (%d)\n",vchar_drv.open_cnt); return 0; } // tat thiet bi, dung hoat dong, - Release entry point static int vchar_driver_release(struct inode *inode, struct file *flip) { printk("Handle closed event\n"); return 0; } // Ham doc noi dung cua cac ghi du lieu vchar device // vao kernel buffer cua vchar driver int vchar_hw_read_data(vchar_dev_t *hw, int start_reg, int num_regs, char *kbuf) { int read_bytes = num_regs; // kiem tra xem co quyen doc du lieu khong if((hw->control_regs[CONTROL_ACCESS_REG] & CTRL_READ_DATA_BIT) == DISABLE) return -1; // kiem tra xem dia chi cua kernel buffer co hop le khong if(kbuf == NULL) return -1; // kiem tra xem vi tri cua cac ghi can doc co hop ly khong if(start_reg > NUM_DATA_REGS) return -1; // dieu chinh lai so luong ghi du lieu can doc (neu can thiet) if(num_regs > (NUM_DATA_REGS - start_reg)) read_bytes = NUM_DATA_REGS - start_reg; // ghi du lieu tu kernel buffer vao cac ghi du lieu memcpy(kbuf, hw->data_regs + start_reg, read_bytes); // cap nhat so lan doc tu cac ghi du lieu hw->status_regs[READ_COUNT_L_REG] += 1; if(hw->status_regs[READ_COUNT_L_REG] == 0) hw->status_regs[READ_COUNT_H_REG] += 1; // tra ve so byte da doc duoc tu cac ghi du lieu return read_bytes; } // Doc du lieu tu buffer cua char device vao kernel buffer Sau do, // chep du lieu tu kernel buffer vao user buffer cua tien trinh // Read entry point static ssize_t vchar_driver_read(struct file *flip, char user *user_buf, size_t len, loff_t *off) { char *kernel_buf = NULL; int num_bytes = 0; printk("Handle read event start from %lld, %zu bytes\n", *off, len); kernel_buf = kzalloc(len, GFP_KERNEL); if(kernel_buf == NULL) return 0; num_bytes = vchar_hw_read_data(vchar_drv.vchar_hw, *off, len, kernel_buf); printk("read %d bytes from HW\n", num_bytes); if(num_bytes < 0) return -EFAULT; if(copy_to_user(user_buf, kernel_buf, num_bytes)) return -EFAULT; *off += num_bytes; return num_bytes; } // Ham ghi noi dung cua kernel buffer vao cac ghi du lieu cua vchar device int vchar_hw_write_data(vchar_dev_t *hw, int start_reg, int num_regs, char *kbuf) { int write_bytes = num_regs; // kiem tra xem co quyen ghi du lieu khong if((hw->control_regs[CONTROL_ACCESS_REG] & CTRL_WRITE_DATA_BIT) == DISABLE) return -1; // kiem tra xem dia chi cua kernel buffer co hop le khong if(kbuf == NULL) return -1; // kiem tra xem vi tri cua cac ghi can ghi co hop li khong if(start_reg > NUM_DATA_REGS) return -1; // dieu chinh lai so luong ghi du lieu can ghi (neu can thiet) if(num_regs > (NUM_DATA_REGS - start_reg)) { write_bytes = NUM_DATA_REGS - start_reg; hw->status_regs[DEVICE_STATUS_REG] |= STS_DATAREGS_OVERFLOW_BIT; } // Doc du lieu tu cac ghi du lieu vao kernel buffer memcpy(hw->data_regs + start_reg, kbuf, write_bytes); // Cap nhat so lan ghi vao cac du lieu hw->status_regs[WRITE_COUNT_L_REG] += 1; if(hw->status_regs[WRITE_COUNT_L_REG] == 0) hw->status_regs[WRITE_COUNT_H_REG] += 1; // Tra ve so byte da ghi vao cac ghi du lieu return write_bytes; } // Sao chep du lieu tu user buffer vao kernel buffe Sau do, ghi du // lieu tu kernel buffer vao buffer cua char device // Write entry point static ssize_t vchar_driver_write(struct file *flip, const char user *user_buf, size_t len, loff_t *off) { char *kernel_buf = NULL; int num_bytes = 0; printk("Handle write event start from %lld, %zu bytes\n", *off, len); kernel_buf = kzalloc(len, GFP_KERNEL); if(copy_from_user(kernel_buf, user_buf, len)) return -EFAULT; num_bytes = vchar_hw_write_data(vchar_drv.vchar_hw, *off, len, kernel_buf); printk("write %d bytes to HW\n", num_bytes); if(num_bytes < 0) return -EFAULT; *off += num_bytes; return num_bytes; } // dang ki cac ham tren entry point cua char driver static struct file_operations fops = { .owner = THIS_MODULE, open = vchar_driver_open, release = vchar_driver_release, read = vchar_driver_read, write = vchar_driver_write, }; /**** Cac ham entry point - END ****/ /**** Ham khoi tao driver ****/ static int init vchar_driver_init(void) { int ret = 0; //cap phat device number vchar_drv.dev_num = 0; ret = alloc_chrdev_region(&vchar_drv.dev_num,0,1, "vchar_device"); if(ret < 0){ printk("failed to register device number dynamically\n"); goto failed_register_devnum; } printk("allocated device number (%d,%d)\n", MAJOR(vchar_drv.dev_num), MINOR(vchar_drv.dev_num)); //tao device file vchar_drv.dev_class = class_create(THIS_MODULE,"class_vchar_dev"); if(vchar_drv.dev_class == NULL){ printk("failed to create a device class\n"); goto failed_create_class; } vchar_drv.dev = device_create(vchar_drv.dev_class,NULL, vchar_drv.dev_num,NULL, "vchar_dev"); if(IS_ERR(vchar_drv.dev)){ printk("failed to create a device\n"); goto failed_create_device; } // cap phat bo nho cho cac cau truc du lieu cua driver va khoi tao vchar_drv.vchar_hw = kzalloc(sizeof(vchar_dev_t), GFP_KERNEL); if(!vchar_drv.vchar_hw) { printk("failed to allocate data structure of the driver\n"); ret = -ENOMEM; goto failed_allocate_structure; } // khoi tao thiet bi vat ly ret = vchar_hw_init(vchar_drv.vchar_hw); if(ret < 0) { printk("failed to initialize a virtual character device\n"); goto failed_allocate_structure; } // dang ky cac entry point voi kernel vchar_drv.vcdev = cdev_alloc(); if(vchar_drv.vcdev == NULL) { printk("failed to allocate cdev structure\n"); goto failed_allocate_cdev; } cdev_init(vchar_drv.vcdev,&fops); if(ret < 0) { printk("failed to add a char device to the system\n"); goto failed_allocate_cdev; } // dang ky ham xu li ngat printk("Initialize vchar driver successfully\n"); return 0; failed_allocate_cdev: vchar_hw_exit(vchar_drv.vchar_hw); failed_init_hw: kfree(vchar_drv.vchar_hw); failed_allocate_structure: device_destroy(vchar_drv.dev_class, vchar_drv.dev_num); failed_create_device: class_destroy(vchar_drv.dev_class); failed_create_class: unregister_chrdev_region(vchar_drv.dev_num,1); failed_register_devnum: return ret; } /***** Ham ket thuc driver *****/ static void exit vchar_driver_exit(void) { // Huy dang ky ngat // Huy dang ky entry point voi kernel cdev_del(vchar_drv.vcdev); // Giai phong thiet bi vat ly vchar_hw_exit(vchar_drv.vchar_hw); // Giai phong bo nho da cap phat kfree(vchar_drv.vchar_hw); // xoa bo device file device_destroy(vchar_drv.dev_class, vchar_drv.dev_num); class_destroy(vchar_drv.dev_class); // ham giai phong device number unregister_chrdev_region(vchar_drv.dev_num,1); printk("Exit vchar driver\n"); } /*=========== OS specific - END ===========*/ module_init(vchar_driver_init); module_exit(vchar_driver_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_VERSION(DRIVER_VERSION); MODULE_SUPPORTED_DEVICE("testdevice"); user_test.c /* * ten file: user_test.c * tac gia : CaoLuong * tao: 26/11/2021 * mo ta : day la chuong trinh tren user space tuong tac voi vchar_device * vchar_device la mot thiet bi nam tren RAM */ #include #include #include #include #include #define BUFFER_SIZE 1024 #define DEVICE_NODE "/dev/vchar_dev" /* ham kiem tra entry point OPEN cua vchar driver */ int open_chardev() { int fd = open(DEVICE_NODE, O_RDWR); if(fd < 0) { printf("Can not open the device file\n"); exit(1); } return fd; } /* ham kiem tra entry point RELEASE cua vchar driver */ void close_chardev(int fd) { close(fd); } /* Ham kiem tra entry point READ cua vchar driver */ void read_data_chardev() { int ret = 0; char user_buf[BUFFER_SIZE]; int fd = open_chardev(); // open device file // dung system call READ de doc du lieu tu device file ret = read(fd, user_buf, BUFFER_SIZE); // close device file close_chardev(fd); // print data if (ret < 0) printf("Could not read a message from %s\n", DEVICE_NODE); else printf("Read a message from %s: %s\n", DEVICE_NODE, user_buf); } /* Ham kiem tra entry point WRITE cua vchar driver */ void write_data_chardev() { int ret = 0; char user_buf[BUFFER_SIZE]; // Nhap vao du lieu muon ghi vao device file printf("Enter your message: "); scanf(" %[^\n]s", user_buf); // Open device file int fd = open_chardev(); // su dung system call WRITE de Ghi chuoi ki tu, bao gom ca NULL ret = write(fd, user_buf, strlen(user_buf) + 1); // Close device file close_chardev(fd); if(ret < 0) printf("Could not write the message to %s\n", DEVICE_NODE); else printf("Wrote the message to %s\n", DEVICE_NODE); } int main() { int ret = 0; char option = 'q'; int fd = -1; printf("Select below options:\n"); printf("\to (to open a device file)\n"); printf("\tc (to close the device file)\n"); printf("\tr (to read data from device file)\n"); printf("\tw (to write data to device file)\n"); printf("\tq (to quit the application)\n"); while (1) { printf("Enter your option: "); scanf(" %c", &option); switch (option) { case 'o': if (fd < 0) fd = open_chardev(); else printf("%s has already opened\n", DEVICE_NODE); break; case 'c': if (fd > -1) close_chardev(fd); else printf("%s has not opened yet! Can not close\n", DEVICE_NODE); fd = -1; break; case 'r': read_data_chardev(); break; case 'w': write_data_chardev(); break; case 'q': if (fd > -1) close_chardev(fd); printf("Quit the application Good bye!\n"); return 0; default: printf("invalid option %c\n", option); break; } }; } ... 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.5.4 Kịch hoạt động USB Q trình hoạt động chuẩn USB. .. Thực hàm entry point device file CHƯƠNG USB DEVICE DRIVER 1.5 Cơ USB 1.5.1 Định nghĩa USB USB gì? USB (Universal Serial Bus) chuẩn kết nối đa dụng máy tính USB sử dụng để kết nối thiết bị ngoại... driver cho thiết bị usb thông thường gắn với giao diện (chức năng) thiết bị usb khơng thường cho tồn chức thiết bị Điều có nghĩa thiết bị usb có nhiều driver nhiều giao diện khác chung driver,

Ngày đăng: 22/12/2021, 05:46

Hình ảnh liên quan

Hình 1.1 Tương tác giữa thiết bị và driver - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.1.

Tương tác giữa thiết bị và driver Xem tại trang 8 của tài liệu.
Hình 1.2 Các thành phần của driver thên Linux - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.2.

Các thành phần của driver thên Linux Xem tại trang 9 của tài liệu.
Hình 1.3 Kiến trúc tổng quan nhân Linux - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.3.

Kiến trúc tổng quan nhân Linux Xem tại trang 10 của tài liệu.
Hình 1.4 Xem các module có sẵn trên Linux - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.4.

Xem các module có sẵn trên Linux Xem tại trang 11 của tài liệu.
Hình 1.5 Xem các module đã được nạp - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.5.

Xem các module đã được nạp Xem tại trang 12 của tài liệu.
Hình 1.6 Kết quả biên dịch file mymodule.ko - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.6.

Kết quả biên dịch file mymodule.ko Xem tại trang 15 của tài liệu.
Hình 1.9 Gỡ module khỏi kernel - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.9.

Gỡ module khỏi kernel Xem tại trang 16 của tài liệu.
Hình 1.8 Nạp module - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.8.

Nạp module Xem tại trang 16 của tài liệu.
Hình dưới minh họa sử dụng lệnh dmesg để xem thông tin ghi log từ tầng nhân, kết hợp với lệnh tail  để giới hạn số dòng muốn xem (do quá nhiều thông tin được log trên hệ thống). - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình d.

ưới minh họa sử dụng lệnh dmesg để xem thông tin ghi log từ tầng nhân, kết hợp với lệnh tail để giới hạn số dòng muốn xem (do quá nhiều thông tin được log trên hệ thống) Xem tại trang 18 của tài liệu.
Hình 1.11 Cài đặt kernel source - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.11.

Cài đặt kernel source Xem tại trang 20 của tài liệu.
Hình 1.12 Kết nối giữa tiến trình và character device trong Linux - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.12.

Kết nối giữa tiến trình và character device trong Linux Xem tại trang 22 của tài liệu.
Khi gõ lệnh “ls -l /dev” trên terminal, ta sẽ thu được kết quả tương tự như hình 1.13 - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

hi.

gõ lệnh “ls -l /dev” trên terminal, ta sẽ thu được kết quả tương tự như hình 1.13 Xem tại trang 23 của tài liệu.
Bảng 1.1 Một số hàm và marco làm việc với device number - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Bảng 1.1.

Một số hàm và marco làm việc với device number Xem tại trang 26 của tài liệu.
Hình 1.14 Danh sách các thiết bị đang hoạt động trong hệ thống - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.14.

Danh sách các thiết bị đang hoạt động trong hệ thống Xem tại trang 27 của tài liệu.
Hình 1. 15 Cấp phát tĩnh device number - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1..

15 Cấp phát tĩnh device number Xem tại trang 28 của tài liệu.
Phương pháp tạo device file này có ưu điểm là: - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

h.

ương pháp tạo device file này có ưu điểm là: Xem tại trang 30 của tài liệu.
Hình 1.17 Tạo device file bằng công cụ mknod - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.17.

Tạo device file bằng công cụ mknod Xem tại trang 30 của tài liệu.
Hình 1.18 Tạo device file tự động - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.18.

Tạo device file tự động Xem tại trang 32 của tài liệu.
Hình 1.19 Các bước triển khai entry point read trong char driver - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.19.

Các bước triển khai entry point read trong char driver Xem tại trang 38 của tài liệu.
Hình 1.20 Biên dịch và lắp vchar_driver vào kernel - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.20.

Biên dịch và lắp vchar_driver vào kernel Xem tại trang 40 của tài liệu.
Hình 1.21 Thực hiện các hàm entry point trên device file - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 1.21.

Thực hiện các hàm entry point trên device file Xem tại trang 41 của tài liệu.
Hình 2.1 Các đường tín hiệu chuẩn USB - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 2.1.

Các đường tín hiệu chuẩn USB Xem tại trang 42 của tài liệu.
Hình 2.2 Đồ hình mạng của các thiết bị hoạt động theo chuẩn USB - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 2.2.

Đồ hình mạng của các thiết bị hoạt động theo chuẩn USB Xem tại trang 43 của tài liệu.
Hình 2.3 Thông tin cấu hình của một thiết bị USB hoạt động với 1 Interface - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 2.3.

Thông tin cấu hình của một thiết bị USB hoạt động với 1 Interface Xem tại trang 45 của tài liệu.
Hình 2.4 Hệ thống USB trên Linux - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 2.4.

Hệ thống USB trên Linux Xem tại trang 47 của tài liệu.
Hình 2.5 Xem thông tin các thiết bị USB sử dụng lệnh lsusb - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 2.5.

Xem thông tin các thiết bị USB sử dụng lệnh lsusb Xem tại trang 48 của tài liệu.
xuất ra màn hình chứa thông tin cơ bản về tất cả các thiết bị usb được nhận diện trên hệ thống trong đó có vùng thông tin cho thiết bị ổ nhớ usb Flash Voyager đang sử dụng. - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

xu.

ất ra màn hình chứa thông tin cơ bản về tất cả các thiết bị usb được nhận diện trên hệ thống trong đó có vùng thông tin cho thiết bị ổ nhớ usb Flash Voyager đang sử dụng Xem tại trang 49 của tài liệu.
Hình 2.7 Mô hình biểu diễn tổng quan thiết bị USB - MÔN HỆ ĐIỀU HÀNH đề tài lập trình driver cho USB

Hình 2.7.

Mô hình biểu diễn tổng quan thiết bị USB Xem tại trang 51 của tài liệu.

Mục lục

    HÌNH ẢNH VÀ BẢNG BIỂU

    CHƯƠNG 1. TỔNG QUAN DEVICE DRIVER

    1.1. Cơ bản về driver trên Linux

    1.1.2. Vai trò và nhiệm vụ của Driver

    1.1.3. Mô hình phân lớp theo chiều dọc:

    1.2. Viết driver đầu tiên trên Linux

    1.2.1. Nạp động driver vào hệ thống

    1.2.2. Viết driver đầu tiên

    1.2.3. Biên dịch Driver đầu tiên:

    1.3. Lập trình C ở tầng nhân

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

Tài liệu liên quan