Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15499000
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2007-08-08 15:40:20

浅析armlinux-setup_arch()->init_arch_irq()函数7

文章来源:http://gliethttp.cublog.cn

建议首先参考《浅析armlinux2_4_19启动程序[head-armv.s文件][http://gliethttp.cublog.cn]

函数指针init_arch_irq在setup_arch()函数的末尾被赋值,init_arch_irq = mdesc->init_irq;
我的平台是at91rm9200,所以mdesc->init_irq位于arch/arm/mach-at91rm9200/Core.c中--at91rm9200_init_irq,
//++++++++++++++
//arch/arm/mach-at91rm9200/Core.c
//位于.arch.info段
//MACHINE_START(AT91RM9200, "ATMEL AT91RM9200")//.nr = MACH_TYPE_##_type=MACH_TYPE_AT91RM9200=251
//与上面从u-boot传到r1中的一样[gliethttp]
//MAINTAINER("SAN People / ATMEL")
//BOOT_MEM(AT91_SDRAM_BASE, AT91C_BASE_SYS, AT91C_VA_BASE_SYS)
//BOOT_PARAMS(AT91_SDRAM_BASE + 0x100)//tag list存放的物理地址0x20000100[gliethttp]
//FIXUP(at91rm9200_fixup)
//MAPIO(at91rm9200_map_io)
//INITIRQ(at91rm9200_init_irq)
//MACHINE_END[gliethttp]
//--------------
void __init at91rm9200_init_irq(void)
{
    unsigned int i;
//对已经虚拟映射的at91rm9200的寄存器进行读写
    for (i = 0; i < NR_IRQS; i++) {
        AT91_SYS->AIC_SVR[i] = i;
        AT91_SYS->AIC_SMR[i] = at91rm9200_irq_smr[i];
        irq_desc[i].valid    = 1;
        irq_desc[i].mask_ack    = at91rm9200_mask_irq;
        irq_desc[i].mask    = at91rm9200_mask_irq;
        irq_desc[i].unmask    = at91rm9200_unmask_irq;
        if (i < 8)
        AT91_SYS->AIC_EOICR = AT91_SYS->AIC_EOICR;//必须要有,否则中断不能工作
//以上都是对at91rm9200寄存器的启动操作,很简单,没什么可说的
    }
    AT91_SYS->AIC_SPU = NR_IRQS;
    /* No debugging in AIC: Debug (Protect) Control Register */
    AT91_SYS->AIC_DCR = 0;
    /* Disable and clear all interrupts initially */
    AT91_SYS->AIC_IDCR = 0xFFFFFFFF;
    AT91_SYS->AIC_ICCR = 0xFFFFFFFF;
//至此中断所需要的硬性寄存器环境已经完成
}

阅读(1772) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~