网站公告列表

  没有公告

加入收藏
设为首页
联系本站
您现在的位置: AnalogCN安诺电子 >> 文章 >> 技术交流 >> 文章正文
  uclinux-2008r1-rc8(bf561)的中断处理(10):ivg_table           ★★★ 【字体:
uclinux-2008r1-rc8(bf561)的中断处理(10):ivg_table
作者:快乐虾    文章来源:http://blog.csdn.net/lights_joy    点击数:    更新时间:2008-5-26    
为了记录BF561的64个外部中断的状态,内核使用了ivg_table的数组:
#define NR_PERI_INTS        64
 
struct ivgx {
     /* irq number for request_irq, available in mach-bf533/irq.h */
     unsigned int irqno;
     /* corresponding bit in the SIC_ISR register */
     unsigned int isrflag;
} ivg_table[NR_PERI_INTS];
在这里,ivg_table的数组是使用内部中断号来进行排序的,即从IVG7排到IVG13。而其中的irqno这个值保存的是内核中的中断序号,使用这个序号即可访问irq_desc数组中对此中断的描述。isrflags则存放的是此中断对于于SIC_MASK、SIC_ISR等的掩码。
为了快速访问同一个内部中断号所对应的所有外部中断,内核使用了另一个数组:
struct ivg_slice {
     /* position of first irq in ivg_table for given ivg */
     struct ivgx *ifirst;
     struct ivgx *istop;
} ivg7_13[IVG13 - IVG7 + 1];
此结构体中的ifirst和istop都指向ivg_table,由于ivg_table的元素是按内部中断号升序排列的,因而可以用ifirst指向相应内部中断号的起始元素,用istop指向结束元素。
在内核初始化的时候会调用一个称之为search_IAR的函数,从中可以看出这两个结构体之间的关系:
/*
 * Search SIC_IAR and fill tables with the irqvalues
 * and their positions in the SIC_ISR register.
 */
static void __init search_IAR(void)
{
     unsigned ivg, irq_pos = 0;
     for (ivg = 0; ivg <= IVG13 - IVG7; ivg++) {
         int irqn;
 
         ivg7_13[ivg].istop = ivg7_13[ivg].ifirst = &ivg_table[irq_pos];
 
         for (irqn = 0; irqn < NR_PERI_INTS; irqn++) {
              int iar_shift = (irqn & 7) * 4;
                   if (ivg == (0xf &
#ifndef CONFIG_BF52x
                   bfin_read32((unsigned long *)SIC_IAR0 +
                        (irqn >> 3)) >> iar_shift)) {
#else
                   bfin_read32((unsigned long *)SIC_IAR0 +
                        ((irqn%32) >> 3) + ((irqn / 32) * 16)) >> iar_shift)) {
#endif
                   ivg_table[irq_pos].irqno = IVG7 + irqn;
                   ivg_table[irq_pos].isrflag = 1 << (irqn % 32);
                   ivg7_13[ivg].istop++;
                   irq_pos++;
              }
         }
     }
}
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    对比ADI两代TD-SCDMA射频IC得
    [结尾篇]ADSP-TS20XS系列DSP
    一种基于DDS的幅值可调信号发
    基于ADSP2181的CAN总线通讯设
    一种采用单片机控制AD9854为
    在vs2008下使用ffmpeg(5):
    在vs2008下使用ffmpeg(4):
    在vs2008下使用ffmpeg(3):
    ADI AD8275电平转换16位ADC驱
    Boot在ADSP-BF533上的移植
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    版权所有:AnalogCN安诺电子 湘ICP备06016315号