ACPI 中SCI的IRQ变更

需要更改3个方面:    

 

       1. 通常,对于Intel Chipsets来说,在APIC关闭情况下,SCI可以使用IRQ9,10,11。详细内容参考Intel手册,一般是在LPC的"ACPI Control"寄存器:SCI IRQ Select设置。

 

       2. Fixed ACPI Description Table (FADT) Format的offset 46:  SCI_INT.

          该值是在建立ACPI表的时候创建。

 

 

      3. 在Windows 2000下光改这两个地方是不行的. 如果只有PIC mode,那么是可以用的. 支援multiprocessor的OS(使用APIC mode), BIOS必須建立ACPI multiple APIC Description Table(MADT)MADT中要有一個 SCI 用到的interrupt source override structure <==>

       在ACPI规范中,MADT中有n个APIC结构,其中有一个类型为interrupt source override ,在它的下面有IRQ source的设置需要更改

 PBIOS: acpiCreateIntSrcOverride PROC NEAR PUBLIC

             INT_OVERRIDE

 

附:本文参考 http://www.biosren.com/thread-1120-1-1.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一段使用 ACPI 的 SCI 断来实现按键检测的驱动代码: ```c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/acpi.h> #include <linux/interrupt.h> #define KEY_NOTIFY 0x80 // ACPI 通知值 static irqreturn_t key_handler(int irq, void *dev_id) { struct acpi_device *device = dev_id; union acpi_object *obj; obj = acpi_evaluate_dsm_typed(device->handle, &KEY_NOTIFY, 1, 0, NULL, ACPI_TYPE_INTEGER); if (obj) { /* 检测到按键按下,执行相应操作 */ switch (obj->integer.value) { case 0x01: printk(KERN_INFO "Key A pressed.\n"); break; case 0x02: printk(KERN_INFO "Key B pressed.\n"); break; case 0x03: printk(KERN_INFO "Key C pressed.\n"); break; default: break; } kfree(obj); } return IRQ_HANDLED; } static int key_driver_probe(struct acpi_device *device) { int ret; ret = request_threaded_irq(device->irq, NULL, key_handler, IRQF_SHARED, "acpi-key", device); if (ret < 0) { printk(KERN_ERR "Failed to request IRQ: %d\n", device->irq); return ret; } /* 初始化驱动 */ printk(KERN_INFO "ACPI key driver initialized.\n"); return 0; } static int key_driver_remove(struct acpi_device *device) { free_irq(device->irq, device); printk(KERN_INFO "ACPI key driver removed.\n"); return 0; } /* ACPI 设备驱动结构体 */ static const struct acpi_device_id acpi_key_ids[] = { {"ACPI000E", 0}, // 与按键相关的 ACPI 设备 ID { "", 0 }, }; MODULE_DEVICE_TABLE(acpi, acpi_key_ids); static struct acpi_driver key_driver = { .name = "acpi-key", .ids = acpi_key_ids, .ops = { .add = key_driver_probe, .remove = key_driver_remove, }, }; static int __init key_driver_init(void) { int ret; ret = acpi_bus_register_driver(&key_driver); if (ret) { printk(KERN_ERR "Failed to register ACPI key driver.\n"); return ret; } printk(KERN_INFO "ACPI key driver loaded.\n"); return 0; } static void __exit key_driver_exit(void) { acpi_bus_unregister_driver(&key_driver); printk(KERN_INFO "ACPI key driver unloaded.\n"); } module_init(key_driver_init); module_exit(key_driver_exit); MODULE_LICENSE("GPL"); ``` 以上驱动可以读取 ACPI 设备的 SCI 断,以检测按键的操作。具体实现阐述如下: 1. 使用`acpi_bus_register_driver()`函数注册驱动,传入一个 `key_driver` 结构体。`key_driver` 结构体包括驱动名字,驱动操作函数等信息。 2. 在 `key_driver_probe()` 函数请求 IRQ 断,注册一个断处理函数 `key_handler()` 从按键的 ACPI 设备获取按键状态。 3. 在 `key_driver_remove()` 函数移除 IRQ 断,在驱动关闭时释放资源。 4. 驱动使用联合体对象 `acpi_object` 来从 ACPI 设备获取数据, `switch` 语句根据按键的不同状态来执行相应操作。 注意:驱动程序使用了一些 Linux 内核不常用到的函数,如果不了解这些函数的用法,可能需要查阅相关的内核文档才能理解。同时,为了方便理解,本代码只提供了基本的按键检测实现,实际应用需要根据实际情况做出相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值