linux驱动
luckywang1103
每天多一点思考
展开
-
CONFIG_KALLSYMS_ALL
内核配置在2.6内核中,为了更好地调试内核,引入了kallsyms。kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map。CONFIG_KALLSYMS=y 符号表中包含所有的函数CONFIG_KALLSYMS_ALL=y 符号表中包括所有的变量(包括没有用E...原创 2020-01-24 16:35:05 · 3645 阅读 · 0 评论 -
DMA(四) - DMA_API_DEBUG
DMA_API_DEBUG为了debug驱动程序及发现使用DMA-API时的bug,检测代码可以编译到kernel中,它们可以告诉开发 者那些违规行为。如果你的体系结构支持,你可以选择编译选项“Enable debugging of DMA-API usage”,使能这个选项会影响系统性能,所以请勿在产品内核中加入该选项。...原创 2020-01-23 10:34:47 · 821 阅读 · 0 评论 -
linux自旋锁spin_lock
spin_lock与spin_lock_irq与spin_lock_irqsavespin_lock与spin_lock_irq两者只有一个差别:是否调用local_irq_disable()函数, 即是否禁止本地中断。spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢...原创 2019-12-28 14:56:47 · 412 阅读 · 0 评论 -
内核current指针
current指针current其实一个struct task_struct指针,指向当前进程struct task_struct *task又是struct thread_info的一个成员变量。thread_info可以从sp寄存器得到//linux-imx/include/asm-generic/current.h#define get_current() (current_thr...原创 2019-11-23 11:18:11 · 2472 阅读 · 3 评论 -
s3c2440与s3c2410区别
1. 最高主频不相同:2410为200M,2440为400M。 我们在用这两款处理器时,一般使用的主频是不相同的,而这个不相同,不仅影响是的运行的速度,最主要的是会影响一些外设(如串口)的时钟,这些外设的时钟如果不正确,就会出现问题。 又比如内存总线设置,2410 和 2440 主频不一样,总线定时所要求的时钟数也会不一样。---------------------转载 2013-10-31 22:58:40 · 3359 阅读 · 0 评论 -
hello驱动与Makefile
#include #include MODULE_LICENSE("Dual BSD/GPL");MODULE_AUTHOR("xxx");static int __init hello_init(void){ printk(KERN_ALERT "Hello world\n"); return 0;}static void __exit hello原创 2013-11-03 22:37:21 · 859 阅读 · 0 评论 -
Linux completion理解
completion是一种轻量级的机制,它允许一个线程告诉另一个线程工作已经完成。可以利用下面的宏静态创建completion:DECLARE_COMPLETION(my_completion);如果运行时创建completion,则必须采用以下方法动态创建和初始化:struct compltion my_completion;init_completion(&my_com转载 2013-11-19 11:38:42 · 1071 阅读 · 0 评论 -
linux驱动头文件
#include 是在linux-2.6.29/include/linux下面寻找源文件。#include 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。#include 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。Linux驱动程序常用头文件列举#inclu原创 2013-11-04 20:42:39 · 1452 阅读 · 0 评论 -
i2c驱动之调用ioctl函数进行读写at24c08
在linux驱动中/drivers/i2c/目录下有i2c-dev.c提供了I2C设备的通用驱动,实现了read(),write(),ioctl等函数,不过这里的read()和write()函数只能对应一条消息,即如下,但是如果碰到下面的情况:先写一次地址,然后再开始读数据,即分为两次消息,这个时候read(),write()函数就不能正常读写了,因为先原创 2013-11-18 21:45:42 · 19551 阅读 · 5 评论 -
i2c驱动之普通设备驱动1
驱动程序#include #include #include #include #include #include #include #include /* printk() */#include /* kmalloc() */#include /* everything... */#include /* error codes */#i原创 2013-11-21 23:44:32 · 2785 阅读 · 2 评论 -
i2c驱动之普通设备驱动2(推荐设备驱动方法)
与前面普通设备驱动1方法不同,这里的普通设备驱动利用i2c-core.c提供的i2c_transfer方法来实现设备驱动,而不是普通设备驱动1里面的通过操纵s3c2440的i2c寄存器来与设备通信 采用友善之臂的2.6.32.2内核,需要修改/linux-2.6.32.2/arch/arm/mach-s3c2440/mach-mini2440.c文件1)添加 #include原创 2013-11-23 15:29:18 · 2493 阅读 · 0 评论 -
function declaration isn't a prototype解决办法
对以上程序,在编译驱动的时候会出现以下warning:在网上查到解决办法是:即使函数括号内没有任何参数,也要加一个void类型,来避免这种warning:解决如下:原创 2013-11-10 00:26:15 · 49518 阅读 · 4 评论 -
Linux I/O端口与I/O内存
一、IO端口访问 1、直接使用IO端口操作函数 1)在设备打开或驱动模块被加载时申请IO端口区域,之后使用inb(),outb()等进行端口访问,最后在设备关闭或驱动被卸载时释放IO端口范围。流程如下: 2)struct resource *request_region(unsigned long first,unsigned long n原创 2013-11-29 15:40:49 · 1622 阅读 · 0 评论 -
内核地址空间与进程地址空间
一、内核地址空间1)物理内存映射区: kmalloc,get_free_pages申请的内存位于物理内存映射区,在物理上连续,他们与真实的物理地址只有一个固定的偏移。 virt_to_phys() 可以实现内核虚拟地址转化为物理地址 phys_to_virt() 物理地址转化为虚拟地址2)虚拟内存分配区:原创 2013-11-29 20:37:18 · 2314 阅读 · 0 评论 -
linux设备驱动之mmap函数
1.mmap系统调用void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);功能:负责把文件内容映射到进程的虚拟地址空间,通过对这段内存的读取和修改来实现对文件的读取和修改,而不需要再调用read和write;参数:addr:映射的起始地址,设为NULL由系统指定;len:映转载 2013-11-28 18:03:19 · 1760 阅读 · 0 评论 -
V4L2应用编程之huffman table don't exist,empty input file问题解决办法
最近在开始研究V4L2应用编程,网上找来一个embedsky的应用程序进行preview,第一次打开的时候是可以正常的preview,但是再次打开的时候提示:huffman table don't exist,empty input file。 我想之所以会报错huffman table don't exist,是在下面这个判断函数中,从缓冲区取出的图像数据buffers中不符合原创 2013-12-04 22:49:47 · 2915 阅读 · 0 评论 -
jpeglib库实现MJPEG图像的压缩与解压缩
linux提供了jpeglib库用于MJPEG图像的压缩与解压缩等,编译的时候加上选项-ljpeg表示使用jpeg库中的API函数一、压缩步骤1、申请并初始化jpeg压缩对象,同时要指定错误处理器 struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; // 声明错误处理器,并赋值给cinfo.err域原创 2013-12-13 00:19:21 · 12876 阅读 · 4 评论 -
V4L2应用程序
V4L2采集视频操作基本按照:打开视频设备、设置视频格式、启动视频采集、循环处理视频数据、停止视频采集、关闭视频设备,具体操作通过ioctl等函数实现一般操作流程如下:1、打开视频设备文件int fd = open("/dev/video0", O_RDWR);2、查询设备的能力,比如是否具有视频输入、或者音频输入输出等struct v4l2_capability {原创 2013-12-15 16:50:37 · 1599 阅读 · 0 评论 -
YUV格式到RGB格式的转换
YUYV格式到RGB格式的转换: 为什么YUYV格式要转到RGB格式,视频的显示调用的多数API都是基于RGB格式,所以需要进行格式的转换。YUYV格式如下: Y0U0Y1V0 Y2U1Y3V1.......... 说明:一个Y代表一个像素,而一个Y和UV组合起来构成一个像素,所以第0个像素Y0和第一个像素Y1都是共用第0个像素的U0和V0。而每个分量Y,U,V都是占用一个转载 2013-12-10 21:46:33 · 1327 阅读 · 0 评论 -
linux内核两个驱动之间的通信
想要实现的效果是: 先加载驱动1和驱动2,当驱动1的中断被触发后,进入中断处理函数,然后发送类似信号功能的某机制; 接着,驱动2收到后,停止阻塞,进行相应的处理... 请问:该用什么实现呢?---------------------------------------------------------------------------------------转载 2014-01-04 17:00:52 · 2724 阅读 · 0 评论 -
linux内核调试
我在编写camera应用程序的时候去调试V4L2_CID_HUE这个值时queryctrl.id = V4L2_CID_HUE;ret = ioctl(fd, VIDIOC_QUERY, &queryctrl); //ioctl若成功返回0,失败返回错误代码if(ret { printf("%d not supported\n"); return ;原创 2014-01-05 20:03:04 · 1584 阅读 · 0 评论 -
camera vivi虚拟驱动架构
最近打算翻翻linux-2.6.32内核中V4L2的源码,linux-2.6.32.2/Documentation目录下有关于V4L2驱动的结构说明,V4L2感觉挺复杂的,所以打算从vivi虚拟驱动入手掌握V4L2驱动 vivi驱动涉及文件:vivi.c驱动的具体实现v4l2-common.cV4L2-dev.cvideo_register_device(st原创 2013-12-19 01:23:50 · 3326 阅读 · 0 评论 -
Linux下./configure参数详解
我从http://www.ijg.org/files/下载了最新的libjpeg库(因为之前arm-linux-gcc编译器自带的libjpeg比较旧,比如jpeg_mem_src这个函数都没有)需要编译能在ARM Linux平台上运行,于是1、tar xvfz jpegsrc.v9a.tar.gz2、cd jpeg-9a3、./configure CC=arm-linux-gcc -原创 2014-01-22 21:33:53 · 31367 阅读 · 0 评论 -
linux 模块编译步骤
本文将直接了当的带你进入linux的模块编译。当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂。之所以要写这篇文章,主要是因为从书本上学的话,可能要花更长的时间才能学会整个过程,因为看书的话是一个学习过程,而我这篇文章更像是一个培训。所以实践性和总结性更强。通过本文你将会学到编译一个模块和模块makefile的基本知识。以及加载(卸载)模块,查看系统消息的一些知识;声明:转载 2014-03-17 15:36:09 · 923 阅读 · 0 评论 -
vmalloc
当buddy系统还有大量的连续物理内存时,我们可以通过__pages_alloc成功分配很大的一块连续物理内存空间,随着系统运行时间加长,buddy系统内很难中找到一块大的连续物理内存空间,因此__pages_alloc可能会失败,即便通过kswapd进行页面的回收和交换,buddy仍然不可避免的碎片化首先我们要明确的是,连续物理内存的分配并不是必要的。对于大部分DMA操作,我们的确需转载 2014-04-23 16:46:29 · 2305 阅读 · 0 评论 -
Class create, device create, device create file
来自:http://www.hovercool.com/en/Class_create,_device_create,_device_create_file开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点(包括ldd3中不少例子也是这样),实际上现在Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时转载 2014-05-09 17:43:24 · 1004 阅读 · 0 评论 -
struct class
在前面我们已经介绍了两种方法来实现在编写设备驱动程序时由系统自动给我们创建设备文件的方法。现在我们接着讲解第三种方法.一.前言内核中定义了struct class结构体,一个struct class 结构体类型变量对应一个类,内核同时提供了class_create()函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建了这个类,再调用device_create()函数在/d转载 2014-04-24 21:29:56 · 870 阅读 · 0 评论 -
浅析linux内核内存管理之bootmem allocator
在系统初始化的时候需要执行一些内存管理,内存分配的任务,这个时候buddy system,slab等并没有被初始化好,此时就引入了一种内存管理器bootmem allocator在系统初始化的时候进行内存管理与分配,当buddy system等初始化好后,在mem_init()中对bootmem allocator进行释放,内存管理与分配由buddy system,slab等进行接管。bootme转载 2014-04-24 21:30:58 · 977 阅读 · 0 评论 -
linux总线、设备和驱动程序
linux的驱动程序,模型一般在总线、设备、驱动3个模块1、总线struct bus_type{char *name;struct subsystem subsys;struct kset drivers};2、设备struct device { struct device *parent; struct原创 2014-04-24 21:30:45 · 894 阅读 · 0 评论 -
linux /sys目录下的各个子目录说明
# ls /sys/block class firmware kernel powerbus devices fs module-------------------------------------------------------------------------------------------------------原创 2014-05-13 15:34:28 · 14467 阅读 · 0 评论 -
linux kernel中没有include/linux/version.h文件
编译内核的时候make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig当然转载 2014-06-27 19:42:58 · 14697 阅读 · 0 评论 -
subsys_initcall
在linux内核代码里, 到处充满了subsys_initcall,这个调用是用来干吗的呢?有人回答是系统启动时候用来初始化某些系统的,具体怎么初始化的呢,说起来还是有点复杂。以2.6.21内核作为例子。在linux/init.h里,有这样一段代码:#define pure_initcall(fn) __define_initcall("0",fn,1)#define c转载 2014-05-28 23:25:27 · 967 阅读 · 0 评论 -
spinlock
linux内核代码中持有spinlock时为什么不能睡眠,本质原因是转载 2014-07-24 20:04:35 · 925 阅读 · 0 评论 -
<asm/types.h>在哪里
在linux中包含头文件时,有不少类似如下的写法:#include,但在linuxkernle的include文件夹下并没有这个文件夹,倒是有不少以asm打头的文件夹,如:asm_powerpc、asm_ppc等。#include,是由Makefile根据.config内核配置自动生成的,而用make menuconfig 可以生成.config.用make mrproper 可以清除.c转载 2014-07-25 12:00:45 · 11838 阅读 · 1 评论 -
i2c驱动之i2c-dev驱动
i2c的设备驱动可以直接利用内核提供的i2c-dev.c文件提供的ioctl函数接口在应用层实现对i2c设备的读写,但是在应用层使用ioctl函数对应用程序员要求较高,必须了解设备的操作流程,时序之类的。 另外i2c设备的驱动也可以通过普通的设备驱动实现,像往常的驱动一样实现,然后在应用层就可以像读取普通文件一样操作,无需再考虑读写时序。 在编译驱动的时候提示出原创 2013-11-20 00:18:18 · 16857 阅读 · 3 评论 -
未发现软件包ncurses
解决Ubuntu 10.10 使用`make menuconfig`配置Linux 内核时,出现缺少'ncurses-devel'库支持。*** Unable to find the ncurses libraries or the*** required header files.*** 'make menuconfig' requires the ncurses转载 2014-06-18 19:06:44 · 393 阅读 · 0 评论 -
printk()
五 printk() 内核提供的格式化打印函数。 1 printk函数的健壮性 健壮性是printk最容易被接受的一个特质,几乎在任何地方,任何时候内核都可以调用它(中断上下文、进程上下文、持有锁时、多处理器处理时等)。2 printk函数脆弱之处 在系统启动过程中,终端初始化之前,在某些地方是不能调用的。如果真的需要调转载 2014-07-29 21:40:30 · 2022 阅读 · 0 评论 -
各种总线match匹配函数
当向linux系统总线添加设备或驱动时,总是会调用各总线对应的match匹配函数来判断驱动和设备是否匹配,这些match函数之间都存在一定的差异,本文先对常用的match匹配函数进行讲解,以后会陆续添加新的内容。 一. 驱动和设备匹配过程常用数据结构1. of_device_idstruct of_device_id{charname[32];char type[32];转载 2014-06-21 22:28:28 · 922 阅读 · 0 评论 -
内核镜像
内核映像:内核映像有很多种。它可以是ELF格式,或者是可引导的U-Boot映像格式。它可以和一个根文件系统捆绑在一起。或者仅仅是内核本身。格式:内核如果是可引导的U-Boot格式,它一般地会在文件名中包含Image字符串(诸如uImage或vmImage),而ELF格式的内核通常在文件名中包含linux字符串(诸如linux或vmlinux)。大多数情况下你应该使用U-Boot格式转载 2014-11-16 18:19:55 · 3446 阅读 · 0 评论 -
修改设备驱动加载顺序
内核启动的时候,各个驱动初始化的工作在文件init/main.c中的do_basic_setup()函数中做.------------------------------------------------------------------------------------------------------static void __init do_basic_setup(void)转载 2014-10-14 11:58:20 · 1260 阅读 · 0 评论