自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

转载 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

一、V4L2框架主要结构体分析V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口。V4L2整体框架如下图:图中主要包括两层和三个结构体:两层是:1. v4l2驱动核心层:包含video_device和v4l2_device的分配、设置和注册2. v4l2下层接口层:具体的底层传感器驱...

2019-08-16 19:32:00 711

转载 二十三、uevnet机制和U盘自动挂载

一、uevent机制在分析之前,我们首先要知道uevent作用是什么。在此我们先来看一个uevent机制的框架图:该图片来自:Linux设备模型(3)_Uevent通过图片我们可以确定uevent的作用:设备产生上报事件时会触发uevent接口,uevent则通过netlink和kmod这两种方式把事件上报到用户空间。kmod会直接调用用户空间的程序,netlink只是将...

2019-08-06 12:22:00 442

转载 二十二、DMA驱动

一、DMA简介DMA(Direct Memory Access,直接内存存取),DMA传输将数据从一个地址空间复制到另外一个地址空间。传输过程由DMA控制器独立完成,它并没有拖延CPU的工作,可以让CPU效率提高。既然DMA用于传输,那么就需要具备传输三要素:源、目的、长度。在传输完成后,DMA会通过产生中断的方式汇报。由于DMA不使用页表机制,因此必须分配连续的物理内...

2019-08-05 19:35:00 1200

转载 二十一、RTC驱动

一、RTC设备驱动分析内核的rtc驱动位于内核drivers/rtc目录下,里面包含各个平台的RTC驱动。读者可在此目录下任意选择一个单板驱动文件进行分析,我选择的是rtc-davinci.c文件。文件链接:https://files.cnblogs.com/files/Lioker/21_rtc.zip首先来看init()函数: 1 static stru...

2019-07-31 12:47:00 224

转载 二十、网卡框架分析、虚拟网卡驱动和DM9621驱动分析

一、网络设备驱动的结构网卡设备不同于字符设备和块设备, 网络设备并不对应于/dev目录下的文件,它存放在/sys/class/net目录下。Linux系统对网络设备驱动定义了四个层次:1. 网络协议接口层:用于实现统一的数据包收发的协议,通过dev_queue_xmit()函数发送数据, 通过netif_rx()函数接收数据2. 网络设备接口层:通过struct n...

2019-07-29 16:15:00 471

转载 十九、eMMC驱动框架分析

一、MMC简介eMMC在封装中集成了一个控制器,提供标准接口并管理Nand Flash,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间。对于我们来说,eMMC就是在Nand Flash上添加负责ECC、管理坏块等功能的控制器。在内核中,使用MMC子系统统一管理MMC、SD、SDIO等设备。从MMC规范发布至今,基于不同的考量(物理尺寸、数据位宽和c...

2019-07-28 14:46:00 666

转载 十八、Nand Flash驱动和Nor Flash驱动

在读者学习本章之前,最好了解Nand Flash读写过程和操作,可以参考:Nand Flash裸机操作。一开始想在本章写eMMC框架和设备驱动,但是没有找到关于eMMC设备驱动具体写法,所以本章仍继续完成Nand Flash设备驱动,eMMC这个坑留在以后填。如果读者开发板为eMMC,本节驱动可能无法正常执行。在裸机操作中,读者应了解Nand Flash时...

2019-07-27 16:46:00 632

转载 十七、块设备驱动

在读者学习本章以及后续块设备相关章节之前,最好了解块设备读写过程和操作,可以参考:Nor Flash裸机操作。一、块设备概念和读写过程块设备:块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据。如硬盘,U盘,SD卡等。块设备组成:段(Segments):由若干个块组成,是Linux...

2019-07-26 16:38:00 157

转载 十六、USB驱动

一、USB固件和USB传输方式USB固件:USB固件一般不需要我们编写,在此不做程序分析。USB固件中包含USB设备的出厂信息,如厂商ID、产品ID、主版本号和次版本号等。这就是为什么当我们把U盘插入USB口的时候主机可以知道这是一个U盘设备。除包含出厂信息外,固件中还包含处理USB协议和设备读写操作的程序,如将数据从设备发送到总线上或从总线中将数据读取到设备中。驱...

2019-07-25 16:17:00 232

转载 十五、电容触摸屏驱动

在读者学习本章以及后续章节之前,最好拥有ADC和触摸屏裸机基础,可以参考:ADC和触摸屏编程。和按键驱动类似,触摸屏也是通过电平来体现按下或松开。因此如果想要写出通用的触摸屏驱动,需要使用输入子系统完成。考虑到我是用的并不是之前的TINY4412,在此给出下文所分析的文件:https://files.cnblogs.com/files/Lioker/15_ts.z...

2019-06-18 11:24:00 594

转载 十四、i2c子系统

由于之后的触摸屏驱动分析中使用到了GPIO子系统和i2c子系统,因此在分析触摸屏驱动之前我准备把这两个子系统进行简单分析。在读者学习本章以及后续i2c相关章节之前,最好了解i2c通信方式,可以参考:i2c编程。一、i2c框架分析和总线设备驱动模型类似,i2c分为核心层、总线驱动层和设备驱动层。总线驱动层向核心层提供统一接口,设备驱动层实现底层设备操作。...

2019-06-14 20:57:00 156

转载 十三、GPIO子系统

由于之后的触摸屏驱动分析中使用到了GPIO子系统和i2c子系统,因此在分析触摸屏驱动之前我准备把这两个子系统进行简单分析。之前我们使用GPIO引脚的方式并不是推荐的方式,当我们更改某一bit时,很有可能导致另外的bit值发生更改。而GPIO子系统进行了封装,确保每次只对一个GPIO引脚操作,而不会影响到别的GPIO引脚。下面这段代码是我从驱动程序中摘出来的,它首...

2019-06-10 22:13:00 211

转载 十二、使用PWM调整LCD背光亮度

和手机一样,开发板中也带有调整背光亮度的功能。调整背光亮度依赖于PWM,它通过调节脉冲宽度来控制背光亮度,此方式需要使用PWM驱动。本章将对其进行讲解。一、用户空间调整背光亮度一般应用程序可以通过/sys/class/目录下的节点间接调整各个外设的参数。如下图,可通过命令行来控制背光亮度。设备节点不同开发板的目录不一定相同,读者需自行测试。如果读者...

2019-06-04 22:40:00 7816

转载 十一、三星平台framebuffer驱动

和总线设备驱动模型类似,framebuffer分为核心层、驱动层和设备层。核心层:就是上一章分析的fbmem.c文件驱动层(控制器层):一般由芯片原厂提供,实现了LCD控制器通用的操作接口和配置接口,本章用到的是三星提供的s3cfb_main.c和s3cfb_ops.c设备层:一般由单板厂商提供,本章用到的是arch/arm/plat-s5p/dev-fimd-s5p....

2019-06-02 13:26:00 210

转载 十、LCD的framebuffer设备驱动

在读者学习本章以及后续LCD相关章节之前,最好拥有LCD裸机基础,可以参考:LCD编程。在内核中,表示LCD使用的是framebuffer(帧缓冲,简写为fb),其内容对应于屏幕上的界面显示。修改framebuffer中的内容,即修改屏幕上的内容。操作framebuffer可以直接在LCD上观察到效果。framebuffer本质上是一段内存,或称作显存。在内...

2019-06-01 14:06:00 377

转载 第十六章:网络IPC 套接字

一、IP地址和端口套接字接口可以用于计算机间通信。目前计算机间使用套接字通讯需要保证处于同一网段。为了查看是否处于同一网段,我们可以使用IP地址判断。IP地址是计算机在网络中的唯一标识。IP地址本质是个整数,它与网卡的物理地址(MAC地址)绑定。MAC地址在网卡出厂时都确保唯一,不需要我们关心。IP地址有IPv4和IPv6之分,IPv4是32位整数,IPv6是...

2019-05-30 22:35:00 161

转载 第十四章:高级I/O

一、非阻塞I/O对于一个给定的描述符,有两种为其指定非阻塞I/O的方法。1. 如果调用open()函数获得描述符,可以使用O_NONBLOCK标志。如int fd = open("a.txt", O_RDWR | O_NONEBLOCK);2. 对于已经打开的描述符,可以使用fcntl()函数设置O_NONBLOCK标志。二、文件锁在此使用之前的例子...

2019-05-30 14:44:00 105

转载 第十一章:线程

多进程在代码中并不多见,因为它有很大的局限性,如分配大量资源、进程的PID个数有限等。现在更多地是使用多线程实现代码并发。一、线程的概念线程是一种轻量级的代码并发技术,对资源的要求较小。线程隶属于某个进程,进程内部可以使用多线程,线程内部也可以使用多线程。线程共享进程的资源,不需要太多额外的资源,每个线程只需要额外分配一个栈区即可。在使用多线程之后,在程序设计时就可...

2019-05-28 16:28:00 100

转载 九、总线设备驱动模型

由于TINY4412被学长借去做毕设了,因此从本章开始,以后章节的示例代码均基于iTOP4412_SCP精英版如读者使用TINY4412开发板,可自行修改代码本章所说的总线是虚拟的总线,只是为了让设备属性和驱动行为更好的分离所提出的概念实际的Linux设备和驱动通常都会挂接在一种总线上,对于USB、I2C、SPI等总线设备而言,自然不是问题。但是挂...

2019-05-22 21:19:00 132

转载 八、输入子系统

前面几章我们写的按键驱动程序虽然已经足够完善,但是这个驱动只有知道/dev/key设备节点和write()格式的人才能使用,不具有适应性故本节引入标准的输入子系统,来编写通用的输入类设备。输入子系统是对所有的标准输入类设备的统一的管理系统,使用这个模型可以跨平台的处理所有的输入类设备一、输入子系统分层输入子系统将一个输入设备的输入过程分成了设备驱动(inpu...

2019-05-15 18:04:00 136

转载 第十章:信号

一、信号的概念使用信号进行进程间通信(IPC)是UNIX的一种传统机制,Linux也支持这种机制。每一个信号都有一个名字,这些名字都以SIG开头。如SIGINT表示终端中断(Ctrl + C产生),SIGQUIT表示终端退出,SIGIO表示异步I/O。我们可以使用kill -l命令查看所有信号信号属于异步事件,它的发生对于进程是随机的。...

2019-05-15 09:51:00 142

转载 第八章:进程控制

一、进程标识和进程状态和文件描述符类似,每个进程都有一个非负数的唯一ID来表示它。进程ID可以在不同时刻复用,当一个进程终止后,它的ID就可以复用了。UNIX系统通常会有一个延迟的复用算法,使得新创建的进程ID不同于最近一段时间内终止的进程ID,以避免将新进程误认为是之前已终止的那个进程。进程ID为1的通常是init进程,它在系统自举结束后由内核创建,该进程是用来初始化系统...

2019-05-15 09:21:00 114

转载 七、内核定时器

在测试按键驱动时,可能会出现按键抖动的问题,也就是按下或松开一次,却进入了多次中断程序。如下图所示:产生这个问题是由于现实中的高电平转成低电平脉冲过程是机械式开关,可能会有机械的抖动导致多次触发中断针对这个问题,我们可以采用延时检测来防止抖动,这就是这节要谈论的内核定时器,内核定时器基于软中断,因此在处理函数中不允许睡眠一、内核定时器的使用方法定时器...

2019-05-14 16:47:00 136

转载 六、异步通知

在此之前的代码,我们都是应用程序主动去read()按键值这章所要涉及的异步通知是一旦设备就绪,则驱动主动通知应用程序,这样应用程序不需要查询设备状态。这一点类似于“中断”一、应用程序异步通知signal()这章的异步通知使用的是UNIX环境高级编程第十章的信号。由于是异步通知,因此我们还需要使用fcntl(fd, F_SETFL, oflag | FASYN...

2019-05-13 14:39:00 107

转载 五、并发控制

一、并发与竞态并发是指一段时间内有多个程序执行,但任一个时刻点上只有一个程序在运行并发就会导致一个问题:假设程序A对一个文件写入3000个字符“a”,而另一个程序B对这个文件写入3000个“b”,第三个程序C读取这个文件,会导致读取数据不一定是什么因为可能在一段时间内先执行了A;当A执行到一半CPU切换到执行B了,这时就会导致数据混乱解决这个问题的途径是保证对...

2019-05-12 18:35:00 92

转载 四、poll()、select()和epoll()

在用户程序中,poll()和select()系统调用用于对设备进行无阻塞访问。poll()和select()最终会调用设备驱动中的poll()函数,在我所使用的Linux内核中,还有扩展的poll()函数epoll()一、poll()函数应用程序中的poll()函数原型为:#include <poll.h>int poll(struct p...

2019-05-12 15:54:00 129

转载 Linux驱动函数解读

一、kmalloc()、kzalloc()和vmalloc()这三个函数都可以分配连续的虚拟内存除此之外,这三个函数的区别有:1. kmalloc()和kzalloc()函数分配的物理内存也是连续的,而vmalloc()分配的物理内存不一定连续2. kmalloc()和kzalloc()函数分配的大小需要小于128K,而vmalloc()分配的大小没有限制...

2019-05-11 16:40:00 586

转载 LINUX驱动笔记 目录

笔记参考了宋宝华老师的《Linux设备驱动开发详解:基于最新的Linux 4.0内核》以及韦东山老师的嵌入式驱动教程笔记开发环境:单板:第一章到第八章使用TINY4412-1611;第九章及之后章节使用iTOP4412_SCP精英版编译工具链:arm-linux-gcc-4.3.2内核版本:linux-3.5-20170221busybox版本:busybox-1.2...

2019-05-11 15:50:00 136

转载 UNIX环境高级编程笔记 目录

每一章的重点会使用加粗字体第一章:UNIX基础知识:UNIX体系结构;文件和目录;输入和输出;程序和进程;出错处理;信号;时间值;系统调用和库函数第三章:文件I/O:文件描述符;文件操作函数;文件操作示例;I/O的效率;原子操作;dup()和dup2();fcntl();ioctl();其他函数第四章:文件和目录:stat()、fstat()、fstatat()和...

2019-05-11 14:42:00 100

转载 第七章:进程环境

一、进程终止进程正常终止:1. 从main()函数返回,即retrun 02. 调用exit(),即在main()函数内或其它被main()函数调用的函数内调用exit()3. 调用_exit()或_Exit(),即在main()函数内或其它会被main()调用的函数体内调用_exit()或_Exit()4. 最后一个线程从其所在进程返回5. 最后一个线程在...

2019-05-11 14:35:00 108

转载 第五章:标准I/O库

本章用于解析C语言标准I/O库,之所以在UNIX类系统的编程中会介绍C语言标准库,主要是因为UNIX和C之间具有密不可分的关系。标准I/O库相比于操作系统的I/O库,具有更高的效率和可移植性,前者是因为标准I/O库提供了缓冲和块长度优化功能,后者是因为使用标准I/O库的代码不仅能在各UNIX系统上移植,也能在支持标准C的非UNIX系统上移植。一、基本概念...

2019-05-11 10:47:00 97

转载 三、中断分析以及按键中断

在读者学习本章以及后续章节之前,最好拥有中断裸机基础,可以参考:中断编程。一、内核中断分析通过裸机系列的学习,我们可以知道异常的触发分为下面几个过程:1. 在规定地址设置异常向量表2. 保存各种寄存器的值(保存现场)2. 执行异常处理函数(处理现场)3. 恢复执行(恢复现场)如u-boot中arch/arm/cpu/armv7/start.S...

2019-05-10 14:29:00 250

转载 二、点亮LED

接着上一章,本章来实现控制LED的亮灭操作:一、驱动框架#include <linux/fs.h>#include <linux/init.h>/* 定义文件内私有结构体 */struct led_device { struct cdev cdev; int stat; /* 用于保存LE...

2019-05-09 18:22:00 213

转载 第四章:文件和目录

本章在第三章的基础上描述文件的属性,如大小、创建时间等。本章最后介绍对目录进行操作的各个函数。一、stat()、fstat()、fstatat()和lstat()stat系列函数用于返回文件的属性信息,如文件类型、大小、所有者、访问修改时间等。函数声明如下: 1 /* 文件属性查看函数 */ 2 #include <sys/stat...

2019-05-09 12:57:00 124

转载 一、驱动基础

在读者学习本章之前,最好拥有部分裸机程序基础(如点亮LED、arm-linux-gcc、中断等),初学者可以查看:ARM裸机加强版本章使用的平台为TINY4412,移植等过程课查看之前的随笔:TINY4412:移植uboot、内核和挂接网络文件系统本系列参考了宋宝华老师的《Linux设备驱动开发详解:基于最新的Linux 4.0内核》以及韦东山老师的嵌入式驱动教程,在此...

2019-05-08 16:48:00 222

转载 TINY4412:移植uboot、内核和挂接网络文件系统

开发环境:单板:TINY4412-1611系统:Ubuntu 16.04 64位编译工具链:arm-linux-gcc-4.3.2uboot版本:uboot_tiny4412-20130729内核版本:linux-3.5-20170221busybox版本:busybox-1.20.0【注】 1、本文只用于移植,不会讲解其中原理。若读者希望了解...

2019-04-06 15:23:00 466

转载 第一章:UNIX基础知识

一、UNIX体系结构严格来说,操作系统可定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核。因为它小且位于计算机体系的核心。下图显示了UNIX系统的体系结构:上图阴影部分为系统调用,所有的系统调用都会从用户空间中汇聚到 0x80中断点,同时保存具体的系统调用号。C语言中的open()、read()等函数都是通过系统调用触发中...

2019-04-01 14:21:00 145

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除