簡單的說,i2c驅動也就三步吧,註冊i2c裝置,註冊i2c裝置驅動,建立sysfs檔案供上層呼叫。
1. 註冊i2c裝置。
先定義乙個i2c_board_info
static struct i2c_board_info __initdata ***x_i2c_info = ,
};
再註冊,一般會註冊乙個client。
i2c_register_board_info()
強烈建議有興趣的可以看看這個函式的原始碼,可以學到很多。
2. 註冊i2c裝置driver
定義再註冊
static struct i2c_driver ***_i2c_driver = ,
};
註冊函式
i2c_add_driver(&***_i2c_driver);
註冊過程中,主要是呼叫probe函式,如何跑到probe函式裡同樣需要跟**。這裡不詳述。講講probe函式裡主要幹什麼。
static int ***_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
***_sensorw = kzalloc(sizeof(struct ***_work_t), gfp_kernel);
if (!***_sensorw)
i2c_set_clientdata(client, ***_sensorw);
***_init_client(client);
***_client = client;
msleep(50);
printk("%s successed! rc = %d\n", __func__, rc);
return 0;
probe_failure:
printk("%s failed! rc = %d\n", __func__, rc);
return rc;
}
probe函式主要是獲取client,而後便可以通過client中adapter的方法來傳輸資料:
static int ***_i2c_txdata(const uint16_t saddr,
uint8_t *txdata, const uint16_t length)
, };
if (i2c_transfer(***_client->adapter, msg, 1) < 0)
return 0;
}
3. 建立sysfs供上層呼叫
可以通過函式
sysfs_create_group(&(pdev->dev.kobj), &***_attribute_group);
來建立。
以上就是簡要說說,主要還是要看原始碼才能更深的理解這些流程。
i2c裝置驅動
1,i2c 裝置註冊 static struct i2c board info i2c2 devices i2c裝置一般在板級 中註冊 static void msm8916 add i2c deivces void 2,i2c驅動註冊 include static const struct i2c...
I2C協議解析
1 基本概念 主機 初始化傳送,產生時鐘訊號和終止傳送的器件 從機 被主機定址的器件 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 多主機 同時有多於乙個主機嘗試控制匯流排 但不破壞報文 仲裁 是乙個在有多個主機同時嘗試控制匯流排,但只允許其中乙個控制匯流排並使報文不被破壞的過程 ...
i2c 協議解析
1 基本概念 主機 初始化傳送,產生時鐘訊號和終止傳送的器件 從機 被主機定址的器件 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 多主機 同時有多於乙個主機嘗試控制匯流排 但不破壞報文 仲裁 是乙個在有多個主機同時嘗試控制匯流排,但只允許其中乙個控制匯流排並使報文不被破壞的過程 ...