Linux I2C Driver - 使用str8131(3)上面提到使用 ioctl(i2c_fd, I2C_RDWR, (uint32_t)&queue) 把訊息傳給driver,這裡我們要先看i2c-dev.c裡面,然後我們找到 ioctl的函式:static int i2cdev_ioctl(struct inode *inode, struct file 節能燈具*file,        unsigned int cmd, unsigned long arg){   ...   res = i2c_transfer(client->adapter,      rdwr_pa,      土地買賣rdwr_arg.nmsgs);   ...}這裡傳送的參數實際上就是 i2c_adapter、i2c_msg、i2c_msg的數目。這裡的i2c_adapter,就是我們實做bus driver時要用的。例如宣告:#define I2C_HW_STR8131    0x1b0000static struct i2c_algorithm 居酒屋str8131_algorithm = {    master_xfer: str8131_xfer,    algo_control: str8131_ioctl,    functionality: str8131_func,};static struct i2c_adapter str8131_i2c_adapter = {    澎湖民宿name:              "Str8131 i2c",    id:                591I2C_HW_STR8131,    algo:              &str8131_algorithm,};主要就是 str8131_i2c_adapter這個 adapter裡的algo(str8131_algorithm),在這algo指的就是通信方法,婚禮佈置意即實際上的硬體傳輸,我們在這裡指定str8131_xfer 函式,它原形為:static int str8131_xfer(struct i2c_adapter *adapter, struct i2c_msg msgs[], int num)在 bus driver實做的檔案裡的 i2c_init裡呼叫 i2c_add_adapter,加入我們宣告的adapter,在 燒烤i2c_exit裡,呼叫 i2c_del_adapter ,釋放這個 adapter。這裡做的目的是讓我們的 bus driver 的 str8131_xfer 函式被呼叫,因為每個硬體的初化始和動作不一樣, kernel不可能每個硬體都幫你寫好,我們只要依照kernel為i2c規劃的架構,通過 i2c_adapter,和 帛琉kernel 做連結,來操作自已的硬體。總結一下:1. 宣告自已的 i2c_adapter 結構,主要是 algo成員裡面的 master_xfer(函式指標),指定自已的傳輸函式。2. 在自已的 module 的 init裡,呼叫 i2c_add_adapter,加入自已的 i2c_adapter。3. 在user-space時呼叫酒店經紀ioctl,指定I2C_RDWR,會呼叫 i2c-core.c 的 i2c_transfer。4. kernel 會在這裡呼叫已加入的 adapter的 algo的 master_xfer 來做實際的硬體傳輸。5. 在 module 的 exit裡,呼叫 i2c_del_adapter,刪除 adapter。


.msgcontent .wsharing ul li { 酒店打工text-indent: 0; }



分享

Facebook
Plurk
YAHOO!

創作者介紹

Sammi Cheng

hx28hxvpti 發表在 痞客邦 PIXNET 留言(0) 人氣()