2011-7-26 8:54:53
整个唤醒流程
serial_pxa_suspend: enter
pxa2xx-uart
int pm_suspend(suspend_state_t state)
{
if (state > PM_SUSPEND_ON && state <= PM_SUSPEND_MAX)
return enter_state(state);
return -EINVAL;
}
static int enter_state(suspend_state_t state)
{
int error;
if (!valid_state(state))
return -ENODEV;
if (!mutex_trylock(&pm_mutex))
return -EBUSY;
if (state == PM_SUSPEND_DISK) {
error = pm_suspend_disk();
goto Unlock;
}
pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
if ((error = suspend_prepare(state)))
goto Unlock;
pr_debug("PM: Entering %s sleep\n", pm_states[state]);
error = suspend_enter(state);
pr_debug("PM: Finishing wakeup.\n");
suspend_finish(state);
Unlock:
mutex_unlock(&pm_mutex);
return error;
}
typedef int __bitwise suspend_state_t;
#define PM_SUSPEND_ON ((__force suspend_state_t) 0)
#define PM_SUSPEND_STANDBY ((__force suspend_state_t) 1)
#define PM_SUSPEND_MEM ((__force suspend_state_t) 3)
#define PM_SUSPEND_DISK ((__force suspend_state_t) 4)
#define PM_SUSPEND_LCDREFRESH ((__force suspend_state_t) 5)
#define PM_SUSPEND_DEEPSLEEP ((__force suspend_state_t) 6)
#define PM_SUSPEND_MAX ((__force suspend_state_t) 7)
需要注意的是就是这8种状态
PXAFB_SET_WAKEUP===
key code = 116,key value = 1, event time = 124962184
pxa3xx_keypad_pmic_interrupt
在哪注册的116的按键?
116按键没有注册到矩阵上
pmic的事件处理 加入到list中
int pmic_event_handle(unsigned long event)
{
int ret;
unsigned long flags;
struct pmic_callback *pmic_cb;
ret = check_pmic_ops();
if (ret < 0)
return ret;
spin_lock_irqsave(&pxa3xx_pmic_ops->cb_lock, flags);
list_for_each_entry(pmic_cb, &pxa3xx_pmic_ops->list, list) {
spin_unlock_irqrestore(&pxa3xx_pmic_ops->cb_lock, flags);
/* event is bit-wise parameter, need bit AND here as filter */
if ((pmic_cb->event & event) && (pmic_cb->func))
#ifdef CONFIG_KEYBOARD_ASTRI
pmic_cb->func(event, pmic_cb->data);
#else
pmic_cb->func(event);
#endif
spin_lock_irqsave(&pxa3xx_pmic_ops->cb_lock, flags);
}
spin_unlock_irqrestore(&pxa3xx_pmic_ops->cb_lock, flags);
return 0;
}
pmic_callback_data_register
用来注册一个事件
pxa3xx_keypad_interrupt
这个事件是怎么过来的?
是上层没有收到数据吗?
IPMC_IOCTL_STARTPMU
IPMC_IOCTL_GET_FV_OP
IPMC_IOCTL_SET_FV_OP
设置操作点和获取操作点
ipm-profiler
struct ipm_profiler_arg {
unsigned int size; /* size of ipm_profiler_arg */
unsigned int flags;
unsigned int window_size; /* in microseconds */
unsigned int pmn0;
unsigned int pmn1;
unsigned int pmn2;
unsigned int pmn3;
};
int ipm_start_profiler(struct ipm_profiler_arg *arg)
{
if (arg == NULL) {
up(&ipm_sem);
return -EINVAL;
}
memset(&cur_arg, 0, sizeof(struct ipm_profiler_arg));
cur_arg.flags = arg->flags;
if (arg->window_size > 0)
cur_arg.window_size = arg->window_size;
else
cur_arg.window_size = DEFAULTWINDOWSIZE;
if (arg->flags & IPM_PMU_PROFILER) {
cur_arg.pmn0 = arg->pmn0;
cur_arg.pmn1 = arg->pmn1;
cur_arg.pmn2 = arg->pmn2;
cur_arg.pmn3 = arg->pmn3;
}
up(&ipm_sem);
return 0;
}
更新当前参数
pipm_start_pmu = ipm_start_profiler;
向其他模块贡献了一个方法
ret = kernel_thread(ipm_thread, NULL , 0);
ipm_start_profiler
更改ipm_profiler 有什么用?