最近在作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就掛
留言列表