天天看點

S5P4418 Android實時時鐘架構介紹

RTC(Real-TimeClock)實時時鐘為作業系統提供了一個可靠的時間,并且在斷電的情況下,RTC實時時鐘也可以通過電池供電,一直運作下去。本文以飛淩嵌入式的OK4418-C為例,介紹在Android實時時鐘架構。

整體流程介紹

由于實時時鐘子系統,硬體抽象層、架構層、應用層、谷歌的android開發包都已經做好,是以此接口的主要設計工作在于rx8010晶片的驅動的實作,包括晶片的初始化及配置時間,讀取時間及接入實時時鐘子系統等功能。

闆子上電以後,核心驅動會初始化rtc晶片rx8010,并生成/dev/rtc0裝置檔案,注冊其設定時間等操作函數。

進入android系統後,點選設定界面的設定時間,應用程式會調用架構層鬧鐘管理服務的設定時間的接口,架構層會調用硬體抽象層的設定時間接口,硬體抽象層會打開/dev/rtc0裝置檔案并調用其ioctl函數,核心層實時時鐘子系統将調用實時時鐘晶片驅動的設定時間函數,核心驅動層實時時鐘晶片驅動調用設定時間的函數,設定實時時鐘晶片的對應寄存器。

流程圖說明

S5P4418 Android實時時鐘架構介紹

成/dev/rtc0裝置檔案,注冊其設定時間等操作函數。進入android系統後,點選設定界面的設定時間,應用程式會調用架構層鬧鐘管理服務的設定時間的接口,架構層會調用硬體抽象層的設定時間接口,硬體抽象層會打開/dev/rtc0裝置檔案并調用其ioctl函數,核心層實時時鐘子系統将調用實時時鐘晶片驅動的設定時間函數,核心驅動層實時時鐘晶片驅動調用設定時間的函數,設定實時時鐘晶片的對應寄存器。

基本邏輯圖如下:

S5P4418 Android實時時鐘架構介紹

闆子上電以後,核心驅動會初始化rtc晶片rx8010,并生成/dev/rtc0裝置檔案,注冊其設定時間等操作函數。

進入android系統後,點選設定界面的設定時間,應用程式會調用架構層鬧鐘管理服務的設定時間的接口,架構層會調用硬體抽象層的設定時間接口,硬體抽象層會打開/dev/rtc0裝置檔案并調用其ioctl函數,核心層實時時鐘子系統将調用實時時鐘晶片驅動的設定時間函數,核心驅動層實時時鐘晶片驅動調用設定時間的函數,設定實時時鐘晶片的對應寄存器。

流程圖中各個部分涉及到的函數名稱及功能

■ 應用層函數:

packages/apps/Settings/src/com/android/settings/DateTimeSettings.java檔案

static void setTime(Context context, int hourOfDay, int minute)

功能:設定Calendar的時分秒毫秒資訊,并調用系統的鬧鐘服務的設定時間setTime的接口。

■ 系統架構層函數:

./frameworks/base/services/core/java/com/android/server/AlarmManagerService.java檔案

public boolean setTime(long millis)

功能:檢查權限及是否存在alarm驅動,并調用setKernelTime(mNativeData,millis)接口。

■ 硬體抽象層函數:

frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp檔案

static jint android_server_AlarmManagerService_setKernelTime(JNIEnv*,jobject, jlong nativeData, jlong millis)

功能:将毫秒轉換成秒及微秒并調用setTime接口。

frameworks/base/services/core/jni/com_android_server_AlarmManagerService.cpp檔案

int AlarmImplTimerFd::setTime(struct timeval *tv)

功能:打開的核心生成的/dev/rtc0裝置檔案,并調用其ioctl接口。

■ 核心驅動層函數:

linux/kernel/kernel-3.4.39/drivers/rtc/rtc-dev.c檔案

static long rtc_dev_ioctl(struct file *file,

unsigned int cmd, unsigned long arg)

功能:根據ioctl的相關條件做出對應的rtc函數的調用。

linux/kernel/kernel-3.4.39/drivers/rtc/interface.c檔案

int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)

功能:調用rtc裝置操作函數的set_time函數。

linux/kernel/kernel-3.4.39/drivers/rtc/rtc-rx8010.c檔案

static int rx8010_probe(struct i2c_client *client, const structi2c_device_id *id)

功能:初始化rx8010晶片,并注冊生成/dev/rtc0裝置。

linux/kernel/kernel-3.4.39/drivers/rtc/rtc-rx8010.c檔案

static int rx8010_set_time(struct device *dev, struct rtc_time *dt)

功能:此為rtc操作函數set_time對應的函數,作用是将時間值寫入rx8010寄存器。

實際運作效果

闆子上電,系統起來以後,選擇“

S5P4418 Android實時時鐘架構介紹

->“Settings”->“Date&time”,在這裡可以更改日期和時間,并且在您斷電之後時間仍可同步更新(確定闆子上已經安裝了紐扣電池)。

注意:此步測試一定要先去掉“Automaticdate & time”以及“Automatictime zone”兩部分的勾選,否則無法準确測試RTC功能,如下:

S5P4418 Android實時時鐘架構介紹

點選“set date”和“set time”設定好之後,就可以給闆子斷電再上電,再次進入時間設定界面,就會看到時間已經同步更新了。