Linux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析

发布者:Asawen最新更新时间:2025-01-24 来源: cnblogs关键字:S5PV210 手机看文章 扫描二维码
随时随地手机看文章

init/main.c:


1 asmlinkage void start_kernel(void)

2 {

3     ......

4     early_irq_init();

5     init_IRQ();

6     ......

7 }


early_irq_init()函数有两种实现,一种是基于radix tree,一种是定义静态数组,如果要使用radix tree实现的,那么需要打开SPARSE_IRQ配置选项,由于我对数据结构不了解,所以分析以下静态数组实现方式版本的。


/kernel/irq/irqdesc.c


 1 struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {

 2     [0 ... NR_IRQS-1] = {

 3         .handle_irq    = handle_bad_irq,

 4         .depth        = 1,

 5         .lock        = __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock),

 6     }

 7 };

 8 

 9 int __init early_irq_init(void)

10 {

11     int count, i, node = first_online_node;

12     struct irq_desc *desc;

13 

14     init_irq_default_affinity();

15 

16     printk(KERN_INFO 'NR_IRQS:%dn', NR_IRQS);

17 

18     desc = irq_desc;

19     count = ARRAY_SIZE(irq_desc);

20 

21     for (i = 0; i < count; i++) {

22         desc[i].kstat_irqs = alloc_percpu(unsigned int);

23         alloc_masks(&desc[i], GFP_KERNEL, node);

24         raw_spin_lock_init(&desc[i].lock);

25         lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);

26         desc_set_defaults(i, &desc[i], node);

27     }

28     return arch_early_irq_init();

29 }


  第一次见到这种初始化数组全部成员为同样内容的方式,可以学习积累下。


  NR_IRQS在arch/arm/mach-s5pv210/include/mach/irqs.h下定义:


1 #define NR_IRQS            (IRQ_EINT(31) + S5P_GPIOINT_COUNT + 1)

  上面函数的核心就是调用desc_set_defaults()来初始化上述中断描述符数组,kernel/irq/irqdesc.c:


 1 static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node)

 2 {

 3     int cpu;

 4 

 5     desc->irq_data.irq = irq;

 6     desc->irq_data.chip = &no_irq_chip;

 7     desc->irq_data.chip_data = NULL;

 8     desc->irq_data.handler_data = NULL;

 9     desc->irq_data.msi_desc = NULL;

10     irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS);

11     irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);

12     desc->handle_irq = handle_bad_irq;

13     desc->depth = 1;

14     desc->irq_count = 0;

15     desc->irqs_unhandled = 0;

16     desc->name = NULL;

17     for_each_possible_cpu(cpu)

18         *per_cpu_ptr(desc->kstat_irqs, cpu) = 0;

19     desc_smp_init(desc, node);

20 }


  最后返回时调用的arch_early_irq_init()函数并没有做事情。


  接着看init_IRQ():


1 void __init init_IRQ(void)

2 {

3     machine_desc->init_irq();

4 }

  machine_desc是全局变量,定义在板文件中,由于我们使用的是s5pv210,且demo板号选的是smdkv210,所以这个全局变量就在arch/arm/mach-s5pv210/mach-s5pv210.c中:


1 MACHINE_START(SMDKV210, 'SMDKV210')

2     /* Maintainer: Kukjin Kim */

3     .boot_params    = S5P_PA_SDRAM + 0x100,

4     .init_irq    = s5pv210_init_irq,

5     .map_io        = smdkv210_map_io,

6     .init_machine    = smdkv210_machine_init,

7     .timer        = &s5p_timer,

8 MACHINE_END


arch/arm/mach-s5pv210/mach-s5pv210.c中还有如下函数定义:


 1 void __init s5pv210_init_irq(void)

 2 {

 3     u32 vic[4];    /* S5PV210 supports 4 VIC */

 4 

 5     /* All the VICs are fully populated. */

 6     vic[0] = ~0;

 7     vic[1] = ~0;

 8     vic[2] = ~0;

 9     vic[3] = ~0;

10 

11     s5p_init_irq(vic, ARRAY_SIZE(vic));

12 }


arch/arm/plat-s5p/irq.c


 1 void __init s5p_init_irq(u32 *vic, u32 num_vic)

 2 {

 3 #ifdef CONFIG_ARM_VIC

 4     int irq;

 5 

 6     /* initialize the VICs */

 7     for (irq = 0; irq < num_vic; irq++)

 8         vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0);

 9 #endif

10 

11     s3c_init_vic_timer_irq(5, IRQ_TIMER0);

12 

13     s3c_init_uart_irqs(uart_irqs, ARRAY_SIZE(uart_irqs));

14 }


  上面涉及到的函数都是去操作VIC相关的寄存器,这部分操作还不是很清楚,先不往下继续追踪了。


关键字:S5PV210 引用地址:Linux-3.0.8中基于S5PV210的IRQ模块代码追踪和分析

上一篇:U-Boot bootargs简析
下一篇:04_uboot全面讲解

推荐阅读最新更新时间:2026-03-22 11:01

S5PV210(TQ210)学习笔记——8位HWECC与YAFFS2的OOB布局
最近又重新调试了下8位的HWECC,最后发现S5PV210的8位HWECC的确是可以用的,但是,使用yaffs2文件系统的时候的时候仍然会出问题,这是由于yaffs2文件系统与mtd层的oob布局冲突导致的。 当我们使用8位HWECC时,会生成52字节的ECC校验数据并写入oob,而yaffs2自身也有28字节的数据写日oob,也就是说,至少需要28+52=80字节的oob空间,而对于我们的nand flash,页大小为2048字节,oob空间为64字节,明显空间不足,进而导致了我们前面看到的问题,所以,采用8位HWECC时应该选用不使用oob空间的文件系统,如jffs2,但是jffs2文件系统在挂载时比较慢,感觉上不如yaf
[单片机]
三星s5pv210启动过程(ARM Cortex-A8
S5PV210内部有96Kb的IRAM和64Kb的IROM。 DRAM0的地址:0x2000_0000——0x3FFF_FFFF(512MB)(自带内存) DRAM1的地址:0x4000_0000——0x7FFF_FFFF(1024MB)(扩展内存) SROM的地址: 0x8000_0000——0xAFFF_FFFF(128MB*6)(扩展内存) IROM的地址: 0xD000_0000——0xD000_FFFF(64Kb) ISRAM的地址: 0xD002_0000——0xD003_7FFF(96Kb) SFR的地址: 0xE000_0000——0xFFFF_FFFF(512Mb) IROM结构: BL0:64Kb。 ISRA
[单片机]
S5PV210(TQ210)学习笔记——8位HWECC与YAFFS2的OOB布局
最近又重新调试了下8位的HWECC,最后发现S5PV210的8位HWECC的确是可以用的,但是,使用yaffs2文件系统的时候的时候仍然会出问题,这是由于yaffs2文件系统与mtd层的oob布局冲突导致的。 当我们使用8位HWECC时,会生成52字节的ECC校验数据并写入oob,而yaffs2自身也有28字节的数据写日oob,也就是说,至少需要28+52=80字节的oob空间,而对于我们的nand flash,页大小为2048字节,oob空间为64字节,明显空间不足,进而导致了我们前面看到的问题,所以,采用8位HWECC时应该选用不使用oob空间的文件系统,如jffs2,但是jffs2文件系统在挂载时比较慢,感觉上不如yaffs2
[单片机]
Cortex-A8开发板,选择S5PV210还是AM335X?
随着手机和平板等移动市场的持续火爆,ARM低功耗高效率内核技术越来越受重视,国内各大企业相继卷入移动平台,华为、联想、小米、魅族、阿里巴巴等,都已经和ARM有了深度的合作。 图1 据ARM中国代理商米尔科技统计,2009年,ARM在纳斯达克股票均价6.04美元,2013年,ARM纳斯达克股票均价已经升到了44.54美元,四年之间涨了将近八倍。 而作为ARM的一个关键转型产品,Cortex-A8备受瞩目,因其可在Android、Linux和WinCE系统之间切换,所以在手机、平板、工控三大领域得到了大量的应用。 接下来就Cortex-A8的发展过程做一个简要叙述,看看这个关键的过渡技术有怎样的历史。 Cortex-A8
[单片机]
Cortex-A<font color='red'>8</font>开发板,选择<font color='red'>S5PV210</font>还是AM335X?
tslib移植(针对s5pv210,cw210开发板)
tslib移植:   tslib是为了控制触摸屏的开源程序,那么为了用于我的开发板(cortex-a8系列的cw210开发板),那么要有特定的配置才能用于指定的开发板。 1.下载tslib-1.4.tar.gz 2.解压: ##tar zxvf tslib-1.4.tar.gz 3.配置: ##cd tslib ##./autogen.sh ##./configure --prefix=$(pwd)/_install --host=arm-linux ac_cv_func_malloc_0_nonnull=yes ps:--prefix=$(pwd)/_install是指定安装目录为当前目录的_install目录 --host
[单片机]
tslib移植(针对<font color='red'>s5pv210</font>,cw210开发板)
嵌入式专题: S5PV210 - MPEG4编码
我想说不同的平台,如tiny210和x210。它们的头文件是有稍微区别的。 我这个是x210下的代码。但都须要注意的是NV12T与NV12的问题,默认要求输入的图片是NV12T,经过调整之后,能够同意用NV12。 即便如此。NV12格式的图片也不好拿到啊。 #include stdio.h #include string.h #include stdlib.h #include unistd.h #include ../mfc/SsbSipMfcApi.h #include ../mfc/MfcConvert.h #include ../mm/MMClock.h int test_enc_mpeg4(
[单片机]
基于s5pv210嵌入式linux系统sqlite3数据库移植
1、下载源码 http://www.sqlite.org/download.html 最新源码为3080100 2、解压 tar xvf XXXXX 3、配置编译环境 运行 ./configure –host=你的交叉编译工具的前缀 –prefix=你想编译安装的位置 我的host为arm-none-linux-gnueabi,prefix为/home/linux/sqlit3-arm 运行后会生成Makefile文件。 4、编译并安装 编译:make 安装:make install 安装完成后会在你设定的目录下生成安装好的文件: bin、include、lib、share bin:为编译完成的sqlite3可执行文件
[单片机]
基于<font color='red'>s5pv210</font>嵌入式linux系统sqlite3数据库移植
基于s5pv210嵌入式系统busybox文件系统移植
1、下载源码 busybox.net/downloads下载最新版的busybox源码,最新源码为1.21.1 2、解压源码文件 tar xvf busybox-1.21.1.tar.bz2 3、进入busybox cd busybox-1.21.1 4、阅读README文件,查看编译步骤 重点阅读上面一段 5、配置源码 make menuconfig 修改编译工具为交叉编译工具 Busybox Settings --- Build Options--- Cross Compiler prefix为你机器里交叉编译工具链的前缀,我的名字叫arm-none-linux-gnueabi-gcc所以填写arm-none-li
[单片机]
基于<font color='red'>s5pv210</font>嵌入式系统busybox文件系统移植
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved