linux 驱动
sir_zeng
这个作者很懒,什么都没留下…
展开
-
Linux内核中用户空间栈和内核栈的区别
转自http://blog.csdn.net/bailyzheng/article/details/80156181.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程转载 2013-01-18 17:04:45 · 529 阅读 · 0 评论 -
有关likely和unlikely
在linux中判断语句经常会看到likely和unlikely,例如:if(likely(value)){}else{}简单从表面上看if(likely(value)) == if(value),或者if(unlikely(value)) == if(value)。也就是likely和unlikely的用法是一样的,但是实际上执行是不同的,加likely的意识是value的值为转载 2013-01-31 10:59:41 · 357 阅读 · 0 评论 -
内核空间与用户空间之一:基础概念
(1)Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此Linux的虚拟地址空间也为0~ 4G(32位地址最大访问极限)。Linux内核将这4G字节的空间分为两部分,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF,供各个进程使用,称为“用户空间)。因为每个进转载 2013-01-31 10:43:58 · 731 阅读 · 0 评论 -
Linux的中断处理:work_struct的使用实例
WM9714的耳机跟喇叭通道切换由寄存器软件控制,跟之前电视里面插入耳机让功放直接拉低关掉外音的方式有点差别。通过设置WM9714的0X1C寄存器的值来切换,其中设置耳机时为0X00A0,设置喇叭时为0X1200。 电路中有外部上拉固定EINT11为高电平,通过插入耳机将这个外中断EINT11拉低来触发中断,再进行WM9714的寄存器控制。首先在WM9713.C中wm9713_soc转载 2013-01-31 10:19:10 · 627 阅读 · 0 评论 -
Linux设备模型(总线、设备、驱动程序和类)之一:bus_type
总线是处理器和一个或多个设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟"platform"总线。可以通过ls -l /sys/bus看到系统加载的所有总线。drwxr-xr-x root root 1970-01-01 00:02 platformdrwxr-xr-x root root 1970转载 2013-02-01 10:58:59 · 481 阅读 · 0 评论 -
linux之gcc命令
在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序。Gcc指令的一般格式为: Gcc [选项] 要编译的文件 [选项] [目标文件]。其中,目标文件可缺省,Gcc默认生成可执行的文件名为:编译文件.out看一下经典入门程序"Hello World!"# vi hello.c ,编辑如下:[cpp] view plaincopyprint?转载 2013-01-31 11:30:50 · 413 阅读 · 0 评论 -
mmap函数详解
mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数。原型:#include void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);int munmap(void *addr, size_转载 2013-01-31 11:03:48 · 435 阅读 · 0 评论 -
Linux设备模型(总线、设备、驱动程序和类)之三:device_driver && 多厂家驱动自动识别
设备模型跟踪所有系统已知的驱动,主要目的是使驱动程序核心能协调驱动和新设备之间的关系。一旦驱动在系统中是已知的对象就可能完成大量的工作。驱动程序的结构体device_driver 定义如下:struct device_driver { const char *name; /*驱动程序的名字( 在 sysfs 中出现 )*/ struct bus_type转载 2013-02-01 11:13:45 · 1113 阅读 · 0 评论 -
Linux设备模型(总线、设备、驱动程序和类)之二:device
在最底层,Linux 系统中的每个设备由一个struct device 代表: struct device{ struct klist klist_children; struct klist_node knode_parent; /* node in sibling list */ struct klist_node knode_driver;转载 2013-02-01 11:04:43 · 369 阅读 · 0 评论 -
linu编译系统的Kconfig和Makefile
Linux内核源码树的每个目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在执行内核配置make menuconfig时,从Kconfig中读出菜单,用户选择后保存到.config的内核配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择转载 2013-01-31 15:20:22 · 425 阅读 · 0 评论 -
Request_irq和setup_irq的区别
Linux 内核提供了两个注册中断处理函数的接口:setup_irq和request_irq。这两个函数都定义在kernel/irq/manage.c里。这两个函数有什么样的区别呢?(1)Setup_irq,Setup_irq通常用在系统时钟(GP Timer)驱动里,注册系统时钟驱动的中断处理函数。下面举个列子,如s3c2410 timer驱动结构体定义在Time.c (arch/arm/p转载 2013-01-31 20:40:10 · 483 阅读 · 0 评论 -
container_of()和内核链表中的list_entry()
(1) container_of宏的原始定义是: [cpp] view plaincopyprint?/** * container_of - cast a member of a structure out to the containing structure* @ptr: the pointer to the member.* @type: t转载 2013-01-31 11:17:03 · 429 阅读 · 0 评论 -
Linux下的LED子系统
版权所有,转载必须说明转自http://my.csdn.net/weiqing1981127最简单的led驱动就是从端口输出0或1来关闭或点亮灯。而我们这里讲的led子系统,主要是对led事件进行了分装和优化,这里我们主要讲的是可以实现跨平台的led驱动。不管你是使用三星的平台,还是Atmel的平台,你只要知道如何在你的BSP中添加平台数据,并且知道如何在应用程序中使用这个转载 2013-01-18 14:39:55 · 476 阅读 · 0 评论 -
Linux下的platform总线驱动(一)
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 原创作者:南京邮电大学 通信与信息系统专业 研二 魏清一.Platform设备驱动概念主要讲解平台设备驱动的模型和基本概念,同时因为驱动加载的方式有动态加载和静态加载两种方式,这里我们分别对动态加载和静态加载两种情况下,如何使用平台设备和驱动加以叙述。最后使用mini2440转载 2013-01-18 14:02:16 · 368 阅读 · 0 评论 -
Linux内核中的内存(三)
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 页高速缓存(cache)是Linux内核实现磁盘缓存,通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页回写是将页高速缓存中的变更数据刷新回磁盘的操作。引入磁盘高速缓存的目的主要有两个:其一,访问内存速度比访问磁盘快的多;其二,临时局部原理。读后备存储(正被缓存的存转载 2013-01-18 17:36:42 · 419 阅读 · 0 评论 -
Linux内核中的内存(二)
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127内存除了管理本身的内存(物理内存)外,还必须管理用户空间中的进程的内存(虚拟内存),这个内存就叫进程地址空间。尽管一个进程可以寻址4GB的虚拟内存,但是这并不代表它就有权访问所有的虚拟内存,这些可以被访问的地址空间称为内存区域。如果一个进程访问了不在有效范围内的内存区域,或者以不正确的方式访问了有效转载 2013-01-18 17:36:01 · 355 阅读 · 0 评论 -
Linux内核中的内存(一)
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 页内核把物理页作为内存管理的基本单位,尽管处理器的最小可寻址单位通常为字节,但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的硬件)通常以页作为单位进行处理。大多数32位体系结构支持4KB的页,内核用struct page结构表示系统的物理页,这个page与物理页相关,而并转载 2013-01-18 17:25:48 · 375 阅读 · 0 评论 -
Linux下的platform总线驱动(二)
版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 三.平台设备驱动测试这里我们采用Mini2440开发板,编写基于平台设备的按键驱动,要求按键驱动触发方式为单边沿触发,同时要求添加设备属性项。因为这个驱动比较简单,我就不去细致分析了,如果对硬件不理解可以参考mini2440开发板数据手册,如果对软件不理解,可以参考上文平台设备的讲解。在此转载 2013-01-18 14:09:13 · 355 阅读 · 0 评论 -
platform_device与platform_driver
做Linux方面也有三个多月了,对代码中的有些结构一直不是很明白,比如platform_device与platform_driver一直分不清关系。在网上搜了下,做个总结。两者的工作顺序是先定义platform_device -> 注册 platform_device->,再定义 platform_driver-> 注册 platform_driver。(1)platform_device设备转载 2013-02-01 15:50:31 · 460 阅读 · 0 评论 -
Linux 设备驱动框架
(1)驱动框架 Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,转载 2013-02-01 11:33:22 · 370 阅读 · 0 评论 -
Linux设备模型(总线、设备、驱动程序和类)之四:class_register
类是一个设备的高层视图,它抽象出了底层的实现细节,从而允许用户空间使用设备所提供的功能,而不用关心设备是如何连接和工作的。类成员通常由上层代码所控制,而无需驱动的明确支持。但有些情况下驱动也需要直接处理类。 几乎所有的类都显示在/sys/class目录中,可以通过ls -l /sys/class来显示。出于历史的原因,有一个例外:块设备显示在/sys/block目录中。在许多情况,类转载 2013-02-01 11:20:12 · 510 阅读 · 0 评论 -
DMA讲解《一》(清华大学)
DMA(Driect Memory Access)技术是一种代替微处理器完成存储器与外部设备或存储器之间大量数据传送的方法,也称直接存储器存取方法。 在微机系统内,外设与内存间的数据传送通常是通过CPU执行一段程序来实现的,但利用DMA技术则可不用CPU介入就能实现外设与内存之间数据的直接传送。DMA的主要优点是当需要把一个外设的大量数据送到指定内存时,它可以自动完成传送任务,也就是说外设发转载 2013-01-09 15:30:59 · 1082 阅读 · 0 评论 -
cdev结构 and MKDEV
MKDEV 功能:将主设备号和次设备号转换成dev_t类型cdev结构在Linux2.6内核中一个字符设备用cdev结构来描述,其定义如下:struct cdev { struct kobject kobj; struct module *owner; //所属模块 const struct file_operations*转载 2013-01-09 14:16:02 · 570 阅读 · 0 评论 -
Linux内核I2C子系统驱动(二)
上一篇文章讲述了I2C子系统体系结构,总线驱动、设备驱动的知识点,下面就S3C2440 I2C总线驱动的实现详细讲解,它的源码位于drivers/i2c/busses/i2c-s3c2410.c一、I2C平台设备资源 IIC驱动中使用的平台设备与前面看门狗、rtc等方式原理相同,但定义路径有所不同,并且设置了额外一些参数。mach_smdk2440.c文件中smdk244转载 2012-11-27 08:59:55 · 819 阅读 · 0 评论 -
Linux内核I2C子系统驱动(一)
I2C子系统驱动(一)一、I2C体系结构 Linux的I2C体系结构分为3个组成部分:I2C核心、I2C总线驱动、I2C设备驱动,如下图所示。I2C核心提供总线驱动和设备驱动的注册、注销方法,algorithm;I2C总线驱动对硬件体系结构中适配器的实现,主要包括适配器i2c_adapter、适配器通信算法i2c_algorithm,如果CPU集成了I2C控制器并且lin转载 2012-11-27 08:58:55 · 585 阅读 · 0 评论 -
ARM中的RO段、RW段和ZI段的区别
分类: ARM2012-09-29 13:4462人阅读评论(0)收藏举报目录(?)[+]前言ARM程序的组成ARM映像文件的组成ARM程序的执行过程实例RORWZI总结注:本文从http://mcuos.com/thread-2843-1-1.html 收集整理而来。1 前言 一直以来对于ARM体系中所描述的转载 2012-09-29 18:25:25 · 554 阅读 · 0 评论 -
linux UART串口驱动开发文档
内容简介: 介绍了Linux下的串口驱动的设计层次及接口,并指出串口与TTY终端之间的关联层次(串口可作TTY终端使用), 以及Linux下的中断处理机制/中断共享机制,还有串口缓冲机制当中涉及的软中断机制; 其中有关w83697/w83977 IC方面的知识, 具体参考相关手册,对串口的配置寄存器有详细介绍, 本文不再进行说明.目录索引:一. Linux的串口接口及层次.二. Lin转载 2012-05-21 20:43:52 · 879 阅读 · 0 评论 -
V4L2 - Linux下视频驱动模型
在DM6446平台,我们在GPP端一般使用MontaVista操作系统来进行程序控制。MontaVista作为一种嵌入式的Linux,和桌 面Linux类似,同样使用视频驱动V4L2(Video For Linux Two)来进行视频采集、输出。本文就V4L2的使用方式做简易说明。一般的,视频采集都有如下流程:在V4L2中,视频设备被看做一个文件。使用open函数打开这个转载 2012-05-18 11:22:13 · 411 阅读 · 0 评论 -
Linux驱动程序开发 - 设备控制接口
序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管理和控制设备的接口。我们前面的“Hello World”驱动程序已经可以提供读写功能了,在这里我们将扩展我们的驱动以支持设备控制接口,在Linux中这个接口是通过ioctl函数来实现的。设备控制接口(ioctl 函数)回想一下我们在字符设备驱动中介绍的struct file_operations结构,这里我们转载 2012-05-18 11:05:54 · 417 阅读 · 0 评论 -
request_irq()——注册中断服务
在 2.4 内核和 2.6内核中都使用 request_irq() 函数来注册中断服务函数。在 2.4 内核中,需要包含的头文件是 #include ,2.6 内核中需要包含的头文件则是#include 。函数原型如下:2.4 内核intrequest_irq (unsignedint irq, void (*handler)(int,void*转载 2012-05-18 10:21:45 · 545 阅读 · 0 评论 -
get_ds, set_fs, get_fs函数的使用
在linux内核编程时,进行系统调用(如文件操作)时如果要访问用户空间的参数,可以用set_fs,get_ds等函数实现访问。get_ds获得kernel的内存访问地址范围(IA32是4GB),set_fs是设置当前的地址访问限制值,get_fs是取得当前的地址访问限制值。进程由用户态进入核态,linux进程的task_struct结构中的成员addr_limit也应该由0xBFFFFFFF变为0转载 2012-05-18 09:56:25 · 506 阅读 · 0 评论 -
Datashee常用名词
Interrupt controller 中断控制器non-latched 非锁存latched 锁存Non-volatile memory 非易失性存储器calibration 校准Manual compensation 手动补偿Fast compensation转载 2013-01-06 10:27:21 · 540 阅读 · 0 评论 -
linux 设备驱动初学(一)
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在 应用程序看来,硬件设备只是一个设备文件, 应用程序可以象操作普通文件一样对硬件设备进行操作.比如read(),就像读文件一样操作设备。设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放. 2.把数据从内核传送到硬件和从硬转载 2013-01-09 09:48:40 · 381 阅读 · 0 评论 -
“手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
上一篇文章我们介绍了如何在linux下编写一个模块,并加载到内核空间。通过实验我们了解了大体的流程以及模块的工作原理。本篇文章我们将介绍如何编写一个虚拟的字符设备驱动程序。 之所以称之为虚拟字符设备驱动程序,主要原因是该驱动程序并没有真正操作外部设备,只是一个字符设备驱动程序框架,这为后面我们开发正是设备的驱动程序(LED、蜂鸣器等)奠定了基础。 作者:沧海转载 2013-01-09 11:47:52 · 416 阅读 · 0 评论 -
“手把手教你学linux驱动开发”OK6410系列之01---模块编程
一、实验环境 开发机环境 操作系统:ubuntu 9.10 交叉编译环境:arm-linux-gcc 4.2.2 ,安装位置 /usr/local/arm/4.3.2/ 6410板子内核源码路径:/work/linux-2.6.36.2-v1.05/ 目标板环境:OK6410-A linu转载 2013-01-09 11:36:16 · 450 阅读 · 0 评论 -
中断触发流程三(中断控制器)
这一篇主要说说中断控制器,及GPIO中断触发与中断号的识别,为什么GPIO引脚的触发最后调用特定的中断例程,这中间是怎么联系起来的。现在知道的是request_irq只是在特定的中断号链表中注册了一个中断例程,那这个中断号哪儿来的呢?其次,GPIO引脚的专用功能是特定的,当被触发后,就会通过VIC通知CPU去读取对应的中断号信息,所以要想让GPIO引脚上的触发让cpu去调用特定的中转载 2013-01-09 11:21:49 · 666 阅读 · 0 评论 -
中断触发流程二
中断触发流程二2012-07-24 10:16 by 至上, 18 阅读, 0 评论, 收藏, 编辑主要讲下两个结构体及其关系和在系统中所处的位置:每一个中断线或者叫中断向量都对应一个desc结构体,系统中所有的desc组成一个结构体数组。struct irq_desc { unsigned int irq;转载 2013-01-09 11:19:25 · 448 阅读 · 0 评论 -
中断触发流程
在响应一个特定的中断的时候,内核会执行一个函数,该函数叫做中断处理程序(interrupt handler)或中断服务例程(interrupt service routine ,ISP).产生中断的每个设备都有一个相应的中断处理程序,中断处理程序通常不和特定的设备关联,而是和特定的中断关联的,也就是说,如果一个设备可以 产生多种不同的中断,那么该就可以对应多个中断处理程序,相应的,该设备的驱动程序转载 2013-01-09 11:12:45 · 567 阅读 · 0 评论 -
关于设备号的思考
这是最后的运行流程,用户open设备节点,通过主设备号找到驱动程序,根据次设备号找到对应的设备,使用驱动函数中的read(),write()等函数操作设备。为了搭建这样的运行时环境,需要做如下工作:1 驱动程序加载(申请主设备号,在/proc/devices下创建设备)2 根据具体设备创建设备节点 (查询合适的主设备号和可用的次设备号 在/dev下面创建设备节点)先转载 2013-01-09 11:02:39 · 1161 阅读 · 0 评论 -
设备驱动概述
1 .对设备驱动通俗的解释:驱动硬件设备行动。设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询,中断处理,DMA通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据。2.关于有操作系统和没有操作系统的区别: 有时候操作系统是不必的,对于一些功能单一,控制并不复杂的系转载 2013-01-09 10:08:56 · 470 阅读 · 0 评论