1. 程式人生 > >linux 核心模組之間通訊:EXPORT_SYMBOL

linux 核心模組之間通訊:EXPORT_SYMBOL

--- a/drivers/input/misc/audio_wakeup.c
+++ b/drivers/input/misc/audio_wakeup.c
@@ -13,6 +13,8 @@ struct audio_wakeup_data {
        struct input_dev *input;
 };
 
+
+
 static struct audio_wakeup_data *data;
 
 static ssize_t func_show(struct device *dev,
@@ -37,6 +39,14 @@ static ssize_t func_store(struct device *dev,
        return count;
 }
 
+void report_system_wakeup(void)
+{
+       input_report_rel(data->input, REL_MISC, 1);
+    input_sync(data->input);
+    printk(KERN_INFO "Wakeup_system\n");
+
+}
+
 static DEVICE_ATTR(func, 0644,
                    func_show, func_store);
 
@@ -105,5 +115,6 @@ static void __exit audio_wakeup_exit(void)
        printk("%s\n", __func__);
 }
 
+EXPORT_SYMBOL(report_system_wakeup);
 module_init(audio_wakeup_init);
 module_exit(audio_wakeup_exit);
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -34,6 +34,8 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/syscore_ops.h>
 
+extern void report_system_wakeup(void);
+
 struct gpio_button_data {
        const struct gpio_keys_button *button;
        struct input_dev *input;
@@ -375,13 +377,17 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
        BUG_ON(irq != bdata->irq);
 
        if (bdata->button->wakeup)
+    {
                pm_stay_awake(bdata->input->dev.parent);
+        report_system_wakeup();
+    }
        if (bdata->timer_debounce)
                mod_timer(&bdata->timer,
                        jiffies + msecs_to_jiffies(bdata->timer_debounce));
        else
                schedule_work(&bdata->work);
 
+
        return IRQ_HANDLED;
 }

例項如上,功能:宣告在audio_wake.c裡面的函式可以在gpio_keys.c裡面使用。