首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux设备驱动程序(三)——字符驱动

然后内核通过设备文件提供的主设备找到设备驱动程序(操作设备由驱动程序实现)。最后通过主设备号和次设备构成的设备号找到正确的设备。...有了操作的对象(设备)和操作的方法(驱动程序)那就可以完成了我们的要求。 一个驱动程序可以操作多个设备,所以不同的设备可以具有相同的主设备号。...cdev_add 一返回,你的设备就是"活的"并且内核可以调用它的操作,因此,在驱动程序还没有完全准备好处理设备上的操作时,就不能调用 cdev_add。...scull 驱动引入 2 个核心函数来管理 Linux 内核中的内存,这些函数定义在,是: void *kmalloc(size_t size, int flags); void...如果想尝试比较简单的字符驱动实现,可以查看我的另一篇驱动开发之 hello 驱动程序实现的文章: 荔枝派Zero(全志V3S)驱动开发之hello驱动程序

39241
您找到你想要的搜索结果了吗?
是的
没有找到

Linux设备驱动程序(一)——设备驱动简介

前言 这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。...一、Linux 设备驱动程序的作用 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作细节。...用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务。...系统调用。...内核与网络设备驱动间的通讯与字符和块设备驱动所用的完全不同。不用 read 和 write,内核调用和报文传递相关的函数。 有其他的划分驱动模块的方式,与上面的设备类型是正交的。

78641

Linux系统GIC驱动程序分析

视频观看 百问网驱动大全 第五章GIC驱动程序分析 资料下载 视频观看 1....GIC中的重要函数和结构体 沿着中断的处理流程,GIC涉及这4个重要部分: CPU从异常向量表中调用handle_arch_irq,这个函数指针是有GIC驱动设置的 GIC才知道怎么判断发生的是哪个...GIC中断 从GIC获得hwirq后,要转换为virq:需要有GIC Domain 调用irq_desc[virq].handle_irq函数:这也应该由GIC驱动提供 处理中断时,要屏蔽中断、清除中断等...irq_init_cb(desc->dev, desc->interrupt_parent); 2.1 内核支持多种GIC 按照设备树的套路: 驱动程序注册...= { .compatible = "arm,cortex-a7-gic", \ .data = gic_of_init } 2.2 在设备树里指定GIC 在设备树中指定GIC,内核驱动程序根据设备树来选择

4.1K21

Linux设备驱动程序(四)——调试技术

有些设备驱动程序也通过 iproc 导出信息,而我们自己的驱动程序当然也可以这么做。因为 /proc 文件系统是动态的,所以驱动程序模块可以在任何时候添加或删除其中的入口项。...data:提供给驱动程序的专用数据指针,可用于内部记录 在我们的 read_proc 方法被调用时,start 的初始值为 NULL。...但如果问题出现在驱动程序中,通常只会导致正在使用驱动程序的那个进程突然终止。...然而,由于内核在进程终止时会对已打开的设备调用进行 close 操作,驱动程序仍可以释放由 open 方法分配的资源。...如果该进程因驱动程序的错误而在内核空间陷入死循环,则可以在跟踪到这种情况之后,借助 schedule 调用杀死这个进程。 有时系统看起来像挂起了,但其实并没有。

48041

Linux驱动实践:如何编写【 GPIO 】设备的驱动程序

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章中,我们一块讨论了:在 Linux 系统中,编写字符设备驱动程序的基本框架,主要是从代码流程和 API 函数这两方面触发。...编写驱动程序 以下所有操作的工作目录,都是与上一篇文章相同的,即:~/tmp/linux-4.15/drivers/。...创建驱动目录和驱动程序 $ cd linux-4.15/drivers/ $ mkdir mygpio_driver $ cd mygpio_driver $ touch mygpio.c mygpio.c...从代码中可以看出:驱动程序使用 alloc_chrdev_region 函数,来动态注册设备号,并且利用了 Linux 应用层中的 udev 服务,自动在 /dev 目录下创建了设备节点。...再来看一下 dmesg的打印信息: 可以看到:驱动程序中的 gpio_driver_exit( ) 被调用执行了。

4.8K30

Linux系统驱动之LCD驱动程序框架_使用设备树

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 编程_LCD驱动程序框架_使用设备树 参考资料,GIT仓库里: 基于这个程序修改: IMX6ULL\source\03_LCD\03_lcd_drv_qemu_ok STM32MP157...\source\A7\03_LCD\03_lcd_drv_qemu_ok 参考:内核自带的示例驱动程序 Linux驱动源码:drivers/video/fbdev/simplefb.c 设备树:...说明 Linux驱动程序 = 驱动程序框架 + 硬件编程。 在前面已经基于QEMU编写了LCD驱动程序,对LCD驱动程序的框架已经分析清楚。...核心就是: 分配fb_info 设置fb_info 注册fb_info 硬件相关的设置 本节课程我们基于设备树来编写驱动程序。 2. 入口函数注册platform_driver 3.

2.4K30

韦东山:Linux驱动程序基石之mmap

稿定设计导出-20200526-155212.png 应用程序和驱动程序之间传递数据时,可以通过read、write函数进行。...这涉及在用户态buffer和内核态buffer之间传数据,如下图所示: 应用程序不能直接读写驱动程序中的buffer,需要在用户态buffer和内核态buffer之间进行一次数据拷贝。...改进的方法就是让程序可以直接读写驱动程序中的buffer,这可以通过mmap实现(memory map),把内核的buffer映射到用户态,让APP在用户态直接读写。...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: 还有一个更简单的函数:...9.4 驱动编程 我们在驱动程序中申请一个8K的buffer,让APP通过mmap能直接访问。

3.7K21

韦东山:Linux驱动程序基石之mmap

应用程序和驱动程序之间传递数据时,可以通过read、write函数进行。这涉及在用户态buffer和内核态buffer之间传数据,如下图所示: ?...应用程序不能直接读写驱动程序中的buffer,需要在用户态buffer和内核态buffer之间进行一次数据拷贝。这种方式在数据量比较小时没什么问题;但是数据量比较大时效率就太低了。...改进的方法就是让程序可以直接读写驱动程序中的buffer,这可以通过mmap实现(memory map),把内核的buffer映射到用户态,让APP在用户态直接读写。...3.3, 驱动程序要做的事 驱动程序要做的事情有3点: ① 确定物理地址 ② 确定属性:是否使用cache、buffer ③ 建立映射关系 参考Linux源文件,示例代码如下: ?...4,驱动编程 我们在驱动程序中申请一个8K的buffer,让APP通过mmap能直接访问。 ① 使用哪一个函数分配内存?

6.9K40

Linux系统驱动之链式中断控制器驱动程序编写

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 链式中断控制器驱动程序编写 资料下载 视频观看 1....Domain转换为virq,假设是102 调用irq_desc[102].handle_irq,即handleC 清除GIC 33号中断:调用irq_dataA的irq_chip的函数,由GIC驱动提供...handleC:处理GPIO 2号中断,handleC由GPIO驱动提供 屏蔽GPIO 2号中断:调用irq_dataB的irq_chip的函数,由GPIO驱动提供 处理:调用actions链表中用户注册的函数...编程 会涉及2个驱动程序:虚拟的中断控制器驱动程序,按键驱动程序,以及对应的设备树。

1.6K30

Linux驱动实践:驱动程序如何发送【信号】给应用程序?

目录 kill 命令和信号 使用 kill 命令发送信号 多线程中的信号 信号注册和处理函数 驱动程序代码示例:发送信号 功能需求 驱动程序代码 驱动模块 Makefile 编译和加载 应用程序代码示例...static int g_pid = 0; #endif #ifdef MYGPIO_HW_ENABLE // 硬件初始化函数,在驱动程序被加载的时候(gpio_driver_init)被调用 static...(1)函数 gpio_ioctl 当应用程序调用 ioctl() 的时候,驱动程序中的 gpio_ioctl 就会被调用。...这里定义一个简单的协议:当应用程序调用参数中 cmd 为 100 的时候,就表示用来告诉驱动程序自己的 PID。 驱动程序定义了一个全局变量 g_pid,用来保存应用程序传入的参数PID。.../mysignal 根据刚才驱动程序的代码,当驱动程序接收到设置PID的命令之后,会立刻发送两个信号: 先来看一下 dmesg 中驱动程序的打印信息: 可以看到:驱动把这两个信号(10 和 12)

2.7K30

Linux系统驱动之GIC驱动程序对中断的处理流程

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 GIC驱动程序对中断的处理流程 资料下载 视频观看 1....多级中断控制器处理流程 参考资料: linux kernel的中断子系统之(七):GIC代码分析 使用逐步演进的方法才能形象地理解。 1....发生UART中断时 程序从GIC中读取寄存器知道发生了32号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中的handleA函数,它的作用是调用action...读取GPIO寄存器,确定是GPIO里2号引脚发生中断 通过GPIO irq_domain可以知道virq为102 调用irq_desc[102]中的handleA函数,它的作用是调用action链表中用户注册的函数

2.1K20

WDM 驱动程序开发

2.WDM设备驱动程序的特点和原理2.1通用驱动程序对基本上一样的硬件,因为他们共享一个总线或完成类似的任务,设备驱动程序可以使用这些标准的驱动程序功能,使公共总线的共享容易,且更容易写出新的驱动程序,...(2)创建设备 大多数WDM设备对象都是在PnP管理器中调用AddDevice入口时创建,这个PnP 例程在插入新设备和安装Inf文件时被调用,此后一系列的PnP IRP被发送到驱动程序,指示设备应如何启动和查询它的功能...如果调用另一个驱动则必须创建下一个栈单元。...driver’s I/O stack location in an IRP so the caller can set it up for the lower driver.可使用IoCallDriver调用下一个驱动程序...,当最低一层的驱动处理玩后调用IoCompleteRequest,IRP再向上传递返回用户,当IRP向上传递时也可以每个驱动有机会再处理它,每个驱动要设置IoSetCompletionRoutine挂接一个例程

1.6K20

Linux设备驱动程序(二)——建立和运行模块

模块初始化函数的任务是为以后调用模块的函数做准备;模块的退出函数就在模块被卸载时调用。这种编程的方法类似于事件驱动的编程,但是虽然不是所有的应用程序都是事件驱动的,每个内核模块都是。...2、内核的并发 常见引起并发原因: linux 系统中通常正在运行多个并发进程,并且可能有多个进程同时使用我们的驱动程序。...大多数设备能够中断处理器,而中断处理程序异步运行,而且可能在驱动程序正试图处理其他任务时被调用linux 可以运行在多处理器上,因此可能同时有多个处理器在使用该进程。...一个精心设计的驱动程序仍然可以,如同内核空间驱动,允许对设备的并行存取。 如果你必须编写一个封闭源码的驱动,用户空间的选项使你容易避免不明朗的许可的情况和改变的内核接口带来的问题。...#include 最重要的头文件中的一个,这个文件包含很多驱动使用的内核 API 的定义,包括睡眠函数和许多变量声明。

51641

linux设备驱动程序注冊过程具体解释

Linux驱动程序注冊过程,大致分为两个步骤: 模块初始化 驱动程序注冊 以下以内核提供的演示样例代码pci-skeleton.c,具体说明一个pci设备驱动程序的注冊过程。...驱动程序注冊 什么是驱动模块的注冊?上面讲到的初始化函数中调用的pci_register_driver函数就是注冊驱动程序啦。...当驱动匹配到了相应的设备之后,就会调用该函数来驱动设备。所以能够说这个函数才是驱动程序真正的入口。 remove:当驱动程序相应的设备被删除之后,使用这个函数来删除驱动程序。...通过module_init宏调用驱动程序的初始化函数xx_init_module,在初始化函数中注冊驱动程序。...4.假设设备与驱动程序匹配成功,则调用驱动程序的probe函数。probe函数的实现,须要依据驱动程序的功能来定,不属于本文的讨论范围。

2.2K20

Linux系统驱动之I2C系统驱动程序模型

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 I2C系统驱动程序模型 参考资料: Linux内核文档: Documentation\i2c\instantiating-devices.rst Documentation...\i2c\writing-clients.rst Linux内核驱动程序示例: drivers/eeprom/at24.c 1....I2C驱动程序的层次 I2C Core就是I2C核心层,它的作用: 提供统一的访问函数,比如i2c_transfer、i2c_smbus_xfer等 实现I2C总线-设备-驱动模型,管理:I2C设备(...值相同,则匹配成功 使用id_table来判断 i2c_client.name跟某个id_table[i].name值相同,则匹配成功 i2c_driver跟i2c_client匹配成功后,就调用

2.6K40

Linux系统驱动之层级中断控制器驱动程序编写

层级中断控制器驱动程序编写 1. 层级中断控制器的重要函数和结构体 1.1 回顾处理流程 1.2 irq_domain的核心作用 2. 硬件模型 3....,即handleA mask/ack中断: 调用irq_desc[236].irq_data->irq_chip的函数,即irq_dataB 它会调用父级...irq_dataA->irq_chip的函数 调用irq_desc[236].action链表中用户注册的函数 unmask中断: 调用irq_desc[236].irq_data->irq_chip...内核中有各类中断控制器的驱动程序,它们涉及的硬件过于复杂,从这些杂乱的代码中去讲清楚中断体系,比较难。 我们实现一些虚拟的中断控制器,如下图所示。 实际板子中,我们可以通过按键触发中断。...编程 会涉及2个驱动程序:虚拟的中断控制器驱动程序,按键驱动程序,以及对应的设备树。 虚拟的中断控制器驱动程序中,涉及2个递归处理。

1.4K21
领券