linux内核驱动
luck_horse
这个作者很懒,什么都没留下…
展开
-
Linux Device和Driver注册过程,以及Probe的时机
Linux 2.6的设备驱动模型中,所有的device都是通过Bus相连。device_register() / driver_register()执行时通过枚举BUS上的Driver/Device来实现绑定,本文详解这一过程。这是整个LINUX设备驱动的基础,PLATFORM设备,I2C上的设备等诸设备的注册最终也是调用本文讲述的注册函数来实现的。 Linux Device的注册转载 2017-07-24 09:46:30 · 237 阅读 · 0 评论 -
Linux杂项设备驱动
一、Linux杂项设备驱动简介Linux杂项驱动出现的意义在于:有很多简单的外围字符设备,它们功能相对简单,一个设备占用一个主设备号对于内核资源来说太浪费。所以对于这些简单的字符设备它们共用一个主设备号,不同的设备使用不同的次设备号.杂项驱动特点:主设备号相同,次设备号不同在文件系统中自动生成设备节点杂项设备描述结构体struct miscdevice {int minor;//次设备号cons...转载 2018-03-16 19:23:25 · 800 阅读 · 0 评论 -
Linux platform总线(1):总体框架
PlatForm设备驱动: 一、platform总线、设备与驱动 1.一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2 C、SPI等的设备而言,这自然不是问题, 但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总线。 基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的...转载 2018-03-16 20:46:35 · 231 阅读 · 0 评论 -
camera 原理
转载:http://blog.csdn.net/g_salamander/article/details/80868351、Color Filter Array — CFA随着数码相机、手机的普及,CCD/CMOS 图像传感器近年来得到广泛的关注和应用。 图像传感器一般都采用一定的模式来采集图像数据,常用的有 BGR 模式和 CFA 模式。BGR 模式是一种可直接进行显示和压缩等处理的图像数据模式...转载 2018-03-16 20:53:02 · 712 阅读 · 0 评论 -
V4L2框架分析学习
Author:CJOKContact:cjok.liao#gmail.comSinaWeibo:@廖野cjok 1、概述Video4Linux2是Linux内核中关于视频设备的内核驱动框架,为上层的访问底层的视频设备提供了统一的接口。凡是内核中的子系统都有抽象底层硬件的差异,为上层提供统一的接口和提取出公共代码避免代码冗余等好处。就像公司的老板一般都不会直接找底层的员工谈话,而是找部门经理了解情况...转载 2018-03-16 21:02:24 · 256 阅读 · 0 评论 -
视频驱动V4L2子系统驱动架构 - 驱动框架
V4L2驱动框架v4l2驱动架构如图所示,v4l2也就是video for linux two,那么也就是说还有One了,v4l2前面还有v4l图中芯片模块对应Soc的各个子模块,video_device结构体主要用来控制Soc的video模块,v4l2_device会包含多个v4l2_subdev ,每个v4l2_subdev 用来控制各自的子模块,某些驱动不需要v4l2_subdev ,依靠v...转载 2018-03-16 21:05:27 · 226 阅读 · 0 评论 -
视频驱动V4L2子系统驱动架构 - ioctl
基于linux4.6.3,最后会附上一张ioctl调用总图,分析代码还是要用图来说明,这样更清晰一点,我就是这么分析的,不过平时分析的图很随便,而且很大,所以就不能在这里呈现,我在这里会贴出一个简略图ioctl详解进入ioctl都是从cdev->ops->ioctl进入的,一般的驱动cdev都是驱动自己初始化的,在v4l2架构中,cdev都已经初始化完成,不需要驱动开发者来初始化,下面...转载 2018-03-16 21:09:27 · 655 阅读 · 0 评论 -
V4L2驱动框架
V4L2驱动框架主设备号: 81次设备号: 0-63 64-67 192-223 224-255/dev/videoX 应用层————————————char驱动————————————V4L2————————————具体的驱动————————————硬件应用层的操作都需要有底层V4L2驱动的支持。内核中有一些非常完善的例子。比如:linux-2.6.26内核目录dr...转载 2018-03-16 21:15:44 · 281 阅读 · 0 评论 -
V4L2 driver(一). 整体框架
1.1 从字符设备说起熟悉v4l2用户空间编程的都知道, v4l2编程主要是调用一系列的ioctl函数去对v4l2设备进行打开, 关闭, 查询, 设置等操作. v4l2设备是一个字符设备, 而且其驱动的主要工作就是实现各种各样的ioctl. v4l2的整体框架如下图所示V4L2的整体框架图 上图中, 淡绿色背景为用户空间, 淡蓝色背景为内核空间. 椭圆表示相关的结构体, 子系统或实例. 方框表示相...转载 2018-03-19 20:18:50 · 317 阅读 · 0 评论 -
深入理解l内核v4l2框架之video for linux 2(一)
在看了很多关于v4l2驱动的例程之后,想深入研究下linux内核的v4l2框架,顺便把这些记录下来,以备查用。Video for Linux 2 随着一些视频或者图像硬件的复杂化,V4L2驱动也越来越趋于复杂。许多硬件有多个IC,在/dev下生成多个video设备或者其他的诸如,DVB,ALSA,FB,I2C ,IR等等非V4L2的设备。所以,V4L2驱动程序就要为这些硬件设备提供音视频的...转载 2018-03-19 20:19:28 · 500 阅读 · 0 评论 -
misc设备驱动源码
/* * Head entry for the doubly linked miscdevice list */static LIST_HEAD(misc_list);static DEFINE_MUTEX(misc_mtx);/* * Assigned numbers, used for dynamic minors */#define DYNAMIC_MINORS 64 /* like dyn...原创 2018-03-16 19:21:25 · 209 阅读 · 0 评论 -
register_chrdev深入分析
register_chrdev __register_chrdev(major, 0, 256, name, fops); struct char_device_struct *cd; cd = __register_chrdev_region(major, baseminor, count, name); ...转载 2018-03-16 19:14:19 · 1065 阅读 · 0 评论 -
字符设备驱动基本流程
一、申请设备号: 1.动态申请设备号(alloc_chrdev_region) 2.静态申请设备号(register_chrdev_region)二、设备注册: 1.为cdev分配空间(cdev_alloc) 2.初始化cdev(cdev_init) 3.将cdev添加进Kernel(cdev_add)三、生成设备节点 1.创建class(class_creat...原创 2018-03-16 18:47:04 · 2434 阅读 · 1 评论 -
linux驱动篇之 driver_register 过程分析(二)bus_add_driver
linux驱动篇之 driver_register 过程分析(二)个人笔记,欢迎转载,请注明出处,共同分享 共同进步 http://blog.csdn.net/richard_liujh/article/details/48245715kernel版本3.10.141.概述本篇主要围绕driver_register中的第二步bus转载 2017-07-24 09:46:54 · 439 阅读 · 0 评论 -
linux驱动的入口函数module_init的加载和释放
就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:#include #include #include 其中,init.h 定义了驱动的初始化和退出相关的函数,kernel.h 定义了经常用到的函数原型及宏定义,module.h 定义了内核模块相关的函数、变量及宏。 几乎每个转载 2017-07-24 09:47:27 · 406 阅读 · 0 评论 -
linux驱动篇之 driver_register 过程分析(一)
linux驱动注册过程分析--driver_register(一)个人笔记,欢迎转载,请注明出处,共同分享 共同进步 http://blog.csdn.net/richard_liujh/article/details/45825333kernel版本3.10.14driver_register顾名思义,是驱动程序的注册。但是很少是由我们写的驱动直接调用的,转载 2017-07-24 09:47:41 · 597 阅读 · 0 评论 -
Linux内核Ramdisk(initrd)机制
摘要:对于Linux用户来说,Ramdisk并不陌生,可是为什么需要它呢?本文对Ramdisk在内核启动过程中的作用,以及它的内部机制进行深入介绍。标题initrd 和 initramfs在内核中的处理临时的根目录rootfs的挂载initrd的解压缩老式的initrd的处理cpio格式的initrd的处理initrd实例分析在早期的Linux系统中转载 2017-07-24 18:03:07 · 422 阅读 · 0 评论 -
理解linux虚拟文件系统VFS - 概述
当前,除了Linux标准的文件系统Ext2/Ext3/Ext4外,还有很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。linux通过叫做VFS的中间层对这些文件系统提供了完美的支持。对于用户来说,这些文件系统几乎是透明的,在大部分情况下,用户通过libc转载 2017-07-24 18:07:59 · 779 阅读 · 0 评论 -
低功耗稳压芯片HT7333、HT7333-A
简单介绍低功耗稳压芯片HT7333、HT7333-A是一款低压差三端稳压器IC,输出电流:300mA、压差:5mV典型值、超低功耗:2uA、输出电压3.3V、输出电压精度:±2%、芯片封装:SOT89、TO-92、SOT23。非常适用于安防消防等电子类产品的电源。低功耗稳压芯片HT7333、HT7333-A的详细介绍低功耗稳压芯片HT7333、HT7333-转载 2017-08-26 17:27:36 · 24000 阅读 · 4 评论 -
驱动中常见的队列操作函数
/** * destroy_workqueue - safely terminate a workqueue * @wq: target workqueue * * Safely destroy a workqueue. All work currently pending will be done first. */void destroy_workqueue(struct workqueue_...原创 2018-03-14 17:52:20 · 525 阅读 · 0 评论 -
Linux SPI总线设备驱动模型详解
随着技术不断进步,系统的拓扑结构越来越复杂,对热插拔、跨平台移植性的要求越来越高,早期的内核难以满足这些要求,从linux2.6内核开始,引入了总线设备驱动模型。其实在linux2.4总线的概念就已经提出来了,直到2.6版本的内核才运用。Linux系统中有很多条总线,如I2C、USB、platform、PCI等。以spi为例,假如有M种不同类型CPU,N中不同SPI外设,在写裸机驱动的时候,M种C...转载 2018-03-14 18:26:59 · 361 阅读 · 0 评论 -
spi总线驱动简单代码
spi-bus.c#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/device.h> int my_match(struct device *dev, struct device_driver *drv...转载 2018-03-14 19:04:35 · 624 阅读 · 0 评论 -
RESPONSE(x) 宏定义测试代码
#include <iostream>using namespace std;#define LK_STUCK_KEY 111#define LK_SELFTEST_FAILED 112static struct { unsigned char value; unsigned char *name;} lk_response[] = {#define RESPONSE(x) { ...原创 2018-03-22 14:52:55 · 187 阅读 · 0 评论 -
Linux之解析鼠标input事件数据
Linux中USB鼠标驱动:http://blog.csdn.net/qq_21792169/article/details/48790745或者直接Linux自带的USB鼠标驱动。/* * 向输入子系统汇报鼠标事件情况,以便作出反应。 * data 数组的第0个字节:bit 0、1、2、3、4分别代表左、右、中、SIDE、EXTRA键的按下情况; * data...转载 2018-03-13 19:29:27 · 888 阅读 · 0 评论 -
linux内核中时间处理常用的宏定义
/* * These inlines deal with timer wrapping correctly. You are * strongly encouraged to use them * 1. Because people otherwise forget * 2. Because if the timer wrap changes in future you won't have t...原创 2018-04-03 09:07:05 · 1209 阅读 · 0 评论 -
关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
disable_irq关闭中断并等待中断处理完后返回, 而disable_irq_nosync立即返回. 那么在中断处理程序中应该使用哪一个函数来关闭中断呢?在<linux设备驱动开发详解>中的按键驱动中, 使用disable_irq来关闭中断, 但是我在测试时进入中断后系统会死在中断处理程序, 而改为disable_irq_nosync则能正常退出中断处理程序.下面从内核代码来找一下...转载 2018-04-03 09:57:39 · 1619 阅读 · 0 评论 -
中断处理函数中自旋锁的应用
中断处理函数中,在获取锁之前,必须先禁止本地中断。否则,持有锁的内核代码会被中断处理程序打断,接着试图去争用这个已经被持有的自旋锁。这样的结果是,中断处理函数自旋,等待该锁重新可用,但是锁的持有者在该中断处理程序执行完毕之前不可能运行,这就成为了双重请求死锁。注意,需要关闭的只是当前处理器上的中断。因为中断发生在不同的处理器上,即使中断处理程序在同一锁上自旋,也不会妨碍锁的持有者(在不同处理器上)...转载 2018-04-03 10:16:20 · 3522 阅读 · 0 评论 -
Linux内核中工作队列的使用work_struct,delayed_work
初始化工作队列调度工作队列取消工作队列[cpp] view plain copy#include <linux/module.h> #include <linux/sched.h> #include <linux/kthread.h> #include <linux/err.h> #include <linux/delay.h> ...转载 2018-04-03 10:25:23 · 2326 阅读 · 0 评论 -
Linux内核中断底半部处理--工作队列
工作队列的使用过程:工作队列相关函数介绍:#include <workqueue.h> /*头文件包含*/1.工作队列的创建及销毁:定义一个工作队列结构体指针static struct workqueue_struct *key_workqueue;创建工作队列struct workqueue_struct *create_workqueue(char *);参数:工作队列的名称(字符...转载 2018-04-03 10:34:47 · 392 阅读 · 0 评论 -
禁止抢占
由于内核是抢占性的,内核中的进程在任何时刻都可能停下来以便另一个具有更高优先级的进程运行。这意味着一个任务与被抢占的任务可能会在同一个临界区内运行。为了避免这样的情况,内核抢占代码使用自旋锁作为非抢占区域的标记。如果一个自旋锁被持有,内核便不能进行抢占。因为内核抢占和SMP面对相同的并发问题,并且内核已经是SMP安全的,因此,这种简单的变化使得内核也是抢占安全的。 实际中,某些情况并不需要自旋锁...转载 2018-04-03 13:34:49 · 370 阅读 · 0 评论 -
preempt_count详解
当从内核态返回到用户态的时候,要检查是否进行调度,而调度要看两个条件:1.preempt_count是否为02.rescheduled是否置位 ret_from_exception: preempt_stop(CLBR_ANY)ret_from_intr: GET_THREAD_INFO(%ebp)check_userspace: movl PT_EFLAGS(%esp), %eax # mix ...转载 2018-04-03 13:42:21 · 1013 阅读 · 0 评论 -
del_timer_sync
Note: You must not hold locks that are held in interrupt context * while calling this function. Even if the lock has nothing to do * with the timer in question. Here's why: * * CPU0 ...转载 2018-04-03 14:12:40 · 792 阅读 · 0 评论 -
input_to_handler函数分析
/* * Pass event first through all filters and then, if event has not been * filtered out, through all open handles. This function is called with * dev->event_lock held and interrupts disabled. */st...原创 2018-04-25 19:57:09 · 504 阅读 · 0 评论 -
test_bit、set_bit和clear_bit
//将addr的第nr(nr为0-31)位置值置为1; //nr大于31时,把高27的值做为当前地址的偏移,低5位的值为要置为1的位数 extern __inline__ int set_bit(int nr,int * addr) { int mask, retval; addr += nr >> 5; //nr大于31时...转载 2018-03-31 17:27:58 · 6357 阅读 · 0 评论 -
pack 内存对齐操作
#pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐#pragma pack(pop)//恢复对齐状态#pragma pack( [show] | [push | pop] [, identifier], n )1,pack提供数据声明级别的控制,对定义不起作用;2,调用pack时不指定参数,n将被设成默认值;3,一旦改变数据类型的alignme...原创 2018-03-31 09:24:38 · 553 阅读 · 0 评论 -
I2C_ADDRS(addr, addrs...)理解
IIC驱动中的宏定义:/* Internal numbers to terminate lists */#define I2C_CLIENT_END 0xfffeU/* Construct an I2C_CLIENT_END-terminated array of i2c addresses */#define I2C_ADDRS(addr, addrs...) \ ((const unsign...原创 2018-03-20 19:39:32 · 2916 阅读 · 0 评论 -
Linux 设备模型之 (kobject、kset 和 Subsystem)(二)
1、kobject 结构在Linux内核里,kobject是组成Linux设备模型的基础,一个kobject对应sysfs里的一个目录。从面向对象的角度来说,kobject可以看作是所有设备对象的基类,因为C语言并没有面向对象的语法,所以一般是把kobject内嵌到其他结构体里来实现类似的作用,这里的其他结构体可以看作是kobject的派生类。Kobject为Linux设备模型提供了很多有用的功能...转载 2018-03-19 20:33:41 · 205 阅读 · 0 评论 -
Linux 设备模型基本概念 (一)
1、设备模型引入Linux 2.6内核最初为了应付电源管理的需要,提出了一个设备模型来管理所有的设备。在物理上,外设之间是有一种层次关系的,比如把一个U盘插到笔记本上,实际上这个U盘是接在一个USB Hub上,USB Hub又是接在USB 2.0 Host Controller (EHCI)上,最终EHCI又是一个挂在PCI Bus上的设备。这里的一个层次关系是:PCI->EHCI->...转载 2018-03-19 20:39:24 · 196 阅读 · 0 评论 -
linux设备驱动模型之 kset原理与实例分析
1、 Kset kset是具有相同类型的kobject的集合,在sysfs中体现成一个目录,在内核中用kset数据结构表示,定义为:struct kset {struct list_head list; //连接该kset中所有kobject的链表头spinlock_t list_lock;struct kobject kobj; //内嵌的kobjectstruct kset_uev...转载 2018-03-19 20:41:30 · 203 阅读 · 0 评论 -
kset_create_and_add
本文中所有代码都是来自linux内核源文件/lib/kobject.c/** * kset_create_and_add - 创建一个动态的kset 结构并添加到sysfs中 * * @name: kset名称 * @uevent_ops: kset的kset_uevent_ops 结构 * @parent_kobj: kset的付kobject,如果有的话 * * 该方法创建一个动态的kset...转载 2018-03-19 20:43:28 · 648 阅读 · 0 评论