
linux设备驱动
floatinglong
这个作者很懒,什么都没留下…
展开
-
驱动程序之_1_字符设备_10_分离分层概念_总线驱动设备机制
驱动程序之总线驱动设备框架一个好的驱动框架往往会使用到分离、分层的概念,本文主要讲总线驱动设备框架,使用到分离概念使用的硬件不同,硬件相关的代码也不同,但软件相关的代码可以相同,分离就是将硬件、软件分开,在移植过程中只需要修改硬件相关的代码即可,软件代码保持稳定总线驱动设备机制将一个驱动分为了硬件(device)部分、软件(driver)部分,这里作为例子,将以前写过的LED驱动程序使用总线...原创 2019-01-17 16:38:16 · 315 阅读 · 0 评论 -
驱动程序之_2_块设备_5_Nor Flash_3_驱动编写
驱动程序之_2_块设备_5_Nor Flash_3_驱动编写 Nor Flash的驱动框架与Nand Flash类似,协议层基本一样,都是分配一个mtd_info结构体,主要区别在于硬件层,Nor Flash和Nand Flash的地址、总线位宽不同;Nor Flash可以像内存一样读,但不能像内存一样写,写操作类似Nand Flash,协议层提供读写接口,需要根据硬件特性完善 ...原创 2019-01-22 01:31:11 · 172 阅读 · 0 评论 -
驱动程序之_3_网络设备_1_驱动框架
驱动程序之_3_网络设备_1_驱动框架网络驱动≠网卡驱动网络驱动的底层是网卡驱动,在这上面有若干层纯软件的协议 网卡驱动作用:配置网卡,为软件层提供收发数据包接口 ...原创 2019-01-22 12:35:35 · 210 阅读 · 1 评论 -
驱动程序之_1_字符设备_2_按键中断
驱动程序之字符设备_按键中断本文是关于基本的阻塞按键中断驱动程序驱动的基本框架在之前的文章已有说明,对驱动程序稍作分析,并附上驱动程序和测试用的应用程序代码1、加载驱动时,进入my_irq_drv_init,完成设备的初始化工作2、应用程序打开设备时,进入my_irq_drv_open,完成中断初始化、及按键硬件初始化3、应用程序读取按键时,进入my_irq_drv_read,若没有按键...原创 2019-01-16 20:36:39 · 189 阅读 · 0 评论 -
驱动程序之_1_字符设备_9_输入子系统_2_实例
驱动程序之输入子系统框架_实例编写本文中input_handler层使用evdev,在input_dev层编写按键实例基本流程:1、编写入口函数,分配、设置、注册input_dev结构体,并且完成硬件初始化2、编写出口函数,完成与入口函数相反的操作3、声明、定义硬件相关结构体和定时器4、编写按键中断服务程序5、编写定时器中断服务程序,定时时间为10ms,用于消抖6、添加相关头文件...原创 2019-01-16 20:25:05 · 148 阅读 · 0 评论 -
驱动程序之_1_字符设备_1_基本框架和Led实例
驱动程序之字符设备驱动_1Linux设备驱动分三种,包括字符设备驱动、块设备驱动和网络设备驱动其中本文讲的字符设备(如LCD、触摸屏等)只能按字节流先后顺序访问设备内存,不能随机访问字符设备的基本框架比较简单加载驱动时,调用入口函数卸载驱动时,调用出口函数应用程序打开驱动设备时,调用open函数应用程序读写驱动设备时,调用read、write函数……open、read、write...原创 2019-01-16 19:56:24 · 136 阅读 · 0 评论 -
驱动程序之_1_字符设备_9_输入子系统_2_分析
@TOC输入子系统核心层为input管辖handler层(软件)和dev层(硬件)handler层有input_handler 结构体dev层有input_dev结构体两者由input_handle结构体建立联系input_handler 结构体:struct input_handler { void *private; void (*event)(struct input_h...原创 2019-01-15 15:34:37 · 156 阅读 · 0 评论 -
驱动程序之_1_字符设备_3_poll机制
驱动程序之字符设备_3_poll机制本文主要介绍驱动程序的poll机制poll机制的主要作用是:把当前的文件挂到设备内部定义的等待队列中,定期扫描,从而使得应用程序不会阻塞在某一环节在驱动程序中1、在文件结构体中定义了poll函数:my_irq_drv_poll2、在poll函数实现中,根据应用程序要求挂入等待队列3、当按键按下,进入中断服务程序4、当到达超时时间,进程同样也被唤醒...原创 2019-01-16 22:08:44 · 117 阅读 · 0 评论 -
驱动程序之_1_字符设备_4_fasync机制
驱动程序之字符设备_4_fasync机制fasync机制是异步通知机制,当驱动程序向应用程序发送信号量,触发应用程序的信号处理函数,以达到类似中断的效果驱动程序中:1、在文件专属的fasync函数中,调用了fasync_helper,将属主信息通知给内核2、当发生按键中断,进入按键中断服务程序,读取键值,调用kill_fasync,发送信号量给相应进程应用程序中:1、使用signal,...原创 2019-01-16 22:39:27 · 291 阅读 · 0 评论 -
驱动程序之_1_字符设备_5_原子操作
驱动程序之字符设备_5_原子操作有的程序可能为了避免错误,不能被线程调度机制所打断,这时候就用到了原子操作,在进行原子操作的过程中,不会被任何事情所打断例如,我们想要让驱动设备只能被打开一次,通常的想法就是1、设置全局标志位2、在open函数中对其运算,再判断是否是某个值,从而决定是否打开设备3、在close函数中再对其进行与入口函数中相反的运算这种做法不严谨,在系统中,应用程序只占据...原创 2019-01-16 23:01:44 · 250 阅读 · 0 评论 -
驱动程序之_1_字符设备_6_互斥锁与信号量
驱动程序之字符设备_7_互斥锁与信号量上一篇文章的要求,除了原子操作,也可以使用本文的互斥锁代替实现互斥锁的作用是:保证共享数据操作的完整性,每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象定义互斥锁static DECLARE_MUTEX(button_lock); 初始化信号量void sema_init (struc原创 2019-01-16 23:15:50 · 203 阅读 · 0 评论 -
驱动程序之_1_字符设备_7_非阻塞
驱动程序之字符设备_7_非阻塞阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。非阻塞操作进程在不能进行设备操作时并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。驱动程序中:如果是以非阻塞方式打开文件,在读函数中,判断是否按下按键,若有按键则返回键值,否则直接退...原创 2019-01-16 23:52:39 · 109 阅读 · 0 评论 -
驱动程序之_1_字符设备_8_按键消抖
驱动程序之字符设备_8_按键消抖按下按键时,由于按键抖动,会产生几个高低脉冲,而cpu处理太快,这几次高低脉冲被当作有效信号处理,处理办法:使用定时器,检测到第一次按下后,启动定时器,延迟一段时间(一般取10ms),再检测一次,如果这时候检测到按键按下,则确定有按键按下驱动程序中运行流程:按键中断触发后,记录键值,修改定时值,10ms后,触发定时器中断,将键值传送到应用程序创建定时器in...原创 2019-01-17 00:13:55 · 184 阅读 · 0 评论 -
驱动程序之_3_网络设备_2_虚拟网卡驱动编写
驱动程序之_3_网络设备_2_虚拟网卡驱动编写 参考drivers/net/cs89x0.c(实际网卡驱动)编写一个虚拟网卡驱动,在ping其他地址时,虚拟网卡驱动需要模拟一个数据包,实现自发自收 入口函数中1、分配net_device2、设置net_device(mac地址、发包函数等)3、注册net_device 完善功能函数模拟收发数据包(由于是虚拟网...原创 2019-01-22 19:39:28 · 367 阅读 · 0 评论 -
驱动程序之_2_块设备_5_Nor Flash_1_硬件操作原理
驱动程序之_2_块设备_5_Nor Flash_1_硬件操作原理 Nor Flash可以像内存一样读,但不能像内存一样写(需要使用特定命令),由此保证了数据的安全性Nor Flash与Nand Flash不同,存储空间比较小,硬件上不仅有数据线,还有地址线,不需要复用数据线开发板启动时,要选择启动方式1、Nand启动,Nand的前4K内容被拷贝到内存(SDRAM),Cpu从...原创 2019-01-21 22:58:35 · 118 阅读 · 0 评论 -
驱动程序之_2_块设备_4_Nand Flash_3_驱动程序编写
驱动程序之_2_块设备_4_Nand Flash_3_驱动程序编写 参考/drivers/mtd/nand/目录下的s3c2410.c和At91_nand.c 一、入口函数1、分配nand_chip2、设置nand_chip(如果不知道怎么设置,可以从nand_scan函数入手分析,如果不设置,会分配有默认值、默认函数,可以参数默认函数编写符合自己的函数,如果默认函数...原创 2019-01-21 17:10:04 · 195 阅读 · 0 评论 -
驱动程序之_0_模块编译Makefile
驱动程序之模块编译Makefile编译驱动程序时,是使用linux内核完成的,所以要指定linux内核的目录(本例中用KERNEL_DIR代替),查看linux下的文档可以知道,obj-y是将文件编译到内核中,obj-m是将文件编译为模块,这里使用的是obj-m,指定编译文件名MODULES_NAME.o(如果源文件是drv_led.c,则用drv_led.o替换),编译成功后再将生成的模块移动...原创 2019-01-17 16:45:49 · 262 阅读 · 0 评论 -
驱动程序之_1_字符设备_11_LCD驱动_1_粗浅分析
驱动程序之字符设备_9_LCD驱动本文所讲的LCD驱动程序使用到了分离分层的思想,以内核代码为例分析抽象层位于drvier/video/fbmem.c在入口函数中,创建字符设备,创建类fbmem_init(void){ create_proc_read_entry("fb", 0, NULL, fbmem_read_proc, NULL); if (register_chrde原创 2019-01-18 21:25:54 · 157 阅读 · 0 评论 -
驱动程序之_1_字符设备_11_LCD驱动_2_编写
驱动程序之字符设备_10_LCD驱动编写上一篇文章粗浅地分析了内核的一个LCD驱动代码,由此知道编写LCD驱动的一个方法:编写一个设备,将其融入内核的fbmem即可。本文仿照上一篇文章所分析的例子,去掉platform框架,编写一个符合fbmem机制的简单LCD驱动程序在入口函数1、分配fb_info结构体 static struct fb_info *s3c_lcd; s3c_l...原创 2019-01-18 21:26:02 · 209 阅读 · 0 评论 -
驱动程序之_1_字符设备_12_触摸屏驱动
驱动程序之字符设备_12_触摸屏驱动触摸屏在内核中有现成的input子系统框架,input_handler层位于ts_dev.c,只需要编写input_dev层与之融合即可,编写方法与lcd驱动程序类似一、在入口函数1、分配input_dev结构体s3c_ts_dev = input_allocate_device();2、设置input_dev结构体3、注册input_dev结构体...原创 2019-01-18 21:59:59 · 308 阅读 · 1 评论 -
驱动程序之_1_字符设备_13_USB设备_1_基本概念
驱动程序之_15_字符设备_USB设备_概念原创 2019-01-18 23:23:54 · 335 阅读 · 0 评论 -
驱动程序之_1_字符设备_13_USB设备_2_USB总线驱动_分析
驱动程序之_13_字符设备_USB设备_2_总线驱动程序USB主机控制器有三种规范其中USB1.1支持低速(1.5Mbps)USB2.0支持全速/高速(12Mbps/480Mbps)目测最新的USB3.0最高传输速度是USB2.0的10倍(4.8Gbps),并且更节能S3C2410的USB规范使用的是OHCIUSB总线驱动的作用:1、识别USB设备2、查找、安装USB设备驱动...原创 2019-01-19 16:15:35 · 295 阅读 · 0 评论 -
驱动程序之_1_字符设备_13_USB设备_3_鼠标驱动
驱动程序之_13_字符设备_USB设备_3_鼠标驱动_编写从上一篇文章知道,当我们接入一个USB设备,USB总线驱动会为我们构建一个device并注册,编写驱动程序时只需要构造driver并注册到总线即可,其中driver中有一个id_table[],用来示意所支持的设备;probe函数用于,完成初始化,(probe函数在总线驱动匹配设备);disconnect函数,切断联系;等等编写一个简单...原创 2019-01-19 18:57:54 · 296 阅读 · 0 评论 -
驱动程序之_1_字符设备_14_小结
驱动程序之_14_字符设备_小结每当应用程序调用open、read、write等接口函数,会进入内核层,调用sys相关的函数,最终调用到驱动程序实现的open、read、write以按键驱动为例读取数据方式有如下几种:1、查询:read函数中不断读取数据并返回。这种方法CPU的占用率高2、休眠唤醒:在read函数中休眠,当按下按键,触发中断,在中断服务程序中唤醒。这种方法在没有唤醒事件时...原创 2019-01-19 20:14:31 · 317 阅读 · 0 评论 -
驱动程序之_2_块设备_1_基本概念
驱动程序之_2_块设备_1_基本概念前面所讲的字符设备是顺序读写、读写大小不固定的数据流设备与之不同,块设备是可以不按顺序读写,以固定大小读写的数据块设备块设备的典型例子有硬盘、flash等等对于块设备,如果直接使用字符设备的方法(应用open read write 直接驱动程序对应),读写速度可能会大打折扣,减少设备寿命例如硬盘:如果应用程序需要读block1,写block5,再读b...原创 2019-01-19 21:01:00 · 152 阅读 · 0 评论 -
驱动程序之_2_块设备_2_ll_rw_block分析
驱动程序之_2_块设备_2_ll_rw_block分析层次结构内核目录下有fs文件夹,里面放有各种文件系统以及它们公共的接口,ll_rw_block就位于fs/buffer.c中以读为例在ll_rw_block中提取bh呈递void ll_rw_block(int rw, int nr, struct buffer_head *bhs[]){/*******************...原创 2019-01-19 22:06:58 · 560 阅读 · 0 评论 -
驱动程序之_2_块设备_3_基本框架和简单实例
驱动程序之_2_块设备_3_基本框架和简单实例基本框架:一、分配gendisk二、设置gendisk1、分配、设置队列2、设置容量等信息三、注册gendisk参考drivers目录下的z2ram.c和Xd.c,编写一个简单实例:分配一块内存,模拟块设备,为它编写驱动程序...原创 2019-01-21 02:19:58 · 257 阅读 · 0 评论 -
驱动程序之_2_块设备_4_Nand Flash_1_硬件操作原理
驱动程序之_2_块设备_4_Nand Flash_1_硬件操作原理 有了上一篇所说的块设备驱动框架后,Nand Flash的驱动程序也不难了,主要是在框架的入口函数增加Nand Flash相关初始化,读写函数中使用Nand Flash的操作函数,为此,本篇先讲一下Nand Flash的硬件操作Nand Flash是一块存储芯片,存储芯片有一定的存储空间,存储空间以存储单元作为单位存储数...原创 2019-01-21 13:23:00 · 173 阅读 · 0 评论 -
驱动程序之_2_块设备_4_Nand Flash_2_驱动框架分析
驱动程序之_2_块设备_4_Nand Flash_2_驱动框架分析 启动内核时,有如下打印信息:从信息可以找到内核的Nand Flash驱动,位于/drivers/mtd/nand/s3c2410.c中初始化的调度关系如下,完成1、控制器初始化2、芯片初始化3、读取芯片信息,分配mtd_info结构体,提供读写等函数接口4、添加分区s3c24xx_nand...原创 2019-01-21 15:05:00 · 154 阅读 · 0 评论 -
驱动程序之_3_网络设备_3_网卡驱动移植
驱动程序之_3_网络设备_3_网卡驱动移植 网卡出厂一般都会有驱动程序模板,网卡接到不同的Cpu上,引脚、参数有所不同,移植过程要做的就是根据硬件修改引脚地址、参数一般来说,需要修改的是片选引脚、中断标号、内存控制器(网卡相关部分) 本文是根据JZ2440,移植DM9000CEP在入口函数前面可以看到,只有定义了MODULE宏,入口函数、出口函数才有效,因此,首先要添...原创 2019-01-22 23:18:14 · 466 阅读 · 0 评论