freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

i2c內(nèi)核數(shù)據(jù)結(jié)構(gòu)之間的關系-wenkub

2022-09-01 14:13:48 本頁面
 

【正文】 er { char name[32]。 super_block 和 inode 數(shù)據(jù)結(jié)構(gòu)本身集中描述了各種文件系統(tǒng)的共性,而具體文件系統(tǒng)的個性則放到 union 中進行描述,在掛載具體的文件系統(tǒng)時實例化為具體的 union 對象,比如ext2_inode_union 或者 jffs2_inode_info。 i2c_client 數(shù)據(jù)結(jié)構(gòu)為描述 i2c 設備的“模板”,而具體的 i2c 設備可能需要描述個性的私有數(shù)據(jù)。否則可以指定地址檢測范圍為這兩個地址,而在加載驅(qū)動程序模塊時由軟件進行地址檢測。 每個 i2c 設備都有唯一的 7 位地址 addr。如果檢測成功則調(diào)用設備驅(qū)動程序提供的回調(diào)函數(shù)創(chuàng)建描述設備的 i2c_client 數(shù)據(jù)結(jié)構(gòu),并將其中的 driver指針指向設備驅(qū)動程序的 i2c_driver 數(shù)據(jù)結(jié)構(gòu)。 /* and our access routines */ void *data。 unsigned int flags。注意不要直接調(diào)用 i2c_driver數(shù)據(jù)結(jié)構(gòu)中的這兩個方法 ,而要通過如下函數(shù)調(diào)用路徑: i2c_use_client i2c_inc_use_client inc_use i2c_release_client i2c_dec_use_client dec_use 通過最頂層的 i2c_use/release_client 函數(shù)來同時改變 i2c 設備和 i2c 適配器驅(qū)動程序模塊的引用計數(shù)。 其中 name 為最大長度為 32 字節(jié)的字符串, id 可選 0xf000 到 0xffff 中的任一數(shù)值, flags 域可以直接設置為 I2C_DF_NOTIFY。 int (*mand)(struct i2c_client *client,unsigned int cmd, void *arg)。 int id。 2. i2c 總線適配器驅(qū)動:定義描述具體 i2c 總線適配器的 i2c_adapter 數(shù)據(jù)結(jié)構(gòu)、實現(xiàn)在具體 i2c 適配器上的 i2c 總線通信方法,并由 i2c_algorithm 數(shù)據(jù)結(jié)構(gòu)進行描述。目錄 1 聲明 你可以自由地隨意修改本文檔的任何文字內(nèi)容及圖表,但是如果你在自己的文檔中以任何形式直接引用了本文檔的任何原有文字或圖表并希望發(fā)布你的文檔,那么你也得保證讓所有得到你的文檔的人同時享有你曾經(jīng)享有過的權(quán)利。 3. i2c 設備驅(qū)動:定義描述具體設備的 i2c_client 和可能的私有數(shù)據(jù)結(jié)構(gòu)、借助 i2c 框架的 i2c_probe函數(shù)實現(xiàn)注冊設備的 attach_adapter 方法、提供設備可能使用的地址范圍、以及設備地址檢測成功后創(chuàng)建i2c_client 數(shù)據(jù)結(jié)構(gòu)的回調(diào)函數(shù)。 unsigned int flags。 void (*inc_use)(struct i2c_client *client)。 attach_adapter 回調(diào)函數(shù)在安裝 i2c 設備驅(qū)動程序模塊時、或者在安裝 i2c 適配器驅(qū)動程序模塊時被調(diào)用,用于檢測、認領設備并為設備分配 i2c_client 數(shù)據(jù)結(jié)構(gòu)。另外,不能在 attach_adapter 函數(shù)檢測到一個 i2c 設備時就增加驅(qū)動程序模塊的引用計數(shù),而應該在用戶進程訪問一個 /dev/i2c/%d設備節(jié)點時增加模塊的引用計 數(shù),則關閉設備節(jié)點時減少引用計數(shù)(但在當前的應用中,適配器和設備的驅(qū)動程序都是靜態(tài)地鏈接入內(nèi)核映像的,所以在 pxa255 的 i2c 補丁中并沒有使用控制引用計數(shù)的函數(shù))。 /* div., see below */ unsigned int addr。 /* for the clients */ int usage_count。這樣將來就可以使用 i2c_driver 中的注銷設備和控制引用計數(shù)的方法了。由于設備可能支持多個地址,所以在設備驅(qū)動程序模塊中要指出需要檢測的地址范圍(由 i2c_client_address_data 二維數(shù)組指定),而設備實際使用的地址在檢測成功并為之分配 i2c_client 數(shù)據(jù)結(jié)構(gòu)時填入。 需要說明的是, i2c 設備的 7 位地址是就當前 i2c 總線而言的,是“相對地址”。私有數(shù)據(jù)結(jié)構(gòu)由 i2c_client 數(shù)據(jù)結(jié)構(gòu)中的 data 域指向。 有關設計私有數(shù)據(jù)的的討論可參見本文末尾的 討論部分 。 unsigned int id。 void (*dec_use)(struct i2c_adapter *)。 /* private data for the adapter */ struct semaphore lock。 int timeout。 endif endif /* def CONFIG_PROC_FS */ }。 一個 i2c 適配器上的 i2c 總線通信方法由其驅(qū)動程序提供的 i2c_algorithm 數(shù)據(jù)結(jié)構(gòu)描述,由 algo 指針指向。 inc_use 和 dec_use 方法可以用來控制適配器驅(qū)動程序的引用計數(shù); client_register 和 client_unregister 函數(shù)可以用來完成適配器端的、額外的設備注冊和注銷工作。 /* textual description */ unsigned int id。 int (*slave_recv)(struct i2c_adapter *,char*,int)。 master_xfer/smbus_xfer 指針指向 i2c 適配器驅(qū)動程序模塊實現(xiàn)的 i2c 通信協(xié)議或者 smbus 通信協(xié)議。 i2c_algorithm 提供了 i2c 適配器的驅(qū)動,而 i2c 設備的驅(qū)動為 i2c_driver。在閱讀下文時請經(jīng)常參照下圖。 i2c_init 函數(shù) i2ccore 模塊的初始化函數(shù)如下: static int __init i2c_init(void) { printk(KERN_DEBUG : i2c core module\n)。 driver_count=0。driver_lock)。 struct semaphore adap_lock。 這里首先初始化 adapters 和 drivers 指針數(shù)組及相關信號量 adap_lock 和 driver_lock,并將計數(shù)器清 0。 i2cproc_init 函數(shù) 該函數(shù)用于創(chuàng)建描述系統(tǒng)中所有 i2c 總線的 /proc/bus/i2c 文件。 i2cproc_cleanup()。proc_fs_type)。 err = PTR_ERR(proc_mnt)。 } …… proc_bus = proc_mkdir(bus, 0)。在此不再贅述,可參見內(nèi)核文檔 Documentation/i2c/procinterface。 i2cproc_cleanup()。 if (LINUX_VERSION_CODE = KERNEL_VERSION(2,3,27)) proc_bus_i2cowner = THIS_MODULE。 return 0。 wait_queue_head_t wait。 unsigned int msg_ptr。 u32 icrlog[32]。所以在 pxa_i2c數(shù)據(jù)結(jié)構(gòu)中設計了等待隊列首部 wait 域。 自旋鎖在嵌 入式應用中往往都退化為實現(xiàn)中斷禁區(qū),另外當前應用所采用的 版本 Linux 中尚不支持內(nèi)核態(tài)搶占,所以自旋鎖的分配、釋放操作也無需改變原子性計數(shù) preempt_count。由于在 i2c 操作的開始必須由 master 將 slave 設備的地址“上傳”到 i2c 總線上,所以一次讀操作就至少包兩個交互:第一次為寫操作,由 master 在發(fā)送 START 分節(jié)后發(fā)出 slave 的地址及 WR 位段,等待 slave 回送 ACK 分節(jié),然后 master 寫入的第 2 個字節(jié)可以為待讀出的寄存器編號;第二次為讀操作, master 接收到 slave 回送的 ACK 分節(jié)后重新發(fā)送 START 分節(jié),以告知 slave 設備可以開始發(fā)送數(shù)據(jù) 了。 short len。 flags 中的標志位描述該 i2c 操作的屬性,比如是讀還是寫。最后 icrlog 和 isrlog 數(shù)組分別是 i2c 控制寄存器和狀態(tài)寄存器的部分歷史記錄,可用作調(diào)試信息。 i2c_pxa_algorithm 描述了 pxa255 的 i2c 適配器上的總線通信方法,其 ID 為 I2C_ALGO_PXA,定義于linux/。但是這個函數(shù)在當前我使用的 內(nèi)核中還不存在,于是我就直接把 所指向的方法直接當作了模塊的初始化函數(shù)。 int ret。 首先將局部變量 i2c 指向靜態(tài)創(chuàng)建的 pxa_i2c 類型的數(shù)據(jù)結(jié)構(gòu)對象,然后開 啟 PXA255 的 i2c 適配器的時鐘源,并注冊 i2c 適配器的中斷處理程序。 該中斷源的名字是“ pxa2xxi2c”?,F(xiàn)在當 i2c 適配器中斷處理程序執(zhí)行時,內(nèi)核將傳 遞 i2c_pxa 數(shù)據(jù)結(jié)構(gòu)的地址。 i2c_pxa 數(shù)據(jù)結(jié)構(gòu)的主體是 i2c_adapter 數(shù)據(jù)結(jié)構(gòu),將其中的 algo_data 指針指向整個 i2c_pxa 數(shù)據(jù)結(jié)構(gòu)的起始,這樣通過 就可以找到 i2c_pxa 數(shù)據(jù)結(jié)構(gòu)了。 free_irq(IRQ_I2C, i2c)。 i2c_add_adapter 函數(shù) 該函數(shù)用于向內(nèi)核注冊描述適配器及其驅(qū)動程序的 i2c_adapter 數(shù)據(jù)結(jié)構(gòu): int i2c_add_adapter(struct i2c_adapter *adap) { int i,j,res。 i++) if (NULL == adapters[i]) break。 } adapters[i] = adap。注意在訪問全局數(shù)組期間要持有 adap_lock 信號量。 struct proc_dir_entry *proc_entry。 res = ENOENT。 if (LINUX_VERSION_CODE = KERNEL_VERSION(2,3,48)) proc_entryproc_fops = amp。 endif if (LINUX_VERSION_CODE = KERNEL_VERSION(2,3,27)) proc_entryowner = THIS_MODULE。 } endif /* def CONFIG_PROC_FS */ proc 文件的訪問方法由 i2cproc_operations 結(jié)構(gòu)體定義,其中只定義了讀方法為 i2cproc_bus_read,這個函數(shù)通過訪問 i2c_adapter數(shù)據(jù)結(jié)構(gòu)中的 clients 數(shù)組,向用戶進程返回在該 i2c 總線上所有已注冊的設備的信息(可以參見內(nèi)核 文檔 Documentation/i2c/procinterface)。j++) if (drivers[j]!=NULL amp。 if it fails, too bad */ drivers[j]attach_adapter(adap)。 最后遍歷系統(tǒng)上所有已注冊的 i2c 設備驅(qū)動程序,讓它們都來嘗試認領新注冊的 i2c 適配器上的所有 i2c 設備,詳見 ltc3445 設備驅(qū)動程序分析 。 ERROR0: ADAP_UNLOCK()。 ADAP_LOCK()。 if (I2C_ADAP_MAX == i) { printk( : unregister_adapter adap [%s] not found.\n, adapname)。 第 3 章 安裝、卸載 pxa255 的 i2c 適配器驅(qū)動程序 18 /* DUMMY drivers do not register their clients, so we have to * use a trick here: we call driverattach_adapter to * *detach* it! Of course, each dummy driver should know about * this or hell will break loose... */ DRV_LOCK()。amp。 goto ERROR1。 /* detach any active clients. This must be done first, because * it can fail。 if (client!=NULL) /* detaching devices is unconditional of the set notify * flag, as _all_ clients that reside on the adapter * must be deleted, as this would cause invalid states. */ if ((res=clientdriverdetach_client(client))) { printk(: ad
點擊復制文檔內(nèi)容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1