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

正文內(nèi)容

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

2025-07-18 14:13 本頁面


【正文】 ............................ 55 i2cdev_release 函數(shù) ........................................................................................................................ 58 第 8 章 編寫 i2c 設(shè)備驅(qū)動(dòng)程序模塊的方法 ............................................................................................ 60 第 9 章 用戶進(jìn)程訪問 i2c 設(shè)備的步驟 ................................................................................................... 63 討論和總結(jié) .......................................................................................................................................... 64 i2c 操作中的同步問題 .................................................................................................................... 64 總結(jié)各個(gè)模塊初始化函數(shù)的作用 .................................................................................................... 64 對(duì) i2c 框架代碼的修改 ................................................................................................................... 65 有關(guān) i2c 設(shè)備私有數(shù)據(jù)結(jié)構(gòu)的討論 ................................................................................................. 67 遺留的問題 ................................................................................................................................... 67 (注意:本文檔中的源代碼以 上下載的 pxa 的 i2c 適配器的補(bǔ)丁 23602為準(zhǔn)?。┑?1 章 i2c 核心數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 3 第 1 章 i2c 核心數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 i2c 總線適配器( adapter)就是一條 i2c 總線的控制器,在物理連接上若干 i2c 設(shè)備并聯(lián)于該 i2c 總線的 SCL和 SDA線上,如下圖所示: 那么相應(yīng)軟件數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系就至少應(yīng)該描述硬件物理連接的這種組織關(guān)系。 Linux的 i2c 框架中各個(gè)部分的關(guān)系如下圖所示: SDA pxa255 I2C LTC3445 other device SCL 第 1 章 i2c 核心數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 4 內(nèi)核中 i2c 相關(guān)代碼可以分為三個(gè)層次: 1. i2c 框架: 和 為 i2c 框架的主體,提供了核心數(shù)據(jù)結(jié)構(gòu)的定義、 i2c 適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、 注銷管理, i2c 通信方法上層的、與具體適配器無關(guān)的代碼、檢測(cè)設(shè)備地址的上層代碼等; 用于創(chuàng)建 i2c 適配器的 /dev/i2c/%d 設(shè)備節(jié)點(diǎn),提供 i2c 設(shè)備訪問方法等。 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)行描述。 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ù)。 下面介紹 i2c 各核心數(shù)據(jù)結(jié)構(gòu)的定義和它們之間的連接關(guān)系。 1. 一個(gè) i2c 設(shè)備的驅(qū)動(dòng)程序由 i2c_driver 數(shù)據(jù)結(jié)構(gòu)描述,定義于 include/linux/: struct i2c_driver { char name[32]。 int id。 unsigned int flags。 int (*attach_adapter)(struct i2c_adapter *)。 int (*detach_client)(struct i2c_client *)。 int (*mand)(struct i2c_client *client,unsigned int cmd, void *arg)。 void (*inc_use)(struct i2c_client *client)。 void (*dec_use)(struct i2c_client *client)。 }。 其中 name 為最大長(zhǎng)度為 32 字節(jié)的字符串, id 可選 0xf000 到 0xffff 中的任一數(shù)值, flags 域可以直接設(shè)置為 I2C_DF_NOTIFY。 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)。 detach_client 方法在卸載適配器或設(shè)備驅(qū)動(dòng)程序模塊時(shí)被調(diào)用,用于從總線上注銷設(shè)備、并釋放 i2c_client 及相應(yīng)的私有數(shù)據(jù)結(jié)構(gòu)。 inc_use 和 dec_use 所指向的函數(shù)用于改變 i2c 設(shè)備驅(qū)動(dòng)程序模塊的引用計(jì)數(shù)。注意不要直接調(diào)用 i2c_driver數(shù)據(jù)結(jié)構(gòu)中的這兩個(gè)方法 ,而要通過如下函數(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ù)來同時(shí)改變 i2c 設(shè)備和 i2c 適配器驅(qū)動(dòng)程序模塊的引用計(jì)數(shù)。另外,不能在 attach_adapter 函數(shù)檢測(cè)到一個(gè) i2c 設(shè)備時(shí)就增加驅(qū)動(dòng)程序模塊的引用計(jì)數(shù),而應(yīng)該在用戶進(jì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ǔ)丁中并沒有使用控制引用計(jì)數(shù)的函數(shù))。 第 1 章 i2c 核心數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 5 2. 一個(gè) i2c 設(shè)備由 i2c_client 數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述: struct i2c_client { char name[32]。 int id。 unsigned int flags。 /* div., see below */ unsigned int addr。 /* chip address NOTE: 7bit addresses are stored in the */ /* _LOWER_ 7 bits of this char */ struct i2c_adapter *adapter。 /* the adapter we sit on */ struct i2c_driver *driver。 /* and our access routines */ void *data。 /* for the clients */ int usage_count。 /* How many accesses currently to the client */ }。 在安裝適配器或者設(shè)備的驅(qū)動(dòng)程序時(shí)通過設(shè)備驅(qū)動(dòng)程序 i2c_driver 中的 attach_adapter 函數(shù)檢測(cè)設(shè)備地址。如果檢測(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)。這樣將來就可以使用 i2c_driver 中的注銷設(shè)備和控制引用計(jì)數(shù)的方法了。 由下文可見在描述 i2c 適配器的 i2c_adapter 數(shù)據(jù)結(jié)構(gòu)中設(shè)計(jì)了指向該總線上所有 i2c 設(shè)備的 i2c_client 數(shù)據(jù)結(jié)構(gòu)的指針數(shù)組 clients,而每 個(gè) i2c_client 又通過 adapter 指針回指 i2c_adapter。數(shù)據(jù)結(jié)構(gòu)之間類似的組織關(guān)系在 Linux內(nèi)核中屢見不鮮,比如父子進(jìn)程的 PCB之間、父目錄及子目錄和子文件的 dentry 之間,等等。 每個(gè) i2c 設(shè)備都有唯一的 7 位地址 addr。由于設(shè)備可能支持多個(gè)地址,所以在設(shè)備驅(qū)動(dòng)程序模塊中要指出需要檢測(cè)的地址范圍(由 i2c_client_address_data 二維數(shù)組指定),而設(shè)備實(shí)際使用的地址在檢測(cè)成功并為之分配 i2c_client 數(shù)據(jù)結(jié)構(gòu)時(shí)填入。以 i2c 設(shè)備 ltc3445 為例,硬件支持的地址為 1001011 或者 0101011,即7 位地址的高 2 位由具體的布線方法決定(可以分別接到 VCC 或者 GND)。如果 ltc3445 驅(qū)動(dòng)程序的開發(fā)者知道具體的布線方法,那么在驅(qū)動(dòng)程序中就可以直接指定。否則可以指定地址檢測(cè)范圍為這兩個(gè)地址,而在加載驅(qū)動(dòng)程序模塊時(shí)由軟件進(jìn)行地址檢測(cè)。 需要說明的是, i2c 設(shè)備的 7 位地址是就當(dāng)前 i2c 總線而言的,是“相對(duì)地址”。不同的 i2c 總線上的設(shè)備可以使用相同的 7 位地址,但是它們所在的 i2c 總線不同。所以在系統(tǒng)中一個(gè) i2c 設(shè)備的“絕對(duì)地址”由二元組( i2c 適配器的 ID 和設(shè)備在該總線 上的 7 位地址)表示。 i2c_client 數(shù)據(jù)結(jié)構(gòu)為描述 i2c 設(shè)備的“模板”,而具體的 i2c 設(shè)備可能需要描述個(gè)性的私有數(shù)據(jù)。私有數(shù)據(jù)結(jié)構(gòu)由 i2c_client 數(shù)據(jù)結(jié)構(gòu)中的 data 域指向。設(shè)備驅(qū)動(dòng)程序開發(fā)者可以設(shè)計(jì)合適的私有數(shù)據(jù)結(jié)構(gòu)來描述硬件的特性。值得一提的是,目前在 Linux內(nèi)核中常用的表示與具體設(shè)備、對(duì)象等相關(guān)的私有數(shù)據(jù)結(jié)構(gòu)的方法有兩種,一種就是采用 void類型的指針 data來指向具體的私有數(shù)據(jù)結(jié)構(gòu),又比如 file結(jié)構(gòu)中的 private_data域在設(shè)備驅(qū)動(dòng)程序中往往被設(shè)置為指向具體的設(shè)備數(shù)據(jù)結(jié)構(gòu);第 二種方法就是采用 union 域,比如 VFS 的super_block、 inode 數(shù)據(jù)結(jié)構(gòu)。 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。 有關(guān)設(shè)計(jì)私有數(shù)據(jù)的的討論可參見本文末尾的 討論部分 。 第 1 章 i2c 核心數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系 6 當(dāng)不同進(jìn)程訪問同一 i2c 總線時(shí),對(duì) i2c 總 線的互斥訪問由 i2c_adapter 的 lock 信號(hào)量實(shí)現(xiàn),系統(tǒng)調(diào)用執(zhí)行流只有在獲得該信號(hào)量期間才能調(diào)用 master_xfer,并且在阻塞期間不釋放信號(hào)量( 類似在讀寫正規(guī)文件期間必須持有 , 參見本文末尾的 討論部分 )。而 usage_count 域?yàn)樵O(shè)備的使用引用計(jì)數(shù),在i2c_use_client 和 i2c_release_client 函數(shù)中控制 usage_count 域的值(但是當(dāng)前 pxa255 的 i2c 補(bǔ)丁中并沒有使用這兩個(gè)函數(shù), usage_count 的值自初始化后就一直為 0)。 3. 一個(gè) i2c 適配器由 i2c_adapter 數(shù)據(jù)結(jié)構(gòu)描述: struct i2c_adapter { char name[32]。 unsigned int id。 /* == is algoid | id, for registered values see below */ struct i2c_algorithm *algo。 /* the algorithm to access the bus */ void *algo_data。 void (*inc_use)(struct i2c_adapter *)。 void (*dec_use)(struct i2c_adapter *)。 int (*client_register)(struct i2c_client *)。 int (*client_unregister)(struct i2c_client *)。 void *data
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1