int rtc_read_datetime(struct tm *tm)
{
    unsigned int i;
    int rc, oldlevel;
    unsigned char buf[7];

    oldlevel = disable_irq_save();

    if (get_pmu_type() == PCF50606)
        rc = pcf50606_read_multiple(PCF5060X_RTCSC, buf, sizeof(buf));
    else
        rc = pcf50635_read_multiple(PCF5063X_REG_RTCSC, buf, sizeof(buf));

    restore_irq(oldlevel);

    for (i = 0; i < sizeof(buf); i++)
        buf[i] = BCD2DEC(buf[i]);

    tm->tm_sec = buf[0];
    tm->tm_min = buf[1];
    tm->tm_hour = buf[2];
    tm->tm_wday = buf[3];
    tm->tm_mday = buf[4];
    tm->tm_mon = buf[5] - 1;
    tm->tm_year = buf[6] + 100;

    return rc;
}
示例#2
0
void EXT3(void)
{
    if (get_pmu_type() == PCF50606)
    {
    unsigned char data[3]; /* 0 = INT1, 1 = INT2, 2 = INT3 */

    /* Clear pending interrupts from pcf50606 */
    pcf50606_read_multiple(0x02, data, 3);

    if (data[0] & 0x04)
    {
        /* ONKEY1S */
        if (!charger_inserted())
            sys_poweroff();
        else
            pcf50606_reset_timeout();
    }

    if (data[2] & 0x08)
    {
        /* Touchscreen event, do something about it */
        touchscreen_handle_device_irq();
    }
    }
    else
    {
        unsigned char data[5]; /* 0 = INT1, 1 = INT2, 2 = INT3, ... 4 = INT5 */

        /* Clear pending interrupts from pcf50635 */
        pcf50635_read_multiple(PCF5063X_REG_INT1, data, 5);

        if (data[2] & PCF5063X_INT3_ONKEY1S)
        {
           
            if (!charger_inserted())
                sys_poweroff();
        }
    }
}
示例#3
0
void power_init(void)
{
    /* Configure GPA6 as input and wait a short while */
    GPIOA_DIR &= ~(1<<6);

    udelay(10);

    /* Value of GPA6 determines PMU chip type */
    if (GPIOA & (1<<6))
    {
        pmu = PCF50635;

        pcf50635_init();
        
        /* Clear pending interrupts from pcf50635 */
        unsigned char data[5]; /* 0 = INT1, 1 = INT2, 2 = INT3, ... 4 = INT5 */
        pcf50635_read_multiple(PCF5063X_REG_INT1, data, 5);
    }
    else
    {
        pmu = PCF50606;

        /* Configure GPA6 for output (backlight enable) */
        GPIOA_DIR |= (1<<6);

        pcf50606_init();

        /* Clear pending interrupts */
        unsigned char data[3]; /* 0 = INT1, 1 = INT2, 2 = INT3 */
        pcf50606_read_multiple(0x02, data, 3);
    }

#ifndef BOOTLOADER
        IEN |= EXT3_IRQ_MASK;   /* Unmask EXT3 */
#endif
}