Flash Memmory là loại thiết bị lưu trữ dùng công nghệ EEPROM, được thiết kế theo chuẩn bus vào ra USB. Do tính tiện dụng và khả năng cơ động của nó, Flash Memmory ngày càng được sủ dụng và ứng dụng rộng rãi. Trong phần đồ án tốt nghiệp này, em xin được trình bày về cách thức xây dựng một driver cho flash memmory từ 64 Mb đến 256 Mb.
Việc xây dựng USB driver cho flash memmory cũng như các USB driver khác, vì vậy em chỉ nêu ra các khác biệt
5.2. CÁC SƠ ĐỒ THỰC HIỆN CHOTRÊN USB DRIVER CHO FLASH MEMMORY
Sơ đồ khối quan trọng nhất là sơ đồ thực hiện trong hàm probe
Khoá con trỏ tới device
Xác định lại các tham số
Khởi toạ lại thiết bị
Mỏ khoá tới device
Xác định bộ nhớ và khởi tạo
Xác định URB
Xác định các tham số
Tạo số thứ tự cho device
Xác định các hàm xử lý prôtl
Đăng ký
Xác định các hàm xử lý prôtl
Kiêm tra xem device đã tồn tại chưa
Lấy các Interface
Kiểm tra xem hệ thống có hỗ trọ không Lấy các tham số về device
5.3. CÁC CẤU TRÚC DỮ LIỆU DÙNG TRÊN USB DRIVER CHO FLASH MEMMORY
Để xây dựng driver, cấu trúc quan trọng nhất luu toàn bộ thông tin về driver trong quá trình làm việc la cấu trúc us_data bao gồm các thành phần sau
Struct us_data * next;
Struct semaphore dev_semaphore; Struct usb_device * pusb_dev;
unsigned int flags;
char vendor[32]; char product[32]; char serial[32]; char * transport_name; char * protocol_name; u8 subclass; u8 protocol; u8 max_lun; u8 ifnum; u8 ep_in; u8 ep_out; Struct usb_endpoint_descriptor * ep_int;
Trans_cmnd transport; Trans_reset transport_reset; proto_cmnd proto_handler; GUID(guid);
Struct Scsi_Host * host; Scsi_Host_Template htmplt;
int host_number; int host_no; Scsi_Cmnd * srb;
atomic_t abortcnt; Scsi_Cmnd * queue_srb; int action;
pid_t pid; Struct semaphore ip_waitq; atomic_t ip_wanted[1]; Struct semaphore irq_urb_sem; Struct urb * irq_urb; unsigned char irqbuf[2]; unsigned char irqdata[2]; Struct semaphore current_urb_sem; Struct urb * current_urb; Struct completion current_done; unsigned int tag;
Struct semaphore sema; struct completion notify;
spinlock_t queue_exclusion; Struct us_unusual_dev * unusual_dev; Void * extra;
Cấu trúc lưu giữ toàn bộ các thông tin về device đang làm việc. Trong đó next: là device tiếp theo
dev_semaphore: để bảo vệ pusb_dev pusb_dev: là device hiện tại
flags: cờ khởi động
vendor: là tên nhà cung cấp product:
serial:
transport_name tên của hàm vận chuyển protocol_name: tên của giao thức
subclass: protocol: max_lun:
ifnum: số lượng giao thức ep_in: bulk in endpoint ep_out: bulk out endpoint
struct usb_endpoint_descriptor *ep_int; /* interrupt endpoint */
transport: hàm vận chuyển
transport_reset: hàm reset vận chuyển proto_handler: hàm xử lý giao thức GUID(guid): số được gán cho device Host: bộ đệm của host
Htmplt:mẫu hình của host host_number: để tìm host
host_no: dịa chỉ host xác định bởi scsi srb:
abortcnt: queue_srb:
action: hành động pid: mã tác vụ
ip_waitq: ip_wanted[1]:
irq_urb_sem: để bảo vệ irq_urb irq_urb: USB request
irqbuf[2]: bộ đệm cho irq_urb irqdata[2:; dữ liệu từ irq_urb
current_urb_sem: để bảo vệ current_urb current_urb: current_done: cờ hoàn thành tag: sema: tác vuh nghỉ notify: cờ của tác vụ queue_exclusion:
unusual_dev: nếu là thiết bị không thông thường extra:extra_destructor:
CHƯƠNG 6 TỔNG KẾT
6.1. PHÁT TRIỂN DRIVER TRÊN HỆ ĐIỀU HÀNH MÃ NGUỒN ĐÓNG VÀ HỆ ĐIỀU HÀNH MÃ NGUỒN MỞ
Driver cũng như các sản phẩm phần mềm khác, trong khi trên hệ điều hành mã nguồn đóng như Window, chúng ta hoàn toàn không biết kernel của Windows lmà việc như thê nào với các driver và với các thiết bị phần cứng thì trái lại driver trên Linux la một thành phần của kernel và được cung cấp mở cả mã nguồn về các giao diện, các hàm hỗ trợ và cách thức lam việc. Một điều đáng kể là do tính mở của kernel nên khi người dùng phát hiện lỗi và thông báo lên cộng đồng nguồn mở thì lập tức sẽ có nhũng thành viên của cộng đồng sửa lỗi này và cập nhật vào kernel. Vì vậy có thể nói chất lượng của các driver viết trên hệ điều hành mã nguồn mở cao hơn va đòi hỏi ít thời gian để phát triển hơn.
Tuy nhiên, driver trên Linux lại nghèo nàn về tài liệu hướng dẫn cài đặt và sử dụng. Điều này đòi hỏi người sử dụng phải có kinh nghiệm và kiến thức nhất định.
6.2. TỔNG KẾT
Phát triển driver là một công việc khó khăn và đòi hỏi nhiều kiến thức sâu về hệ điều hành, về thiết bị cần xây dựng. Việc phát triển một driver và kiểm tra hoàn chỉnh để có thể dưa tới người sử dụng cuối theo các chuyên gia đánh giá mất khoảng từ 5-6 tháng. Trong phạm vi đồ án tốt nghiệp do hạn chế về thời gian và kiến thức chuyên môn sâu nên kết quả thu được chưa thật nhiều. Tuy vậy em cũngng xin nêu ra một số kết quả đã đạt được:
+ hiểu về kiến trúc bus USB
+ xây dựng driver cho flash memmory + sử dụng được các thư viện kernel cho USB
+ các bước tạo và xây dựng các file cần thiết cho việc phát triển USB driver trên linux dựa trên các giao diện va hàm mà kernel cung cấp.
PHỤ LỤC A. CÁC THUẬT NGỮ VIẾT TẮT
- CPU: Bộ vi xử lý - Device: thiết bị - Interface: Giao diện
- Host: Chỉ hệ thống có cài đặt Host Controller
- Host Controller: Driver điều khiển trung tâm của BUS USB - Process: tiến trình, tác vụ
- Protocol: giao thức
PHỤ LỤC B. MỘT SỐ HÀM CUNG CẤP BỞI KERNEL CHO USB FLASH MEMMORY DRIVER
1)
int usb_register(struct usb_driver *new_driver)
2)
void usb_scan_devices(void)
3)
static void usb_drivers_purge(struct usb_driver *driver,struct usb_device *dev)
4)
void usb_deregister(struct usb_driver *driver)
int usb_ifnum_to_ifpos(struct usb_device *dev, unsigned ifnum)
6)
struct usb_interface *usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum)
7)
struct usb_endpoint_descriptor *usb_epnum_to_ep_desc(struct usb_device *dev, unsigned epnum)
8)
long usb_calc_bus_time (int speed, int is_input, int isoc, int bytecount)
9)
int usb_check_bandwidth (struct usb_device *dev, struct urb *urb)
10)
void usb_claim_bandwidth (struct usb_device *dev, struct urb *urb, int bustime, int isoc)
11)
void usb_release_bandwidth(struct usb_device *dev, struct urb *urb, int isoc)
12)
static void usb_bus_get(struct usb_bus *bus)
13)
14)
struct usb_bus *usb_alloc_bus(struct usb_operations *op)
15)
void usb_free_bus(struct usb_bus *bus)
16)
void usb_register_bus(struct usb_bus *bus)
17)
void usb_deregister_bus(struct usb_bus *bus)
18)
static void usb_check_support(struct usb_device *dev)
19)
void usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void* priv)
20)
int usb_interface_claimed(struct usb_interface *iface)
21)
void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface)
22)
const struct usb_device_id *
const struct usb_device_id *id)
23)
static int usb_find_interface_driver(struct usb_device *dev, unsigned ifnum)
24)
int usb_find_interface_driver_for_ifnum(struct usb_device *dev, unsigned ifnum)
25)
static void call_policy_interface (char *verb, struct usb_device *dev, int interface)
26)
static void call_policy (char *verb, struct usb_device *dev)
27)
static inline void
call_policy (char *verb, struct usb_device *dev)
28)
static void usb_find_drivers(struct usb_device *dev)
29)
struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus)
30)
void usb_free_dev(struct usb_device *dev)
void usb_inc_dev_use(struct usb_device *dev)
32)
struct urb *usb_alloc_urb(int iso_packets)
33)
void usb_free_urb(struct urb* urb)
34)
int usb_submit_urb(struct urb *urb)
35)
int usb_unlink_urb(struct urb *urb)
36)
static void usb_api_blocking_completion(struct urb *urb)
37)
static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
38)
int usb_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
struct usb_ctrlrequest *cmd, void *data, int len, int timeout)
39)
int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype, __u16 value, __u16 index, void *data, __u16 size, int timeout)
40)
int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout)
41)
int usb_get_current_frame_number(struct usb_device *usb_dev)
42)
static int usb_parse_endpoint(struct usb_endpoint_descriptor *endpoint, unsigned char *buffer, int size)
43)
static int usb_parse_interface(struct usb_interface *interface, unsigned char *buffer, int size)
44)
int usb_parse_configuration(struct usb_config_descriptor *config, char *buffer)
45)
void usb_destroy_configuration(struct usb_device *dev)
46)
static int ascii2utf (char *ascii, __u8 *utf, int utfmax)
47)
48)
int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr)
49)
void usb_disconnect(struct usb_device **pdev)
50)
void usb_connect(struct usb_device *dev)
51)
#define GET_TIMEOUT 5 #define SET_TIMEOUT 5
int usb_set_address(struct usb_device *dev)
52)
int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size)
53)
int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
unsigned char type, unsigned char id, void *buf, int size)
54)
int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size)
55)
int usb_get_device_descriptor(struct usb_device *dev)
56)
int usb_get_status(struct usb_device *dev, int type, int target, void *data)
57)
int usb_get_protocol(struct usb_device *dev, int ifnum)
58)
int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol)
59)
int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id)
60)
void usb_set_maxpacket(struct usb_device *dev)
61)
int usb_clear_halt(struct usb_device *dev, int pipe)
62)
int usb_set_interface(struct usb_device *dev, int interface, int alternate)
63)
int usb_set_configuration(struct usb_device *dev, int configuration)
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size)
65)
int usb_set_report(struct usb_device *dev, int ifnum, unsigned char type, unsigned char id, void *buf, int size)
66)
int usb_get_configuration(struct usb_device *dev)
67)
int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
68)
int usb_new_device(struct usb_device *dev)
69)
static int usb_open(struct inode * inode, struct file * file)
70)
int usb_major_init(void)
71)
void usb_major_cleanup(void)
72)
73)
struct list_head *usb_bus_get_list(void)
74)
static int __init usb_init(void)
75)
static void __exit usb_exit(void) { usb_major_cleanup(); usbdevfs_cleanup(); usb_hub_cleanup(); } 76) module_init(usb_init); 77) module_exit(usb_exit);
PHỤ LỤC C. CÁC TÀI LIỆU THAM KHẢO
1. Linux Kernal Internals Second Edititon
M BECK, M ZIADZKA, U KUNITZ, R MAGNUS, D VERWORNER 2. Universal Serial Bus Spececification Revision 1.1
Compad, Intel, Microsoft, NEC September 23 1998
3. Universal Serial Bus Spececification Revision 2.0
Compaq, Hewlett-Packard, Intel, Lucent, Microsoft, NEC, Philips April 27, 2000
4. http://www.linux-usb.org 5. http://gcc.gnu.org
6. OSS-Asia-NNBinh.ppt – Bài giảng về Open Source của PGS.TS Nguyễn Ngọc Bình – Ha Noi, Jan. 8, 2003