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

正文內(nèi)容

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

2022-09-01 14:13:48 本頁(yè)面
 

【正文】 er { char name[32]。 super_block 和 inode 數(shù)據(jù)結(jié)構(gòu)本身集中描述了各種文件系統(tǒng)的共性,而具體文件系統(tǒng)的個(gè)性則放到 union 中進(jìn)行描述,在掛載具體的文件系統(tǒng)時(shí)實(shí)例化為具體的 union 對(duì)象,比如ext2_inode_union 或者 jffs2_inode_info。 i2c_client 數(shù)據(jù)結(jié)構(gòu)為描述 i2c 設(shè)備的“模板”,而具體的 i2c 設(shè)備可能需要描述個(gè)性的私有數(shù)據(jù)。否則可以指定地址檢測(cè)范圍為這兩個(gè)地址,而在加載驅(qū)動(dòng)程序模塊時(shí)由軟件進(jìn)行地址檢測(cè)。 每個(gè) i2c 設(shè)備都有唯一的 7 位地址 addr。如果檢測(cè)成功則調(diào)用設(shè)備驅(qū)動(dòng)程序提供的回調(diào)函數(shù)創(chuàng)建描述設(shè)備的 i2c_client 數(shù)據(jù)結(jié)構(gòu),并將其中的 driver指針指向設(shè)備驅(qū)動(dòng)程序的 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)中的這兩個(gè)方法 ,而要通過(guò)如下函數(shù)調(diào)用路徑: i2c_use_client i2c_inc_use_client inc_use i2c_release_client i2c_dec_use_client dec_use 通過(guò)最頂層的 i2c_use/release_client 函數(shù)來(lái)同時(shí)改變 i2c 設(shè)備和 i2c 適配器驅(qū)動(dòng)程序模塊的引用計(jì)數(shù)。 其中 name 為最大長(zhǎng)度為 32 字節(jié)的字符串, id 可選 0xf000 到 0xffff 中的任一數(shù)值, flags 域可以直接設(shè)置為 I2C_DF_NOTIFY。 int (*mand)(struct i2c_client *client,unsigned int cmd, void *arg)。 int id。 2. i2c 總線適配器驅(qū)動(dòng):定義描述具體 i2c 總線適配器的 i2c_adapter 數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)在具體 i2c 適配器上的 i2c 總線通信方法,并由 i2c_algorithm 數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。目錄 1 聲明 你可以自由地隨意修改本文檔的任何文字內(nèi)容及圖表,但是如果你在自己的文檔中以任何形式直接引用了本文檔的任何原有文字或圖表并希望發(fā)布你的文檔,那么你也得保證讓所有得到你的文檔的人同時(shí)享有你曾經(jīng)享有過(guò)的權(quán)利。 3. i2c 設(shè)備驅(qū)動(dòng):定義描述具體設(shè)備的 i2c_client 和可能的私有數(shù)據(jù)結(jié)構(gòu)、借助 i2c 框架的 i2c_probe函數(shù)實(shí)現(xiàn)注冊(cè)設(shè)備的 attach_adapter 方法、提供設(shè)備可能使用的地址范圍、以及設(shè)備地址檢測(cè)成功后創(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 設(shè)備驅(qū)動(dòng)程序模塊時(shí)、或者在安裝 i2c 適配器驅(qū)動(dòng)程序模塊時(shí)被調(diào)用,用于檢測(cè)、認(rèn)領(lǐng)設(shè)備并為設(shè)備分配 i2c_client 數(shù)據(jù)結(jié)構(gòu)。另外,不能在 attach_adapter 函數(shù)檢測(cè)到一個(gè) i2c 設(shè)備時(shí)就增加驅(qū)動(dòng)程序模塊的引用計(jì)數(shù),而應(yīng)該在用戶進(jìn)程訪問(wèn)一個(gè) /dev/i2c/%d設(shè)備節(jié)點(diǎn)時(shí)增加模塊的引用計(jì) 數(shù),則關(guān)閉設(shè)備節(jié)點(diǎn)時(shí)減少引用計(jì)數(shù)(但在當(dāng)前的應(yīng)用中,適配器和設(shè)備的驅(qū)動(dòng)程序都是靜態(tài)地鏈接入內(nèi)核映像的,所以在 pxa255 的 i2c 補(bǔ)丁中并沒(méi)有使用控制引用計(jì)數(shù)的函數(shù))。 /* div., see below */ unsigned int addr。 /* for the clients */ int usage_count。這樣將來(lái)就可以使用 i2c_driver 中的注銷(xiāo)設(shè)備和控制引用計(jì)數(shù)的方法了。由于設(shè)備可能支持多個(gè)地址,所以在設(shè)備驅(qū)動(dòng)程序模塊中要指出需要檢測(cè)的地址范圍(由 i2c_client_address_data 二維數(shù)組指定),而設(shè)備實(shí)際使用的地址在檢測(cè)成功并為之分配 i2c_client 數(shù)據(jù)結(jié)構(gòu)時(shí)填入。 需要說(shuō)明的是, i2c 設(shè)備的 7 位地址是就當(dāng)前 i2c 總線而言的,是“相對(duì)地址”。私有數(shù)據(jù)結(jié)構(gòu)由 i2c_client 數(shù)據(jù)結(jié)構(gòu)中的 data 域指向。 有關(guān)設(shè)計(jì)私有數(shù)據(jù)的的討論可參見(jiàn)本文末尾的 討論部分 。 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 */ }。 一個(gè) i2c 適配器上的 i2c 總線通信方法由其驅(qū)動(dòng)程序提供的 i2c_algorithm 數(shù)據(jù)結(jié)構(gòu)描述,由 algo 指針指向。 inc_use 和 dec_use 方法可以用來(lái)控制適配器驅(qū)動(dòng)程序的引用計(jì)數(shù); client_register 和 client_unregister 函數(shù)可以用來(lái)完成適配器端的、額外的設(shè)備注冊(cè)和注銷(xiāo)工作。 /* textual description */ unsigned int id。 int (*slave_recv)(struct i2c_adapter *,char*,int)。 master_xfer/smbus_xfer 指針指向 i2c 適配器驅(qū)動(dòng)程序模塊實(shí)現(xiàn)的 i2c 通信協(xié)議或者 smbus 通信協(xié)議。 i2c_algorithm 提供了 i2c 適配器的驅(qū)動(dòng),而 i2c 設(shè)備的驅(qū)動(dòng)為 i2c_driver。在閱讀下文時(shí)請(qǐng)經(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ù)組及相關(guān)信號(hào)量 adap_lock 和 driver_lock,并將計(jì)數(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)。在此不再贅述,可參見(jiàn)內(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)中設(shè)計(jì)了等待隊(duì)列首部 wait 域。 自旋鎖在嵌 入式應(yīng)用中往往都退化為實(shí)現(xiàn)中斷禁區(qū),另外當(dāng)前應(yīng)用所采用的 版本 Linux 中尚不支持內(nèi)核態(tài)搶占,所以自旋鎖的分配、釋放操作也無(wú)需改變?cè)有杂?jì)數(shù) preempt_count。由于在 i2c 操作的開(kāi)始必須由 master 將 slave 設(shè)備的地址“上傳”到 i2c 總線上,所以一次讀操作就至少包兩個(gè)交互:第一次為寫(xiě)操作,由 master 在發(fā)送 START 分節(jié)后發(fā)出 slave 的地址及 WR 位段,等待 slave 回送 ACK 分節(jié),然后 master 寫(xiě)入的第 2 個(gè)字節(jié)可以為待讀出的寄存器編號(hào);第二次為讀操作, master 接收到 slave 回送的 ACK 分節(jié)后重新發(fā)送 START 分節(jié),以告知 slave 設(shè)備可以開(kāi)始發(fā)送數(shù)據(jù) 了。 short len。 flags 中的標(biāo)志位描述該 i2c 操作的屬性,比如是讀還是寫(xiě)。最后 icrlog 和 isrlog 數(shù)組分別是 i2c 控制寄存器和狀態(tài)寄存器的部分歷史記錄,可用作調(diào)試信息。 i2c_pxa_algorithm 描述了 pxa255 的 i2c 適配器上的總線通信方法,其 ID 為 I2C_ALGO_PXA,定義于linux/。但是這個(gè)函數(shù)在當(dāng)前我使用的 內(nèi)核中還不存在,于是我就直接把 所指向的方法直接當(dāng)作了模塊的初始化函數(shù)。 int ret。 首先將局部變量 i2c 指向靜態(tài)創(chuàng)建的 pxa_i2c 類(lèi)型的數(shù)據(jù)結(jié)構(gòu)對(duì)象,然后開(kāi) 啟 PXA255 的 i2c 適配器的時(shí)鐘源,并注冊(cè) i2c 適配器的中斷處理程序。 該中斷源的名字是“ pxa2xxi2c”?,F(xiàn)在當(dāng) i2c 適配器中斷處理程序執(zhí)行時(shí),內(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 指針指向整個(gè) i2c_pxa 數(shù)據(jù)結(jié)構(gòu)的起始,這樣通過(guò) 就可以找到 i2c_pxa 數(shù)據(jù)結(jié)構(gòu)了。 free_irq(IRQ_I2C, i2c)。 i2c_add_adapter 函數(shù) 該函數(shù)用于向內(nèi)核注冊(cè)描述適配器及其驅(qū)動(dòng)程序的 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。注意在訪問(wèn)全局?jǐn)?shù)組期間要持有 adap_lock 信號(hào)量。 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 文件的訪問(wèn)方法由 i2cproc_operations 結(jié)構(gòu)體定義,其中只定義了讀方法為 i2cproc_bus_read,這個(gè)函數(shù)通過(guò)訪問(wèn) i2c_adapter數(shù)據(jù)結(jié)構(gòu)中的 clients 數(shù)組,向用戶進(jìn)程返回在該 i2c 總線上所有已注冊(cè)的設(shè)備的信息(可以參見(jiàn)內(nèi)核 文檔 Documentation/i2c/procinterface)。j++) if (drivers[j]!=NULL amp。 if it fails, too bad */ drivers[j]attach_adapter(adap)。 最后遍歷系統(tǒng)上所有已注冊(cè)的 i2c 設(shè)備驅(qū)動(dòng)程序,讓它們都來(lái)嘗試認(rèn)領(lǐng)新注冊(cè)的 i2c 適配器上的所有 i2c 設(shè)備,詳見(jiàn) ltc3445 設(shè)備驅(qū)動(dòng)程序分析 。 ERROR0: ADAP_UNLOCK()。 ADAP_LOCK()。 if (I2C_ADAP_MAX == i) { printk( : unregister_adapter adap [%s] not found.\n, adapname)。 第 3 章 安裝、卸載 pxa255 的 i2c 適配器驅(qū)動(dòng)程序 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
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1