- 博客(16)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 Linux字符设备驱动和杂项设备驱动对比
初学Linux驱动程序的时候,可能对什么是字符设备驱动(char device)和杂项设备驱动(misc device)并不是很了解,更谈不上如何区分了。我自己当初在学习Linux字符设备驱动的时候,也并没有特地去了解其两者之间的区别,尤其是在两种驱动设备注册的时候,没有意识到其不同之处,导致后来在项目中出现了很严重的问题,但却迟迟到找不到解决方案。所以今天就趁这个机会,好好分析一下两者之间的区别
2016-01-22 16:43:25
6501
2
原创 Linux内核:工作队列
在我的上一篇文章Linux内核:中断、软中断、tasklet中,我们已经了解了中断底半部的两种实现方式,即软中断和tasklet微线程。但是这两种方式归根结底都是采用软中断机制的,其根本上还是在中断的上下文中执行,所以这也就要求了采用这两种方式编写中断底半部,不能出现一些可能导致程序休眠或者是延迟的函数(虽然当发生中断嵌套时会生成Ksoftirq线程,但这个是不确定的,所以我们在编写程序时,还是不
2015-10-02 10:26:21
5441
原创 Linux内核:中断、软中断、tasklet
在之前我所写的Linux驱动程序中,会经常使用到中断机制,像CC1100高频驱动、倒车雷达驱动等等。但所用到的中断机制都基本上是用到中断的顶半部,即:编写中断处理函数,通过request_irq函数申请中断,这样当中断来临的时候,就会自动执行中断处理程序里面的内容。之所以没有使用到中断的底半部,是因为我们这些驱动程序中,中断处理函数一般都能被很快执行完,同时也不会存在有任何休眠的动作,因此使用中断
2015-09-28 16:21:24
3141
原创 编写JNI的两种应用层与JNI层方法映射方式
通常我们在编写的JNI 时,在定义上层应用层需要调用的函数中,我们需要对该函数进行应用层与JNI层方法之间的映射。这样上层的Android应用程序才能正确的调用我们的JNI函数,这种映射的方式一共有两种。在函数名中进行映射 在函数名中进行映射是最为简单的一种方法,因为只要我们知道调用我们JNI函数的Java文件所在的路径,那么我们就将该路径放在我们JNI对应函数的前面就可以了,同时还要在函数前面加
2015-09-22 11:11:04
2738
原创 Linux内核:seek机制
在我们编写CC1100驱动程序和倒车雷达驱动程序的时候,我们都用到了当前读取数据标志位,即我们在驱动程序中会定义一个容器用来存放数据,每一次我们读完一个数据时,我们都会将我们的读数据变量加1,这样下一次再来读取数据的时候就不会读到以前的数据了,都会是全新的数据。当然这个方法是我们自己在编写驱动程序时候自己定义的。是否在Linux内核中本来就有这样的机制呢?答案是肯定的。这个机制就是seek机制,那
2015-09-19 16:53:26
4678
原创 Linux内核:poll机制
在编写驱动程序的过程当中我们可以使用poll机制来非阻塞的打开我们的设备文件,我们知道,在之前我们编写CC1100的驱动程序以及倒车雷达的驱动程序的时候,在read函数中都有用到过wait_event_interruptible_timeout这个函数,这个函数的主要作用就是采用非阻塞的read,因为每一次我们read函数的时候,都会先判断是否有新的数据可以读,如果没有新的数据就会休眠等待有新的数
2015-09-19 16:20:20
9234
原创 Linux内核:进程基础之进程ID与管理
Linux系统中的每一个进程都有一个唯一的标示——PID(Process ID),也叫进程ID。给每一进程设置一个标示的主要作用便是方便Linux系统管理数量庞大的进程,例如进程间的通信、判断子父进程、通过进程ID找到进程的task_struct等等,都需要使用到我们的进程ID。我们已经知道每一个进程都会有一个唯一的task_struct结构体来关联该进程相关的数据和结构体。Linux 内核所
2015-08-20 16:10:27
3183
原创 基于V4L2驱动程序的USB摄像头Android(JNI)的编写(三)
在上两篇文章基于V4L2驱动程序的USB摄像头Android(JNI)的编写(一)和基于V4L2驱动程序的USB摄像头Android(JNI)的编写(二)中,我详细介绍了如何配置V4L2的环境、设置捕获视频数据的格式,以及视频流数据捕获的过程。但是由于我们捕获到的视频数据是YUYV422格式的,那么在这一篇文章中,我将主要介绍如何将YUYV422格式的数据转换成ARGB格式的数据,同时将ARGB格
2015-08-11 10:27:44
3582
1
原创 C语言:数组指针、指针数组、指针的指针、函数指针
说到C语言的指针,可能大家都比较熟悉,基本上的都知道,指针就是存放地址的,无论是普通变量的地址,还是函数的地址都可以用指针表示。如果该指针用一个变量表示,那么这就是一个指针变量。所为指针变量就是这个指针所存放的地址是可以发生变化的,例如int i = 6;int j = 7;int *p;p = &i;p = &j;由上面的代码可以看出,首先int类型的指针p是指向变量i的地址的,但
2015-08-09 09:41:14
950
原创 如何使自己编译的驱动程序具有读写权限
在Android系统中,我们通常在编写好驱动设备文件之后,如果直接编写JNI程序,通过上层Android应用程序调用驱动的设备文件的话,会显示无法打开设备错误,出现这样一个错误的主要原因是因为应用程序没有权限打开驱动设备。我们可以通过adb工具进入/dev目录输入:ls –al命令,可以显示当前设备文件的权限信息。修改驱动程序的读写权限有两种方法: 第一种 直接使用adb工具,进入dev的目录下
2015-08-07 19:55:52
4301
原创 Linux内核:container_of宏分析
我们在编写驱动程序的时候,会经常在open函数中用到container_of宏,那么这个在linux内核中这个宏的主要作用是什么呢?
2015-08-07 18:57:26
816
原创 Linux内核:通过wait_event和wake_up内在机制分析等待队列
等待队列在linux内核中,等待队列是一个非常重要的概念,也是一个非常重要的机制。我们会在很多函数当中用到等待队列的知识,例如completion机制、wait_event机制等等。在解释这些机制之前,我们首先要弄清楚什么是等待队列。
2015-08-07 16:27:22
7520
原创 基于V4L2驱动程序的USB摄像头Android(JNI)的编写(二)
在我的上一篇文章基于V4L2驱动程序的USB摄像头Android(JNI)的编写(一)中,我详细介绍了如何配置V4L2驱动程序的采集环境,那么在这篇文章中,我将详细分析V4L2采集视频的过程。一、向驱动程序申请缓冲帧 缓冲帧,顾名思义就是在Linux驱动程序中用于临时存放数据的“容器”,在V4L2驱动程序中,也就是存放我们的视频流数据。而什么又是向驱动程序申请缓冲帧呢,因为在V4L2驱动程序中,其
2015-08-07 09:52:26
6540
2
原创 基于V4L2驱动程序的USB摄像头Android(JNI)的编写(一)
video4 linux2(V4L2)是Linux内核中关于视频设备的内核驱动,它为Linux中视频设备访问提供了通用接口,在Linux系统中,本文主要介绍如何使用V4L2驱动程序打开我们的USB摄像头。同时着重介绍如何编写相应JNI(NDK)使Android应用程序能够打开我们外接的USB摄像头,并获取视频流信息。
2015-08-06 17:00:42
9279
15
原创 关于Android.mk和build/envsetup.sh的一些小小理解
我们知道在Android的源代码中,我们会经常看到Android.mk的身影,那么它在我们编译源码的过程当中到底起到了什么作用呢?它和一般的Makefile又有什么联系?同时Android.mk和build目录下的envsetup.sh文件又有什么关联呢? 首先我们来阐述第一个问题,Android.mk文件在编译源码中的作用,在介绍之前可以看看别人写的一篇关于Android.mk的简介,从该文章中
2015-08-06 10:53:01
2360
原创 关于Android的HAL的一些理解
之前一直在学习基于Linux内核的一些字符型驱动的编程,对Linux内核驱动也算有了一些基本的了解吧,后来也做过一些基于Linux内核的驱动开发,像基于Android的CC1101高频模块的驱动开发,以及基于V4L2的USB摄像头开发。但是还是一直都没有用到过Android的HAL模块,这一次刚好在暑假,就好好系统学习一下Android的HAL了。 说到HAL,我想目前市面上关于这方面的书应该也有
2015-08-04 09:56:56
6278
Liunx驱动死机,经常运行一段时间,报错重启问题
2016-01-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人