嵌入式linux IIC驅動

2021-10-02 22:39:10 字數 3488 閱讀 8263

linux驅動和裝置隔離,驅動分層,iic驅動框架分為兩部分

1.1 iic匯流排驅動

platform是虛擬匯流排,針對沒有匯流排的裝置實現,匯流排、裝置、驅動框架,iic不用虛擬,可直接用匯流排bus。iic匯流排驅動有兩個重要資料結構:i2c_adapter, i2c_algorithm。i2c_adapter結構體定義如下:include/linux/i2c.h

struct i2c_adapter
通過iic介面卡操作裝置的api函式都在i2c_algortithm結構體中,i2c_algortithm定義在 include/linux/i2c.h

struct i2c_algorithm 

;

int

i2c_add_adapter

(struct i2c_adapter *adapter)

//使用動態匯流排號

inti2c_add_number_adapter

(struct i2c_adapter *adap)

//使用靜態匯流排號

void

i2c_del_adapter

(struct i2c_adapter *adap)

;

1.2 iic裝置驅動

重點就是兩個結構體,i2c_client和i2c_driver。

struct i2c_client 

;

每檢測到iic裝置就會分配乙個i2c_client,這個結構體和裝置一一對應

struct i2c_driver 

;

probe: iic裝置和驅動匹配成功以後執行probe函式

device_driver :驅動結構體,如果用裝置樹,設定of_match_table成員,表示相容屬性

id_table:沒有使用裝置樹,表示裝置匹配列表

int

i2c_register_driver

(struct module *owner,

struct i2c_driver *driver)

引數 owner 一般為 this_module

driver:需要註冊的i2c_driver結構體

返回值 0 成功 負值 失敗

void

i2c_del_driver

(struct i2c_driver *driver)

1.3 裝置和驅動的匹配過程

iic裝置和驅動的匹配是有iic核心完成的,drivers/i2c/i2c-core.c,提供了一些和具體硬體無關的api函式,i2c_adapter註冊和登出函式,i2c_driver註冊和登出函式。iic裝置和驅動的匹配是由i2c匯流排完成的,結構體i2c_bus_type,定義在drivers/i2c/i2c-core.c

struct bus_type i2c_bus_type =

;

i2c_device_match 是iic裝置和驅動的匹配函式,定義如下

static

inti2c_device_match

(struct device *dev,

struct device_driver *drv)

of_driver_match_device : 裝置樹裝置和驅動的匹配,比較i2c裝置節點的compatible屬性和 of_device_id中的compatible是否相等,相等則匹配

i2c_match_id : 用於傳統無裝置樹的匹配,比較裝置名字和i2c_device_id的name欄位是否相等,相等則匹配

i2c匯流排驅動其實就是soc的i2c控制器驅動,一般soc廠商已經寫好。在imx6ull.dtsi檔案中找到i.mx6u的i2c1控制節點,

i2c1: i2c@021a0000 

;

通過compatible屬性可以再linux原始碼中找到對應的驅動檔案,i.mx6u的i2c介面卡驅動檔案為drivers/i2c/busser/i2c-imx.c

static

struct platform_device_id imx_i2c_devtype=

,,};

module_device_table

(platform, imx_i2c_devtype)

;static

const

struct of_device_id i2c_imx_dt_ids=

,,,}

;module_device_table

(of, i2c_imx_dt_ids)

;。。。

static

struct platform_driver i2c_imx_driver =

,.id_table = imx_i2c_devtype,};

static

int __init i2c_adap_imx_init

(void

)subsys_initcall

(i2c_adap_imx_init)

;static

void __exit i2c_adap_imx_exit

(void

)module_exit

(i2c_adap_imx_exit)

;module_license

("gpl");

module_author

("darius augulis");

module_description

("i2c adapter driver for imx i2c bus");

module_alias

("platform:" driver_name)

;

從以上可以看出i2c介面卡驅動是個標準的platform驅動,當裝置和驅動匹配完成後i2c_imx_probe函式就會執行,主要是完成i2c介面卡的初始化。

i2c_imx_probe 函式主要的工作就是一下兩點:

①、初始化 i2c_adapter,設定 i2c_algorithm 為 i2c_imx_algo,最後向 linux 核心註冊

i2c_adapter。

②、初始化 i2c1 控制器的相關暫存器。

3.1 未使用裝置樹,i2c裝置資訊描述

未使用裝置樹的時候用i2c_board_info 結構體描述具體的i2c裝置,定義如下

struct i2c_board_info 

;

3.2 使用裝置樹,i2c裝置資訊描述

在使用裝置樹的情況下,i2c裝置資訊通過建立相應的節點新增,在i2c1節點下建立子節點,描述具體i2c裝置的有關資訊

3.3 i2c裝置資料收發處理流程

嵌入式Linux SPI驅動

1.1 spi主機驅動 linux使用spi master結構體表示spi主機驅動,定義在 drivers linux spi spi.h transfer 資料傳輸函式 transfer one message spi傳送護具函式,傳送乙個spi message資料 1.2 spi裝置驅動 lin...

嵌入式linux字元裝置驅動

arm linux 驅動 抵岸科技 1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name ...

嵌入式linux字元裝置驅動

1.我們需要先呼叫register chrdev region 或 alloc chrdev region 來向系統申請裝置號 int register chrdev region dev t first,unsigned int count,char name 函式通過已知的裝置號first來註冊...