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;

}

kernel-char设备的建立的更多相关文章

  1. linux kernel 字符设备详解

    有关Linux kernel 字符设备分析: 参考:http://blog.jobbole.com/86531/ 一.linux kernel 将设备分为3大类,字符设备,块设备,网络设备. 字符设备 ...

  2. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...

  3. 嵌入式 emmc 中 安装 烧录 内核 kernel,设备树 devicetree ,根文件系统 rootfs

    一般调试嵌入式开发板喜欢选择  利用 TFTP 传送  内核与 设备树,  利用 nfs 加载根文件系统. uboot 环境变量 设置如下: bootargs=root=/dev/nfs rw nfs ...

  4. i2c总线,设备,驱动之间的关系

    ------ 总线上先添加好所有具体驱动,i2c.c遍历i2c_boardinfo链表,依次建立i2c_client, 并对每一个i2c_client与所有这个线上的驱动匹配,匹配上,就调用这个驱动的 ...

  5. linux设备模型_转

    建议原博文查看,效果更佳. 转自:http://www.cnblogs.com/wwang/category/269350.html Linux设备模型 (1) 随着计算机的周边外设越来越丰富,设备管 ...

  6. Android系统启动过程-uBoot+Kernel+Android

    摘要:本文是参考大量网上资源在结合自己查看源代码总结出来的,让自己同时也让大家加深对Android系统启动过程有一个更加深入的了解!再次强调,本文的大多数功劳应归功于那些原创者们,同时一些必要的参考链 ...

  7. Smart210学习记录------块设备

    转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的 ...

  8. Linux驱动编写(块设备驱动代码)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 按照ldd的说法,linux的设备驱动包括了char,block,net三种设备.char设备 ...

  9. linux 设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和 ...

随机推荐

  1. jQuery过滤选择器具体解释

    基本过滤选择器 选取第一个元素(:first) //选择第一个div元素. $('#btn1').click(function(){ $('div:first').css("backgrou ...

  2. Android 控件:CheckBox

    首先,在布局文件里注冊CheckBox activity_main.xml <LinearLayout xmlns:android="http://schemas.android.co ...

  3. notification-应用实例

    这几天接触到了notification,现在就把它的常用方法总结下. 直接看如下代码就行了 ComponentName componetName = new ComponentName("c ...

  4. MyEclipse 2016 安装/破解

    MyEclipse2016 C1 已经出现了!感觉好像不错的样子! 不多说了,开整... 好熟悉的界面,点击Next! 如上图标注1所示,请修改安装目录! 根据自己的喜好可以选择不同的版本,也可以安装 ...

  5. Java学习笔记八

    IO流:就是input/output输入/输出流. 一.字节流操作文件的便捷类:FileWriter和FileReader import java.io.FileWriter; import java ...

  6. Wiz+360云盘,让你的知识库井井有条

    用了wiz快两年了,一些同事看到我在找资料时打开wiz,总会好奇的问这是什么,想到还有很多同仁在用文件夹管理知识库,于是想分享一下我的管理方法.(PS:鄙人愚见,如有高见,望指教) Wiz为知笔记下载 ...

  7. scrapy爬取知乎某个问题下的所有图片

    前言: 1.仅仅是想下载图片,别人上传的图片也是没有版权的,下载来可以自己欣赏做手机背景但不商用 2.由于爬虫周期的问题,这个代码写于2019.02.13 1.关于知乎爬虫 网上能访问到的理论上都能爬 ...

  8. BZOJ2738: 矩阵乘法(整体二分)

    Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...

  9. 模板 Fail树

    fail树就是将Trie图的Fail指针反指,从而生成一棵树,这个树的性质是:子节点对应字符串为以当前串为后缀,而子节点为原串的前缀,前缀的后缀就是嵌套在原串中的子串. 模板:BZOJ3172 Des ...

  10. Project Euler 389 Platonic Dice (概率)

    题目链接: https://projecteuler.net/problem=389 题意: 掷一个正四面体骰子,记点数为\(T\). 掷\(T\)个正六面体骰子,记点数和为\(C\). 掷\(C\) ...