星期五, 7月 10, 2015

Intel X86 GPIO interrupt on linux

最近處理類似Lynx Point的GPIO interface
看規格應該是Intel series 7 但和Series 5基本上一致

前面GPIO 0~15看來可以設定為Interrupt pin 甚至NMI

基本上透過PM_BASE那邊可以設定ROUTE enable到GPE


linux kernel driver目前看來,沒什麼現成的Generic driver
我某種原因跟linux gpio driver內所謂的lynx-point 完全不一樣, 原因就不知了

但要掛GPIO interrupt看來沒有現成driver可以走gpio to irq

只能透過ACPI GPE去實現

題要一下用法
GPIO0~15對應過去GPE基本上看來都是+ 0x10
也就是GPE 0x10~0x1F

acpi gpe handler(可以想像成原本的irq handler)
 return ACPI_INTERRUPT_HANDLED | ACPI_REENABLE_GPE;
才會有下一個觸發

最簡單就
acpi_install_gpe_handler(NULL,
                                       GPE_num,
                                       ACPI_GPE_LEVEL_TRIGGERED,
                                       &GpeHandler,
                                       NULL);

如果要變化 trigger 方向可以利用GPIO BASE內的GP_INV


參考
http://www.serverphorums.com/read.php?12,907659,907659
http://fwengineer.blogspot.tw/2013/01/acpi.html
http://boy-asmc.blogspot.tw/2011/03/eckbsmi.html
http://datacenterswitching.blogspot.tw/2014/02/interrupts-routing-in-x86.html
http://biosengineer.blogspot.tw/2007/10/sci-check-list.html