linux下I2c框架分析之終端裝置(三)

2021-10-07 11:08:15 字數 2942 閱讀 6238

linux下i2c框架分析之終端裝置(三)

平台:君正x1000

核心:linux3.5

經過前面兩篇文章已經知道了i2c框架的大概結構和介面卡註冊,現在分析i2c終端裝置的驅動,作為普通的驅動工程師,一般都是拿著已有的驅動修改適配產品的sensor,這就是修改的終端驅動了,對咱們也是很重要。

此時要關注乙個關鍵的已經例項化的結構

i2c匯流排

i2c終端裝置和驅動都掛載在它下面,match不斷掃瞄device和driver兩個鍊錶進行匹配,在 /sys/bus/能看到這個i2c

struct bus_type i2c_bus_type =

;

i2c終端的例項化使用i2c_board_info結構描述

struct i2c_board_info 

;

板級檔案中使用i2c_board_info初始化type和addr

#define i2c_board_info(dev_type, dev_addr) \

.type = dev_type, .addr = (dev_addr)

註冊i2c終端裝置

註冊i2c終端裝置有兩種方法

方法一:

靜態註冊,使用此函式申請i2c裝置資訊結構體,將i2c匯流排號和裝置資訊賦值給裝置資訊結構體,並且將裝置資訊結構體的鍊錶插入到__i2c_board_list中

int __init i2c_register_board_info

(int busnum,

struct i2c_board_info const

*info,

unsigned len)

devinfo->busnum = busnum;

devinfo->board_info =

*info;

list_add_tail

(&devinfo->list,

&__i2c_board_list);}

up_write

(&__i2c_board_lock)

;return status;

}

還記得linux下i2c框架分析之介面卡(二)中最後i2c_register_adapter介面實現嗎

static

inti2c_register_adapter

(struct i2c_adapter *adap)

當終端裝置插入到鍊錶後就等待i2c_register_adapter函式註冊介面卡時呼叫i2c_scan_static_board_info(adap)函式通過遍歷__i2c_board_list鍊錶找到註冊的裝置,呼叫i2c_new_device函式把鍊錶中的每個成員構造成乙個i2c_client。

struct i2c_client *

i2c_new_device

(struct i2c_adapter *adap,

struct i2c_board_info const

*info)

int

device_register

(struct device *dev)

int

device_add

(struct device *dev)

int

bus_add_device

(struct device *dev)

void

bus_probe_device

(struct device *dev)

int

device_attach

(struct device *dev)

int

bus_for_each_drv

(struct bus_type *bus,

struct device_driver *start,

void

*data,

int(

*fn)

(struct device_driver *

,void*)

)

static

int__device_attach

(struct device_driver *drv,

void

*data)

終端裝置的註冊咱們暫且先分析這,剩下的函式呼叫放到驅動中分析更合適明了;

方法二

從使用者空間建立裝置(詳細閱讀/documentation/i2c/instantiating-devices文件)

執行命令cd /sys/class/i2c-adapter/,可以看到內容i2c-0 i2c-1 i2c-2,說明有多款介面卡

< 做下面實驗需要把核心中靜態編譯進的drv驅動給去掉,然後載入自己的drv驅動》

建立裝置

echo at24c08 0x50 > /sys/class/i2c-adapter/i2c-0/new_device,導致i2c_new_device被呼叫,最後drv裡的probe 函式就不會被呼叫。如果把位址改為0x51,那麼也會在bus的dev鍊錶中增加乙個dev結構,所以這種方法也是不會判斷位址是否正確。

刪除裝置

echo 0x50 > /sys/class/i2c-adapter/i2c-0/delete_device,導致i2c_unregister_device。

Linux 下I2C裝置驅動新框架

本文只介紹linux下i2c新驅動框架技術,老框架在原blog中有提及,這裡不詳述。linux新的i2c驅動框架下,i2c裝置是以i2c client的形式存在的,即裝置i2c client與i2c驅動相對應。i2c裝置驅動可以理解成i2c client驅動。在i2c匯流排驅動載入的時候,i2c b...

Linux 下I2C 驅動架構全面分析

i2c只有兩條線,一條序列資料線sda,一條是時鐘線scl。使用scl sda這兩根資料線就實現了裝置之間的資料互動。i2c匯流排廣泛用於eeprom,實時時鐘rtc,小型lcd等裝置與cpu的介面中。linux 的iic分3個部分組成 i2c核心 i2c核心提供了匯流排驅動,裝置驅動的註冊 登出方...

linux裝置驅動之I2C

裝置結構體i2c client中addr的低8位表示裝置位址。裝置位址由讀寫位 器件型別和自定義位址組成,第7位是r w位,0表示寫,1表示讀,所以i2c裝置通常有兩個位址,即讀位址和寫位址型別器件由中間4位組成,這是由半導體公司生產的時候就已經固化了。自定義型別由低3位組成。由使用者自己設定,通常...