zoukankan      html  css  js  c++  java
  • rtc关机闹钟7 jni层 com_android_server_AlarmManagerService

    frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp
    int AlarmImplAlarmDriver::set(int type, struct timespec *ts)
    {
        return ioctl(fds[0], ANDROID_ALARM_SET(type), ts);
    }
    

     其实是调用了./kernel/kernel/drivers/rtc/alarm-dev.c 的

    static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    {
        int rv = 0;
        unsigned long flags;
        struct timespec new_alarm_time;
        struct timespec new_rtc_time;
        struct timespec tmp_time;
        enum android_alarm_type alarm_type = ANDROID_ALARM_IOCTL_TO_TYPE(cmd);
        uint32_t alarm_type_mask = 1U << alarm_type;
        printk(">>%s cmd == %d ",__FUNCTION__,cmd);
        if (alarm_type >= ANDROID_ALARM_TYPE_COUNT)
            return -EINVAL;

        if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_GET_TIME(0)) {
            if ((file->f_flags & O_ACCMODE) == O_RDONLY)
                return -EPERM;
            if (file->private_data == NULL &&
                cmd != ANDROID_ALARM_SET_RTC) {
                spin_lock_irqsave(&alarm_slock, flags);
                if (alarm_opened) {
                    spin_unlock_irqrestore(&alarm_slock, flags);
                    return -EBUSY;
                }
                alarm_opened = 1;
                file->private_data = (void *)1;
                spin_unlock_irqrestore(&alarm_slock, flags);
            }
        }

        switch (ANDROID_ALARM_BASE_CMD(cmd)) {
        case ANDROID_ALARM_CLEAR(0):
            spin_lock_irqsave(&alarm_slock, flags);
            pr_alarm(IO, "alarm %d clear ", alarm_type);
            alarm_try_to_cancel(&alarms[alarm_type]);
            if (alarm_pending) {
                alarm_pending &= ~alarm_type_mask;
                if (!alarm_pending && !wait_pending)
                    wake_unlock(&alarm_wake_lock);
            }
            alarm_enabled &= ~alarm_type_mask;
            spin_unlock_irqrestore(&alarm_slock, flags);
            break;

        case ANDROID_ALARM_SET_OLD:
        case ANDROID_ALARM_SET_AND_WAIT_OLD:
            if (get_user(new_alarm_time.tv_sec, (int __user *)arg)) {
                rv = -EFAULT;
                goto err1;
            }
            new_alarm_time.tv_nsec = 0;
            goto from_old_alarm_set;

        case ANDROID_ALARM_SET_AND_WAIT(0):
        case ANDROID_ALARM_SET(0):
            if (copy_from_user(&new_alarm_time, (void __user *)arg,
                sizeof(new_alarm_time))) {
                rv = -EFAULT;
                goto err1;
            }
    from_old_alarm_set:
            spin_lock_irqsave(&alarm_slock, flags);
            pr_alarm(IO, "alarm %d set %ld.%09ld ", alarm_type,
                new_alarm_time.tv_sec, new_alarm_time.tv_nsec);
            alarm_enabled |= alarm_type_mask;
            alarm_start_range(&alarms[alarm_type],
                timespec_to_ktime(new_alarm_time),
                timespec_to_ktime(new_alarm_time));
            spin_unlock_irqrestore(&alarm_slock, flags);
            if (ANDROID_ALARM_BASE_CMD(cmd) != ANDROID_ALARM_SET_AND_WAIT(0)
                && cmd != ANDROID_ALARM_SET_AND_WAIT_OLD)
                break;
            /* fall though */
        case ANDROID_ALARM_WAIT:
            spin_lock_irqsave(&alarm_slock, flags);
            pr_alarm(IO, "alarm wait ");
            if (!alarm_pending && wait_pending) {
                wake_unlock(&alarm_wake_lock);
                wait_pending = 0;
            }
            spin_unlock_irqrestore(&alarm_slock, flags);
            rv = wait_event_interruptible(alarm_wait_queue, alarm_pending);
            if (rv)
                goto err1;
            spin_lock_irqsave(&alarm_slock, flags);
            rv = alarm_pending;
            wait_pending = 1;
            alarm_pending = 0;
            spin_unlock_irqrestore(&alarm_slock, flags);
            break;
        case ANDROID_ALARM_SET_RTC:
            if (copy_from_user(&new_rtc_time, (void __user *)arg,
                sizeof(new_rtc_time))) {
                rv = -EFAULT;
                goto err1;
            }
            rv = alarm_set_rtc(new_rtc_time);
            spin_lock_irqsave(&alarm_slock, flags);
            alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
            wake_up(&alarm_wait_queue);
            spin_unlock_irqrestore(&alarm_slock, flags);
            if (rv < 0)
                goto err1;
            break;
        case ANDROID_ALARM_GET_TIME(0):
            switch (alarm_type) {
            case ANDROID_ALARM_RTC_WAKEUP:
            case ANDROID_ALARM_RTC:
                getnstimeofday(&tmp_time);
                break;
            case ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP:
            case ANDROID_ALARM_ELAPSED_REALTIME:
                tmp_time =
                    ktime_to_timespec(alarm_get_elapsed_realtime());
                break;
            case ANDROID_ALARM_TYPE_COUNT:
            case ANDROID_ALARM_SYSTEMTIME:
                ktime_get_ts(&tmp_time);
                break;
            }
            if (copy_to_user((void __user *)arg, &tmp_time,
                sizeof(tmp_time))) {
                rv = -EFAULT;
                goto err1;
            }
            break;

        default:
            rv = -EINVAL;
            goto err1;
        }
    err1:
        return rv;

    } 

  • 相关阅读:
    iOS开发——keychain的使用
    iOS开发——策略模式
    iOS开发——MVC模式
    iOS开发——代理模式
    ExtjsCode_Test02Panel.js
    网站收藏
    关于ExtJs Form表单的赋值、获取、重置
    ExtJS分页start,limit,pageSize的研究
    使Grid可编辑
    如何禁用Grid中的ToolBar中的Button
  • 原文地址:https://www.cnblogs.com/muhuacat/p/5261154.html
Copyright © 2011-2022 走看看