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...