如何在android 或linux 下,做suspend

2021-12-23 03:06:48 字數 3923 閱讀 3860

1樓:匿名使用者

通常情況下:

pending是指任務在可以隨時執行,但是因為已經有任務在執行,所以排隊,這種狀態的任務可隨時進入執行態。

suspend是被掛起的,在等待資源,等待的資源可以是輸入、訊號或者硬體裝置,在得到想要的資源後會轉成pending狀態(如果有任務在執行)。

linux觸控式螢幕驅動中什麼時候會呼叫suspend這個函式

2樓:300斤大魚

android系統摁下電源鍵後會讓系統進入休眠以達到節電的目的。核心驅動中和休眠相關的就是suspend和resume函式。

suspend函式用於休眠,resume函式用於喚醒。下面分析驅動中的這兩個函式是如何被呼叫到的。

驅動部分:

首先需要分析驅動的註冊過程,較新的核心都是採用dts方式來取代在核心中直接定義platform_device資料結構的註冊方式,本文是基於dts機制的核心來分析。

product對應的dts檔案在編譯時被編譯為dtb檔案,uboot在啟動時候會將其地址傳給核心,核心在啟動過程中會去解析,具體解析是在start_kernel()->setup_arch() --> unflatten_device_tree()中具體分析可以參考網上,解析的最終結果會存放在allnodes地址處,這個allnodes隨後在machine的init函式

中被使用,init函式中會根據allnodes中的節點資料組合成platform_device資料結構,然後將其註冊到platform匯流排上,下面簡要分析一下並重點關注這些初始化過程中和

pm相關的初始化。

我參與的專案中machine的init函式就是via_init_machine函式,在這個函式中就是呼叫了of_platform_populate(null, of_default_bus_match_table, null, null)這個函式來解析allnodes的。of_platform_populate是系統提供的介面。下面分析這個介面的實現:

[html] view plain copy

int of_platform_populate(struct device_node *root,

const struct of_device_id *matches,

const struct of_dev_auxdata *lookup,

struct device *parent)

of_node_put(root);

return rc;

} root最後就是取到的根節點,然後其作為引數傳遞給of_platform_bus_create,of_platform_device_create_pdata的實現如下:

[html] view plain copy

static int of_platform_bus_create(struct device_node *bus,

const struct of_device_id *matches,

const struct of_dev_auxdata *lookup,

struct device *parent, bool strict)

auxdata = of_dev_lookup(lookup, bus);

if (auxdata)

if (of_device_is_compatible(bus, "arm,primecell"))

dev = of_platform_device_create_pdata(bus, bus_id, platform_data, parent);

if (!dev || !of_match_node(matches, bus))

return 0;

for_each_child_of_node(bus, child)

} return rc;

} 根據傳入引數,我們這裡直接分析of_platform_device_create_padate函式,如下:

[html] view plain copy

struct platform_device *of_platform_device_create_pdata(

struct device_node *np,

const char *bus_id,

void *platform_data,

struct device *parent)

return dev;

} of_platform_device_create_padate->of_device_alloc->platform_device_alloc

便在platform_device_alloc函式中進行進行alloc和初始化了,實現如下:

[html] view plain copy

struct platform_device *platform_device_alloc(const char *name, int id)

return pa ? &pa->pdev : null;

} 可以看到有個device_initialize,這裡面對pdev.dev做一些列的初始化,其中有一個函式就是device_pm_init,這個函式就是我們一直關心的device相關的pm函式,具體實現如下:

[html] view plain copy

void device_pm_init(struct device *dev)

可以看見它對device和功耗相關的資料做了一些初始化,我們這裡先重點關注下dev->power.entry,初始化一個連結串列頭,所以他/它很有可能會在後面加到某個連結串列裡面去,而那個連結串列應該是用來儲存所有的device用的。系統中所有的platform_device都是通過這種方式註冊到系統中的,那麼應該所有的platform_device都會初始化一個dev->power.

entry,如果到時候把所有的dev->power.entry都新增到某個連結串列上去,那麼系統到時候查詢的時候只要找到這個list head就可以找到所有的platform_device了。嗯,不過這是我們的猜測。

我們接下去分析來驗證下。

platform_device通過alloc之後已經初始化好了,那麼接下去就可以新增到系統中了,所以我們再回頭看of_platform_device_create_pdata的實現。

函式在of_device_alloc之後把dev->dev.bus賦值給了platform_bus_type,接著就呼叫了of_device_add函式,在of_device_add函式中最後通過device_add新增到了bus上,但是device_add中有個函式需要我們關係,就是device_pm_add(dev),實現如下:

[html] view plain copy

void device_pm_add(struct device *dev)

可以看到這裡list_add_tail(&dev->power.entry, &dpm_list);這就驗證了我們之前的猜測。所有註冊到系統中的裝置,最終都是會新增到dpm_list這條連結串列上。

那麼系統在休眠的時候是如何通過dmp_list這錶連結串列來suspend裝置的呢?接下去就是我們要分析的電源管理部分內容。

系統電源部分:

電源管理相關檔案在kernel/power目錄下,前面已經分析到。系統中註冊的裝置都是會新增到dmp_list這條連結串列上的。那麼睡眠的時候系統應該是會查詢dmp_list這條連結串列,

然後通過這條連結串列依次去查到對應的driver,然後呼叫driver中的suspend方法。下面我們來驗證。

2.在suspend會輪詢bus下的driver,然後一次呼叫到driver->pm->suspend方法,然後進入休眠。

3.state_store->pm_suspend->enter_state->suspend_devices_and_enter->dpm_suspend_start->dpm_suspend->device_suspend->__device_suspend->pm_op->(ops->suspend)

如何在android手機上實現抓包

先給手機刷root許可權,執行命令 adb root adb remount ok後 把tcpdump放到c盤根目錄下 c 2.執行命令 adb push c tcpdump data local tcpdump 這個命令是把tcpdump拷到手機中去 3.adb shell chmod 6755 ...

如何在 android 手機上實現抓包

使用抄資料線將android手機連線到電腦端,打 bai開duwindows命令提示符視窗。zhi使用命令開啟android所在的資料夾,我的 dao是在d盤根目錄下,因為我們要使用到adb.exe,所以我們要一直開啟到adb所在目錄。將tcpdump程式copy至android手機 該命令前面那個...

如何在Android上使用思源黑體作為系統字型

adobe和谷歌歷copy時三年,2014年7月宣佈啟動bai 一個du開源字型,這是一個新的zhi桌面使用開源pan cjk字型,有七dao種字型重量 extralight 光 正常 普通介質,大膽和重型 完全支援繁體和簡體中文,中國日本和韓國,所有這些都包含在一種字型。它還包括來自我們常用的sa...