内核编程
脱水的a鱼
这个作者很懒,什么都没留下…
展开
-
Linux 字符设备驱动结构(一)—— cdev 结构体、设备号相关知识解析
一、字符设备基础知识1、设备驱动分类 Linux系统将设备分为3类:字符设备、块设备、网络设备。使用驱动程序:字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。块设备:是指可以从设备的任意位置读取一定长度数据的设备转载 2017-02-08 15:15:23 · 307 阅读 · 0 评论 -
GPIO的驱动模型
一、概述GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂鸣器,输出高低电平,检测按键,等等。GPIO分输入和输出,在davinci linux中,有关GPIO的最底层的寄存器驱动,\arch\arm\mach-davinci目录下的gpio.c,这个是寄存器级的驱动,搞过单片机MCU的朋友应该比较熟悉寄存器级的驱动。GPIO的驱动主要就是读取GPIO口的状态,或者设置转载 2017-03-14 14:32:44 · 997 阅读 · 0 评论 -
linux内核之链表操作解析
本文只是对linux内核中的链表进行分析。内核版本是linux-2.6.32.63。文件在:linux内核/linux-2.6.32.63/include/linux/list.h。本文对list.h文件进行简要分析,有必要的地方还会以图进行说明。代码分析链表结构体:有前驱和后继,说明是双链表struct list_head { struct list_head转载 2017-03-30 14:46:56 · 284 阅读 · 0 评论 -
linux gpio接口
一.相关结构体 1.gpio_chip代表一个芯片的一个gpio bank[cpp] view plain copy struct gpio_chip { //gpio bank const char *label; //bank名 struct device *dev; //设备文件 struct module转载 2017-03-13 17:11:24 · 559 阅读 · 0 评论 -
Linux GPIO驱动 - 硬件及硬件抽象层
在很多的SOC芯片里,GPIO硬件接口都是和其它硬件接口共用Pin脚,然后通过特定的寄存器去设置Pin使用时的类型。比如目前手上的项目使用的是Marvell的SOC芯片,该芯片上有50个多功能Pin脚(MPP:Multi-Purpose Pins),每个Pin都可以配置成不同的功能。SOC提供了7个32位的寄存器用来配置MPP Pin的类型,寄存器的每4位对应一个Pin,一个寄存器控制可以8个Pi转载 2017-03-13 13:46:25 · 1135 阅读 · 0 评论 -
Linux 内核GPIO的学习
GPIO是嵌入式开发中最常见的接口,之前自己就有写过小的GPIO驱动,提供ioctl接口给用户空间操作。但直到最近才发现Linux自身就有完善的GPIO驱动框架,并且通过sysfs向用户空间提供操作接口。Linux的GPIO驱动框架层次及数据结构如下:最上层是用来向向用户空间提供接口,用户可以通过该接口方去控制GPIO PIN脚。GPIO通用接口层主要是维护了一个GPIO PIN的数组gp转载 2017-03-13 13:45:13 · 677 阅读 · 0 评论 -
Linux内核:poll机制
在编写驱动程序的过程当中我们可以使用poll机制来非阻塞的打开我们的设备文件,我们知道,在之前我们编写CC1100的驱动程序以及倒车雷达的驱动程序的时候,在read函数中都有用到过wait_event_interruptible_timeout这个函数,这个函数的主要作用就是采用非阻塞的read,因为每一次我们read函数的时候,都会先判断是否有新的数据可以读,如果没有新的数据就会休眠等待有新的数转载 2017-03-28 17:02:21 · 912 阅读 · 0 评论 -
select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用转载 2017-03-28 16:04:50 · 375 阅读 · 0 评论 -
linux下devicetree中惯用的of函数
linux下devicetree中常用的of函数从device_node中获取信息:int of_property_read_u8_array(const struct device_node *np, const char *propname,u8 *out_values, size_t sz);int of_property_read_u16_array(const struct转载 2017-03-08 09:00:41 · 450 阅读 · 0 评论 -
ioctl()函数详解
我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围。写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑。一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的转载 2017-02-14 16:17:45 · 293 阅读 · 0 评论 -
read 系统调用剖析--file_operations中read/write函数与内核系统调用的关系
在阅读LDD3-第三章-字符设备驱动程序中:struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write,转载 2017-02-14 15:55:02 · 6406 阅读 · 0 评论 -
内核模块参数
模块参数引导模块时,可以向它传递参数。要使用模块参数加载模块,这样写:insmod module.ko [param1=value param2=value ...]为了使用这些参数的值,要在模块中声明变量来保存它们,并在所有函数之外的某个地方使用宏MODULE_PARM(variable, type) 和 MODULE_PARM_DESC(variable转载 2017-02-21 10:38:29 · 236 阅读 · 0 评论 -
关于Linux下内核编程函数使用头文件包含的问题解决方案
在进行内核编程时候,其不再像C编程那样,函数的使用,我们可以通过man 查询;所以对于内核编程函数的使用往往会给编程人员带来很头疼的问题,古人云工欲善其事必先利其器,所以一个好的工具对于我们编程人员来说也很重要,由于个人也是进过很多的查找,总结了一下相关的使用方式,ctags并不推荐:这里是基于原始的man命令的改善:1.下载相关的内核编程源码,我这里用的是最新的4.1的源码;2.下载原创 2017-03-01 12:16:25 · 1624 阅读 · 0 评论 -
内核编程struct file 与struct file_operations以及struct cdev之间的关系
一:struct file:1.struct file: 描述进程中打开的文件,进程中只要调用了open就有一个该对象。具体描述了打开文件的路径,权限,标志,内部偏移file结构体是用来维护打开的文件的。每打开一次文件,内核空间里就会多增加一个file来维护,当文件关闭是释放。所以,在内核中可以存在同一个文件的多个file,因为该文件被应用程序打开被打开。原创 2017-02-08 16:49:25 · 959 阅读 · 0 评论 -
Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析
前面在 Linux 字符设备驱动开发基础 (三)—— 字符设备驱动结构(中) ,我们已经介绍了两种重要的数据结构 struct inode{...}与 struct file{...},下面来介绍另一个比较重要数据结构struct _file_operationsstruct _file_operations在Fs.h这个文件里面被定义的,如下所示:[cpp] vi转载 2017-02-08 16:19:50 · 365 阅读 · 0 评论 -
Linux 字符设备驱动结构(三)—— file、inode结构体及chardevs数组等相关知识解析
前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 (一)—— 字符设备驱动结构(上) 下面继续学习字符设备另外几个重要的数据结构。 先看下面这张图,这是Linux 中虚拟文件系统、一般的设备文件与设备驱动程序值间的函数调用关系; 上面这张图展现了一个应用程序调用字符设备驱动的过程, 在设备驱动程序的设计中,一般而言,会关心转载 2017-02-08 16:13:03 · 271 阅读 · 0 评论 -
Linux 字符设备驱动结构(二)—— 自动创建设备节点
上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号。第一种是使用mknod手工创建:mknod filename type major minor第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。 具体udev相关知识这里不详细阐述,可以移步L转载 2017-02-08 15:35:34 · 297 阅读 · 0 评论 -
测试嵌入式Linux 的启动时间计算
Tim 的测试软件工具包:Tim软件包Tim Bird 的 grabserial 是一个广泛使用的工具,可以用于产看串口控制台输出的时间信息。这个工具能够为收到的每一行信息添加上时间戳,如下面所示:$ sudo ./grabserial -v -d "/dev/ttyUSB0" -b 115200 -w 8 -p N -s 1 -e 30 -t -m "Starting kernel.原创 2017-04-04 16:40:37 · 898 阅读 · 0 评论