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