
Linux 驱动
tanyjin
这个作者很懒,什么都没留下…
展开
-
linux中class_create和class_register说明
本文介绍linux中class_create和class_register的相关使用方法1 class结构体介绍 内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用device_create(…)函数来在/dev目转载 2016-07-24 16:39:29 · 688 阅读 · 0 评论 -
Linux ubuntu 升级OpenSSL教程
升级OpenSSL为官方更新修复的版本或未受影响的版本,例如OpenSSL-1.0.1t。 查看已安装的版本信息:openssl versionOpenSSL 1.0.1g 01 Jul 2014这里把openSSL升级到1.0.1t版本:wget https://www.openssl.org/source/openssl-1.0.1t.tar.gztar zvxf openssl-1.0.1t转载 2017-05-23 21:22:08 · 2071 阅读 · 0 评论 -
调整内核printk的打印级别
有时调试内核模块,打印信息太多了,可以通过修改/proc/sys/kernel/printk文件内容来控制。 默认设置是7 4 1 7cat /proc/sys/kernel/printk7 4 1 7 该文件有四个数字值,它们根据日志记录消息的重要性,定义将其发送到何处。关于不同日志级别的更多信息,请查阅syslog(2)联机帮助。上面显示的4个数转载 2017-03-18 20:25:03 · 826 阅读 · 0 评论 -
class_create(),class_device_create()或device_create()自动创建设备文件结点
从linux内核2.6的某个版本之后,devfs不复存在,udev成为devfs的替代。相比devfs,udev有很多优势,在此就不罗嗦了,提醒一点,udev是应用层的东东,不要试图在内核的配置选项里找到它;加入对udev的支持很简单,以作者所写的一个字符设备驱动为例,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用 class_device_create转载 2016-08-14 16:55:57 · 733 阅读 · 0 评论 -
Linux_GPIO及中断API函数
#include <linux/gpio.h> // 标准 GPIO_API int gpio_request(unsigned gpio, const char *label);获得并占有 GPIO port 的使用权,由参数 gpio 指定具体 port,非空的lables指针有助于诊断。主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错误,该地址已翻译 2016-07-31 23:26:01 · 833 阅读 · 0 评论 -
linux内核数据结构之kfifo
1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送。为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区中,B每次转载 2016-07-05 23:56:47 · 470 阅读 · 0 评论 -
schedule_work 工作队列
工作队列一般用来做滞后的工作,比如在中断里面要做很多事,但是比较耗时,这时就可以把耗时的工作放到工作队列。说白了就是系统延时调度的一个自定义函数。1、定义struct work_struct irq_queue;2、初始化INIT_WORK(&irq_queue,do_irq_queuework);3、调用方法:schedule_work(&rq_queue);注,转载 2016-06-21 20:49:34 · 3400 阅读 · 0 评论 -
解读PTR_ERR,ERR_PTR,IS_ERR
最近要找工作了,就把内核以及驱动的知识复习了一下。看到了几个宏PTR_ERR,ERR_PTR,IS_ERR(其实是内联函数).还是不太明白,然后就google搜索了一下,搜出来的结果真是不让人满意,看完一些解释我更迷糊了。看来还得依靠内核源码,依靠对内核的理解自己弄明白了。大致看了一下这几个宏的定义还有在内核的用法,恍然大悟。原来这几个宏这么简单,原理也这么简单。下面就说一下这几个宏的由来与用处。转载 2016-07-05 23:46:11 · 959 阅读 · 1 评论 -
device_create 函数详细分析
我们在刚开始写Linux设备驱动程序的时候,很多时候都是**利用mknod命令手动创建设备节点**,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。 内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了cla转载 2016-06-18 13:35:12 · 9896 阅读 · 0 评论 -
信号量 PK 自旋锁
信号量可能允许有多个持有者,而自旋锁在任何时候只能允许一个持有者, 当然也有信号量叫互斥信号量(只能有一个持有者),允许有多个持有者的信号量叫“计数信号量”。 信号量适合于保持时间较长的情况;而自旋锁适合于“保持时间非常短“的情况。在实际应用中自旋锁控制的代码只有几行,持有自旋锁的时间一般不会超过两次上下文切换的时间,因为线程一旦要行切换,就至少花费切出切入两次。自旋锁的占用时间如果远原创 2016-07-03 18:01:00 · 406 阅读 · 0 评论 -
linux 下platform设备和驱动注册的先后顺序
哪个先注册应该 貌似看源码先注册驱动如果没有设备,那probe不会被执行int driver_probe_device(struct device_driver * drv, struct device * dev){ if (drv->bus->match && !drv->bus->match(dev, drv)) return -ENODEV; dev->driver = drv;转载 2016-07-24 23:45:19 · 2114 阅读 · 0 评论 -
Platform设备驱动精讲
总线设备驱动模型主要包含总线、设备、驱动三个部分,总线可以是一条真实存在的总线,例如USB、I2C等典型的设备。但是对于一些设备(内部的设备)可能没有现成的总线。Linux 2.6内核中引入了总线设备驱动模型。总线设备驱动模型与之前的三类驱动(字符、块设备、网络设备)没有必然的联系。设备只是搭载到了总线中。在linux内核中假设存在一条虚拟总线,称之为platform总线。platform总线相比与转载 2016-07-24 22:56:12 · 1358 阅读 · 0 评论 -
list_head用法(二) 接口函数list_for_each_entry
Kernel转载 2016-07-24 18:51:47 · 2588 阅读 · 0 评论 -
list_head用法(一)
list_head用法经常在Linux的kernel里面经常看见,所以记录用法以来备忘 (1)list.h文件在include/linux/list.h#ifndef _LIST_H#define _LIST_H#define _INLINE_ static inlinestruct list_head { struct list_head *next, *prev;};#define转载 2016-07-24 18:44:26 · 2604 阅读 · 0 评论 -
GDB下查看内存命令(x命令)
可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:x/转载 2018-01-06 19:09:18 · 900 阅读 · 0 评论