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

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

scull 优势在于它不依赖硬件,scull 只是操作一些从内核分配内存。 一、scull 设计 编写驱动第一步是定义驱动将要提供给用户程序能力(机制)。scull 源码实现下面的设备....例如我们要操作某个设备,首先,我们要知道设备在/dev下设备文件名。这个设备文件提供主设备号以及次设备号。然后内核通过设备文件提供主设备找到设备驱动程序(操作设备由驱动程序实现)。...最后通过主设备号和次设备构成设备号找到正确设备。有了操作对象(设备)和操作方法(驱动程序)那就可以完成了我们要求。 一个驱动程序可以操作多个设备,所以不同设备可以具有相同主设备号。...scull 驱动引入 2 个核心函数来管理 Linux 内核中内存,这些函数定义在,是: void *kmalloc(size_t size, int flags); void...如果想尝试比较简单字符驱动实现,可以查看我另一篇驱动开发之 hello 驱动程序实现文章: 荔枝派Zero(全志V3S)驱动开发之hello驱动程序

69341

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

目录 示例程序目标 编写驱动程序 编写应用程序 卸载驱动模块 在前几篇文章中,我们一块讨论了:在 Linux 系统中,编写字符设备驱动程序基本框架,主要是从代码流程和 API 函数这两方面触发。...这篇文章,我们就以此为基础,写一个有实际应用功能驱动程序: 在驱动程序中,初始化 GPIO 设备,自动创建设备节点; 在应用程序中,打开 GPIO 设备,并发送控制指令设置 GPIO 口状态; 示例程序目标...编写驱动程序 以下所有操作工作目录,都是与上一篇文章相同,即:~/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 目录下创建了设备节点。

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

    Linux系统驱动之Framebuffer驱动程序框架

    资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 Framebuffer驱动程序框架 1....怎么编写字符设备驱动程序 驱动主设备号 构造file_operations结构体,填充open/read/write等成员函数 注册驱动:register_chrdev(major, name, &fops...Framebuffer驱动程序框架 分为上下两层: fbmem.c:承上启下 实现、注册file_operations结构体 把APP调用向下转发到具体硬件驱动程序 xxx_fb.c:硬件相关驱动程序...怎么编写Framebuffer驱动程序 核心: 分配fb_info framebuffer_alloc 设置fb_info var fbops 硬件相关操作 注册fb_info register_framebuffer

    3.3K30

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

    前言 这一部分主要是用来介绍 Linux 设备驱动程序一些基本概念,包括:Linux 设备驱动程序作用、内核功能划分、设备和模块分类以及版本编号。...一、Linux 设备驱动程序作用 设备驱动程序就像一个个“黑盒子”,使某个特定硬件响应一个定义良好内部编程接口,这些操作完全隐藏了设备工作细节。...用户操作通过一组标准化调用执行,而这些调用独立于特定驱动程序。将这些调用映射到作用于实际硬件设备特有操作上,则是设备驱动程序任务。...驱动程序应当做到使硬件可用, 将所有关于如何使用硬件事情留给应用程序。...Linux,相反,允许应用程序读写一个块设备象一个字符设备一样 – 它允许一次传送任意数目的字节。结果就是,块和字符设备区别仅仅在内核在内部管理数据方式上,并且因此在内核/驱动软件接口上不同。

    1.2K41

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

    目录 kill 命令和信号 使用 kill 命令发送信号 多线程中信号 信号注册和处理函数 驱动程序代码示例:发送信号 功能需求 驱动程序代码 驱动模块 Makefile 编译和加载 应用程序代码示例...在上一篇文章中,我们讨论是:在应用层如何发送指令来控制驱动 GPIOLinux驱动实践:如何编写【 GPIO 】设备驱动程序?。...那么,驱动程序如何才能知道应用程序PID呢?...这里定义一个简单协议:当应用程序调用参数中 cmd 为 100 时候,就表示用来告诉驱动程序自己 PID。 驱动程序定义了一个全局变量 g_pid,用来保存应用程序传入参数PID。.../mysignal 根据刚才驱动程序代码,当驱动程序接收到设置PID命令之后,会立刻发送两个信号: 先来看一下 dmesg 中驱动程序打印信息: 可以看到:驱动把这两个信号(10 和 12)

    2.8K30

    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...按下KEY时: 程序从GIC中读取寄存器知道发生了33号中断,通过GIC irq_domain可以知道virq为16 调用irq_desc[16]中handleB函数 handleB

    2.2K20

    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.5K30

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

    该选项打开驱动程序核心中调试信息,它可以帮助跟踪底层支持代码中问题。...驱动程序开发人员可以用如下方法对系统进行查询:在proc 文件系统中创建文件、使用驱动程序 ioctl 方法,以及通过 sysfs 导出属性等。...有些设备驱动程序也通过 iproc 导出信息,而我们自己驱动程序当然也可以这么做。因为 /proc 文件系统是动态,所以驱动程序模块可以在任何时候添加或删除其中入口项。...,当没有数据可返回时,驱动程序必须设置这个参数 data:提供给驱动程序专用数据指针,可用于内部记录 在我们 read_proc 方法被调用时,start 初始值为 NULL。...但如果问题出现在驱动程序中,通常只会导致正在使用驱动程序那个进程突然终止。

    84041

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

    资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...视频观看 百问网驱动大全 链式中断控制器驱动程序编写 资料下载 视频观看 1....驱动提供 handleC:处理GPIO 2号中断,handleC由GPIO驱动提供 屏蔽GPIO 2号中断:调用irq_dataBirq_chip函数,由GPIO驱动提供 处理:调用actions...内核中有各类中断控制器驱动程序,它们涉及硬件过于复杂,从这些杂乱代码中去讲清楚中断体系,比较难。 我们实现一些虚拟中断控制器,如下图所示。 实际板子中,我们可以通过按键触发中断。...对于这些虚拟中断控制器,我们没有真实按键,通过devmem指令写GICPENDING寄存器触发中断。 3. 编程 会涉及2个驱动程序:虚拟中断控制器驱动程序,按键驱动程序,以及对应设备树。

    1.6K30

    linux设备驱动第一篇:设备驱动程序简介

    (说白了,驱动程序除了对外提供特定接口外,任何实现细节对应用程序都是不可见。)用户操作通过一组标准化调用执行,而这些调用独立于特定驱动程序。...驱动程序就是应用程序与实际硬件之间一个软件层,相同硬件,不同驱动程序可能提供不同功能。实际驱动程序设计要在许多要考虑因素之间做出平衡。...linux中设备和模块分类: 字符设备:字符设备是能够像字节流(类似文件)一样被访问设备,有字符设备驱动程序来实现这种特性。...linux可以让应用程序向字符设备一样读写块设备,允许一次传递任意多字节数据。...Linux磁盘设备都是块设备,尽管在Linux下有块设备节点,但应用程序一般是通过文件系统及其高速缓存来访问块设备,而不是直接通过设备节点来读写块设备上数据。

    3.3K100

    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设备(...I2C总线-设备-驱动模型 2.1 i2c_driver i2c_driver表明能支持哪些设备: 使用of_match_table来判断 设备树中,某个I2C控制器节点下可以创建I2C设备节点

    2.6K40

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

    层级中断控制器驱动程序编写 1. 层级中断控制器重要函数和结构体 1.1 回顾处理流程 1.2 irq_domain核心作用 2. 硬件模型 3....下图中: handleA、irq_dataA由GIC驱动提供 irq_dataB由GPIO驱动提供,不需要handleB 假设GPIO模块下有4个引脚,都可以产生中断,分别链接到GIC100~103...内核中有各类中断控制器驱动程序,它们涉及硬件过于复杂,从这些杂乱代码中去讲清楚中断体系,比较难。 我们实现一些虚拟中断控制器,如下图所示。 实际板子中,我们可以通过按键触发中断。...对于这些虚拟中断控制器,我们没有真实按键,通过devmem指令写GICPENDING寄存器触发中断。 3. 编程 会涉及2个驱动程序:虚拟中断控制器驱动程序,按键驱动程序,以及对应设备树。...虚拟中断控制器驱动程序中,涉及2个递归处理。 3.1 alloc递归处理 3.2 irq_chip递归处理 ----

    1.4K21

    Linux系统驱动之使用GPIO模拟I2C驱动程序分析

    视频观看 百问网驱动大全 使用GPIO模拟I2C驱动程序分析 参考资料: i2c_spec.pdf Linux文档 Linux-5.4\Documentation\devicetree\bindings...\i2c\i2c-gpio.yaml Linux-4.9.88\Documentation\devicetree\bindings\i2c\i2c-gpio.txt Linux驱动源码 Linux...想让SDA输出高电平,双方都不驱动三极管(SDA通过上拉电阻变为高电平) 想让SDA输出低电平,就驱动三极管 从下面的例子可以看看数据是怎么传(实现双向传输)。...在第9个时钟之后,如果有某一方需要更多时间来处理数据,它可以一直驱动三极管把SCL拉低。...驱动程序分析 3.1 平台总线设备驱动模型 3.2 设备树 对于GPIO引脚定义,有两种方法: 老方法:gpios 新方法:sda-gpios、scl-gpios 3.3 驱动程序分析 1.

    3.2K32

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

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

    7K40

    韦东山: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 驱动编程 我们在驱动程序中申请一个8Kbuffer,让APP通过mmap能直接访问。

    4K31

    Linux驱动实践:你知道【字符设备驱动程序两种写法吗?

    大家好,我是道哥,今天我为大伙儿解说技术知识点是:【字符设备驱动程序】。 在上一篇文章中,讨论Linux系统中,驱动模块两种编译方式。...旧 API 函数 在Linux内核代码2.4版本和早期2.6版本中,注册、卸载字符设备驱动程序经典方式是: 注册设备: int register_chrdev(unsigned int major...如何使用新API函数来编写字符设备驱动程序,下一篇文章再详细讨论。 以下所有操作工作目录,都是与上一篇文章相同,即:~/tmp/linux-4.15/drivers/。...根据Linux系统驱动框架,应用层 open、read、write 函数被调用时候,驱动程序中对应函数就会被执行: static const struct file_operations driver1...从编写过程可以看出:Linux系统已经设计好了一套驱动程序框架。 我们只需要按照它要求,按部就班地把每一个函数或者是结构体,注册到系统中就可以了。

    1.9K20
    领券