
linux_driver
driverSir
你永远不知道以后会怎样,现在要做的就是努力!
展开
-
以太网 串行管理接口 SMI MDIO
SMI接口包括两根信号线:MDC和MDIO,通过它,MAC层 芯片 (或其它控制芯片)可以访问 物理层 芯片的寄存器(前面100M物理层芯片中介绍的 寄存器组 ,但不仅限于100M物理层芯片,10M物理层芯片也可以拥有这些寄存器),并通过这些寄存器来对物理层芯片进行控制和管理。SMI管理接口如下: MDC:管理接口的时钟,它是一个非周期信号,信号的最小周期(实际是正电平时间和负电平时转载 2016-08-11 09:44:26 · 2761 阅读 · 0 评论 -
异步通知fasync
linux设备驱动归纳总结(三):7.异步通知fasyncxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx异步通知fasync是应用于系统调用signal和sigaction函数,下面我会使用signal函数。简单的说,signal函数就是让一个信转载 2013-08-21 14:56:51 · 751 阅读 · 0 评论 -
总线地址、物理地址、虚拟地址相关概念澄清
Now, on normal PCs the bus address is exactly the same as the physicaladdress, and things are very simple indeed. However, they are that simplebecause the memory and the devices share the same address转载 2013-08-21 17:55:34 · 1216 阅读 · 0 评论 -
Linux内存管理之mmap详解
Linux内存管理之mmap详解一. mmap系统调用1. mmap系统调用 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作转载 2013-08-08 14:14:22 · 823 阅读 · 0 评论 -
内存映射nopage()
struct vm_operations_struct①在2.6.23之前struct vm_operations_struct中只有struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int *type)从2.6.24后在struct vm_operations_st转载 2013-08-08 09:26:07 · 4467 阅读 · 2 评论 -
旧方式映射
#include #include #include #include #include #include #include #include #include #include #include #include #include #define SHARE_MEM_COUNT 4#define SHARE_MEM_SIZE (PAGE_SIZE*SHARE_MEM_转载 2013-08-08 09:31:49 · 728 阅读 · 0 评论 -
Linux设备驱动之Ioctl控制
Linux设备驱动之Ioctl控制 大部分驱动除了需要具备读写设备的能力之外,还需要具备对硬件控制的能力。 一、在用户空间,使用ioctl系统调用来控制设备,原型如下:int ioctl(int fd,unsigned long cmd,...);/*fd:文件描述符cmd:控制命令...:可选参数:插入*argp,具体内容依赖于cmd*/ 用户程转载 2013-08-20 10:31:34 · 790 阅读 · 0 评论 -
vm_area_struct (vm_pgoff没看懂)
原文:http://blog.youkuaiyun.com/ywf861029/article/details/6114794Linux内核中,关于虚存管理的最基本的管理单元应该是struct vm_area_struct了,它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。 下面是struct vm_area_struct结构体的定义转载 2013-08-07 14:19:12 · 7772 阅读 · 0 评论 -
linux 内存映射 remap_pfn_range操作
mmap 理解的总不是太好,又做了一个读写例子,大部分都是在网找的源代码#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #i转载 2013-08-06 10:14:55 · 5688 阅读 · 1 评论 -
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-07-29 15:44:30 · 994 阅读 · 0 评论 -
IO端口和IO内存
在驱动程序编写过程中,很少会注意到IO Port和IO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。1. CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也转载 2013-05-19 10:59:59 · 634 阅读 · 0 评论 -
linux之DMA动态映射指南
DMA动态映射指南translated by JHJ(jianghuijun211@gmail.com)本文通过伪代码指导驱动开发者如何正确使用DMA API。关于API更精确的描述,请参考DMA-API.txt。大多是64位平台有一些特殊硬件可以将总线地址(DMA地址)转换为物理地址。这个和CPU如何利用页表或TLB将虚拟地址转换成物理地址有点像。这种地址转换是有必要的,转载 2013-08-13 15:40:50 · 7321 阅读 · 1 评论 -
linux设备和驱动加载的先后顺序
Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢。Linux系统使用两种方式去加载系统中的模块:动态和静态。静态加载:将所有模块的程序编译到Linux内核中,由do_initcall函数加载核心进程(/init/main.c)kernel_inità do_basic_setup()àdo_initcalls()该函数中会将在_转载 2013-08-29 16:52:10 · 1439 阅读 · 0 评论 -
Linux 设备和驱动加载的先后顺序
Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢。Linux系统使用两种方式去加载系统中的模块:动态和静态。静态加载:将所有模块的程序编译到Linux内核中,由do_initcall函数加载核心进程(/init/main.c)kernel_inità do_basic_setup()àdo_initcalls()该函数中会将在_转载 2013-08-29 16:49:34 · 665 阅读 · 0 评论 -
Linux设备驱动之内存映射
1. 内存映射所谓的内存映射就是把物理内存映射到进程的地址空间之内,这些应用程序就可以直接使用输入输出的地址空间,从而提高读写的效率。Linux提供了mmap()函数,用来映射物理内存。在驱动程序中,应用程序以设备文件为对象,调用mmap()函数,内核进行内存映射的准备工作,生成vm_area_struct结构体,然后调用设备驱动程序中定义的mmap函数。 2. 映转载 2013-08-07 16:02:33 · 848 阅读 · 0 评论 -
printf debug
#define AlsaDbgPrintf(a, b...) printf("zsphal: "); printf(a, ##b)//#define AlsaDbgPrintf(a, b...)#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)#define error(...) do {\ ...原创 2013-10-17 16:21:54 · 1532 阅读 · 0 评论 -
内核模块相关命令:lsmod,depmod,modprob...
lsmod功能:列出内核已载入模块的状态用法:lsmod描述: lsmod 以美观的方式列出/proc/modules的内容。 输出为: Module(模块名) Size(模块大小) Used by(被...使用) eg. ne2k_pci 8928 0 8390转载 2014-04-10 17:45:50 · 1012 阅读 · 0 评论 -
一个简单的Makefile
CC=gccTARGET=testSRC=$(wildcard *.c)OBJECT= ${SRC:.c=.o}INCLUDES=-I/usr/include/alsaLDFLAGS=-lasoundall:$(TARGET)$(OBJECT):$(SRC)$(CC) -c $(INCLUDES) $$(TARGET):$(OBJECT)$(原创 2013-10-14 17:37:49 · 833 阅读 · 0 评论 -
总线地址、物理地址、虚拟地址相关概念澄清
总线地址、物理地址、虚拟地址相关概念澄清Now, on normal PCs the bus address is exactly the same as thephysicaladdress, and things are very simple indeed. However, they are thatsimplebecause the memory and the devices sh转载 2013-10-22 22:58:55 · 1486 阅读 · 0 评论 -
vim
h, j, k, l - 移动光标i - 在当前光标入插入a - 在当前光标后插入A - 在行末插入x - 删除当前位置的字符X - 删除当前位置的前一个字符c{motion} - 改变某一段内容C - 改变当前位置到行末的内容s - 改变当前位置的内容S - 改变当前行的内容d{motion} - 删除某些内容D - 删除当前位置到行末的内容,等同于转载 2013-10-16 15:46:13 · 625 阅读 · 0 评论 -
start.S 代码学习 C语言内存布局
/*参考了别人的一些笔记,看完了启动代码。本文档记录在看代码时碰到的困难,将这些曾经困扰的问题记录下来,以备今后之用。分析时不重要的代码被删除了。*/.globl _start_start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr转载 2013-09-26 17:42:45 · 4212 阅读 · 1 评论 -
linux内核动态加载模块
一、安装内核模块:一般步骤:(1) 在/usr/src/linux/下运行make menuconfig把需要编译成模块的项打上(M),保存并退出。(2) 运行make modules,这一步将在/usr/src/linux/下生成*.o或*.ko文件。(3) 运行make modeules_install来安装,这步会把生成的.o或ko文件拷贝到/lib/modu转载 2013-09-25 15:01:05 · 744 阅读 · 0 评论 -
Wave File Format
Table of ContentsOverviewData FormatsFile StructureWave File HeaderWave File ChunksFormat Chunk - "fmt "Data Chunk - "data"Fact Chunk - "fact"Cue Chunk - "cue "Playlist Chunk - "plst"Assoc转载 2013-09-30 16:50:36 · 2722 阅读 · 0 评论 -
关于linux内核模块Makefile的解析
Linux内核是一种单体内核,但是通过动态加载模块的方式,使它的开发非常灵活 方便。那么,它是如何编译内核的呢?我们可以通过分析它的Makefile入手。以下是 一个简单的hello内核模块的Makefile. ifneq ($(KERNELRELEASE),)obj-m:=hello.oelseKERNELDIR:=/lib/modules/$(shell uname -r)/b转载 2013-09-29 13:46:38 · 1136 阅读 · 0 评论 -
Android 音频系统
0. 专用术语1. 物理结构2. 系统架构 本文基于Freescale IMX平台Codec ALC5625为例。0. 专用术语 ASLA - Advanced Sound Linux Architecture OSS - 以前的Linux音频体系结构,被ASLA取代并兼容 Codec - Coder/Decoder I2转载 2013-07-18 15:16:22 · 844 阅读 · 0 评论 -
深入分析Linux自旋锁
前言: 在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块。但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取。实验现象和我对自旋锁和休眠的理解有出路。 我后来我将这个模块放到自己的PC上测试,成功锁死了,说明我的模块原理上没有问题。但是为什么在ARM上会这样呢???后来我将模块给了我的转载 2013-05-29 18:24:52 · 956 阅读 · 0 评论 -
Linux系统对IO端口和IO内存的管理
一、I/O端口 端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。二、IO内存 例如,在PC上可以插转载 2013-05-19 10:15:04 · 581 阅读 · 0 评论 -
OMAP3630 Linux I2C总线驱动分析(2)
4 OMAP3630 I2C device驱动 在Linux内核中,I2C device驱动位于drivers/i2c/chips目录下,可以看到该目录下有很多相关的device驱动,这里以xxxx项目的mma7455为例介绍device驱动的注册过程,对应的device驱动程序为mma7455.c。 既然有device驱动,那么必定有相应的device,I2C的device是转载 2013-05-19 11:35:26 · 947 阅读 · 0 评论 -
串口驱动分析
虽然串口通讯已经是普遍的标准而且广为大家熟知,但驱动中涉及的部分内容也可能在平时的应用中并不是很常用到,在这里做一个简单的介绍待后面说明到具体代码的时候可以连贯一些。串行通讯接口是目前十分流行的通讯接口之一。由于其电气界面的简单性使其在计算机领域的应用相当的广泛。在这里提到的串行通讯接口主要是指UART(通用串行)和IRDA两种。通常的串行连接电气连接上有3wire和9wire两种。3wi转载 2013-05-19 11:32:05 · 8078 阅读 · 0 评论 -
Linux内核sk_buff的结构分析
我看的内核版本是2.6.32.在内核中sk_buff表示一个网络数据包,它是一个双向链表,而链表头就是sk_buff_head,在老的内核里面sk_buff会有一个list域直接指向sk_buff_head也就是链表头,现在在2.6.32里面这个域已经被删除了。 而sk_buff的内存布局可以分作3个段,第一个就是sk_buff自身,第二个是linear-data buff,第三个转载 2013-05-19 11:30:22 · 934 阅读 · 0 评论 -
Linux DM9000网卡驱动程序完全分析
虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何实现驱动和平台分离。本文分成以下几个部分: 一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系。 二、两个重要的结构体介绍:sk_buff和net_device 三、具体代码分析转载 2013-05-19 11:28:45 · 739 阅读 · 0 评论 -
SD卡协议学习点滴(二)
数据传输模式:在SD卡识别模式结束之前,控制器使用的时钟频率均为Fod。在数据传输模式,控制器可能会使用Fpp频率。控制器发送一条SSEND_CSD(CMD9)命令来获取SD卡CSD寄存器(Card Specific Data)里面的描述值,譬如,块长度,卡容量信息等。广播命令SET_DSR(CMD4)为各个已识别的SD卡配置驱动阶段(??)。它会向SD卡的DSR寄存器写入相关的信息。控制转载 2013-05-19 11:22:44 · 2005 阅读 · 0 评论 -
SD卡协议学习点滴(一)
首先SD卡有所谓操作模式(operation mode)的概念,每种操作模式又具体对应一种或多种状态,主机通过发送命令可以使SD卡在不同的状态间转换,SD卡则接受命令,并根据自己现在所处状态做出不同的响应。系统上电时刻或者搜寻SD卡时,SD卡控制器应该处于SD卡识别模式;SD卡在刚接入系统时刻也处于这种模式,并且处于此模式下的Idle状态。SD卡识别模式:在这种模式下,控制转载 2013-05-19 11:22:10 · 3668 阅读 · 1 评论 -
Linux USB驱动框架分析
Linux USB驱动框架分析(一) 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了。好,言归正传,我说一说这段时间的收获,跟大家分享一下Linux的驱动开发。但这次只先针对Linux的USB子系统作分析,因为周五研讨老板催货。当然,还会顺带提一下其他的驱动程序写法。 事实上,Linux转载 2013-05-19 11:18:31 · 706 阅读 · 0 评论 -
Linux-2.6.20的LCD驱动分析(一)[转]
一、让 LCD 显示可爱的小企鹅 还是先说说环境吧,处理器为 S3C2410 , linux 的版本当然是 2.6.20 的。下面先说说怎样让 LCD 上显示出可爱的小企鹅。最直接的步骤如下(记住不要问为什么哈~ _ ~,一步一步跟着走就行了):1. 添加 s3c2410 处理器的 LCD 控制寄存器的初始值,具体做法为在文件 arch/arm/mach-s3c2410/ma原创 2010-06-02 11:27:00 · 577 阅读 · 0 评论 -
s3c2440的LCD应用
要想正确使用LCD,必须注意两点:1、时序;2、显示缓存区。 1、时序LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即每秒屏幕刷新的次数(单位Hz)。HSYNC是水平同步信号,在每进行一行的扫描之前,该信号就有效一次,由该信号可以确定LCD的行频,即每秒屏幕从原创 2010-05-31 10:22:00 · 1118 阅读 · 0 评论 -
linux 触摸屏驱动分析
mini2440驱动分析系列之---------------------------------------Mini2440触摸屏程序分析By JeefJiang July,8th,2009这是mini2440驱动分析系列的第三篇文章,本文分为三个部分,第一部分讲叙硬件知识,包括触摸屏的原理以及SCC2440 SOC上的触摸屏是如何工作的。第二部分分析输入设备子系统的框架,转载 2013-05-19 11:14:42 · 666 阅读 · 0 评论 -
platform_driver_probe与platform_driver_register的区别
Platform Device and Drivers从我们可以了解Platform bus上面的驱动模型接口:platform_device,platform_driver。和PCI和USB这些大结构的总线不同,虚拟总线Platform bus使用最小结构来集成SOC processer上的各种外设,或者各种“legacy”之间的互联。Platform device典型的Plat转载 2013-05-19 11:15:33 · 638 阅读 · 0 评论 -
从USB设备插上到驱动probe调用流程分析
最近小小的接触了下usb的驱动, 想搞清楚probe的调用机制, 不过懒人一个, 懒得去看源码, 在Google搜了下, 果然有结果, 引用过来, 留作纪念!!!!==============本文将详细讲述2.6.22下的一个USB设备插上linux系统的PC后是如何一步一步调到我们的usb设备驱动的probe函数的,我们知道我们的USB驱动的probe函数中的一个参数是int转载 2013-05-19 11:19:25 · 813 阅读 · 0 评论 -
关于platform_device和platform_driver的匹配
说句老实话,我不太喜欢现在Linux 2.6这套bus, platform, device,device driver 的模式。我觉得这种模式破坏了Linux的“简单就是美”的哲学,原来那套驱动已经可以包容所有驱动,也可以直接注册驱动文件和管理,而且以前的驱动在现在的结构上也还可以使用,把它在注册到bus这棵树上又有什么用呢?虽然可以看到一点对于移植性和平台管理方面的优点,但是我认为现在这种驱动编转载 2013-05-28 15:34:49 · 730 阅读 · 0 评论