再问comquter:继续网卡驱动的问题,可以读到ID.

感谢comquter,呵呵终于有进展了,困惑了我好多天的事!
加上了step=4.
io-pkt-v4 -d dm9000 ioport=0x30000300,irq=15,step=4
居然能读到ID(奇怪了devn-dm9000.use里明明说的
step=num The offset between the data and I/O port (default=4),)
现在sloginfo里:
Jan 01 00:00:14 5 14 0 tcpip starting
Jan 01 00:00:14 3 14 0 Unable to attach to pci server: No such file or directory
Jan 01 00:00:14 3 14 0 Using pseudo random generator. See “random” option
Jan 01 00:00:15 6 14 0 id = 90000a46
Jan 01 00:00:15 6 14 0 Fastether
现在nicinfo:
#nicinfo
en0:
Davicom DM9000A Ethernet Controller

Link is DOWN

Physical Node ID … 000000 000000
Current Physical Node ID … 000000 000000
Current Operation Rate … Unknown
Active Interface Type … MII
Active PHY address … 1
Maximum Transmittable data Unit … 1514
Maximum Receivable data Unit … 1514
Hardware Interrupt … 0xf
I/O Aperture … 0x30000300
Promiscuous Mode … Off
Multicast Support … Enabled

Packets Transmitted OK … 0
Bytes Transmitted OK … 0

Packets Received OK … 0
Bytes Received OK … 0

Single Collisions on Transmit … 0
Multiple Collisions on Transmit … 0
Deferred Transmits … 0
Late Collision on Transmit errors … 0
Transmit Underruns … 0
Receive Alignment errors … 0
Received packets with CRC errors … 0
Packets Dropped on receive … 0
Ethernet Headers out of range … 0
Oversized Packets received … 0
Short packets … 0
Total Frames experiencing Collison(s) … 0
看起来好像还有很多问题,不知道是不是只是中断的问题?请问你提的GPIO interrupt callout 挂在PD上具体怎么做?能不能指点详细一些。:oops:
谢谢!

请问:
资料上说“AIC为每一个中断源向量寄存器(AIC_SVR0~ AIC_SVR31),在配置使能相应外设时,用户需要将设备的中断处理函数地址写入对应的中断源向量寄存器,而当中断请求发生时AIC将对应的源向量寄存器中的地址复制到中断向量寄存器(AIC_IVR),并向内核发出IRQ请求。”

那么就应该先把AIC_SVRx里写进某个中断服务程序的地址,那是不是每个中断源都在这0-31个寄存器里有一个位置呢,这0-31个中断向量与中断源的对应关系在哪里定义的?这在QNX下是怎么实现的,因为我发现在init_intrinfo.c里有一段
/* Program vector registers */
for (i = 0; i < intrs[0].num_vectors; i++)
out32(aic_base + AT91_AIC_SVR(i), i);

它是往其中写0-31,不明白。
现在我要写一个cascade interrupt callout挂在AIC的GPIO中断上,应该在哪里作呢?
谢谢

请看看init_intrinfo.c和startup库中的callout_interrupt_at91sam9263.S及QNX相关文档来了解一下QNX中断的处理.
MX27的BSP中有GPIO级联中断的例子,照猫画虎就可以了.

QNX里callout 是怎么被运行的?比如如果中断来了,AIC发请求给内核,这个时候是不是就调用callout_interrupt_at91sam9263.S里的callout?接下来又怎么做呢?进来后是不是就读到了位于AT91SAM9263_AIC_IVR的地址?问题是,如果是PD4产生的中断,是不是先就应该在AIC_SVRx里放入PD中断对应的中断服务程序地址?而对于AIC,是不是对每个外部中断源都分配了特定的寄存器,比如说PIO产生的中断,PA对就AIC_SVR5,PB对就AIC_SVR6…?不知道我的理解对不对,但是在QNX下这个又是怎么做的?

中断来了以后内核会先调用callout_interrupt_at91sam9263.S里的ID callout, ID callout会返回0~31, 在init_intrinfo.c已经设置好的.
若PD的中断号为6,而且又有级联中断挂在上面,内核回接着调用级联中断的callout ID,若返回值为4,级联中断的初始值(init_intrinfo.c里赋予)为100,那末PD4的IRQ号即为104.

那PD口对应哪个号是从哪里决定的呢?是定好了不可变的还是需要我们自己指定?我知道在AIC_SVR里,我们只给赋了0-31个ID,AIC怎么知道是哪个中断源来了呢。
另外能不能讲一点关于Callout的知识,比如callout_interrupt_at91sam9263.S是与startup是怎么联系起来的?关于callout帮助文档里好像也没讲多少,能不能拴在一点资料参考一下,现在感觉这一块没有思路,只是有一大堆的疑问但是让我具体问什么却又不知道从何而起,呵呵,只知道是QNX关于中断的问题。不过,非常感谢你的帮助,让我慢慢地走向明白,呵呵 :blush:
谢谢