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位組成。由使用者自己設定,通常...