2011-7-26 8:54:53

 


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 有什么用?

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值