驱动开发 day3

这篇具有很好参考价值的文章主要介绍了驱动开发 day3。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

总结:自动创建设备节点udev的流程

1.如何创建节点

        手动创建:mknod 地址 设备文件类型 主设备号 次设备号(0 - 255)

        自动创建:devfs (创建节点的逻辑在内核 ---> 2.4版本以前使用)

                          udev (创建节点的逻辑在应用层)

                          mdev (轻量级的udev)

2.udev的流程

       驱动开发 day3,驱动开发

        1> 硬件层接入,将硬件信息加载到内核层

        2> 内核层向应用层提交目录(创建设备类:struct class)

                                   和设备节点(创建设备对象:struct device)

        3>同时发起hotplug event,应用层hotplug进程收到event,通知udev进程

        4>udev进程创建/dev/设备文件,同时在/sys/class/下创建目录和文件(/sys/class/目录/文件)

3.相关API

        1> struct class *class_create(struct module *owner, const char *name)

                功能:向上提交目录,在内核创建一个struct class类型的空间并初始化

                参数: owner:模块指针,填写THIS_MODULE(宏定义,指向当前模块自身的一个指针)                             name:向上提交的目录名

                返回值:成功返回创建好的struct class类型的指针,失败返回错误码指针

        2> void class_destroy(struct class *cls)

                功能:销毁目录

                参数: cls:class_create函数创建的空间首地址

                返回值:无

        3> struct device *device_create(struct class *class, struct device *parent, dev_t devt, void                                                                 *drvdata, const char *fmt, ...)

                功能:向上提交设备节点信息,在内核生成一个struct device空间并赋值

                参数: class:class_create函数创建的空间首地址

                            parent:父节点地址,不知道填NULL

                            devt:设备号

                                        MKDEV(主设备号,次设备号):通过主设备号和次设备号得到设备号 

                                        MAJOR(dev):根据设备号得到主设备号 

                                        MINOR(dev):根据设备号得到次设备号

                            drvdata:传递到device回调函数中的参数,填写NULL即可

                            fmt:  向上提交的设备节点名 ...:可填可不填

                            返回值:成功返回创建成功的struct device空间指针,失败返回错误码指针

        4>void device_destroy(struct class *class, dev_t devt)

                功能:销毁设备节点信息

                参数: class:class_create函数创建的空间首地址

                            devt:向上提交设备信息时提交的设备号

       5> 错误码

        驱动开发 day3,驱动开发           

        在3-4G的内核区域,最顶层预留了4K的空间,class_create函数执行失败函数返回值对应的指针是指向这4K预留空间的。

        bool IS_ERR(const void *ptr) //(unsigned long)(void *)(x) >= (unsigned long)-MAX_ER

                功能:用于判断指针是不是指向内核顶层预留的4K空间

                返回值:如果指针指向4K预留空间,则返回真,否则返回假        

        long __must_check PTR_ERR(__force const void *ptr)

                功能:通过错误码指针得到一个错误码文章来源地址https://www.toymoban.com/news/detail-733568.html

到了这里,关于驱动开发 day3的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 驱动开发 day3 (模块化驱动启动led,蜂鸣器,风扇,震动马达)

    模块化驱动启动led,蜂鸣器,风扇,震动马达并加上Makefile 封装模块化驱动,可自由安装卸载驱动,便于驱动更新(附图) 1.安装模块驱动同时初始化各个设备并使能 2.该驱动会自动创建驱动节点. 3.通过c函数程序输入控制各个设备 4.卸载模块驱动 //编译驱动(注意Makefile的编译到移植

    2024年02月16日
    浏览(35)
  • 【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门

    目录 一、Ajax 1、简介 2、Axios (没懂 暂留) (1)请求方式别名 (2)发送get请求 (3)发送post请求 (4)案例 二、前端工程化 1、Vue项目-目录结构 2、Vue项目-启动 (1)vscode页面启动 (2)cmd命令框启动 3、配置Vue端口号 4、Vue项目开发流程 三、Vue组件库 - Element  1、快速入门

    2024年02月12日
    浏览(24)
  • 驱动开发DAY 4

    分步实现字符设备驱动 PART 1 .  分析open函数的调用流程 用户层中进行打开文件操作{调用int open(const char *pathname, int flags);},虚拟文件系统层调用sys_open{假设打开字符设备节点}:         1.根据open传递的文件路径找到文件的inode结构体         open参数中的pathname为文件路径,

    2024年02月10日
    浏览(23)
  • 驱动开发-day9

     驱动代码: 测试代码:

    2024年02月15日
    浏览(28)
  • 驱动开发—day8

    1、在内核模块中启用定时器,定时1s,让led1 闪烁 2、基于gpio子系统完成led灯驱动的注册,应用程序测试 应用层代码:

    2024年02月15日
    浏览(27)
  • ARM day2、day3 汇编

    @ 注释 # 注释(放在行首表示注释一行) /*    */ 注释 #+数字 立即数 : 一种标号(比如main:        loop:) .text        .end+换行 固定格式 ARM指令构成 ARM 指令包含操作码和一些其他的信息,只剩下8 位存放数据 具体来说,一个 ARM 指令通常由以下部分组成: 操作码(Opcode)

    2024年01月19日
    浏览(36)
  • 驱动开发 day4 (led灯组分块驱动)

    //编译驱动(注意Makefile的编译到移植到开发板的内核)         make arch=arm //清除编译生成文件         make clean //安装驱动         insmod mycdev.ko //卸载驱动         rmmod mycdev //编译fun.c 函数(用到交叉工具编译)         arm-linux-gnueabihf-gcc fun.c head.h  mycdev.c fun.c Makefile

    2024年02月15日
    浏览(32)
  • day3-函数

    1、打印100以内7的倍数 2、计算1~100之间所有奇数的和 3、入职薪水10K,每年涨幅5%,第50年工资多少 4、计算1000~2000之间的闰年(每行四个,打印到页面) 5、计算水仙花数 6、计算素数 7、九九剩法表 8、填数 1、创建数组 2、控制台查看的结果 3、访问数组元素 4、数组长度

    2024年02月05日
    浏览(36)
  • C++day3

    1 自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量 成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 头文件 源文件 测试文件 测试结果 2 自行封装一个循环顺序队列的类,包含私有成员

    2024年02月08日
    浏览(28)
  • 强化训练:day3

      今天的三个题目分别是:WY22 Fibonacci数列、NC242 单词搜索、BC140 杨辉三角。   一道非常简单的dp问题,甚至连动态转移方程都给给出了。 状态表示就是:到达第n个位置,F[n]的值为多少,状态转移方程就是:F[i] = F[i-1] + F[i-2]。 因此用一个for循环就可以解决问题了。然后

    2024年04月23日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包