LinuxDev 板


LINE

在下最近在研究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://webptt.com/cn.aspx?n=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
1F:→ leolarrel: 大大,您贴的code是示范如何在kernel里面使用i2c driver 07/29 18:56
2F:→ leolarrel: 不是在app层 07/29 18:57
3F:→ leolarrel: app层读写i2c的范例 07/29 19:00
4F:→ leolarrel: http://goo.gl/Q7csfR .请注意,这只是范例,不保证会动 07/29 19:01
5F:→ leolarrel: 但是他给了你一些方向去找资料研究 07/29 19:02
※ 编辑: cutem (1.174.250.56), 07/29/2016 23:17:20
6F:→ cutem: 其实您说的正是我疑惑的,newstyle i2c driver好像都不用写 07/29 23:18
7F:→ cutem: 跟user space沟通的code,然後您给的例子就可以有作用。 07/29 23:19
8F:推 yvb: 没实际使用和追踪 i2c 的部分, 但简单看了一下, 猜测大概是 07/30 00:33
9F:→ yvb: 被kernel下 drivers/i2c/i2c-dev.c 及该层相关程式包装好了, 07/30 00:35
10F:→ yvb: 所以就只需要写 对硬体的操作 部分即可. 07/30 00:36
11F:→ yvb: 没实际对照kernel code,这篇不知如何? http://goo.gl/2qVEUA 07/30 00:51
12F:→ fightforlive: 这是driver = = 07/30 13:41
13F:→ cutem: 谢谢yvb大的指点、其实我想的和您差不多,只是手中没有设备 07/30 20:39
14F:→ cutem: 只有桌机可以试一下程式片段,不然拿颗mcu挂上去,直接 07/30 20:40
15F:→ cutem: 写code从user space去读取看看就知道了。 07/30 20:40
16F:→ cutem: new style i2c的网上的介绍其实看起来很简单,只是都没人提 07/30 20:41
17F:→ cutem: 到和user space沟通部份的程式,一副好像注册完就ok的样子 07/30 20:42
18F:→ cutem: 所以才会觉得疑惑。 07/30 20:42
19F:推 yvb: 不管 driver 是不是 new style, userspace 写法应该都一样吧? 07/30 23:12
※ 编辑: cutem (1.175.233.29), 07/30/2016 23:19:39
20F:→ cutem: user spce都一样,但是driver内只要注册写完就能用这点我目 07/30 23:20
21F:→ cutem: 前无法验证,所以才会满脑子疑惑。 07/30 23:20
22F:推 openeyes222: 你必须要知道如何与i2c device沟通,这才是能用的内 07/31 06:44
23F:→ openeyes222: 容。 07/31 06:45







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP