Chinaunix首页 | 论坛 | 博客
  • 博客访问: 176078
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 618
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-15 09:12
文章分类
文章存档

2014年(17)

2013年(10)

我的朋友

分类: LINUX

2014-03-31 12:21:20

这个功能在于检查功耗问题的办法之一,需要检查系统功耗问题,但是由于没有硬件的帮忙,所以只能自己搞下,搞了几天都看不出来到底是那个外围设备以及GPIO或者PMIC的问题,我曾经在系统正常状态下把PMIC的所有寄存器打出来和GPIO状态都打出来过,与BASE版本的值进行的对比,但是都没有发现问题,经过老郭和宋哥两个大牛指点,在系统进入SUSPEND的时候,在syscore的时候注册了一个回调函数,由于在系统走suspend的时候,syscore已经相当靠后了,所以可以把在系统在S3状态的时候PMIC寄存器值和GPIO值打印出来

总结下检查电流的小方法:
拔外围器件,查看电流变化
检查GPIO的状态是否正确
检查PMIC寄存器的状态是否正常

在这些方法中需要对照电路图看看供电电路,如果有硬件team帮忙可以逐个排查每路电路的电压。
这个patch放在gpiolib.c

点击(此处)折叠或打开

  1. +static void gpiolib_dbg_show_1(struct gpio_chip *chip)
  2. +{
  3. + unsigned i;
  4. + unsigned gpio = chip->base;
  5. + struct gpio_desc *gdesc = &gpio_desc[gpio];
  6. + int is_out;
  7. +
  8. + for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) {
  9. + is_out = test_bit(FLAG_IS_OUT, &gdesc->flags);
  10. + printk(" gpio-%-3d (%-20.20s) %s %s",
  11. + gpio, gdesc->label,
  12. + is_out ? "out" : "in ",
  13. + chip->get
  14. + ? (chip->get(chip, i) ? "hi" : "lo")
  15. + : "? ");
  16. + printk("\n");
  17. + }
  18. +}
  19. +
  20. +void dump_gpio(void)
  21. +{
  22. + struct gpio_chip *chip = NULL;
  23. + unsigned gpio;
  24. + int started = 0;
  25. +
  26. + /* REVISIT this isn
这个patch随便放吧

点击(此处)折叠或打开

  1. +#include <linux/module.h>
  2. +#include <linux/kernel.h>
  3. +#include <linux/slab.h>
  4. +#include <linux/io.h>
  5. +#include <linux/uaccess.h>
  6. +#include <linux/device.h>
  7. +#include <linux/delay.h>
  8. +#include <linux/fs.h>
  9. +#include <linux/debugfs.h>
  10. +#include <linux/rpmsg.h>
  11. +#include <asm/intel_scu_pmic.h>
  12. +#include <asm/intel_scu_ipc.h>
  13. +#include <asm/intel_mid_rpmsg.h>
  14. +#include <asm/intel_mid_remoteproc.h>
  15. +#include <linux/syscore_ops.h>
  16. +
  17. +#define IPC_WWBUF_SIZE 20
  18. +#define IPC_RWBUF_SIZE 20
  19. +
  20. +#define IPCMSG_PCNTRL 0xFF
  21. +
  22. +#define IPC_CMD_PCNTRL_W 0
  23. +#define IPC_CMD_PCNTRL_R 1
  24. +#define IPC_CMD_PCNTRL_M 2
  25. +static void dump_reg(vold)
  26. +{
  27. + int ret;
  28. + u16 i;
  29. + u8 data;
  30. + for (i = 0; i < 0xff; i++) {
  31. + ret = intel_scu_ipc_ioread8(i,
  32. + &data);
  33. + printk("reg 0x%x = 0x%x\n",i,data);
  34. +
  35. + if (ret) {
  36. + printk(".........reg read error!");
  37. + }
  38. +
  39. + }
  40. +}
  41. +
  42. +extern void dump_gpio(void);
  43. +static int dump_suspend(void)
  44. +{
  45. + dump_gpio();
  46. + dump_reg();
  47. + return 0;
  48. +}
  49. +
  50. +static int dump_resume(void)
  51. +{
  52. + return 0;
  53. +}
  54. +static struct syscore_ops dump_pmic_ops = {
  55. + .suspend = dump_suspend,
  56. + .resume = dump_resume,
  57. +};
  58. +static int __init pmic_dump_init(void)
  59. +{
  60. + register_syscore_ops(&dump_pmic_ops);
  61. + return 0;
  62. +}
  63. +
  64. +module_init(pmic_dump_init);
  65. +
  66. +
注意使用的是register_syscore_ops()函数惊醒的注册,具体何时调用请参考suspend.c的suspend_enter()函数。


阅读(4748) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~