【r16】【通过触摸屏power键关机开机后功放能正常工作】默认待机重启后功放芯片锁死无法唤醒

1. 分析1) 通过gpio证明在断电开机进入系统后,能够控制系统的声音开关

echo 201 > /sys/class/gpio/export
echo “out” > /sys/class/gpio/gpio201/direction
echo “1” > /sys/class/gpio/gpio201/value 关
usleep 100000
echo “0” > /sys/class/gpio/gpio201/value 开

同时如果在通过power键关机之前设置gpio201为1, 那么待机重启后, 通过uboot再设置为gpio201为0, 那么进入系统后是有声音。
可是如果在通过power键关机之前设置gpio201为0(默认开着功放芯片), 那么待机重启后,无论怎么设置gpio201的1或者0, 功放芯片都是锁死状态,没声。
所以说待机前一定要关闭功放芯片,否则待机后功放芯片就锁死了,永远启动不起来了,除非整机断电。

2. 分析2) 修改代码为pdi_key.c, 在收到power键的时候来做这个事情

#if 1//20161208 byh PG9 192+9
static struct resource pdi_resource[] = {
    [0] = {
        .start = 0x01c20800 + 0xd8,//PG9
        .end   = 0x01c20800 + 0xd8 + 32,
        .flags = IORESOURCE_MEM,
    },
    [1] = {
        .start = 9,
        .end   = 9,
        .flags = IORESOURCE_IO,
    }
};


static volatile unsigned long *pg_cfg0;     //  configure PH0--7  PH01 001  0x77777717
static volatile unsigned long *pg_dat;      //  set PH01 bit1   default 0x00000000
static int pinSpeakerReset= 1;
static void initSpeakerResetPin()
{
    struct resource     *resPG9;

    /* 根据platform_device的资源进行ioremap */
    resPG9 = &pdi_resource[0];
    if (resPG9 == NULL)
        printk("initSpeakerResetPin IORESOURCE_MEM return NULL\n");

    printk("initSpeakerResetPin pg_cfg0 ioremap before: \n");
    printk("initSpeakerResetPin resPG9->start -> 0x%lx , resPG9->end -> 0x%lx, size -> 0x%lx\n", 
            resPG9->start, resPG9->end, resPG9->end - resPG9->start);
    pg_cfg0 = ioremap(resPG9->start, resPG9->end - resPG9->start);
    printk("initSpeakerResetPin pg_cfg0 addr -> 0x%lx\n", pg_cfg0);
//  printk("pg_cfg0 data -> 0x%lx\n", *pg_cfg0);
//  pg_dat = ioremap(0x01c20800 + 0x010c, 4);
    pg_dat = pg_cfg0 + 0x4;
    printk("initSpeakerResetPin pg_dat addr -> 0x%lx\n", pg_dat);
    //printk("pg_dat data -> 0x%lx\n", *pg_dat);

    resPG9 = &pdi_resource[1];
    if (resPG9 == NULL)
        printk("initSpeakerResetPin platform_get_resource IORESOURCE_IO return NULL\n");

    pinSpeakerReset = resPG9->start;
    printk("initSpeakerResetPin ioremap before:pinSpeakerReset is -> %d\n", pinSpeakerReset);
    printk("initSpeakerResetPin resPG9->start -> 0x%lx\n\n", resPG9->start);
}


static void PullUpSpeakerResetPin()
{
        initSpeakerResetPin();

        printk("*pg_cfg0 value -> 0x%lx\n", *pg_cfg0);
        *pg_cfg0 &= ~(7<<(32+4*1));    //clear bit
        printk("*pg_cfg0 value -> 0x%lx\n", *pg_cfg0);
        printk("clear pg_cfg0 bit 1 end ... \n");
        *pg_cfg0 |= (1<<(32+4*1));  //set bit
        printk("*pg_cfg0 value -> 0x%lx\n", *pg_cfg0);

        *pg_dat |= (1 << pinSpeakerReset);
}
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值