![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux_drivers
mcgrady_tracy
这个作者很懒,什么都没留下…
展开
-
Linux driver oops异常的处理
如果Linux驱动里面出现了oops异常,这种情况如何快速定位到底什么原因引起的呢,需要对驱动debug。例如:#include #include static int __init hello_init(void){ int *p = NULL; *p = 0; return 0;}static void __exit hello_exit(void){}mo原创 2017-04-07 16:27:05 · 3566 阅读 · 0 评论 -
中断
1、中断处理函数的注册中断处理函数的注册使用request_irq,该原型定义在linux/interrupt.h中,函数原型如下:int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);irq为申请的中断号。handler为原创 2013-10-17 17:25:04 · 1060 阅读 · 0 评论 -
霍尔器件
霍尔器件是一个磁感应器件,在手机等平台上主要用于例如滑盖手机、翻盖手机等场合,用于控制屏幕的亮、灭。那么如果来写driver呢,这里主要调用input_report_switch来上报事件,当然也可以上报其它键值,上层根据键值来做不同的处理。首先是input设备的注册,注册同其它input设备没有什么不同,这里主要看input设备的setting:input_set_capabil原创 2015-08-28 14:12:47 · 1706 阅读 · 0 评论 -
Android early suspend/late resume
early suspend/late resume是Android在标准Linux上增加的一个suspend/resume机制,也就是说标准Linux kernel中是没有这个机制的。early suspend也就是常说的浅睡眠,当用户空间请求内核进入suspend时,early suspend首先被调用,例如常见的会让屏和tp停止工作。首先来看early suspend相关接口函数应该如原创 2015-07-13 19:30:16 · 2230 阅读 · 0 评论 -
Linux/Android多点触摸协议
关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt,而这里根据实际的例子来理解多点触摸协议。多点触摸协议有两种,A协议和B协议。首先来看A协议,协议上说了报点格式是这样的,以两点为例: ABS_MT_POSITION_X x[0原创 2015-07-02 18:22:01 · 7083 阅读 · 0 评论 -
工作队列(workqueue)
内核版本:Linux-2.6.32.2工作队列类似于tasklet,它允许内核代码请求某个函数在将来被执行(不是立即执行)。工作队列相关API定义在中。要使用工作队列有两种方式,一是自己创建一个工作队列;二是使用内核提供的工作队列(共享方式)。一、我们先来看自己创建工作队列的方式工作队列使用结构体struct workqueue_struct描述,要创建一个工作原创 2014-12-30 13:38:04 · 3578 阅读 · 0 评论 -
3.x版本内核中platform_device的生成
内核版本:Linux-3.18.2在3.x版本内核中platform_device不再静态定义,而是通过device tree来动态生成,例如(arch/arm/mach-s3c24xx/mach-sc2416-dt.c):static void __init s3c2416_dt_machine_init(void){ of_platform_populate(NULL, of_defa原创 2015-01-16 15:40:07 · 9633 阅读 · 1 评论 -
Device Tree Usage
Device Tree UsageQuality page [view draft] (+/-) This page walks through how to write a device tree for a new machine. It is intended to provide an overview of d转载 2014-12-27 16:49:47 · 961 阅读 · 0 评论 -
Device Tree(二):基本概念
一、前言一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compile转载 2014-12-22 14:55:14 · 933 阅读 · 0 评论 -
阻塞型I/O
在调用read、write等方法时,如果此时驱动无法满足要求时应该做何处理,例如当调用read系统调用时此时没有数据可读,或者调用write系统调用时没有空间供调用进程写入,调用进程是不会考虑这些事情的,它只是简单的调用read、write系统调用并等待它们的返回,那么这个时候应该阻塞调用进程,使它进入睡眠直到可操作时。那么在driver中使用等待队列来实现,等待队列由一个等待队列头来管理原创 2015-09-01 17:53:21 · 518 阅读 · 0 评论 -
Linux字符设备驱动
1. 关于设备号设备号分主设备号和次设备号,主设备号用来标识设备所对应的驱动程序,由于同一个驱动程序可以支持多个设备,次设备号就是用来区分采用同一个驱动程序的不同设备。Linux内核中采用dev_t来描述设备号,该类型定义在linux/types.h中,阅读内核源码可以看出dev_t实质是一个32位无符号整型,其中使用高12位为设备号,低20位为次设备号,Linux提供了两个宏MAJO原创 2013-07-11 17:09:54 · 1161 阅读 · 0 评论 -
Linux Completion
内核版本:Linux-4.5在Linux驱动程序中,有时需要等待一个事件的完成,就需要用到completion机制,需要包含头文件completion类型定义如下:struct completion { unsigned int done; wait_queue_head_t wait;};说明completion使用等待队列来实现的。可以使用宏DECLARE_C原创 2016-08-04 15:22:23 · 634 阅读 · 0 评论 -
Linux wakelock与autosleep
内核版本:Linux-4.5. wakelockLinux kernel在3.4及以后的版本中加入了wakelock机制,作用同之前的Android内核一样:1. 为应用层提供接口来创建、释放wakelock2. 在driver中,同样也可以创建、释放wakelock3. 当所有的wakelock都释放掉之后,系统可以自动进入低功耗状态,由autosleep来实现原创 2016-06-21 11:41:51 · 3501 阅读 · 0 评论 -
Android wakelock
Android wakelock机制是为了防止系统进入suspend或其他低功耗状态,那么首先来看driver API。那么在driver中需要include一个头文件,例如:struct state { struct wakelock wakelock;};init () { wake_lock_init(&state->wakelock, WAKE_LOCK_SUSPEND,原创 2015-09-17 18:12:48 · 663 阅读 · 0 评论 -
Line Disciplines
在Linux tty子系统中,Line Disciplines处在底层驱动与上层应用的之间,先来看一个例子:#include #include #include #include static int my_ldisc_tty_open(struct tty_struct *tty){ printk("%s\n", __func__); if (tty->ops->write原创 2016-05-29 19:51:03 · 1324 阅读 · 0 评论 -
关于i2c_register_board_info()函数
i2c_register_board_info()函数用于往__i2c_board_list这条链表添加一条i2c设备信息,在i2c adapter注册的时候,会扫描__i2c_board_list链表,然后调用i2c_new_device()函数来注册i2c设备,注意,要先于i2c adapter注册之前就添加好i2c设备信息,否则会出现调用了i2c_register_board_info()函原创 2016-04-30 22:13:14 · 9666 阅读 · 1 评论 -
关于i2c_smbus系列函数
内核版本:linux-4.5i2c_smbus系列函数有:s32 i2c_smbus_read_byte(const struct i2c_client *client);s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value);s32 i2c_smbus_read_byte_data(const struc原创 2016-03-24 12:41:03 · 32241 阅读 · 5 评论 -
关于dev_set_drvdata()和dev_get_drvdata()
内核版本:Linux-4.5dev_set_drvdata()和dev_get_drvdata()代码如下:static inline void *dev_get_drvdata(const struct device *dev){ return dev->driver_data;}static inline void dev_set_drvdata(struct device原创 2016-03-18 15:08:46 · 9571 阅读 · 0 评论 -
printk
在编写应用程序时,我们可以通过printf打印输出一些信息用来调试程序,Linux内核也提供了类似的函数printk,和printf不同的是,printk提供了输出日志级别,日志级别有:KERN_EMERGKERN_ALERTKERN_CRITKERN_ERRKERN_WARNINGKERN_NOTICEKERN_INFOKERN_DEBUGKERN_EMERG原创 2013-07-20 23:29:18 · 1995 阅读 · 0 评论 -
Device Tree(三):代码分析
一、前言Device Tree总共有三篇,分别是:1、为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因)2、Device Tree的基础概念(请参考DT基础概念)3、ARM linux中和Device Tree相关的代码分析(这是本文的主题)本文主要内容是:以Device Tree相关的数据流分析为索引转载 2014-12-22 14:56:34 · 943 阅读 · 0 评论 -
Device Tree(一):背景介绍
一、前言作为一个多年耕耘在linux 2.6.23内核的开发者,各个不同项目中各种不同周边外设驱动的开发以及各种琐碎的、扯皮的俗务占据了大部分的时间。当有机会下载3.14的内核并准备学习的时候,突然发现linux kernel对于我似乎变得非常的陌生了,各种新的机制,各种framework、各种新的概念让我感到阅读内核代码变得举步维艰。 还好,剖析内核的热情还在,剩下的就交给时间的。首先进转载 2014-12-22 14:31:12 · 903 阅读 · 0 评论 -
Linux内核中的时间处理
在Linux内核中,高度依赖于时间信息(不管这个时间是精确的或非精确的),比如硬件驱动中的延时、延后访问等等。在内核中通过定时器来精确的度量时间,那么这个定时的时间间隔取决于HZ这个值,它是与体系结构相关的一个常数,在x86平台下,这个值默认为1000,HZ这个时它表示的是定时器中断的频率,也就是说HZ为1000,即1秒钟要发生1000次中断,也就说是定时器定时的时间间隔为1毫秒,HZ值设的越大,原创 2014-06-20 17:38:34 · 1934 阅读 · 0 评论 -
mini2440 蜂鸣器驱动
蜂鸣器驱动代码如下:#include #include #include #include #include #include #include #include "buzzer.h"static int buzzer_open(struct inode *inode, struct file *file){ s3c2410_gpio_cfgpin(S3C2410_GPB原创 2014-07-17 00:01:40 · 2175 阅读 · 1 评论 -
Linux内核中的container_of宏
container_of宏用于根据已知结构体某个成员的地址得到整个结构体变量的地址,宏定义如下:原创 2014-06-24 18:22:34 · 794 阅读 · 0 评论 -
Linux内核中的链表
要使用内核链表,需要包含头文件,链表结构定义如下:原创 2014-06-24 16:25:11 · 1171 阅读 · 0 评论 -
Linux uinput驱动分析
Linux版本:linux-3.13.3uinput是Linux提供的一个可以在用户空间创建input设备的驱动程序,init部分代码如下:877 static int __init uinput_init(void)878 {879 return misc_register(&uinput_misc);880 }在uinput_init函数中,调用misc原创 2014-04-04 22:49:14 · 4821 阅读 · 7 评论 -
平台资源
平台总线设备除了用前面的platform_device_register函数去注册之外,经常会在平台下面看到platform_add_devices这样一个函数,platform_add_devices也是用于平台设备注册的,它是注册一组平台设备,函数原型如下:int platform_add_devices(struct platform_device **devs, int num);原创 2013-07-24 12:09:17 · 1129 阅读 · 0 评论 -
杂项设备
一、杂项设备先看杂项设备结构定义linux/miscdevice.h:struct miscdevice { int minor; const char *name; const struct file_operations *fops; struct list_head list; struct device原创 2013-07-29 18:53:55 · 1997 阅读 · 0 评论 -
平台总线
platform总线是Linux虚拟的一条总线,总线类型定义如下:struct bus_type platform_bus_type = { .name = "platform", .dev_attrs = platform_dev_attrs, .match = platform_match原创 2013-07-23 21:20:50 · 1808 阅读 · 0 评论 -
总线、设备和驱动属性文件
一、总线属性总线属性使用struct bus_attribute来描述,Linux给我们提供了一个宏,可以用来定义一个总线属性,那就是BUS_ATTR宏,该宏定义如下:#define BUS_ATTR(_name, _mode, _show, _store) \struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode,原创 2013-07-25 11:51:00 · 1557 阅读 · 0 评论 -
Linux内核当中的互斥锁
Linux可以使用互斥信号量来表示互斥锁,那就是通过宏DECLARE_MUTEX来定义一个互斥信号量,因为DECLARE_MUTEX这个宏,Marcin Slusarz在08年提交的了一个patch,邮件地址为:https://lkml.org/lkml/2008/10/26/74,Marcin Slusarz认为DECLARE_MUTEX宏会误导开发者,所以建议将DECLARE_MUTEX修改成原创 2014-06-26 12:00:26 · 12468 阅读 · 0 评论 -
并发与竞态
多个执行单元同时、并行的被执行称为并发,而并发对共享资源(临界区)的访问很容易引起竞态,避免竞态的方法主要有两种,信号量和自旋锁。1. 信号量信号量,使用信号量需要包含结构体,信号量结构定义如下:struct semaphore {spinlock_t lock;unsigned int count;struct list_headwait_list;}原创 2014-06-26 01:30:31 · 1151 阅读 · 0 评论 -
Linux leds驱动分析
内核版本:linux-3.4.67原创 2014-08-30 14:00:29 · 3701 阅读 · 0 评论 -
Linux rtc驱动模块分析
内核版本:linux-2.6.32原创 2014-09-03 14:49:36 · 6361 阅读 · 0 评论 -
关于platform中的id_table
内核版本:Linux-3.4.67platform的match函数如下:原创 2014-09-01 15:47:37 · 12758 阅读 · 0 评论 -
mini2440 led驱动
led驱动代码如下:#include #include #include #include #include #include #include #include "led.h"static int led_open(struct inode *inode, struct file *file){ s3c2410_gpio_cfgpin(S3C2410_GPB(5), S原创 2014-07-11 01:29:57 · 822 阅读 · 0 评论 -
ioctl方法
驱动程序除了需要提供读写设备能力之外,还需要提供控制设备的能力,这就需要用到ioctl方法。1. ioctl方法在应用层中,ioctl系统调用原型如下:#include int ioctl(int fd, unsigned long cmd, ...);fd: 文件描述符。cmd: 控制命令。第三个参数是可选的,具体由设备而定。在内核层中,ioc原创 2014-07-11 00:15:58 · 1082 阅读 · 0 评论 -
mini2440 按键驱动
内核版本:驱动代码如下:原创 2014-08-05 00:00:45 · 888 阅读 · 0 评论 -
linux 驱动模块hello.c的Makefile源码
KERNELDIR = /home/tracy/work/mini2440/linux-2.6.32.2CC = arm-linux-gccPWD = $(shell pwd)obj-m := hello.oall: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean: $(MAKE) -C $(KERNELDIR) M=$(PWD)原创 2014-07-10 20:36:30 · 708 阅读 · 0 评论 -
linux设备驱动之hello.c
#include #include MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){ printk(KERN_ALERT, "Hello, world\n"); return 0;}static void hello_exit(void){ printk(KERN_ALERT, "Goodbye, cr原创 2013-07-10 23:57:49 · 1159 阅读 · 0 评论