IO管理三usb之irq

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 [<ffffffc000206b18>]dump_backtrace+0x0/0x270

[    0.384345]@5 [<ffffffc000206d98>]show_stack+0x10/0x1c

[    0.384360]@5 [<ffffffc000d19a54>]dump_stack+0x1c/0x28

[    0.384376]@5 [<ffffffc000968604>]irq_of_parse_and_map+0x40/0x94

[    0.384388]@5 [<ffffffc000968678>]of_irq_to_resource+0x20/0x88

[    0.384400]@5 [<ffffffc00096875c>]of_irq_count+0x20/0x40

[    0.384411]@5 [<ffffffc000968d64>]of_device_alloc+0x78/0x178

[    0.384424]@5 [<ffffffc000968e94>]of_platform_device_create_pdata+0x30/0x78

[    0.384435]@5 [<ffffffc000969144>]of_platform_bus_create+0x24c/0x2f4

[    0.384447]@5 [<ffffffc0009691b8>]of_platform_bus_create+0x2c0/0x2f4

[    0.384459]@5 [<ffffffc00096935c>]of_platform_populate+0x68/0x90

[    0.384475]@5 [<ffffffc001603004>]arm64_device_init+0x1c/0x2c

[    0.384486]@5 [<ffffffc000200804>]do_one_initcall+0xb0/0x14c

[    0.384498]@5 [<ffffffc001600974>]kernel_init_freeable+0x140/0x1e0

[    0.384512]@5 [<ffffffc000d0f60c>]kernel_init+0x10/0xcc

 

 

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=[0x000000000x00000086...],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=[0x000000000x0000008c...],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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值