irq.docx
- 文档编号:10485358
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:60
- 大小:3.13MB
irq.docx
《irq.docx》由会员分享,可在线阅读,更多相关《irq.docx(60页珍藏版)》请在冰点文库上搜索。
irq
下面简单介绍一下:
1.Linux定义了名字为irq_desc的中断例程描述符表:
(include/linux/irq.h)
structirqdescirq_desc[NR_IRQS];
NR_IRQS表示中断源的数目。
2.irq_desc[]是一个指向irq_desc结构的数组,irq_desc结构是各个设备中断服务例程的描述符。
structirq_desc{
irq_flow_handler_thandle_irq;
structirq_chip*chip;
void*handler_data;
void*chip_data;
structirqaction*action;
unsignedintstatus;
unsignedintdepth;
unsignedintwake_depth;
unsignedintirq_count;
unsignedintirqs_unhandled;
spinlock_tlock;
#ifdefCONFIG_SMP
cpumask_taffinity;
unsignedintcpu;
#endif
#ifdefined(CONFIG_GENERIC_PENDING_IRQ)||defined(CONFIG_IRQBALANCE)
cpumask_tpending_mask;
#endif
#ifdefCONFIG_PROC_FS
structproc_dir_entry*dir;
#endif
constchar*name;
}____cacheline_aligned;
Irq_desc结构体中的成员action指向该中断号对应的irqaction结构体链表。
Irqaction结构体定义如下:
//include/linux/interrupt.h
structirqaction{
irq_handler_thandler;//指向中断服务程序
unsignedlongflags;//中断标志
unsignedlongmask;//中断掩码
constchar*name;//I/O设备名
void*dev_id;//设备标识
structirqaction*next;//指向下一个描述符
intirq;//IRQ线
structproc_dir_entry*dir;//指向IRQn相关的/proc/irq/n目录的描述符
};
其中关键的handler成员指向了该设备的中断服务程序,由执行request_irq时建立。
3.在驱动程序初始化时,若使用到中断,通常调用函数request_irq()建立该驱动程序对应的irqaction结构体,并把它登记到irq_desc[irq_num]->action链表中。
Iqr_num为驱动程序申请的中断号。
request_irq()函数的原型如下:
//kernel/irq/manage.c
intrequest_irq(unsignedintirq,
irqreturn_t(*handler)(int,void*,structpt_regs*),
unsignedlongirqflags,
constchar*devname,
void*dev_id);
参数irq是设备中断求号,在向irq_desc[]数组登记时,它做为数组的下标。
把中断号为irq的irqaction结构体的首地址写入irq_desc[irq]->action。
这样就把设备的中断请求号与该设备的中断服务例程irqaction联系在一起了。
这样当CPU接收到中断请求后,就可以根据中断号通过irq_desc[]找到该设备的中断服务程序。
流程如上图所示。
4.关于共享中断
共享中断的不同设备的iqraction结构体都会添加进该中断号对应的irq_desc结构体的action成员所指向的irqaction链表内。
当内核发生中断时,它会依次调用该链表内所有的handler函数。
因此,若驱动程序需要使用共享中断机制,其中断处理函数必须有能力识别是否是自己的硬件产生了中断。
通常是通过读取该硬件设备提供的中断flag标志位进行判断。
posted@2012-04-0323:
15alfredzzj阅读(82)评论(0)编辑
inux中的设备节点(/dev/*)
设备管理是linux中比较基础的东西,但是由于Linux智能程度的越来越高,Udev的使用越来越广泛,使得越来越多的Linux新用户对/dev目录下的东西变得不再熟悉。
有时候遇见问题就会变得抓狂
本文是我在写作《DIY一个基于LFS的实用Mini-LAPP服务器》过程中整理的资料,拿出来与大家共享
Linux中的设备有2种类型:
字符设备(无缓冲且只能顺序存取)、块设备(有缓冲且可以随机存取)。
每个字符设备和块设备都必须有主、次设备号,主设备号相同的设备是同类设备(使用同一个驱动程序)。
这些设备中,有些设备是对实际存在的物理硬件的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备")。
每个设备在/dev目录下都有一个对应的文件(节点)。
可以通过cat/proc/devices命令查看当前已经加载的设备驱动程序的主设备号。
内核能够识别的所有设备都记录在原码树下的Documentation/devices.txt文件中。
在/dev目录下除了字符设备和块设备节点之外还通常还会存在:
FIFO管道、Socket、软/硬连接、目录。
这些东西没有主/次设备号。
Linux内核所能识别的所有设备都记录在
http:
//www.lanana.org/docs/device-list/
而内核原码树中的Documentation/devices.txt可能不是最新版本。
了解这些设备的最基本要求就是对每个设备文件的含义了如指掌,下面就医列表的形式列出常见的设备文件以及相应的含义(比较偏僻的就省略了):
----------------------------------------------------------------------
主设备号设备类型
次设备号=文件名简要说明
----------------------------------------------------------------------
0未命名设备(例如:
挂载的非设备)
0=未空设备号保留
1char内存设备
1=/dev/mem直接存取物理内存
2=/dev/kmem存取经过内核虚拟之后的内存
3=/dev/null空设备。
任何写入都将被直接丢弃,任何读取都将得到EOF。
4=/dev/port存取I/O端口
5=/dev/zero零字节源,只能读取到无限多的零字节。
7=/dev/full满设备。
任何写入都将失败,并把errno设为ENOSPC以表示没有剩余空间。
8=/dev/random随机数发生器。
完全由用户的输入来产生随机数。
如果用户停止所有动作,则停止产生新的随机数。
9=/dev/urandom更快,但是不够安全的随机数发生器。
尽可能由用户的输入来产生随机数,
如果用户停止所有动作,则把已经产生的随机数做为种子来产生新的随机数。
10=/dev/aio异步I/O通知接口
11=/dev/kmsg任何对该文件的写入都将作为printk的输出
1blockRAMdisk
0=/dev/ram0第1个RAMdisk(initrd只能使用ram0)
1=/dev/ram1第2个RAMdisk
...
200=/dev/ram200第200个RAMdisk
4charTTY(终端)设备
0=/dev/tty0当前虚拟控制台
1=/dev/tty1第1个虚拟控制台
...
63=/dev/tty63第63个虚拟控制台
4block如果根文件系统以是以只读方式挂载的,那么就不可能创建真正的设备节点,
此时就使用该设备作为动态分配的主(major)设备的别名
0=/dev/root
5char其他TTY设备
0=/dev/tty当前TTY设备
1=/dev/console系统控制台
2=/dev/ptmx所有PTYmaster的复用器
7char虚拟控制台捕捉设备(这些设备既允许读也允许写)
0=/dev/vcs当前虚拟控制台(vc)的文本内容
1=/dev/vcs1tty1的文本内容
...
63=/dev/vcs63tty63的文本内容
128=/dev/vcsa当前虚拟控制台(vc)的文本/属性内容
129=/dev/vcsa1tty1的文本/属性内容
...
191=/dev/vcsa63tty63的文本/属性内容
7block回环设备(用一个普通的磁盘文件来模拟一个块设备)
对回环设备的绑定由mount(8)或losetup(8)处理
0=/dev/loop0第1个回环设备
1=/dev/loop1第2个回环设备
...
8blockSCSI磁盘(0-15)
0=/dev/sda第1个SCSI磁盘(整个磁盘)
16=/dev/sdb第2个SCSI磁盘(整个磁盘)
32=/dev/sdc第3个SCSI磁盘(整个磁盘)
...
240=/dev/sdp第16个SCSI磁盘(整个磁盘)
分区表示方法如下(以第3个SCSI磁盘为例)
33=/dev/sdc1第1个分区
34=/dev/sdc2第2个分区
...
47=/dev/sdc15第15个分区
对于Linux/i386来说,分区1-4是主分区,5-15是逻辑分区。
9blockMetadisk(RAID)设备
0=/dev/md0第1组metadisk
1=/dev/md1第2组metadisk
...
metadisk驱动用于将同一个文件系统分割到多个物理磁盘上。
10char非串口鼠标,各种杂项设备和特性
1=/dev/psauxPS/2鼠标
131=/dev/temperature机器内部温度
134=/dev/apm_biosAPM(高级电源管理)BIOS
135=/dev/rtc实时时钟(RealTimeClock)
144=/dev/nvram非易失配置RAM
162=/dev/smbus系统管理总线(SystemManagementBus)
164=/dev/ipmoIntel的智能平台管理(IntelligentPlatformManagement)接口
173=/dev/ipmikcs智能平台管理(IntelligentPlatformManagement)接口
175=/dev/agpgartAGP图形地址重映射表(GraphicsAddressRemappingTable)
182=/dev/perfctr性能监视计数器
183=/dev/hwrng通用硬件随机数发生器
184=/dev/cpu/microcodeCPU微代码更新接口
186=/dev/atomicps进程状态数据的原子快照
188=/dev/smbusbiosSMBus(系统管理总线)BIOS
200=/dev/net/tunTAP/TUN网络设备(TAP/TUN以软件的方式实现了网络设备)
TAP模拟了以太网帧(第二层),TUN模拟了IP包(第三层)。
202=/dev/emd/ctl增强型MetadiskRAID(EMD)控制器
220=/dev/mptctlMessagepassingtechnology(MPT)control
223=/dev/input/uinput用户层输入设备驱动支持
227=/dev/mcelogX86_64MachineCheckExceptiondriver
228=/dev/hpetHPETdriver
229=/dev/fuseFuse(用户空间的虚拟文件系统)
231=/dev/snapshot系统内存快照
232=/dev/kvm基于内核的虚构机(基于AMDSVM和IntelVT硬件虚拟技术)
11blockSCSICD-ROM设备
0=/dev/scd0第1个SCSICD-ROM
1=/dev/scd1第2个SCSICD-ROM
...
13char核心输入设备
32=/dev/input/mouse0第1个鼠标
33=/dev/input/mouse1第2个鼠标
...
62=/dev/input/mouse30第31个鼠标
63=/dev/input/mice所有鼠标的统一
64=/dev/input/event0第1个事件队列
65=/dev/input/event1第2个事件队列
...
95=/dev/input/event1第32个事件队列
21char通用SCSI设备(通常是SCSI光驱)
0=/dev/sg0第1个通用SCSI设备
1=/dev/sg1第2个通用SCSI设备
...
29char通用帧缓冲(framebuffer)设备
0=/dev/fb0第1个帧缓冲设备
1=/dev/fb1第2个帧缓冲设备
...
31=/dev/fb31第32个帧缓冲设备
30chariBCS-2兼容设备
0=/dev/socksys套接字访问接口
1=/dev/spxSVR3本地X接口
32=/dev/inet/ip网络访问接口
33=/dev/inet/icmp
34=/dev/inet/ggp
35=/dev/inet/ipip
36=/dev/inet/tcp
37=/dev/inet/egp
38=/dev/inet/pup
39=/dev/inet/udp
40=/dev/inet/idp
41=/dev/inet/rawip
此外,iBCS-2还需要下面的连接必须存在
/dev/ip->/dev/inet/ip
/dev/icmp->/dev/inet/icmp
/dev/ggp->/dev/inet/ggp
/dev/ipip->/dev/inet/ipip
/dev/tcp->/dev/inet/tcp
/dev/egp->/dev/inet/egp
/dev/pup->/dev/inet/pup
/dev/udp->/dev/inet/udp
/dev/idp->/dev/inet/idp
/dev/rawip->/dev/inet/rawip
/dev/inet/arp->/dev/inet/udp
/dev/inet/rip->/dev/inet/udp
/dev/nfsd->/dev/socksys
/dev/X0R->/dev/null
36charNetlink支持
0=/dev/route路由,设备更新,kerneltouser
3=/dev/fwmonitorFirewallpacket复制
59charsf防火墙模块
0=/dev/firewall与sf内核模块通信
65blockSCSI磁盘(16-31)
0=/dev/sdq第17个SCSI磁盘(整个磁盘)
16=/dev/sdr第18个SCSI磁盘(整个磁盘)
32=/dev/sds第19个SCSI磁盘(整个磁盘)
...
240=/dev/sdaf第32个SCSI磁盘(整个磁盘)
66blockSCSI磁盘(32-47)
0=/dev/sdag第33个SCSI磁盘(整个磁盘)
16=/dev/sdah第34个SCSI磁盘(整个磁盘)
32=/dev/sdai第35个SCSI磁盘(整个磁盘)
...
240=/dev/sdav第48个SCSI磁盘(整个磁盘)
89charI2C总线接口
0=/dev/i2c-0第1个I2C适配器
1=/dev/i2c-1第2个I2C适配器
...
98block用户模式下的虚拟块设备(分区处理方式与SCSI磁盘相同)
0=/dev/ubda第1个用户模式块设备
16=/dev/udbb第2个用户模式块设备
...
103block审计(Audit)设备
0=/dev/audit审计(Audit)设备
128-135charUnix98PTYmaster
这些设备不应当存在设备节点,而应当通过/dev/ptmx接口访问。
136-143charUnix98PTYslave
这些设备节点是自动生成的(伴有适当的权限和模式),不能手动创建。
方法是通过使用适当的mount选项(通常是:
mode=0620,gid=<"tty"组的gid>)
将devpts文件系统挂载到/dev/pts目录即可。
0=/dev/pts/0第1个Unix98PTYslave
1=/dev/pts/1第2个Unix98PTYslave
...
153blockEnhancedMetadiskRAID(EMD)存储单元(分区处理方式与SCSI磁盘相同)
0=/dev/emd/0第1个存储单元
1=/dev/emd/0p1第1个存储单元的第1个分区
2=/dev/emd/0p2第1个存储单元的第2个分区
...
15=/dev/emd/0p15第1个存储单元的第15个分区
16=/dev/emd/1第2个存储单元
32=/dev/emd/2第3个存储单元
...
240=/dev/emd/15第16个存储单元
180charUSB字符设备
96=/dev/usb/hiddev0第1个USB人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备)
...
111=/dev/usb/hiddev15第16个USB人机界面设备
180blockUSB块设备(U盘之类)
0=/dev/uba第1个USB块设备
8=/dev/ubb第2个USB块设备
16=/dev/ubc第3个USB块设备
...
192char内核profiling接口
0=/dev/profileProfiling控制设备
1=/dev/profile0CPU0的Profiling设备
2=/dev/profile1CPU1的Profiling设备
...
193char内核事件跟踪接口
0=/dev/trace跟踪控制设备
1=/dev/trace0CPU0的跟踪设备
2=/dev/trace1CPU1的跟踪设备
...
195charNvidia图形设备(比如显卡)
0=/dev/nvidia0第1个Nvidia卡
1=/dev/nvidia1第2个Nvidia卡
...
255=/dev/nvidiactlNvidia卡控制设备
202char特定于CPU模式的寄存器(model-specificregister,MSR)
0=/dev/cpu/0/msrCPU0的MSRs
1=/dev/cpu/1/msrCPU1的MSRs
...
203charCPUCPUID信息
0=/dev/cpu/0/cpuidCPU0的CPUID
1=/dev/cpu/1/cpuidCPU1的CPUID
...
===================================================================
stagefright框架(七)-Audio和Video的同步
講完了audio和video的處理流程,接下來要看的是audio和video同步化(synchronization)的問題。
OpenCORE的做法是設置一個主clock,而audio和video就分別以此作為輸出的依據。
而在Stagefright中,audio的輸出是透過callback函式來驅動,video則根據audio的timestamp來做同步。
以下是詳細的說明:
(1)當callback函式驅動AudioPlayer讀取解碼後的資料時,AudioPlayer會取得兩個時間戳--mPositionTimeMediaUs和mPositionTimeRealUs
size_tAudioPlayer:
:
fillBuffer(data,size)
{
...
mSource->read(&mInputBuffer,...);
mInputBuffer->meta_data()->findInt64(kKeyTime,&mPositionTimeMediaUs);
mPositionTimeRealUs=((mNumFramesPlayed+size_done/mFrameSize)*1000000)/mSampleRate;
...
}
mPositionTimeMediaUs是資料裡面所載明的時間戳(timestamp);mPositionTimeRealUs則是播放此資料的實際時間(依據framenumber及samplerate得出)。
(2)Stagefright中的video便依據從AudioPlayer得出來之兩個時間戳的差值,作為播放的依據
voidAwesomePlayer:
:
onVideoEvent()
{
...
mVideoSource->read(&mVideoBuffer,...)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- irq