博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kernel-char设备的建立
阅读量:4573 次
发布时间:2019-06-08

本文共 2291 字,大约阅读时间需要 7 分钟。

kernel下的设备分成了一些类,char block char。。

这里就贴出来一个样例能够建立一个char设备 ,抛砖引玉吧

这是kernel中的 drivers/char/msm_smd_pkt.c

先要启动初始化module

module_init(smd_pkt_init);

smd_pkt_init会在启动之后调用

static int __init smd_pkt_init(void)

{
    int i;
    int r;
创造char设备的结构体
    r = alloc_chrdev_region(&smd_pkt_number, 0,
                NUM_SMD_PKT_PORTS, DEVICE_NAME);
    if (r) {
        pr_err("alloc_chrdev_region() failed %d\n", r);
        return r;
    }
创造class下的设备机构提
    smd_pkt_classp = class_create(THIS_MODULE, DEVICE_NAME);
    if (IS_ERR(smd_pkt_classp)) {
        r = PTR_ERR(smd_pkt_classp);
        pr_err("class_create() failed %d\n", r);
        goto unreg_chardev;
    }
    for (i = 0; i < NUM_SMD_PKT_PORTS; ++i) {
        smd_pkt_devp[i] = kzalloc(sizeof(struct smd_pkt_dev),
                      GFP_KERNEL);
        if (IS_ERR(smd_pkt_devp[i])) {
            r = PTR_ERR(smd_pkt_devp[i]);
            pr_err("kmalloc() failed %d\n", r);
            goto clean_cdevs;
        }
        smd_pkt_devp[i]->i = i;
以下几行都是私有数据的赋值  我们不用关心   不须要能够删掉
        init_waitqueue_head(&smd_pkt_devp[i]->ch_read_wait_queue);
        smd_pkt_devp[i]->remote_open = 0;
        init_waitqueue_head(&smd_pkt_devp[i]->ch_opened_wait_queue);
        mutex_init(&smd_pkt_devp[i]->ch_lock);
        mutex_init(&smd_pkt_devp[i]->rx_lock);
        mutex_init(&smd_pkt_devp[i]->tx_lock);
关键地方就是这里了:

char设备的结构初始化

        cdev_init(&smd_pkt_devp[i]->cdev, &smd_pkt_fops);

        smd_pkt_devp[i]->cdev.owner = THIS_MODULE;
char设备添加
        r = cdev_add(&smd_pkt_devp[i]->cdev,
                 (smd_pkt_number + i), 1);
        if (r) {
            pr_err("cdev_add() failed %d\n", r);
            kfree(smd_pkt_devp[i]);
            goto clean_cdevs;
        }
char设备在dev下创造一个节点设备   这个一定要有哦
        smd_pkt_devp[i]->devicep =
            device_create(smd_pkt_classp, NULL,
                      (smd_pkt_number + i), NULL,
                      smd_pkt_dev_name[i]);
        if (IS_ERR(smd_pkt_devp[i]->devicep)) {
            r = PTR_ERR(smd_pkt_devp[i]->devicep);
            pr_err("device_create() failed %d\n", r);
            cdev_del(&smd_pkt_devp[i]->cdev);
            kfree(smd_pkt_devp[i]);
            goto clean_cdevs;
        }
    }
    pr_info("SMD Packet Port Driver Initialized.\n");
    return 0;
后面就是错误处理了 无论了
clean_cdevs:
    if (i > 0) {
        while (--i >= 0) {
            mutex_destroy(&smd_pkt_devp[i]->ch_lock);
            mutex_destroy(&smd_pkt_devp[i]->rx_lock);
            mutex_destroy(&smd_pkt_devp[i]->tx_lock);
            cdev_del(&smd_pkt_devp[i]->cdev);
            kfree(smd_pkt_devp[i]);
            device_destroy(smd_pkt_classp,
                       MKDEV(MAJOR(smd_pkt_number), i));
        }
    }
    class_destroy(smd_pkt_classp);
unreg_chardev:
    unregister_chrdev_region(MAJOR(smd_pkt_number), NUM_SMD_PKT_PORTS);
    return r;
}

转载于:https://www.cnblogs.com/llguanli/p/7221690.html

你可能感兴趣的文章
[工具] 各种主流 SQLServer 迁移到 MySQL 工具对比
查看>>
(二)Maven 基本概念——依赖、生命周期、仓库管理、聚合&继承
查看>>
py4CV例子3Mnist识别和ANN
查看>>
【4Opencv】如何识别出轮廓准确的长和宽
查看>>
现货黄金交易计划摸索
查看>>
Django中国|Django中文社区——python、django爱好者交流社区
查看>>
java中的toArray()
查看>>
java数据库之JDBC
查看>>
C语言 strcpy,memcpy,memmove,memccpy函数
查看>>
SqlSession 内部运行
查看>>
C语言一个小程序的bug疑问 数组相关[已解决]
查看>>
空指针与野指针的区别
查看>>
Ubuntu的root用户问题
查看>>
Linux启动新进程的几种方法及比较[转]
查看>>
使用Python定义类及创建对象
查看>>
[SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到文本文件...
查看>>
Freemarker页面语法(转载)
查看>>
hadoop 3.x 完全分布式集群搭建/异常处理/测试
查看>>
hdu 1035 Robot Motion
查看>>
html5 线程 web Worker
查看>>