Linux驅動學習(四)

來源:互聯網
上載者:User

         在前三篇裡學習了Linux平台裝置和驅動的一些知識後,這篇就說一下驅動程式是怎麼自動產生裝置檔案。

         寫過Linux驅動的可能都知道,Linux裡有一類裝置叫做混雜裝置,而且還可以發現註冊這一類裝置後是不用手動去產生裝置檔案的。好吧,由這類裝置的註冊函數入手,從而去瞭解是怎樣自動產生裝置檔案的。看看混雜裝置註冊函數在/drivers/char/misc.c裡的定義:

 1 int misc_register(struct miscdevice * misc) 2 { 3         struct miscdevice *c; 4         dev_t dev; 5         int err = 0; 6  7         INIT_LIST_HEAD(&misc->list); 8  9         mutex_lock(&misc_mtx);10         list_for_each_entry(c, &misc_list, list) {11                 if (c->minor == misc->minor) {12                         mutex_unlock(&misc_mtx);13                         return -EBUSY;14                 }15         }16 17         if (misc->minor == MISC_DYNAMIC_MINOR) {18                 int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS);19                 if (i >= DYNAMIC_MINORS) {20                         mutex_unlock(&misc_mtx);21                         return -EBUSY;22                 }23                 misc->minor = DYNAMIC_MINORS - i - 1;24                 set_bit(i, misc_minors);25         }26         // MISC_MAJOR = 1027         dev = MKDEV(MISC_MAJOR, misc->minor);28 29         misc->this_device = device_create(misc_class, misc->parent, dev,30                                           misc, "%s", misc->name);31         if (IS_ERR(misc->this_device)) {32                 int i = DYNAMIC_MINORS - misc->minor - 1;33                 if (i < DYNAMIC_MINORS && i >= 0)34                         clear_bit(i, misc_minors);35                 err = PTR_ERR(misc->this_device);36                 goto out;37         }38 39         /*40          * Add it to the front, so that later devices can "override"41          * earlier defaults42          */43         list_add(&misc->list, &misc_list);44  out:45         mutex_unlock(&misc_mtx);46         return err;47 }

第17~25行的作用是分配一個還沒用過的次裝置號(混雜裝置的主裝置號都是一樣的);第27行,產生一個裝置號(由主裝置號和次裝置號組成)。第29行,自動產生裝置檔案的“玄機”就在裡面,看它在drivers/base/core.c裡的定義:

 1 struct device *device_create(struct class *class, struct device *parent, 2                              dev_t devt, void *drvdata, const char *fmt, ...) 3 {        4         va_list vargs; 5         struct device *dev; 6  7         va_start(vargs, fmt); 8         dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs); 9         va_end(vargs);10         return dev;11 }

關鍵看第8行device_create_vargs()的定義:

 1 struct device *device_create_vargs(struct class *class, struct device *parent, 2                                    dev_t devt, void *drvdata, const char *fmt, 3                                    va_list args) 4 { 5         struct device *dev = NULL; 6         int retval = -ENODEV; 7  8         if (class == NULL || IS_ERR(class)) 9                 goto error;10 11         dev = kzalloc(sizeof(*dev), GFP_KERNEL);12         if (!dev) {13                 retval = -ENOMEM;14                 goto error;15         }16 17         dev->devt = devt;18         dev->class = class;19         dev->parent = parent;20         dev->release = device_create_release;21         dev_set_drvdata(dev, drvdata);22 23         retval = kobject_set_name_vargs(&dev->kobj, fmt, args);24         if (retval)25                 goto error;26 27         retval = device_register(dev);28         if (retval)29                 goto error;30 31         return dev;32 33 error:34         put_device(dev);35         return ERR_PTR(retval);36 }

第17~21行,很明顯,就是設定device變數的一些成員的值;第27行,怎麼樣,很眼熟是吧,前面已經分析過了,這裡就不再累述。

 

下面總結一下在編寫驅動程式時怎麼讓核心幫我們自動產生裝置檔案,其實也就是多調用2個函數:

1. class_create()

該函數在include/linux/device.h裡定義。

2. 上面所說的device_create()

關鍵在於把class_create()函數的傳回值作為device_create()函數第一個參數的值,其他參數的含義都很好明白。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.