static struct s3c_irq_data init_eint[32]的注册在s3c2440_init_irq中,二s3c2440_init_irq是在哪里调用的呢?
root@ubuntu:/mnt/shared/linux-3.16.1# grep "s3c2440_init_irq" ./ -r
Binary file ./arch/arm/boot/Image matches
Binary file ./arch/arm/mach-s3c24xx/mach-nexcoder.o matches
Binary file ./arch/arm/mach-s3c24xx/built-in.o matches
./arch/arm/mach-s3c24xx/mach-mini2440.c: .init_irq = s3c2440_init_irq,
./arch/arm/mach-s3c24xx/mach-at2440evb.c: .init_irq = s3c2440_init_irq,
./arch/arm/mach-s3c24xx/mach-osiris.c: .init_irq = s3c2440_init_irq,
./arch/arm/mach-s3c24xx/mach-anubis.c: .init_irq = s3c2440_init_irq,
Binary file ./arch/arm/mach-s3c24xx/mach-mini2440.o matches
Binary file ./arch/arm/mach-s3c24xx/mach-anubis.o matches
./arch/arm/mach-s3c24xx/common.h:extern void s3c2440_init_irq(void);
Binary file ./arch/arm/mach-s3c24xx/mach-rx3715.o matches
./arch/arm/mach-s3c24xx/mach-nexcoder.c: .init_irq = s3c2440_init_irq,
Binary file ./arch/arm/mach-s3c24xx/mach-osiris.o matches
Binary file ./arch/arm/mach-s3c24xx/mach-at2440evb.o matches
./arch/arm/mach-s3c24xx/mach-smdk2440.c: .init_irq = s3c2440_init_irq,
Binary file ./arch/arm/mach-s3c24xx/mach-smdk2440.o matches
./arch/arm/mach-s3c24xx/mach-rx3715.c: .init_irq = s3c2440_init_irq,
结合编译方法make zImage -C ../,可以看出是在mach-smdk2440.c或者mach-mini2440.c中调用的。
从内核启动信息来看:
MINI2440: Option string mini2440=0tb
MINI2440: 't' ignored, touchscreen not compiled in
MINI2440: LCD [0:240x320] 1:800x480 2:1024x768 3:320x240
S3C2440: Initialising architecture
从这里很容易看出,s3c2440_init_irq是在./arch/arm/mach-s3c24xx/mach-mini2440.c中如下部分调用的:
MACHINE_START(MINI2440, "MINI2440")
/* Maintainer: Michel Pollet <[email protected]> */
.atag_offset = 0x100,
.map_io = mini2440_map_io,
.init_machine = mini2440_init,
.init_irq = s3c2440_init_irq,
.init_time = mini2440_init_time,
.restart = s3c244x_restart,
MACHINE_END
关于MACHINE_START、MACHINE_END的说明见如下文章
(摘自:http://blog.csdn.net/cxw3506/article/details/8475965)
在移植Linux时,有个结构体需要填写,它以MACHINE_START开始并以MACHINE_END结束,如下mini2440开发板的移植为示例
其中MACHINE_START、MACHINE_END都是定义的宏,代码如下
由上代码可知这两个宏一起定义了一个类型为struct machine_desc的变量,结构体定义如下
这个类型的变量放在内核代码段.arch.info.init中,在内核运行初期,被函数lookup_machine_type(此函数用汇编实现,在汇编文件中)取出,读取流程为
Start_kernel() -> setup_arch() -> setup_machine() -> lookup_machine_type()
在函数setup_machine()中,利用这个结构体类型的变量初始化一些全局变量,以备内核运行时使用,比如
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
这个结构体中,成员init_machine保存的是开发板资源注册的初始化代码,init_irq保存的是中断初始化指针,timer保存的是一个struct sys_timer类型的指针…..如果我们要给自己的开发板定制内核,那么我们必须自己实现以上成员函数,其中函数init_machine()是我们向内核传递开发板设备信息的重要的常规途径,分析mini2440开发板内核移植代码知道,在这个函数中,注册了开发板所用到的所有设备的相关硬件信息!
那么成员函数init_machine什么时候被调用呢?
在函数setup_machine()中有一条语句init_machine = mdesc->init_machine;其中init_machine为全局函数指针变量,此变量在函数customize_machine()中被调用,代码如下所示:
在MACHINE_START与MACHINE_END之间还要填写一些参数,参照结构体注释小心填写即可,最好找个例子参考参考
到现在为止,中断的初始化算是追根到底了,但是err -22的原因仍未找到:
如果这里s3c2440_init_irq中只是将中断初始化的话,为什么将struct s3c_irq_data init_eint[32]中的EINT4-EINT7注掉,
则key.ko中申请中断正常,但是dm9000工作不正常,而不注掉,网卡工作正常,而key.ko中申请共享中断会失败?
明天继续寻找答案!
翻开电路图,可以看到DM9000网卡用到了EINT7,而key.c中用到了EINT4,而EINT4~7是共享中断线的,或许是这里的问题!