驱动入门
文章平均质量分 81
Y__Can
这个作者很懒,什么都没留下…
展开
-
阻塞和非阻塞、中断的线程化
阻塞和非阻塞、中断的线程化一、阻塞和非阻塞1、应用层2、驱动层二、中断的线程化1、创建线程化中断 request_threaded_irq2、卸载中断 free_irq一、阻塞和非阻塞所谓阻塞,就是等待某件事情发生。比如调用 read 读取按键时,如果没有按键数据则 read 函数不会返回,它会让线程休眠等待。使用 poll 时,如果传入的超时时间不为 0,这种访问方法也是阻塞的。APP 调用 open 函数时,传入 O_NONBLOCK,就表示要使用非阻塞方式;默认是阻塞方式。注意:对于普通文原创 2021-03-20 17:03:34 · 441 阅读 · 0 评论 -
异步通知
异步通知前言一、异步通知机制二、四要素三、应用层要做的事1、利用signal设置SIGIO信号处理函数2、打开驱动3、把进程ID告诉驱动4、使能驱动的FASYNC功能四、驱动层要做的事1、添加一个fasync_struct 结构体指针2、实现设备操作结构体中的fasync函数3、在需要向用户空间通知的地方(例如中断中)调用内核的kill_fasync函数五、总结+源码前言使用异步通知(信号)实现按键驱动一、异步通知机制驱动程序发出信号,应用程序接受到信号处理相对应的函数二、四要素1、应用程.原创 2021-03-20 10:02:32 · 783 阅读 · 0 评论 -
poll机制
poll机制前言一、应用API二、驱动实现1.把当前进程挂入等待队列中 poll_wait2.返回设备状态前言实现按键驱动有四种:①、查询方式、②、休眠-唤醒、③、poll机制、④、异步通知一、应用APIint poll(struct pollfd *fds ,nfds_t nfds ,int timeout);fds:指向待查询的设备文件数组nfds:同时查询几个文件timeout:超时时间返回值:查询到期望状态的设备文件个数struct pollfd.原创 2021-03-19 23:57:33 · 333 阅读 · 0 评论 -
SPI驱动----74HC595操作数码管
SPI-----74HC595操作数码管前言一、用户态SPI编程1、设备打开和关闭2、总线控制3、示例程序代码:二、驱动层SPI编程1、SPI 驱动架构简析2、注册spi设备3、编写spi设备驱动4、示例代码前言通过SPI与从机74HC595驱动数码管有两种实现方法:①、用户态SPI编程来实现②、驱动层SPI编程来实现一、用户态SPI编程用户态SPI编程是基于平台已编写好的SPI驱动来进行的,跟I2C用户态编程类似,把spi当做一个设备进行操作。Linux 的 SPI 总线设备文件名通常.原创 2021-03-05 16:43:08 · 4955 阅读 · 0 评论 -
I2C驱动-----FM24C02A
I2C驱动-----FM24C02A前言一、设备注册 i2c_register_board_info二、驱动注册1、添加驱动 i2c_add_driver2、删除驱动 i2c_del_driver总结前言I2C核心:主要为总线驱动和设备驱动提供各种API,比如设备探测、注册、注销,设备和驱动匹配等函数。它在I2C架构中处于中间的位置。I2C总线驱动:I2C总线驱动维护了I2C适配器数据结构(i2c_adapter)和适配器的通信方法数据结构(i2c_algorithm)。所以I2C总线驱动可控制I.转载 2021-02-24 15:33:05 · 1209 阅读 · 0 评论 -
内核配置和编译
内核配置和编译前言一、Makefile二、 Kconfig1、config条目:2、menu条目3、choice条目4、source条目三、.config四、之间联系1、Kconfig对.config文件的影响:2、Kconfig对Makefile文件的影响:3、编译4、如何获得.config文件前言.config、 Kconfig 、Makefile 之间的关系一、Makefile1、Linux内核源码的每个目录下都有一个Makefile,由该 Makefile 对源代码的编译、链接等操作进.原创 2021-02-21 18:16:13 · 445 阅读 · 0 评论 -
platform总线、设备、驱动模型
platform总线、设备、驱动模型前言一、总线1、设备结构:2、总线结构体:3、内核总线初始化二、platform设备1、platform_device结构体2、platform_device_register设备注册3、自己注册设备流程三、platform驱动1.platform_driver结构体2、platform_driver_register驱动注册3、设备与驱动如何联系起来?4、驱动模板总结前言设备驱动模型中,关心的是总线,设备和驱动这3个实体,总线将设备与驱动绑定。在系统总线注册(.原创 2021-02-21 12:32:39 · 390 阅读 · 0 评论 -
混杂设备下ADC驱动
文章转载:https://blog.csdn.net/lwj103862095/article/details/18451819dev_init入口函数分析:static int __init dev_init(void){ int ret; base_addr=ioremap(S3C2410_PA_ADC,0x20); if (base_addr == NULL) { printk(KERN_ERR "Failed to remap register block\n"); retur转载 2021-02-19 11:08:12 · 162 阅读 · 0 评论 -
信号量、互斥锁、自旋锁
信号量、互斥锁、自旋锁前言一、信号量1、信号量初始化api2、获取信号量3、释放信号量4、使用案例二、互斥锁互斥锁的API三、自旋锁1、初始化2、获得自旋锁3、释放自旋锁4、判断自旋锁5、自旋锁使用注意事项前言信号量:是一种锁机制用于协调进程之间互斥的访问临界资源。以确保某种共享资源不被多个进程同时访问。互斥锁(Mutex):是初始值为1的信号量自旋锁:与互斥锁类似,但在无法得到资源时,互斥锁内核线程处于睡眠阻塞状态,而自旋锁处于忙等待状态。一、信号量Linux内核的信号量在概念和原理上与.原创 2021-02-17 15:50:49 · 1460 阅读 · 0 评论 -
jiffies与HZ、定时器、原子操作
jiffies与HZ、定时器、原子操作前言一、Jiffies与HZ1、jiffies:2、HZ:3、时间与jiffies转换4、jiffies的回绕二、计时、延迟与睡眠1、计时2、延迟3、睡眠三、定时器1、简单定时器2、高精度定时器四、原子操作1、atomic_t数据类型2、操作API前言内核中定时器有两种,简单定时器和高精度定时器,简单定时器:以全局变量jiffies衡量高精度定时器:ktime 的特殊数据类型表示 有绝对时间和相对时间概念一、Jiffies与HZ1、jiffies:是原创 2021-02-11 17:53:37 · 2659 阅读 · 1 评论 -
中断下半部——工作队列、软件中断、tasklet
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档工作队列、软件中断、tasklet前言一、workqueue1、使用默认工作队列2、自己创建工作队列api二、软件中断三、tasklet1、编写tasklet处理函数2、初始化结构体tasklet_struct3、在中断返回前调度tasklet4、在模块卸载中,将tasklet_struct结构体移除四、总结前言中断上半部和下半部上半部:中断服务函数下半部:工作队列、软件中断、tasklet上半部执行紧急的任务不能休眠、下半部为原创 2021-02-09 21:05:12 · 1141 阅读 · 0 评论 -
输入子系统--按键驱动
输入子系统一、输入子系统二、设备申请与成员赋值1.申请设备空间2.设备结构体赋值3.设置设备事件4.gpio与gpio中断三、注册设备四、注销设备五、按键驱动实现一、输入子系统linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:事件层(EventHandler)、核心层(InputCore)和设备驱动层。设备驱动层:主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。核心层:为设备驱动层提供了规范和接口。设.原创 2021-02-05 21:10:36 · 559 阅读 · 3 评论 -
ioremap、 mmap
一、映射方式几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器、状态寄存器和数据寄存器三大类,外设的寄存器通常被连续地编址。根据CPU体系结构的不同,CPU对IO端口的编址方式有两种:a – I/O 映射方式(I/O-mapped)典型地,如X86处理器为外设专门实现了一个单独的地址空间,称为"I/O地址空间"或者"I/O端口空间",CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。b – 内存映射方式(Memory-mapped)RISC指令系原创 2021-02-04 21:15:45 · 686 阅读 · 0 评论 -
按键驱动(等待队列)
按键驱动(等待队列)前言一、等待队列1、定义2、阻塞接口3、唤醒接口二、按键驱动1、自定义结构体2、申请中断3、中断服务函数4、read总结前言知识点: 中断 等待队列普通IO中断架接字符设备时,只能轮询的读取io状态,要实现当有按键按下时才进行读取,可以使用等待队列来实现阻塞休眠读写。一、等待队列等待队列是一种实现阻塞和唤醒的内核机制,它以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现内核中的异步事件通知机制。1、定义定义头文件 #include <linux/wa.原创 2021-02-02 22:13:56 · 310 阅读 · 1 评论 -
GPIO-中断上半部
GPIO-中断上半部前言一、gpio申请和注册中断1、申请gpio gpio_request()2、获得中断号 irq_no= gpio_to_irq()3、设置触发方式 set_irq_type4、注册中断 request_irq()二、编写中断服务函数三、中断释放和gpio释放1、释放中断 free_irq(irq_no,NULL)2、释放gpio gpio_free()四、其他api总结前言了解GPIO的中断上半部实现过程和api,中断是优先级高于线程的处理紧急的事情的,越.原创 2021-02-01 21:53:26 · 1247 阅读 · 0 评论 -
LED驱动程序(GPIO常见接口)
LED驱动程序前言一、GPIO申请二、操作函数三、GPIO释放前言基于imx283a的一个简单驱动程序一、GPIO申请int gpio_request(unsigned gpio, const char *label) //申请引脚资源gpio:为对应哪一个引脚label:引脚名#define LED1_GPIO MXS_PIN_TO_GPIO(PINID_SAIF1_SDATA0)//p3.26gpio_request(LED1_GPIO,"led1");二、操作函数int.原创 2021-01-30 12:27:01 · 1388 阅读 · 1 评论 -
混杂设备驱动模型
混杂设备驱动模型混杂设备,它们拥有相同的主设备号(数字10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。然后调用其file_operations结构中注册的文件操作接口进行操作。对比普通字符设备操作比较简单一、初始化miscdevice1 struct miscdevice {2 int minor; /* 次设备号*/3 const char *name; /* 设备名*/4 const struct file_operations *fops; /*文件原创 2021-01-29 21:11:38 · 255 阅读 · 0 评论 -
字符设备驱动程序
字符设备驱动程序前言一、驱动初始化**1.1申请主设备号****1.2初始化cdev****1.3注册cdev(注册设备)****1.4自动创建设备节点**二、实现设备操作2.1.open2.2.release2.3.read2.4.write2.5.ioctl三、驱动注销3.1释放设备3.2释放类class3.3释放cdev3.4释放设备号cdev四、添加驱动程序到内核五、用户空间调用设备驱动程序最后前言字符设备指那些必须以串行顺序依次访问的设备,并不需要缓冲,通常用于不需要大量数据请求传送的设备类原创 2020-11-28 16:31:05 · 755 阅读 · 1 评论 -
设备驱动简介
设备驱动一、设备驱动程序简介二、设备的分类和特点1.字符设备2.块设备3.网络设备一、设备驱动程序简介系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件只是个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动与用户程序的区别:1、应用程序以main 开始;驱动程序没有main,它以一个模块初始化函数作为入口。2、应用程序从头到尾执行一个任务;驱动程序完成初始化之后不再原创 2020-11-28 10:45:38 · 5330 阅读 · 0 评论 -
驱动模块
一、 驱动程序相关shell命令1、insmod [选项] [驱动模块]功能:将驱动程序加载到Linux内核中添加新用户2、rmmod [选项] [驱动模块]功能:将驱动程序从Linux内核删除3、lsmod [驱动模块]功能:查看内核存在哪些模块。本质是读取/proc/moduls文件4、modinfo [选项] [驱动模块]功能:用来查看模块信息、包含功能、作者信息等5、dmesg [选项] 选项中 [-c] 清空打印日志信息功能:查看printk函数打印信息二原创 2020-11-25 21:15:33 · 2858 阅读 · 0 评论 -
内核开发调试printk
进行内核开发调试在进行驱动开发的过程中往往要打印一些信息来查看是否正确类似于printf,以下将介绍在内核开发常用的调试方法。.(第一次写文章,内容可能不咋样勿喷呀)内容一、printk介绍二、如何查看并修改消息级别在应用程序采用printf打印调试、内核驱动采用printk打印调试。printk函数打印数据到console缓冲区,打印的格式方类似printf。printk函数说明头文件:<linux/kernel.h>int printk(KERN_XXX const原创 2020-11-24 21:44:37 · 1089 阅读 · 0 评论