您的位置 首页 知识

ARM-Linux s3c2440 之中止剖析(二)

软件篇:上一篇文章回顾了s3c2440的中断控制器原理的相关硬件知识,有了这个基础再来分析Linux中的软件分析方式,心里就有底了。面对浩瀚…

软件篇:

上一篇文章回忆了s3c2440的中止控制器原理的相关硬件常识,有了这个根底再来剖析Linux中的软件剖析方法,心里就有底了。面临众多如海的Linux源代码,s3c2440的中止到底是怎样呢,怎样处理,怎样完成的呢?一步一步来揭开它奥秘的面纱吧,当然需要从Linux内核源码下手!

在Linux中start_kernel()时会进行体系结构的初始化:init_IRQ(), 故名思议,其源代码如下:

[cpp]view plaincopy

  1. void__initinit_IRQ(void)
  2. {
  3. intirq;
  4. for(irq=0;irq
  5. irq_desc[irq].status|=IRQ_NOREQUEST|IRQ_NOPROBE;
  6. #ifdefCONFIG_SMP
  7. cpumask_setall(bad_irq_desc.affinity);
  8. bad_irq_desc.cpu=smp_processor_id();
  9. #endif
  10. init_arch_irq();//这里是体系初始化irq的进口
  11. }

init_arch_irq()初始值为:void (*init_arch_irq)(void)__initdata = NULL; 相当于一个变量函数(函数就像变量相同,被赋值),默认值为NULL,那么在其他当地应该被再次赋值。其实在setup_arch()中init_arch_irq()现已有所指向了,在arch/arm/kernel/setup.c中setup_arch进行体系渠道相关初始化:

  1. void__initsetup_arch(char**cmdline_p)
  2. {
  3. structtag*tags=(structtag*)&init_tags;
  4. structmachine_desc*mdesc;
  5. char*from=default_command_line;
  6. unwind_init();
  7. setup_processor();
  8. mdesc=setup_machine(machine_arch_type);
  9. machine_name=mdesc->name;
  10. cpu_init();
  11. init_arch_irq=mdesc->init_irq;//这里是init_arch_irq()指向的函数
  12. system_timer=mdesc->timer;
  13. init_machine=mdesc->init_machine;
  14. early_trap_init()//初始化中止向量表
  15. }

mdesc是一个struct machine_desc的数据结构,msdesc 经过 setup_machine(machine_arch_type) 获取渠道体系的MACHINE_START相关参数。

  1. #defineMACHINE_START(_type,_name)\
  2. staticconststructmachine_desc__mach_desc_##_type\
  3. __used\
  4. __attribute__((__section__(“.arch.info.init”)))={\
  5. .nr=MACH_TYPE_##_type,\
  6. .name=_name,
  7. #defineMACHINE_END\
  8. };

这个参数如下:

  1. MACHINE_START(S3C2440,”SMDK2440″)
  2. /*Maintainer:BenDooks*/
  3. .phys_io=S3C2410_PA_UART,
  4. .io_pg_offst=(((u32)S3C24XX_VA_UART)>>18)&0xfffc,
  5. .boot_params=S3C2410_SDRAM_PA+0x100,
  6. .init_irq=s3c24xx_init_irq,//这里是方针CPU的irq初始化函数
  7. .map_io=smdk2440_map_io,
  8. .init_machine=smdk2440_machine_init,
  9. .timer=&s3c24xx_timer,
  10. MACHINE_END

可见s3c24xx_init_irq()才是所要找得中止初始化进口程序,所以碑文init_arch_irq()实践是碑文s3c24xx_init_irq()程序。中止的初始化作业:首要,清空各interrupt pending的值,然后再向体系注册首要的中止,从上篇中咱们知道s3c2440有60个中止,但体系中首要用了58个中止,

注册中止首要用下面三个函数:

  1. intset_irq_chip(unsignedintirq,structirq_chip*chip)
  2. staticinlinevoidset_irq_handler(unsignedintirq,irq_flow_handler_thandle)
  3. staticinlinevoidset_irq_chained_handler(unsignedintirq,irq_flow_handler_thandle)

至此,中止的初始化进程完成了,那么它是怎样作业的,详细的流程由怎样,各中止函数的回调函数怎样了解,下文将持续深入探讨。。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/264919.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部