作者cutem (大少爺)
看板LinuxDev
標題[問題] 請教linux i2c newstyle驅動的問題
時間Wed Jul 27 14:59:15 2016
在下最近在研究newstyle i2c驅動,網路文章看了一些,
有一點心得,但由於身邊朋友同學並沒有做embedded system
的人,所以想跟各位先進請益一下,我先上一個google 到的sample
,我是把它編譯成module,也就是ko檔。
這個程式稍微改一下就真的可以用insmod掛起來了,本身是屬於動
態偵測i2c device的做法,不過我有一些問題如下:
希望各位大大可以給我一些方向。感謝。
1.掛起來之後,我要怎麼在application層透過這個驅動程式對i2c
裝置進行讀寫動作?因為我看這個例子裡面完全沒有實作跟application
溝通的程式碼?
後來有google到一些思路如下:
a.先將這個struct定義出來,並且把最基本的open,read,write完成
static const struct file_operations i2c_fops = {
.owner = THIS_MODULE,
.open = i2c_open,
.read = i2c_read,
.write = i2c_write,
.unlocked_ioctl = i2c_ioctl,
.release = i2c_release,
};
b.註冊成char device,那麼理論上就可以在application去對driver做讀寫。
register_chrdev(I2C_MAJOR,DEVICE_NAME,&i2c_fops)
2.因為我沒有真的在application進行讀寫device的動作,所以我也不確
定這個程式碼是不是真的ok呢?
#include <linux/i2c.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
Static int i2c_driver_demo_probe(struct i2c_client *client, const struct
i2c_device_id *id)
{
Return 0;
}
static int __devexit i2c_driver_demo_remove(struct i2c_client *client)
{
return 0;
}
static const truct i2c_device_id i2c_driver_demo_id[] = {
{“XXXX”,0},
{}
} ;
MODULE_DEVICE_TABLE(i2c, i2c_driver_demo_id);
int i2c_driver_demo_detect(struct i2c_client *client, struct i2c_board_info
*info)
{
struct i2c_adapter *adapter = client->adapter;
int vendor,device,revision;
if(!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
Return -ENODEV;
/*方法1:获取设备特定寄存器的值,该值要能反映出设备的信息,判断设
备,例如如下代码段
*/
vendor=i2c_smbus_read_byte_data(client,XXXX_REG_VENDOR);
if(vendor!=XXXX_VENDOR)
return-ENODEV;
device=i2c_smbus_read_byte_data(client,XXXX_REG_DEVICE);
if(device!=XXXX_DEVICE)
return -ENODEV;
revision = i2c_smbus_read_byte_data(client, XXXX_REG_REVISION);
if(revision != XXXX_REVISION)
return -ENODEV;
/*方法二:獲取設備的CHIP_ID,判斷設備,例如以下代碼*/
}
/*0x60為I2C設備位址*/
static const unsigned short normal_i2c[] = {0x60 , I2C_CLIENT_END};
static struct i2c_driver i2c_driver_demo = {
.class = I2C_CLASS_HWMON,
.probe = i2c_driver_demo_probe,
.remove = __devexit_p(i2c_driver_demo_remove),
.ip_table = i2c_driver_demo_id,
.driver = {
.name = “XXXX”
.owner = THIS_MODULE,
},
.detect = i2c_driver_demo_detect,
.address_list = normal_i2c,
};
static int __init i2c_driver_demo_init(void)
{
return i2c_add_driver(&i2c_driver_demo);
}
module_init(i2c_driver_demo_init);
module_exit(i2c_driver_demo_exit);
MODULE_AUTHOR("anchor");
MODULE_DESCRIPTION("I2Cdevicedriverdemo");
MODULE_LICENSE("GPL");
补充说明:若I2C设备驱动不能在detect回调函数里访问硬件,可采用如下形式解决,例
如:
inti2c_driver_demo_detect(structi2c_client*client,structi2c_board_info*info){
structi2c_adapter*adapter=client->adapter;
if(2 == adapter->nr)
{ constchar*type_name="XXXX";
strlcpy(info->type,type_name,I2C_NAME_SIZE);
return0;
}else{
return-ENODEV;
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.249.145.253
※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1469602758.A.AF2.html
※ 編輯: cutem (60.249.145.253), 07/27/2016 15:00:53
※ 編輯: cutem (60.249.145.253), 07/27/2016 15:03:10
※ 編輯: cutem (60.249.145.253), 07/27/2016 15:04:16
※ 編輯: cutem (60.249.145.253), 07/27/2016 17:36:13
→ leolarrel: 大大,您貼的code是示範如何在kernel裡面使用i2c driver 07/29 18:56
→ leolarrel: 不是在app層 07/29 18:57
→ leolarrel: app層讀寫i2c的範例 07/29 19:00
→ leolarrel: 但是他給了你一些方向去找資料研究 07/29 19:02
※ 編輯: cutem (1.174.250.56), 07/29/2016 23:17:20
→ cutem: 其實您說的正是我疑惑的,newstyle i2c driver好像都不用寫 07/29 23:18
→ cutem: 跟user space溝通的code,然後您給的例子就可以有作用。 07/29 23:19
推 yvb: 沒實際使用和追踪 i2c 的部分, 但簡單看了一下, 猜測大概是 07/30 00:33
→ yvb: 被kernel下 drivers/i2c/i2c-dev.c 及該層相關程式包裝好了, 07/30 00:35
→ yvb: 所以就只需要寫 對硬體的操作 部分即可. 07/30 00:36
→ fightforlive: 這是driver = = 07/30 13:41
→ cutem: 謝謝yvb大的指點、其實我想的和您差不多,只是手中沒有設備 07/30 20:39
→ cutem: 只有桌機可以試一下程式片段,不然拿顆mcu掛上去,直接 07/30 20:40
→ cutem: 寫code從user space去讀取看看就知道了。 07/30 20:40
→ cutem: new style i2c的網上的介紹其實看起來很簡單,只是都沒人提 07/30 20:41
→ cutem: 到和user space溝通部份的程式,一副好像註冊完就ok的樣子 07/30 20:42
→ cutem: 所以才會覺得疑惑。 07/30 20:42
推 yvb: 不管 driver 是不是 new style, userspace 寫法應該都一樣吧? 07/30 23:12
※ 編輯: cutem (1.175.233.29), 07/30/2016 23:19:39
→ cutem: user spce都一樣,但是driver內只要註冊寫完就能用這點我目 07/30 23:20
→ cutem: 前無法驗證,所以才會滿腦子疑惑。 07/30 23:20
推 openeyes222: 你必須要知道如何與i2c device溝通,這才是能用的內 07/31 06:44
→ openeyes222: 容。 07/31 06:45