Linux设备驱动(宋宝华)
文章平均质量分 70
Linux设备驱动开发详解学习
anieoo
这个作者很懒,什么都没留下…
展开
-
Linux驱动_网络驱动简介
参考:Linux设备驱动开发详解(宋宝华) 网络设备完成用户数据包在网络媒介上的发送和接收的设备,它讲上层协议的传递的数据包以媒介访问的方式进行发送,并将接收到的数据传递给上层协议。 ① 网络协议接口层:该层的存在使设备独立于上层协议,即不管上层网络采用什么协议都通过dev_queue_xmit()发送数据,netif_rx()接收数据。 ② 网络设备接口层:net_device是描述具体的网络属性和操作的结构体,并且是设备驱动功能层中各函数的容器。原创 2022-06-03 22:49:49 · 492 阅读 · 0 评论 -
Linux驱动_块设备驱动
块设备是Linux驱动三大设备之一。与字符设备有很大的区别。块设备是针对存储设备的,比如 SD 卡、 EMMC、 NAND Flash、 Nor Flash、 SPI Flash、机械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动。一、块设备和字符设备的区别摘自Linux驱动设备开发详解(宋宝华)二、块设备驱动结构1、block_device_operations block_device_operations是和file_operation...原创 2022-05-31 17:04:44 · 1273 阅读 · 0 评论 -
12.2.3 platform设备资源和数据
Linux系统发明了一种虚拟的总线,称为platform总线,相应的设备名称称为platform_device,而驱动则成为platform_driver。 platform总线实现的功能是:在系统注册一个platform_device设备的时候,会寻找与之匹配的驱动。相反,在向系统注册一个platform_driver驱动的时候,会寻找与之匹配的设备。关于platform总线详细的介绍:Linux驱动_Platform平台驱动_anieoo的博客-CSDN博客_驱动pla...原创 2022-05-22 16:52:41 · 274 阅读 · 0 评论 -
10.5 内核定时器编程
和Linux中断一样,内核定时器的编程只需要调用内核提供的API函数。内核在时钟中断发生以后会检查各定时器是否到期,到期后将会把其绑定的定时器处理函数放到底半部执行。 内核定时器本质上还是依赖硬件定时器实现。一、定时器API函数1、timer_list结构体在Linux内核中,如果需要使用一个定时器,则必须先定义一个timer_list结构体,结构体对应如下:struct timer_list { /* * All fields that change...原创 2022-05-21 19:09:46 · 485 阅读 · 1 评论 -
10.3 Linux中断编程
一、Linux中断处理机制中断会打破内核进程正常运行的程序的调度,因此对于系统来说中断中执行的程序需要尽量短小。在Linux系统中,为了在中断执行时间和中断处理程序量之间找到一个平衡,引入了Top Half和Bottom Half.即顶半部和底半部。 顶半部:主要完成尽量少的紧急功能,比如紧急处理寄存器的中断状态位 底半部:执行剩余中断中需要完成的事情。二、Linux中断编程Linux中的中断编程和MCU不一样,不需要你一个个去配置相关的寄存器,只需要使用L...原创 2022-05-21 16:43:12 · 873 阅读 · 0 评论 -
9.3 支持异步通知的globalfifo驱动
本节学习再驱动中添加异步通知的功能。其实步骤很简单只需要添加一个结构体和使用2个新函数即可。 数据结构是 fasync_struct 两个函数分别是: ① fasync_helper ② kill_fasync先附上完整代码:/* * a simple char device driver: globalfifo * * Copyright (C) 2014 Barry Song (baohua@kerne...原创 2022-05-17 18:47:29 · 209 阅读 · 0 评论 -
9.2 Linux异步通知编程
一、Linux信号信号可以在进程间进行传递,Linux的异步通知就是基于信号进行实现的。在Linux中可以使用的信号如下所示:除了SIGSTOP和SIGKILL信号外,其余信号均能被进程忽略或捕获。信号的接收:在用户进程中可以使用signal()函数设置相应的信号处理处理函数。类似于MCU中的中断,当满足触发中断条件的时候,就会去执行相对应的中断处理函数。signal()函数原型如下:void (*signal(int si............原创 2022-05-17 17:53:51 · 383 阅读 · 0 评论 -
8.2.3设备驱动中的轮询编程
非阻塞I/O的应用程序通常会使用poll()、select()甚至是epoll()系统调用进行设备的非阻塞访问。无论是哪一种系统调用对应的都是设备驱动中的poll()函数。驱动中poll函数原型:unsigned int (*poll) (struct file *filp, struct poll_table_struct *wait)第一个参数是file结构体指针。第二个参数为轮询表指针。驱动中的poll函数通常需要完成两件事情: ① 将可能会引起设...原创 2022-05-16 18:46:58 · 404 阅读 · 0 评论 -
8.1.2 支持阻塞操作的globalfifo驱动学习
在本节学习带有阻塞操作和互斥访问的驱动,在用一时间内只有一个应用访问设备驱动,同时只有设备定义的内存有数据的时候(非空)才能进行读取,并且读取完成后,才能进行写操作。 附上代码:/* * a simple char device driver: globalfifo * * Copyright (C) 2014 Barry Song (baohua@kernel.org) * * Licensed under GPLv2 or later. */#i...原创 2022-05-15 20:59:31 · 189 阅读 · 0 评论 -
使用自旋锁实现驱动设备的互斥访问
代码来源: Linux设备驱动开发详解(宋宝华) p172int xxx_count = 0; //定义文件打开次数static int xxx_open(struct inode *inode,struct file *filp){ ... spinlock(&xxx_lock); if(xxx_count) { spin_unlock(&xxx_lock); return -EBUSY; } xxx_原创 2022-05-12 20:23:28 · 294 阅读 · 0 评论 -
使用原子变量实现应用对驱动的互斥访问
代码来源: Linux设备驱动开发详解(宋宝华) p169static atomic_t xxx_available = ATOMIC_INIT(1);static int xxx_open (struct inode *inode, struct file *filp){ ... if(!atomic_dec_and_test(&xxx_available)) { atomic_inc(&xxx_available); retur原创 2022-05-12 16:13:03 · 276 阅读 · 0 评论 -
6.2 globalmem虚拟设备实例学习
在本节中介绍了关于globalmem字符设备驱动,其功能对应:分配一个4KB大小的内存空间,并提供函数接口给应用程序用来针对该内存的读写、控制核定位函数。 首先贴上,驱动代码:#include <linux/module.h>#include <linux/fs.h>#include <linux/init.h>#include <linux/cdev.h>#include <linux/slab.h>...原创 2022-05-11 16:56:21 · 498 阅读 · 0 评论