新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 字符設備驅動模型淺析

        字符設備驅動模型淺析

        作者: 時間:2014-02-08 來源:網絡 收藏


        復制代碼

        接著又調用了函數cdev_add(),這個函數又調用了kobj_map()函數,其作用就是分配一個struct probe結構體,填充該結構體中的變量并將其加入到全局的cdev_map中,說白了,就是分個一畝三分田給該,并做好標記,放到主設備號對應的地方,等主人下次來找的時候能找到(使用kobj_lookup()函數,后面會講到)。該函數是這樣的,int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,

        struct module *module, kobj_probe_t *probe,

        int (*lock)(dev_t, void *), void *data)

        {

        unsigned n = MAJOR(dev + range - 1) - MAJOR(dev) + 1;

        unsigned index = MAJOR(dev);

        unsigned i;

        struct probe *p;

        if (n > 255)

        n = 255;

        /*分配了一畝三分田*/

        p = kmalloc(sizeof(struct probe) * n, GFP_KERNEL);

        if (p == NULL)

        return -ENOMEM;

        /*填充些私有的東西*/

        for (i = 0; i owner = module;

        p->get = probe; /*是exact_match ()函數,獲取cdev結構體的kobject指針*/

        p->lock = lock; /*是exact_lock()函數,增加引用*/

        p->dev = dev;

        p->range = range;

        p->data = data; /* cdev保存到p->data中*/

        }

        mutex_lock(domain->lock);

        /*將這一畝三分田加到主設備號對應的位置上去*/

        for (i = 0, p -= n; i probes[index % 255];

        while (*s (*s)->range next;

        p->next = *s;

        *s = p;

        }

        mutex_unlock(domain->lock);

        return 0;

        }

        復制代碼接下來有class_create()函數和class_device_create()函數,前者生成一個名字為testchar的class,后者作用就是在/dev目錄下生成設備節點,當然,需要和UDEVD的支持,具體可見鄙人博客上的文章《設備模型淺析之篇》。

        順帶說下register_chrdev()函數,其也是注冊,只不過是封裝好的,包含了所有前面講的注冊步驟——分配一個設備號,由一個主設備號和255個次設備號組成。如下,int register_chrdev(unsigned int major, const char *name,

        const struct file_operations *fops)

        {

        struct char_device_struct *cd;

        struct cdev *cdev;

        char *s;

        int err = -ENOMEM;

        cd = __register_chrdev_region(major, 0, 256, name);

        if (IS_ERR(cd))

        return PTR_ERR(cd);

        cdev = cdev_alloc(); /*這個有點不一樣,動態分配的,不是調用者提供*/

        if (!cdev)

        goto out2;

        cdev->owner = fops->owner;

        cdev->ops = fops;

        kobject_set_name( %s, name);

        for (s = strchr(kobject_name( s; s = strchr(s, '/'))

        *s = '!';

        err = cdev_add(cdev, MKDEV(cd->major, 0), 256);

        if (err)

        goto out;

        cd->cdev = cdev;

        return major ? 0 : cd->major;

        out:

        kobject_put(

        out2:

        kfree(__unregister_chrdev_region(cd->major, 0, 256));

        return err;

        }

        本文引用地址:http://www.104case.com/article/256974.htm
        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 拉萨市| 化州市| 义乌市| 顺平县| 象山县| 肇东市| 永川市| 哈巴河县| 马关县| 峨山| 横山县| 若尔盖县| 邻水| 高雄县| 略阳县| 文昌市| 芦溪县| 和静县| 珠海市| 临漳县| 余庆县| 江山市| 双流县| 盘锦市| 耒阳市| 定安县| 合水县| 佳木斯市| 双流县| 贡觉县| 旬阳县| 木里| 吴忠市| 密云县| 乌鲁木齐县| 舞钢市| 遂昌县| 土默特右旗| 靖江市| 宕昌县| 荔浦县|