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

正文內容

i2c內核數(shù)據(jù)結構之間的關系(編輯修改稿)

2024-09-26 14:13 本頁面
 

【文章內容簡介】 。 /* private data for the adapter */ struct semaphore lock。 unsigned int flags。 /* flags specifying div. data */ struct i2c_client *clients[I2C_CLIENT_MAX]。 int client_count。 int timeout。 int retries。 ifdef CONFIG_PROC_FS /* No need to set this when you initialize the adapter */ int inode。 if LINUX_VERSION_CODE KERNEL_VERSION(2,1,29) struct proc_dir_entry *proc_entry。 endif endif /* def CONFIG_PROC_FS */ }。 在 i2c_adapter 數(shù)據(jù)結構中設計了 clients 指針數(shù)組,指向該總線上每個設備的 i2c_client 數(shù)據(jù)結構。由于一條 i2c 總線上最多只有 I2C_CLENT_MAX 個設備,所以可以使用靜態(tài)數(shù)組(題外話,如果相關數(shù)據(jù)結構的個數(shù)是未知的 ,鏈表顯然是更好的選擇)。 lock 信號量用于實現(xiàn)對 i2c 總線的互斥訪問:在訪問 i2c 總線上的任一設備期間當前進程必須首先獲得該信號量,并且在阻塞等待 i2c 操作完成期間不釋放。 一個 i2c 適配器上的 i2c 總線通信方法由其驅動程序提供的 i2c_algorithm 數(shù)據(jù)結構描述,由 algo 指針指向。i2c_algorithm 數(shù)據(jù)結構即為 i2c_adapter 數(shù)據(jù)結構與具體 i2c 適配器的總線通信方法的中間層,由下文可見正是這個中間層使得上層的 i2c 框架代碼與與具體 i2c 適配器的總線通信方法無關,從而實現(xiàn)了 i2c 框架 的可移植性和重用性。當安裝具體 i2c 適配器的驅動程序時由相應驅動程序實現(xiàn)具體的 i2c_algorithm 數(shù)據(jù)結構,其中的函數(shù)指針指向操作具體 i2c 適配器的代碼(換用面向對象的語言,就是當創(chuàng)建子類對象時將基第 1 章 i2c 核心數(shù)據(jù)結構之間的關系 7 類中定義的函數(shù)調用接口實例化為與具體子類相關的代碼。值得說明的是,在 Linux內核層次中數(shù)據(jù)結構的設計大量地采用了面向對象的概念來實現(xiàn)框架的可移植性和重用性)。 inc_use 和 dec_use 方法可以用來控制適配器驅動程序的引用計數(shù); client_register 和 client_unregister 函數(shù)可以用來完成適配器端的、額外的設備注冊和注銷工作。這些函數(shù)在當前 pxa255 的 i2c 補丁中都沒有實現(xiàn)。最后 timeout 和 retries 用于超時重傳機制。 4. 具體 i2c 適配器的通信方法由 i2c_algorithm 數(shù)據(jù)結構進行描述: struct i2c_algorithm { char name[32]。 /* textual description */ unsigned int id。 int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)。 int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr, unsigned short flags, char read_write, u8 mand, int size, union i2c_smbus_data * data)。 int (*slave_send)(struct i2c_adapter *,char*,int)。 int (*slave_recv)(struct i2c_adapter *,char*,int)。 int (*algo_control)(struct i2c_adapter *, unsigned int, unsigned long)。 u32 (*functionality) (struct i2c_adapter *)。 }。 master_xfer/smbus_xfer 指針指向 i2c 適配器驅動程序模塊實現(xiàn)的 i2c 通信協(xié)議或者 smbus 通信協(xié)議。由下文分析可見在用戶進程通過 i2cdev 提供的 /dev/i2c/%d 設備節(jié)點訪問 i2c 設備時,最終是通過調用master_xfer 或者 smbus_xfer 指向的方法完成的。 slave_send/recv函數(shù)用于實現(xiàn)當 i2c適配器扮演 slave角色時的傳輸方法。由于在 pxa255的現(xiàn)有應用中其 i2c適配器始終為主導 i2c 通信的 master,故補丁中這兩個函數(shù)都沒有實現(xiàn)。 i2c_algorithm 提供了 i2c 適配器的驅動,而 i2c 設備的驅動為 i2c_driver。內核中靜態(tài)指針數(shù)組 adapters 和drivers 分別記錄所有已經注冊的 i2c 總線設備和 i2c 設備驅動。從下文源代碼分析可以看到,安裝 i2c 總線驅動和 i2c 設備驅動的順序不確定,因此在安裝 i2c設備驅動時必須遍歷所有已注冊的適配器上的 i2c 設備,以“認領”相應的設備;同理,在安裝 i2c 適配器驅動時必須遍歷所有已注冊的 i2c 設備的驅動程序,讓已有驅動程序“認領”新注冊的適配器上的所有設備。 5. 假設一條 i2c 總線上有兩個使用相同驅 動程序的 i2c 設備,在打開該 i2c 總線的設備結點后相關數(shù)據(jù)結構之間的邏輯組織關系如下圖所示。在閱讀下文時請經常參照下圖。 上層的 i2c 框架實現(xiàn)了控制策略,具體 i2c 適配器和設備的驅動實現(xiàn)了使具體設備可用的機制,上層策略和底層機制通過中間的函數(shù)調用接口聯(lián)系。正是中間的函數(shù)調用接口使得上層策略與底層機制無關,從而使得上層策略具有良好的可移植性和重用性。閱讀完全文后可以回過頭來總結一下各數(shù)據(jù)結構的作用、創(chuàng)建時機、由誰創(chuàng)建等,品味這一點是如何通過這些數(shù)據(jù)結構實現(xiàn)的,進一步在自己的研發(fā)過程中積極實踐這種思想并享受學 以致用的樂趣:) 第 1 章 i2c 核心數(shù)據(jù)結構之間的關系 8 i2c_msg i2c_algorithm name id master_xfer smbus_xfer …… algo_control functionality name id flags attach_adapter detach_client mand inc_use dec_use i2c_driver name id flags addr adapter driver data usage_count i2c_client name id flags addr adapter driver data usage_count i2c_client lock wait msg msg_num msg_idx msg_ptr …… name id algo_data algo inc_use dec_use client_register client_unregister data lock flags client_count timeout retries clients pxa_i2c addr flags len buf i2c_pxa_xfer ltc3445_attach_adapter …… addr adapter driver …… i2c_client ltc3445_detach_adapter adapters[ ] drivers[ ] file …… f_op private_data i2cdev_open i2cdev_read i2cdev_write i2cdev_ioctl i2cdev_fops 第 2 章 的初始化 9 第 2 章 的初始化 i2c 框架的主體代碼,包括 i2c 適配器驅動和設備驅動的注冊、注銷管理的框架代碼、 i2c通信方法的上層、與具體適配器無關的代碼和檢測設備地址的上層代碼等。 i2c_init 函數(shù) i2ccore 模塊的初始化函數(shù)如下: static int __init i2c_init(void) { printk(KERN_DEBUG : i2c core module\n)。 memset(adapters,0,sizeof(adapters))。 memset(drivers,0,sizeof(drivers))。 adap_count=0。 driver_count=0。 init_MUTEX(amp。adap_lock)。 init_MUTEX(amp。driver_lock)。 在 中定義了內核靜態(tài)指針數(shù)組 adapters 和 drivers,用于注冊描述 i2c 適配器及其驅動程序的i2c_adapter 數(shù)據(jù)結構和描述設備及其驅動程序的 i2c_driver 數(shù)據(jù)結構。同時也定義了保護這兩個全局指針數(shù)組的信號量: static struct i2c_adapter *adapters[I2C_ADAP_MAX]。 static struct i2c_driver *drivers[I2C_DRIVER_MAX]。 struct semaphore adap_lock。 struct semaphore driver_lock。 其中表示適配器和驅動程序最大數(shù)量的宏在 linux/ 中均被定義為 16。由于安裝 i2c 適配器驅動程序模塊和 i2c 設備驅動程序模塊的先后順序不確定,所以必須通過全局數(shù)據(jù)結構(比如這里的指針數(shù)組或者鏈表等)來保存所有已安裝的數(shù)據(jù)結構的地址,這樣在后安裝 i2c 適配器驅動程序時就可將 drivers指針數(shù)組中記錄的地址傳遞給 i2c_add_adapter 函數(shù);在后安裝 i2c 設備驅動程序時就可將 adapters 指針數(shù)組中記錄的地址傳遞給 i2c_add_driver 函數(shù)(而這兩個函數(shù)最終都是通過 attach_adapter 函數(shù)“認領”設備的)。 這里首先初始化 adapters 和 drivers 指針數(shù)組及相關信號量 adap_lock 和 driver_lock,并將計數(shù)器清 0。 i2cproc_init()。 return 0。 } 第 2 章 的初始化 10 然后通過 i2cproc_init 函數(shù)創(chuàng)建相應的 /proc/bus/i2c 文件,使得用戶進程可以通過該文件得到當前系統(tǒng)上所有已注冊的 i2c 總線信息。 i2cproc_init 函數(shù) 該函數(shù)用于創(chuàng)建描述系統(tǒng)中所有 i2c 總線的 /proc/bus/i2c 文件。 int i2cproc_init(void) { struct proc_dir_entry *proc_bus_i2c。 i2cproc_initialized = 0。 if (! proc_bus) { printk(: /proc/bus/ does not exist)。 i2cproc_cleanup()。 return ENOENT。 } 在 proc 接口初始化程度的靜態(tài)變量 i2cproc_initialized,其初始值為 0。內核全局變量 proc_bus 定義于 fs/proc/,聲明于 include/linux/,在 fs/proc/ 的 proc_root_init 函數(shù)中初始化: struct proc_dir_entry *proc_, *proc_bus, …… void __init proc_root_init(void) { int err = register_filesystem(amp。proc_fs_type)。 if (err) return。 proc_mnt = kern_mount(amp。proc_fs_type)。 err = PTR_ERR(proc_mnt)。 if (IS_ERR(proc_mnt)) { unregister_filesystem(amp。proc_fs_type)。 return。 } …… proc_bus = proc_mkdir(bus, 0)。 } 可見在 proc_root_init函數(shù)中注冊、掛載 p
點擊復制文檔內容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1