Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Memory Device Driver trong lập trình C trên Linux

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Talking Memory Device Driver trong lập trình C trên Linux

    Lâu lâu không post code lên giờ làm vài cái cho máu
    Viết cái Device Driver mẫu
    Xử lý demo memory
    Bác nào có làm việc trên Linux hoặc bài tập dùng cái này tham khảo

    C Code:
    1. /* Necessary includes for device drivers */
    2. #include <linux/init.h>
    3. #include <linux/config.h>
    4. #include <linux/module.h>
    5. #include <linux/kernel.h> /* printk() */
    6. #include <linux/slab.h> /* kmalloc() */
    7. #include <linux/fs.h> /* everything... */
    8. #include <linux/errno.h> /* error codes */
    9. #include <linux/types.h> /* size_t */
    10. #include <linux/proc_fs.h>
    11. #include <linux/fcntl.h> /* O_ACCMODE */
    12. #include <asm/system.h> /* cli(), *_flags */
    13. #include <asm/uaccess.h> /* copy_from/to_user */
    14.  
    15.  
    16. /* Declaration of memory.c functions */
    17. int memory_open(struct inode *inode, struct file *filp);
    18. int memory_release(struct inode *inode, struct file *filp);
    19. ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos);
    20. ssize_t memory_write(struct file *filp, char *buf, size_t count, loff_t *f_pos);
    21. void memory_exit(void);
    22. int memory_init(void);
    23.  
    24. /* Structure that declares the usual file */
    25. /* access functions */
    26. struct file_operations memory_fops = {
    27.   read: memory_read,
    28.   write: memory_write,
    29.   open: memory_open,
    30.   release: memory_release
    31. };
    32.  
    33. /* Declaration of the init and exit functions */
    34. module_init(memory_init);
    35. module_exit(memory_exit);
    36.  
    37. /* Global variables of the driver */
    38. /* Major number */
    39. int memory_major = 171;
    40. /* Buffer to store data */
    41. char *memory_buffer;
    42.  
    43. int memory_init(void) {
    44.   int result;
    45.  
    46.   /* Registering device */
    47.   result = register_chrdev(memory_major, "memory", &memory_fops);
    48.   if (result < 0) {
    49.     printk(
    50.       "<1>memory: cannot obtain major number %d\n", memory_major);
    51.     return result;
    52.   }
    53.  
    54.   /* Allocating memory for the buffer */
    55.   memory_buffer = kmalloc(1, GFP_KERNEL);
    56.   if (!memory_buffer) {
    57.     result = -ENOMEM;
    58.     goto fail;
    59.   }
    60.   memset(memory_buffer, 0, 1);
    61.  
    62.   printk("<1>Inserting memory module\n");
    63.   return 0;
    64.  
    65.   fail:
    66.     memory_exit();
    67.     return result;
    68. }
    69.  
    70. void memory_exit(void) {
    71.   /* Freeing the major number */
    72.   unregister_chrdev(memory_major, "memory");
    73.  
    74.   /* Freeing buffer memory */
    75.   if (memory_buffer) {
    76.     kfree(memory_buffer);
    77.   }
    78.  
    79.   printk("<1>Removing memory module\n");
    80.  
    81. }
    82.  
    83. int memory_open(struct inode *inode, struct file *filp) {
    84.  
    85.   /* Success */
    86.   return 0;
    87. }
    88.  
    89. int memory_release(struct inode *inode, struct file *filp) {
    90.  
    91.   /* Success */
    92.   return 0;
    93. }
    94.  
    95. ssize_t memory_read(struct file *filp, char *buf,
    96.                     size_t count, loff_t *f_pos) {
    97.  
    98.   /* Transfering data to user space */
    99.   copy_to_user(buf,memory_buffer,1);
    100.  
    101.   /* Changing reading position as best suits */
    102.   if (*f_pos == 0) {
    103.     *f_pos+=1;
    104.     return 1;
    105.   } else {
    106.     return 0;
    107.   }
    108. }
    109.  
    110. ssize_t memory_write( struct file *filp, char *buf,
    111.                       size_t count, loff_t *f_pos) {
    112.  
    113.   char *tmp;
    114.  
    115.   tmp=buf+count-1;
    116.   copy_from_user(memory_buffer,tmp,1);
    117.   return 1;
    118. }
    None!

  2. #2
    Ngày gia nhập
    11 2006
    Bài viết
    9

    Bạn có doc mô tả đoạn code này không? Mình đọc code sẽ không hiểu nhiều lắm nếu không có doc
    360 yahoospacetime blog
    Tripod blog
    cũng của spacetime trên wordpress
    The god programmin language-C
    My name is 7h36h5ng
    password yahoo:mDn4kdn1z

  3. #3
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Đây là một driver ảo (virtual driver) để đọc và viết memory.
    Để sử dụng compile nó thành module (Makefile ko)
    sau đó chèn vào hệ thống
    Code:
    root ~]# /sbin/insmod memory.ko
    để xóa đi thì remove
    Code:
    root ~]# /sbin/rmmod memory.ko
    sau đó khởi động lại để dùng (activate)
    Code:
    root ~]# shutdown -r now
    Sử dụng thì viết một chương trình nhỏ để test các API đã viết ở trên á
    Đầu tiên tạo file driver cho hệ thống
    Code:
    root ~]# mknod /dev/memory c 1 0
    c : character driver
    1 : Major version
    0 : Minor version
    Tra cứu chi tiết hơn về mknod
    Code:
    root ~]# man mknod
    Mình ở trên khai báo 4 API đơn giản
    Code:
    struct file_operations memory_fops = {
      read: memory_read,
      write: memory_write,
      open: memory_open,
      release: memory_release
    };
    2 cái open với release chẳng nghĩ ra viết gì nên kệ return 0 cho nhanh
    2 cái read and write bạn dùng để đọc hoặc ghi memory. Chú ý đây là memory ảo nhé không phải thật đâu.

    Code:
    ssize_t memory_read(struct file *filp, char *buf, 
                        size_t count, loff_t *f_pos)
    ssize_t memory_write( struct file *filp, char *buf,
                          size_t count, loff_t *f_pos)
    à quên mất, cái device driver chỉ có system kernel nó xài. Khi nào có call đến các driver của một device nào đó thì các cấu trúc này sẽ được tự động gọi. Vì nó được xử lý qua file_operations trong kernel rồi.
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 22-11-2007 lúc 03:12 PM.
    None!

  4. #4
    Ngày gia nhập
    12 2007
    Bài viết
    0

    nhưng nó có lỗi rùi bạn ơi *v*

Các đề tài tương tự

  1. Cách sử dụng RNDIS driver, giao tiếp qua cổng USB giữa PC và Smart Device?
    Gửi bởi markpq trong diễn đàn Lập trình Windows Mobile bằng C#
    Trả lời: 1
    Bài viết cuối: 07-01-2013, 03:57 PM
  2. Hướng Dẫn Lập Trình Driver Trên Hệ Điều Hành Linux
    Gửi bởi AlexF trong diễn đàn Thủ thuật, Tutorials và Mã nguồn
    Trả lời: 9
    Bài viết cuối: 06-12-2012, 10:51 AM
  3. Tool để lập trình linux device driver?
    Gửi bởi bigbang1b0 trong diễn đàn Công cụ, Tài liệu lập trình trên Linux
    Trả lời: 1
    Bài viết cuối: 13-10-2012, 10:48 PM
  4. Trả lời: 1
    Bài viết cuối: 06-10-2011, 08:11 PM
  5. Lập trình Driver| Một số code access device viết bằng C
    Gửi bởi Xcross87 trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 25-11-2007, 12:31 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn