본문 바로가기

Programming/Linux_Kernel

Platform_get_irq & struct resource


kernel 소스를 보다보면 irq handler 를 등록하는 부분에서 다음과 같은 code 를 볼 수 있다.
static int __devinit kp_probe(struct platform_device *pdev)
{
...
keypad->irq = platform_get_irq(pdev, 0);
 printk("[KEY] %s() irq = 0x%x\n", __FUNCTION__, keypad->irq);
 
 if (keypad->irq < 0) {
  ret = keypad->irq;
  goto err_disable_clk;
 }
...
}

Platform_get_irq 는 어디서 등록된 irq 정보를 가지고 오는 것일까?
probe 에서 가지고 온것을 보니 분명 어딘가에서 register_device 를 한 struct 에서 가지고 올 것이다.
일단, device 의 name 을 살펴보자.


static struct platform_driver kp_driver = {
 .probe  = kp_probe,
 .remove  = __devexit_p(kp_remove),
 .suspend = kp_suspend,
 .resume  = kp_resume,
 .driver  = {
  .name = "keypad",
  .owner = THIS_MODULE,
 },
};

static int __init kp_init(void)
{
 return platform_driver_register(&kp_driver);
}

이름은 "keypad" 이다.
이것을 등록시키는 곳을 찾아보자.
전혀 다른곳에서 아래와 같은 코드를 발견할 수 있다.


static struct resource keypad_resources[] = {
 [0] = {
  .start = S3C_PA_KEYPAD,
  .end = S3C_PA_KEYPAD + 0x20 - 1,
  .flags = IORESOURCE_MEM,
 },
 [1] = {
  .start = IRQ_KEYPAD,
  .end = IRQ_KEYPAD,
  .flags = IORESOURCE_IRQ,

 },
};

struct platform_device device_keypad = {
 .name  = "keypad",
 .id  = -1,
 .num_resources = ARRAY_SIZE(keypad_resources),
 .resource = keypad_resources,
};

void __init kp_set_platdata(struct kp_platdata *pd)
{
 struct kp_platdata *npd;

 if (!pd) {
  printk(KERN_ERR "%s: no platform data\n", __func__);
  return;
 }

 npd = kmemdup(pd, sizeof(struct kp_platdata), GFP_KERNEL);
 if (!npd)
  printk(KERN_ERR "%s: no memory for platform data\n", __func__);

 device_keypad.dev.platform_data = npd;
}

IRQ 라는 type 으로 keypad irq 를 등록함을 알 수 있다.
이렇게 irq type 으로 등록한 device 의 resource 를

Platform_get_irq
 
로 얻어 올 수 있는 것이다.

여담으로 keypad irq 같은 경우는 다양한 key 값을 interrupt source 로 사용하여야 하기 때문에
VECTORED INTERRUPT CONTROLLER 라는 가상 interrupt resource 를 사용한다.

리눅스를 하면서 힘든점은 이러한 언급이 거의 없다는 것이다.
등록을 했으면 어디서 어떻게 불러와서 사용하는지에 대한 유기적인 설명을 찾기 힘들다.
구글링을 해도 수많은 패치들과 코드들 사이에 정작 필요로 하는 정보들이 묻혀있기 일수다.
내가 힘들여 알게된 정보들을 부지런히 블로깅 하는것은 이러한 범 국민적인 소모전을 그만하자는 의미도 있다.
오히려 이러한 내용들은 중국어 블로그에 많이 개시되어있다.
언젠가 중국이 리눅스의 강국으로 떠오르지 않을까?

나의 글에 대해 도움을 받았다면, 댓글이라도 달아주었으면 하는 바램이다.
지치게 되면 더이상 업데이트를 하지 않을 수도 있으니...