歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

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

Copyright © Linux教程網 All Rights Reserved