Kernel/drivers/of/irq.c
unsignedint irq_of_parse_and_map(structdevice_node *dev, int index)
{
struct of_irq oirq;
if(strcmp(dev->name,"usb")== 0)
{
pr_err("zll----0-dev->name=%s !\n",dev->name);
dump_stack();
}
pr_err("zll----1-dev->name=%s !\n",dev->name);
if (of_irq_map_one(dev, index, &oirq))
return 0;
return irq_create_of_mapping(oirq.controller, oirq.specifier,
oirq.size);
}
[ 0.384286]@5 zll----0-dev->name=usb!
[ 0.384301]@5 CPU: 0 PID: 1 Comm: swapper/0Not tainted 3.10.84-gc02f4f9-03169-gedf9c45-dirty #68
[ 0.384310]@5 Call trace:
[ 0.384333]@5 [
[ 0.384345]@5 [
[ 0.384360]@5 [
[ 0.384376]@5 [
[ 0.384388]@5 [
[ 0.384400]@5 [
[ 0.384411]@5 [
[ 0.384424]@5 [
[ 0.384435]@5 [
[ 0.384447]@5 [
[ 0.384459]@5 [
[ 0.384475]@5 [
[ 0.384486]@5 [
[ 0.384498]@5 [
[ 0.384512]@5 [
kernel_init //-----------------------kernel\init\main.c
-->kernel_init_freeable
-->do_basic_setup
-->do_initcalls
-->do_initcall_level
-->do_one_initcall
-->arch_initcall(arm64_device_init) //--------------------------kernel\arch\arm64\kernel\setup.c
-->arm64_device_init
-->of_platform_populate(NULL, of_default_bus_match_table, NULL,NULL) //----------------------------kernel\drivers\of\platform.c
-->of_platform_bus_create
-->of_platform_bus_create(child, matches, lookup, &dev->dev,strict);
-->of_platform_device_create_pdata(bus, bus_id,platform_data, parent);
-->of_device_alloc(np, bus_id, parent);
-->of_irq_count //----------------------------------kernel\drivers\of\irq.c
-->of_irq_to_resource_table//----------此函数与上一级函数都调用下一级函数
-->of_irq_to_resource
-->irq_ of_parse_and_map
-->of_irq_map_one
-->of_get_property(device, "interrupts",&intlen)
-->of_irq_map_raw(p, intspec + index * intsize, intsize, addr, out_irq);
//------------------------此函数会打印出来dts中的中断号
int of_irq_map_raw(structdevice_node *parent, const __be32 *intspec, u32 ointsize, const __be32 *addr, struct of_irq *out_irq)
{
struct device_node *ipar, *tnode, *old = NULL, *newpar = NULL;
const __be32 *tmp, *imap, *imask;
u32 intsize = 1, addrsize, newintsize = 0, newaddrsize = 0;
int imaplen, match, i;
pr_err("of_irq_map_raw:par=%s,intspec=[0x%08x 0x%08x...],ointsize=%d\n", parent->full_name,be32_to_cpup(intspec),
be32_to_cpup(intspec + 1), ointsize);
…...
}
[ 0.382812]@4 zll----00--intspec=ffffffc001e1fbbc----intlen=6 !
[ 0.382851]@4 of_irq_map_raw:par=/soc/interrupt-controller@b000000,intspec=[0x00000000 0x00000086...],ointsize=3
[ 0.382862]@4 zll----00-dev->name=interrupt-controller !
[ 0.382873]@4 zll----00--intspec=ffffffc001e1fbbc----intlen=6 !
[ 0.382910]@4 of_irq_map_raw:par=/soc/interrupt-controller@b000000,intspec=[0x00000000 0x0000008c...],ointsize=3
[ 0.382921]@4 zll----00-dev->name=interrupt-controller !
上面两个值对应10进制为134和140
int of_irq_map_raw(structdevice_node *parent, const __be32 *intspec, u32 ointsize, const __be32 *addr, struct of_irq *out_irq)
{
。。。。。。。。。。。。。。。。
while (ipar != NULL){
/* Now check if cursor is an interrupt-controller and if it is
* then we are done
*/
if (of_get_property(ipar, "interrupt-controller", NULL) !=
NULL) {
pr_debug(" -> got it !\n");
for (i = 0; i < intsize; i++){
out_irq->specifier[i] =
of_read_number(intspec +i, 1);
+if(out_irq->specifier[1]>130&& out_irq->specifier[1]<180)
+pr_err("zll----@@@-----out_irq->specifier[%d]=%d intspec=%d\n",i,out_irq->specifier[1],intspec);
}
out_irq->size = intsize;
out_irq->controller = ipar;
of_node_put(old);
return 0;
}
。。。。。。。。。。。。。。。。。。
}
Line 452: [ 0.382335]@5 zll----@@@-----out_irq->specifier[0]=134 intspec=31587272
Line 453: [ 0.382343]@5 zll----@@@-----out_irq->specifier[1]=140 intspec=31587272