飛凌干貨丨OK-xx18 Android實時時鐘框架介紹

原創 2020-03-06 17:07:00 RTC 實時時鐘 電池供電 Android

RTC(Real-TimeClock)實時時鐘為操作系統提供了一個可靠的時間,并且在斷電的情況下,RTC實時時鐘也可以通過電池供電,一直運行下去。本文以OK-4418-C為例,介紹在Android實時時鐘框架。

整體流程介紹

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

板子上電以后,內核驅動會初始化rtc芯片rx8010,并生成/dev/rtc0設備文件,注冊其設置時間等操作函數。

進入android系統后,點擊設置界面的設置時間,應用程序會調用框架層鬧鐘管理服務的設置時間的接口,框架層會調用硬件抽象層的設置時間接口,硬件抽象層會打開/dev/rtc0設備文件并調用其ioctl函數,內核層實時時鐘子系統將調用實時時鐘芯片驅動的設置時間函數,內核驅動層實時時鐘芯片驅動調用設置時間的函數,設置實時時鐘芯片的對應寄存器。


 流程圖說明 

 

 


成/dev/rtc0設備文件,注冊其設置時間等操作函數。進入android系統后,點擊設置界面的設置時間,應用程序會調用框架層鬧鐘管理服務的設置時間的接口,框架層會調用硬件抽象層的設置時間接口,硬件抽象層會打開/dev/rtc0設備文件并調用其ioctl函數,內核層實時時鐘子系統將調用實時時鐘芯片驅動的設置時間函數,內核驅動層實時時鐘芯片驅動調用設置時間的函數,設置實時時鐘芯片的對應寄存器。


 基本邏輯圖如下: 


 

板子上電以后,內核驅動會初始化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寄存器。


 實際運行效果 

板子上電,系統起來以后,選擇“ ”->“Settings”->“Date&time”,在這里可以更改日期和時間,并且在您斷電之后時間仍可同步更新(確保板子上已經安裝了紐扣電池)。

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


運行結果5.jpg

 

 

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


相關產品 >

  • OK4418/6818-C開發板

    飛凌提供S5P4418/s5p6818,S5P4418/s5p6818開發板,4418/6818開發板,s5p4418/s5p6818開發板解決方案,S5p4418/s5p6818多媒體解決方案,s5p4418硬件解決方案,更多S5P4418/s5p6818方案敬請聯系飛凌嵌入式。Cortex-A9 四核S5P4418/6818 支持Android5.1.1,Linux3.4.39、QT4.8.6等系統 了解詳情
    OK4418/6818-C開發板
  • OK3568-C開發板

    強而穩,國產芯,1Tops算力,多路高速接口|飛凌RK3568系列RK3568開發板基于國產工業級AI處理器RK3568四核64位Cortex-A55 處理器設計。RK3568作為國產化高性能處理器,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,瑞芯微RK3568芯片是一款定位中高端的通用型SoC,NPU達到1Tops,飛凌RK3568系列核心板提供瑞芯微RK3568規格書_datasheet_數據手冊_原理圖等,


    了解詳情
    OK3568-C開發板

推薦閱讀 換一批 換一批