最近在作power comsuming的監視

被要求寫一個loaded module driver

讓他的suspend 和 resume funciton 

可以被kernel的 suspend / resume 觸發

 

所以trace了一下kernel

知道driver是在android找到硬體

然後比對id

再執行driver中的probe來initialize硬體

 

若沒有硬體存在

android是不會去執行probe來register

也就無法觸發driver的suspend/resume function

後來想了一個笨方法

就是在driver module的module_init()  function中

去register一個假的device

 

這是module_init的function

由於需要char dev來讓user space的application傳入data

所以一開始register character device

同時也register early-suspend幫忙作一點事

 

 

static int hello_init(void)
{
    major_no = register_chrdev(0, DEVICE_NAME, &fops);

    printk("\n Major_no : %d", major_no);

    my_class = class_create(THIS_MODULE, DEVICE_NAME);
    device_create(my_class, NULL, MKDEV(major_no,0), NULL, DEVICE_NAME);

    hello_new_device();

    early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 100;
    early_suspend.suspend = hello_early_suspend;
    early_suspend.resume = hello_late_resume;
    register_early_suspend(&early_suspend);

    printk(KERN_INFO "Hello, world\n");
    return 0;
}

 

其中mutext_init如果沒作的話

一旦insmod module就會導致pad reboot

 

int hello_new_device(void)
{
    struct device *dev;
    dev = kzalloc(sizeof(struct device),GFP_KERNEL);
    struct dev_pm_domain *dd;
    dd = kzalloc(sizeof(struct dev_pm_domain),GFP_KERNEL);

    dd->ops.suspend = hello_dev_suspend;
    dd->ops.resume = hello_dev_resume;
    dev->pm_domain = dd;
    dev_set_name( dev, "hello");
    mutex_init(&dev->mutex);

    int error = device_register(dev);

    printk("hello error: %d", error);

    return 0;
}

 

不過再module_exit我有試著下unregister_device

但總是導致system crash然後reboot

可能得再研究一下

 

PS.1. 

橘色是register early-suspend,

early-suspend使用比較簡單, 

不需要device, 只要register early_suspend就可以了,

若不是非得要suspend/resume,

其實early-suspend更方便

 

20130315:

發現如果不需要char_dev來做io coomand的話

可以直接在一開始宣告

static struct device *mDev;

之後一樣device_register(mDev);

在module_exit中,

device_unregister(mDev);

就不會導致reboot了

 

當初char_dev unregister會reboot

多半還是有東西沒處理好

才導致一unregister就掛

arrow
arrow
    全站熱搜

    bonet 發表在 痞客邦 留言(0) 人氣()